- 博客(38)
- 收藏
- 关注
原创 open62541之核心模块
包含核心引擎,暴露公共 API,而plugins/提供配置、访问控制、日志记录和节点存储的默认实现。内部结构定义在中,而主要的编排逻辑位于。UA_Server结构体充当中央枢纽。它拥有配置、命名空间数组、会话和安全通道列表、订阅状态、服务器组件以及运行时诊断信息——所有这些都定义在的内部头文件中。连接层(传输 + SecureChannel)位于会话层(认证 + 身份)之下,而会话层又位于服务层(读/写/调用/浏览)之下。
2026-07-21 10:23:48
329
原创 open62541之架构概述
open62541架构解析:模块化OPCUA开源实现的核心设计 open62541作为跨平台OPCUA开源实现,采用分层架构确保从嵌入式设备到工业服务器的灵活部署。
2026-07-18 11:21:25
246
原创 open62541之概述
open62541是一个用C语言编写的开源OPC UA实现,提供完整的SDK用于构建服务器、客户端和发布-订阅通信。它支持OPC UA的四个核心层级:协议层、类型系统、信息模型和服务层,具有高度可移植性,仅依赖C99标准库,并通过插件架构实现平台无关性。该库支持多种编码、加密方式和传输协议,适用于从工业设备到微控制器的多种场景。项目采用分层设计,核心功能与平台相关代码分离,支持POSIX、Windows、Zephyr和FreeRTOS等平台。构建系统使用CMake,提供丰富的配置选项以满足不同需求。
2026-07-18 11:16:03
392
原创 Mongoose 网络库之协议实现
HTTP 子系统并非一个独立的库——它是一个协议处理器,通过每个连接上的pfn(协议函数)回调指针接入 Mongoose 的核心事件循环。当你调用或时,Mongoose 会注册一个内部的http_cb函数作为协议处理器。该函数拦截传入的字节,将其解析为 HTTP 消息,并以更高级别的和事件重新发送给你的应用程序回调。关键的架构洞察在于,http_cb充当了字节流到消息的解复用器。它从连接的接收缓冲区(c->recv。
2026-07-18 11:00:41
510
原创 Mongoose 网络库之网络层
Mongoose的Connection Manager API是其网络功能的核心,提供了创建、追踪和管理网络连接的统一接口。该API基于单线程事件驱动模型,通过mg_mgr结构体管理所有活动连接,并使用mg_mgr_poll()驱动事件循环。文章详细介绍了连接的生命周期、数据传输API、地址解析和定时器等关键功能,并比较了套接字后端与内置TCP/IP协议栈的差异。内置TCP/IP协议栈特别适用于资源受限的嵌入式系统,支持多种硬件驱动和网络协议。文章还提供了完整的代码示例,展示如何实现一个简单的TCP回显服务
2026-07-18 10:44:43
361
原创 Mongoose 网络库之事件驱动核心设计
Mongoose 的整个运行时构建在单线程、非阻塞的基础之上——这种设计使其在裸机微控制器和完整的 POSIX 系统上均具备极高的适用性。机制、,以及将二者紧密相连的。
2026-07-17 19:33:08
334
原创 Mongoose 网络库之架构概述
Mongoose是一个跨平台的嵌入式Web服务器库,采用分层架构设计,支持从微控制器到Linux服务器的多种平台。其核心基于事件驱动模型,通过连接管理器和连接两个基础数据结构实现非阻塞I/O操作。库提供HTTP、WebSocket、MQTT等协议支持,并内置TLS加密功能。Mongoose支持多种网络后端(如POSIX套接字、FreeRTOS-TCP等),并包含自研的轻量级TCP/IP协议栈。通过预处理器宏实现灵活的编译时配置,代码组织清晰,包含核心运行时、协议实现、工具模块等功能组件。该库特别适合资源受限
2026-07-17 17:55:49
350
原创 Mongoose 网络库之概述
Mongoose是一款轻量级、跨平台的C/C++网络库,支持TCP、UDP、HTTP、WebSocket、MQTT和TLS等多种协议。自2004年发布以来,已广泛应用于嵌入式设备和云服务器,包括国际空间站。其核心采用异步非阻塞I/O模型,通过事件驱动机制简化网络编程,无需复杂依赖或线程管理。Mongoose支持多种平台和硬件,包括裸机微控制器和RTOS环境,并提供内置TCP/IP协议栈选项。代码结构简洁,仅需两个文件即可集成,同时具备完善的安全审查和双重许可模式。其事件系统和模块化设计使其适用于物联网和嵌入
2026-07-17 17:46:33
725
原创 OpenPLC Editor v4 OPC UA 与 S7Comm 服务器
这两种服务器协议均遵循编辑器中建立的端口与适配器模式,types.ts中的PLCServer类型作为规范的领域模型,通过protocol字段('opcua''s7comm')进行辨识。前端配置组件负责填充这些类型,随后通过特定协议的生成器将其序列化为运行时 JSON 文件。OPC UA 生成器额外依赖于编译后的debug.c文件来解析变量索引,而 S7Comm 生成器则直接执行 camelCase 到 snake_case 的转换。
2026-07-11 23:38:29
194
原创 OpenPLC Editor v4 Modbus 配置
OpenPLC 运行时通过五个非标准 Modbus 功能码暴露调试功能,这些功能码运行在标准 Modbus ADU/TDU 帧结构之上。TCP 和 RTU 两种传输方式共享完全相同的功能码,仅帧结构和错误检测层有所不同。功能码十六进制名称方向用途DEBUG_INFO0x41调试信息请求保留用于信息查询DEBUG_SET0x42调试设置请求→响应在目标上写入或强制修改变量值DEBUG_GET0x43调试获取请求→响应通过索引读取单个变量0x44调试获取列表请求→响应。
2026-07-11 23:22:13
193
原创 OpenPLC Editor v4 EtherCAT 架构
OpenPLC 编辑器的 EtherCAT 子系统在 IEC 61131-3 自动化领域与 EtherCAT 现场总线协议之间实现了一个。它横跨两个 Electron 进程——主进程负责 ESI 持久化与运行时 HTTP 通信,渲染进程负责项目状态管理、设备配置 UI 与运行时 JSON 生成。本页将从类型系统基础到完整的端到端生命周期:ESI 导入 → 设备发现 → 项目配置 → 固件构建输出,对该架构进行深入剖析。
2026-07-11 23:18:47
524
原创 OpenPLC Editor v4 编译流水线
编译流水线是一个严格的顺序执行过程——每个阶段消费其前一个阶段的输出,并为下一个阶段生成产物。这里没有并行的编译阶段,因为后续步骤依赖于已生成的中间文件(例如,defines.h需要program.st的内容;OPC-UA 配置需要debug.c唯一的并行处理发生在启动时的工具可用性检查中。流水线区分了三种编译器类型——和simulator——它们决定了最终的构建阶段。路径生成原生固件二进制文件,并可选择将其刷写到已连接的硬件上。
2026-07-11 23:12:44
350
原创 OpenPLC Editor v4 FBD 与 SFC 图形编辑器
层级组件职责特性FbdEditor流与项目同步,差异检测,Zod 验证,编排FBDBody分子FBDBodyReactFlow 画布,拖放处理,调试边着色,剪贴板,视口持久化,防抖存储同步原子单个节点渲染,内联编辑,句柄渲染,调试徽章原子计算句柄几何和默认数据的节点工厂函数FBDBody中的防抖本地状态镜像模式是关键的性能优化——没有它,每次拖动移动都会触发完整的存储写入、Zod 验证和项目 JSON 序列化。200ms 的防抖确保仅持久化稳定的状态,而dragging标志在主动拖动期间完全抑制同步。
2026-07-11 22:55:41
546
原创 OpenPLC Editor v4 梯形图编辑器
LD 编辑器遵循与项目 Atomic Design 组织方式相契合的三层组合Atom 层负责节点类型定义、构建器工厂、SVG 视觉效果及手柄系统。Molecule 层将 Atom 组合为梯级结构——即梯形图程序的基础水平逻辑单元。Organism 层则将完整的梯级实例与其头部、主体及创建交互编排在一起。持有所有梯级状态(节点、边、流元数据),是画布的唯一数据源。React Flow 的默认Handle组件被封装,后者通过全局和相对位置坐标扩展了标准的。
2026-07-11 22:51:59
319
原创 OpenPLC Editor v4 Monaco 代码编辑器集成
Monaco 集成被组织为编辑器域下的一个独立功能模块。每个关注点——语言定义、主题、补全、拖放、AI 和 LSP——都位于monaco/目录中,顶层index.tsx通过连接到 Zustand 存储的 React 副作用和回调将它们全部协调起来。该组件的属性被刻意精简——只有pathname和language——因为所有丰富的上下文(POU 数据、变量、调试状态、设备信息)都是通过 Zustand 存储和平台提供程序钩子流入的。这种设计保持了组件公共接口的稳定,同时其内部数据订阅可以独立演进。
2026-07-11 22:31:52
339
原创 OpenPLC Editor v4 端口与适配器层
OpenPLC Editor 采用(六边形)架构,使其共享的 React UI 与平台特定机制完全解耦。端口接口是——纯 TypeScriptinterface定义,声明了 UI能做什么,而不规定如何做。每个端口代表一个内聚的领域功能(编译、调试、项目管理等),且每个方法要么返回一个带类型的结果对象,要么返回一个用于事件订阅的清理函数。这种设计使得相同的组件树能够在 Electron(通过 IPC 桥接)或浏览器(通过 HTTP/WebRTC)中保持不变地运行,适配器在应用启动时接入具体的实现。
2026-07-11 21:21:28
375
原创 OpenPLC Editor v4 技术栈
OpenPLC 编辑器是一款跨平台的桌面 IDE,基于运行时构建,结合了 React 驱动的渲染进程与 Node.js 主进程,提供专业的 PLC 编程能力。该技术栈中的每一项技术选择都有其明确目的:从 IEC 61131-3 语言编辑器到实时工业协议通信,整个技术栈针对工业自动化工具的独特需求进行了深度优化。
2026-07-10 21:27:02
384
原创 CANopenNode协议栈之对象字典概念
每个 OD 子对象都带有一个 8 位属性位掩码(OD_attr_t),用于控制谁可以访问它以及如何访问。属性数值含义ODA_SDO_R0x01SDO 服务器可读ODA_SDO_W0x02SDO 服务器可写ODA_TPDO0x04可映射至 TPDO(发送)ODA_RPDO0x08可映射至 RPDO(接收)ODA_TSRDO0x10可映射至发送 SRDOODA_RSRDO0x20可映射至接收 SRDOODA_MB0x40多字节变量(int16 及以上——需处理大小端)ODA_STR0x80。
2026-07-09 21:30:22
330
原创 CANopenNode协议栈之架构概述
CANopenNode 遵循非阻塞、多线程的设计。所有协议代码均运行于三种执行上下文之一,每种上下文各司其职。下图展示了这些线程如何通过共享的 CANopen 对象(CO_t)进行交互:CAN 接收线程以最高优先级运行——通常由硬件中断驱动——并且只执行最少的处理:它识别 CAN 报文,将有效载荷复制到相应的对象字典条目中,并可选地触发回调以唤醒低优先级的线程。定时器周期线程以固定的 1ms 频率运行,负责处理时间敏感且与网络同步的操作:SYNC 的生成/消费、RPDO 输入复制以及 TPDO 输出发送。
2026-07-08 08:21:34
181
原创 CANopenNode协议栈之概述
CANopenNode是一款开源CANopen协议栈,采用ANSI C编写并支持面向对象设计。它实现了EN 50325-4标准,兼容16位微控制器至PC级硬件,可在有无RTOS环境下运行。该协议栈包含对象字典、NMT、PDO、SDO等核心通信服务,模块化设计允许按需启用功能以优化资源占用。其多线程架构将实时性要求高的任务与普通任务分离,同时支持单线程运行模式。通过Apache 2.0许可授权,已通过CANopen一致性测试,符合CiA 301等多项国际标准。项目按CiA标准组织代码结构,提供硬件抽象接口便于
2026-07-08 08:09:20
559
原创 OpenPLC在PREEMPT_RT实时Linux上部署
绑定到特定 CPU 核心 (例如 CPU 2)# 设置实时调度策略和优先级 (99 为最高)target 不需要 enable。# 允许锁定内存,防止被换出。找到文件路径后,使用。
2026-07-07 16:56:11
166
原创 OpenPLC Editor v4 端口接口契约
OpenPLC Editor 采用(六边形)架构,使其共享的 React UI 与平台特定机制完全解耦。端口接口是——纯 TypeScriptinterface定义,声明了 UI能做什么,而不规定如何做。每个端口代表一个内聚的领域功能(编译、调试、项目管理等),且每个方法要么返回一个带类型的结果对象,要么返回一个用于事件订阅的清理函数。这种设计使得相同的组件树能够在 Electron(通过 IPC 桥接)或浏览器(通过 HTTP/WebRTC)中保持不变地运行,适配器在应用启动时接入具体的实现。
2026-06-28 21:45:17
351
原创 OpenPLC Editor v4 之架构概述
OpenPLC Editor 是一款桌面 IDE,支持使用 IEC 61131-3 语言(结构化文本、梯形图、功能块图、指令表)以及 Python 和 C++ 扩展进行 PLC 编程。该架构遵循(六边形)模式,强制执行严格的依赖倒置:前端从不直接导入后端或 Electron API——所有特定于平台的行为都通过带类型的端口接口传递,使得相同的 UI 代码库可在 Electron 编辑器和 Web 应用程序中复用。本页提供了系统的结构蓝图:其分层、层间关系以及支配其交互的规则。
2026-06-28 21:40:59
432
原创 OpenPLC Runtime v4 可靠性与安全性
三层恢复机制构成了一个同心保护模型:看门狗线程监控最内层的执行循环,信号处理程序捕获致命的程序故障,而 Web 服务器进程监视器处理灾难性的进程级故障。每一层都会将 PLC 转换为ERROR状态,用户可以通过 REST API 观察到该状态并采取相应操作。安全模型遵循清晰的关注点分离原则。中的CertGen类负责处理所有证书操作。JWT 生命周期管理完全通过 Flask-JWT-Extended 驻留在中。配置密钥由引导生成,供两个层级共同使用。核心协调点是中的。
2026-06-24 14:54:32
336
原创 OpenPLC Runtime v4 编译与构建
OpenPLC Runtime v4 中,PLC 程序从上传、编译到运行时加载的完整生命周期。该处理流程将基于 Web 的管理界面与 C 语言运行时核心连接起来,将打包为 ZIP 压缩包的 IEC 61131-3 程序转换为扫描周期执行的动态加载共享库。
2026-06-24 14:16:25
339
原创 OpenPLC Runtime v4 插件驱动系统
方面C 运行时 (Python Web 服务器 (解析方法带逗号分隔符的strtok格式错误行的处理静默跳过(少于 4 个标记)从返回None注释保留不适用(只读)保留原始行位置强制最大插件数是 (解析时不强制执行名称/路径长度限制64 / 256 字节(固定缓冲区)无显式限制文件缺失回退从复制从复制路径验证无检查存在性该桥接跨越了两个语言边界和三个独立层级:嵌入在插件驱动程序中的 C 侧编排层、通过PyCapsule。
2026-06-24 12:00:56
594
原创 OpenPLC Runtime v4 进程间通信
OpenPLC Runtime 采用双通道 Unix 域套接字设计。命令套接字承载从 Python Web 服务器发往 C 运行时的控制消息,而日志套接字则将结构化日志数据从 C 运行时回流至 Python 层。两个通道均使用AF_UNIX(面向连接、可靠、字节流)以及换行符分隔的文本帧格式。命令套接字路径在 C 头文件中硬编码为,而日志套接字路径默认为。如果这些目录不存在,会在启动时动态创建它们。
2026-06-24 11:44:02
390
原创 OpenPLC Runtime v4 PLC 运行时核心
下图展示了扫描周期如何与更广泛的系统相集成——从程序加载、稳态执行到关闭:核心架构不变式在于,PLC 程序绝不在加锁窗口之外运行。所有插件对映像表的读取,要么在同一个互斥锁的保护下进行(原生插件的周期钩子),要么通过日志缓冲区进行(来自独立线程的异步插件写入)。这确保了数据一致性,同时允许插件与扫描周期并发运行。在排查计时问题时,应区分超限(scan_time > ticktime)和延迟(周期启动延迟)。超限表明当前的逻辑和插件负载没有足够的 CPU 余量。
2026-06-24 11:23:53
516
原创 Profinet协议栈P-Net 库之五
以太网驱动程序接口通过多层架构运行,将特定硬件的关注点与 Profinet 协议栈分离。调度器使用链表实现基于优先级的回调系统,以维护有序的超时队列。该架构将定时器管理与回调执行分离,通过互斥锁保护确保线程安全操作。
2026-06-19 22:25:48
246
原创 Profinet协议栈P-Net 库之四
DCP(设备连接和协议)处理器是 PROFINET 协议栈的基础组件,负责实现设备发现、识别和配置服务。DCP 在 OSI 模型的第 2 层运行,为网络设备提供必要的协议机制,以便在调试和运行过程中宣告其存在、响应识别查询并接受配置参数。
2026-06-19 22:14:22
401
原创 Profinet协议栈P-Net 库之三
模块管理架构采用分层设计,其中设备包含 API,API 包含插槽,插槽包含子插槽。这种结构支持复杂的设备配置,允许在运行过程中动态插入和拔出多个功能模块。核心管理由pf_cmdev组件(pf_cmdev.h)处理,该组件提供模块和子模块操作的主要接口。此组件维护设备配置树,并处理由控制器或应用程序发起的所有插入/拔出操作。报警和诊断系统围绕两个主要组件构建,它们协同工作以提供强大的事件处理能力:报警系统处理设备与控制器之间的异步事件通知,支持高优先级和低优先级通信通道。诊断系统管理结构化故障信息。
2026-06-19 21:51:08
322
原创 Profinet协议栈P-Net 库之二
管理从设备到控制器的出站循环数据- 处理从控制器到设备的入站循环数据以太网层- 提供底层帧传输和接收服务。
2026-06-19 09:01:52
397
原创 Profinet协议栈P-Net 库之一
P-Net 是一个设备协议栈,提供符合性等级 A 和 B 支持,并具备实时等级 1 的能力。完全用 C 语言编写,它为跨各种平台(包括 Linux、RTOS 和裸机系统)的 Profinet 设备实现提供了可移植的基础。该协议栈为内存和处理能力受限的嵌入式环境而设计,使其特别适合基于微控制器的工业设备。支持多个以太网端口,协议栈在保持小占用的同时能够处理复杂的工业网络场景。
2026-06-19 08:49:11
531
原创 OpenPLC Editor v4 入门
OpenPLC Editor 是一款,用于使用 IEC 61131-3 标准语言(结构化文本、梯形图、功能块图和指令表)以及 Python 和 C++ 扩展对 PLC(可编程逻辑控制器)进行编程。它基于 Electron 和 React 构建,提供了从编写到部署的完整工作流:创建项目、使用多种 PLC 语言编写程序、编译为原生固件、通过 Modbus 或 WebSocket 调试实时变量,以及上传至物理硬件或内置 AVR 模拟器。
2026-06-19 08:39:20
696
原创 OpenPLC Runtime v4 REST API 服务器
REST API 被构造为一个restapi_bp),注册在专用的 Flask 应用()上,该应用与用于 Flask-Login 会话管理的旧版app对象是分离的。该 Blueprint 使用回调分发模式:两个通用的全捕获路由(用于 GET 和 POST 的/<command>)委托给从app.py注册的处理程序字典,从而将路由定义与运行时交互逻辑解耦。服务器绑定到,并使用在启动时通过中的CertGen类生成的自签名 TLS 证书。如果缺少或,服务器将自动为localhost和127.0.0.1生成它们。
2026-06-18 20:05:45
352
原创 OpenPLC Runtime v4 双进程架构
系统从单一入口点启动,该脚本会准备虚拟环境,然后启动 Python Web 服务器。此后,Python 进程承担起进程监督者的角色:它将编译好的 C 二进制文件作为子进程衍生出来,在轮询循环中监控其健康状态,并在发生故障时协调优雅重启。相应地,C 运行时绑定一个 Unix 域套接字并进入其扫描周期,仅响应通过该套接字接收到的命令。
2026-06-18 19:03:58
434
原创 OpenPLC Runtime v4 快速开始
OpenPLC Runtime 包含一个用于硬件 I/O 的插件驱动系统。插件在(一个格式为类型值语言示例Python0Python 3Modbus 从站、Modbus 主站、OPC UA原生1C/C++S7 通信所有插件默认处于禁用状态。要启用插件,请编辑并将enabled字段从0更改为1,然后重启运行时。当存在文件时,启动脚本会自动为每个插件创建并维护独立的 Python 虚拟环境。CLAUDE.md。
2026-06-18 17:58:10
684
原创 OpenPLC Runtime v4 概述
OpenPLC Runtime v4 是一个无界面的工业可编程逻辑控制器 (PLC) 运行时,能够在标准计算硬件上执行 IEC 61131-3 程序。不同于需要专有硬件的传统 PLC,该运行时通过以具有确定性的实时扫描周期运行编译后的控制逻辑,将任何 Linux 机器、Docker 容器,甚至 Windows(通过 MSYS2)转变为功能完备的 PLC。它被设计为由。
2026-06-18 17:44:07
539
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅