{PLC,IOT}>ESP32 项目的基础研究,解决了一些方向的问题:
1、运行平台(RUNTIME)固件 和 PLC应用程序 之间的协同机制。所有硬件驱动、实时操作系统(FreeRTOS)、通信协议栈(LWIP)、应用支持库(MQTT、MODBUS等)、PLC标准库、物联网扩展库,以及调试维护支持库,整合为一个运行平台固件,烧录到ESP32的flash。提取ESP32-IDF的工具链,整合到 OpenPLC-Editor 开发平台,独立编译PLC应用程序,生成轻量级的ELF文件,通过运行平台把生成的ELF文件存储到板载文件系统,运行平台加载PLC应用程序到ESP32的指令空间,用最高的任务优先级执行PLC应用任务。运行平台固件和PLC应用程序分离,将PLC应用程序的代码缩减到近可能小,对于实现远程升级维护,至关重要。
2、工具链整合。ESP32-IDF的工具链中,仅GCC编译、链接器和标准库,是生成PLC应用程序ELF必需的;编译辅助工具 cmake、ninja,是执行编译任务的必要支撑。在OpenPLC-Editor中将工具栏的按钮改成启动编译任务的命令,将工具链嵌入到OpenPLC-Editor开发平台中。
3、硬件的IO映射。开发代码自动生成程序,解析OpenPLC生成的结构化文本程序:generated_plc.st , 获取输入输出端口的指定指令 AT %xxx,生成可以给运行平台固件执行的 IO 映射表。例如,generated_plc.st的代码:
PROGRAM PLC_EasyStart
VAR
K1 AT %IX0 : BOOL;
P0 AT %QX0 : BOOL;
P1 AT %QX1 : BOOL;
END_VAR
VAR
CLOCK0 : CLOCK;
END_VAR
P0 := NOT(K1);
CLOCK0(PT := T#500ms);
P1 := CLOCK0.Q;
END_PROGRAM
解析生成:
VARP inputVarList[1]={
{"BOOL","","X0",&RES0__INS0.K1},};
VARP dacVarList[0]={
};
VARP anologVarList[0]={
};
VARP outputVarList[2]={
{"BOOL","","Y1",&RES0__INS0.P1},
{"BOOL","","Y0",&RES0__INS0.P0},};
把PLC的变量和运行平台固件能够识别的端口名对应起来。
4、设置、调试和维护工具的整合。OpenPLC有基于树莓派或者Windows的软PLC的运行平台,通过这些平台中的 web 服务器,可以完成设计、调试、维护等工作,但是这个web是python写的,在ESP32上面,同时运行PLC应用程序和 web 服务器,web服务器增加的开销(尤其是内存的开销),会降低产品的性价比。务实一点的做法是:把设置、调试和维护的web服务器集成到 OpenPLC-Editor,运行平台固件作为此服务器的客户端,设计者用浏览器访问设置、调试和维护服务器,完成对PLC的操作。例如,用在线调试的功能进行时序验证:
5、参考设计导入。 参考设计导入是开发平台一个很务实的功能,帮助开发者减少一些工作量。OpenPLC-Editor只提供 “复制POU”和“黏贴POU”的功能,按照一般的做法,需要打开一个示例项目,从中“复制POU”,然后转到开发项目,“黏贴POU”,不够利索。借助web server 扩展功能,由web server 的程序完成参考设计导入的流程,从示例项目中复制POU的XML代码到系统的粘贴板,开发者通过“黏贴POU”的操作,就将参考设计导入到开发项目中。
以上五项,在运行平台(RINTIME)和开发环境两个方面奠定了{PLC,IOT}>ESP32产品化的基础,使产品具备传统PLC的易用特性,在物联网通信、远程维护等方面展现开放式PLC的优势。{PLC,IOT}>ESP32的定型产品,以IOT-PLC命名,后缀由IO和板载资源特性决定,首款定型产品 IOT-PLC-5672RE 具备 5个继电器输出、6个晶体管输出、7个数字输入、2个模拟输入,板载RTC + Ethernet
从构想到推出定型产品,工作量虽很多,但是对于项目的目标:“提供一套技术解决方案,使之成为工业互联网和数字化工程的基础工具”,却仅仅只是从实际行动上迈出一步而已,以后会从实践中积累案例,从案例中提取参考设计,逐步普及应用。