处理完交叉编译工具链、链接器内存布局、ELF加载、动态库链接等古老、晦涩的技术整合以后,{PLC,IOT}>ESP32初步把FreeRTOS改装成为对应用程序友好一点的平台,“为工业互联网和数字化工程提供便利工具”的千里之行,其实也只是迈开了第一步,还有大量的成熟技术整合工作要逐步开展。
modbus 的功能PLC实现互联互通的基本途径,ESP32 的IDF里面也有modbus的组件,而且挺完善的,有ASCII、RTU和TCP模式,MASTER和SLAVE都支持,都挺成熟。整合之前,不如看看现状。
传统的PLC开发平台,可能是因为逐步演化的原因,提供了梯形图的程序设计输入平台,就什么都用图。当自己即做使用者又做供应者的时候,能体会到使用者的无可奈何:modbus的设置参数不少,导致图块比较大;设置一个参数细项就要画图连线;modbus 其实也就一个平台基础功能,最多用的是复制粘贴(套用原来的设计参数),图块的复制粘贴相对来讲麻烦一点。设身处地考虑问题,有得选的化,我想要一个字符串设置完所有参数。
OpenPLC的设计基于IEC 61131-3,软件的模型参考了IEC 1131-5的模型。
配置项最为一种相对独立的软件元素存在,就不用和设计文件掺和在一起了。这种做法体现在 OpenPLC 的项目配置页,例如:
这种和业务功能关系不大的配置项独立处理的做法,比较方便项目的套用。我们将以OpenPLC 的项目组织方式整合modbus功能。
MODBUS_CONFIG@为起始的字符串(不区分大小写,内部程序全部按大写处理)将被解析为 modbus 的配置项。基于 RS485接口的modbus配置 格式定义为:COM:[a,b,m,d,s,c,t],
配置项分别是:
a ——从机地址 (必填)
b ——波特率 (必填)
m ——模式 0为RTU、1为 ASCII (选填,默认是0)
d ——数据位 (选填,默认是8)
s ——停止位 (选填,默认是1)
c —— 校验位 (选填,默认是无(0) 奇校验(1) 偶校验(2))
t —— 超时时间(单位是毫秒) (选填,默认是 100毫秒)
例如:
MODBUS_CONFIG@COM:[34,115200] 从机地址是34,波特率是115200,其他是默认值
MODBUS_CONFIG@COM:[34,115200,0,8,1,0,300] 超时时间为300毫秒
基于TCP的modbus-tcp的配置定义为:TCP:[u,p] 其中 u 表示设备的标识码(必填),p表示TCP端口号(选填,默认值是 502)
MDB_REG@为开始的字符串将被解析为modbus的寄存器配置,格式为:MDB_REG@REGN:[VN, VP(s)],其中:
REGN——数字,为寄存器组的起始地址,以1 递增,范围是 0~512。
VN ——PLC变量名称,以该变量的存储单元映射到modbus寄存器(16bit)
VP(s) ——VP是PLC变量名称,s是数字,以该变量的存储单元偏移s字节映射到modbus寄存器(16bit)
没有找对对应变量的寄存器定义为无效定义,不会产生任何作用。
例如:MDB_REG@0:[X0,X1,RPM,RPM(2)],表示地址为0的寄存器组的映射配置,0:X0,1:X1,2:RPM低16位,3:RPM高16位。
基于RS485的modbus只有一项有效;modbus-tcp的配置,只要端口不重复,允许多项配置;寄存器的配置可以有多项(适应地址不连续的情况) 。