本帖最后由 快乐小小鱼 于 2023-5-8 16:09 编辑
去年做过三菱的PLC的,是解释型的PLC,也就是把梯形图先生产对应的中间汇编(il指令),然后把汇编转码成16进制,比如 ------|M0|----------(Y0) =>对应的IL指令是LD M0, OUT Y0共两条,然后通过三菱的规则转码成0x2400, 0xC500这样的指令,STM32单片机通过串口把16进制编码下载到内存的区域里面,然后根据16进制码来执行对应的函数,比如把LD加载BIT型软元件写出一个函数,把OUT输出软元件写出一个函数。。。。最后单片机就通过不同的16进制码,来执行不同的函数,把执行结果输出就构成了PLC的梯形图逻辑,这里的过程就是解析型PLC的的底层处理过程,解析的意思就是用单片机的底层程序来解析对应的IL指令,这些IL指令都对应于一个特定功能函数。。。。。。。
编译型PLC是什么呢?其实编译型PLC就是像单片机一样,上位机IDE把逻辑C语言直接解析成ARM的机器码,放在FLASH里面,编译型PLC生产的16进制码是ARM的机器码,而不是IL指令对应的16进制码,IL指令转码执行的过程更像是虚拟机,或者JAVA,C#的处理过程。。。。而编译型PLC的转码,就直接是单片机的机器码,没有虚拟机,这样优点是速度高,缺点是要对ARM的汇编机器码非常熟悉,相当于自己设计一个编译器把T型图逻辑翻译成ARM的机器码。。。。。
这里有一种新的思路,不用自己设计编译器,用现成的ARMCC或者GCC的编译器,把梯形图逻辑先转成C语言,然后用编译器来编译生产的中间C代码,下载到PLC里面的就是ARM的机器码,能大大的提高PLC的处理逻辑的速度,缺点是PLC的上位机IDE要自带GCC编译器。。。。。下面来讨论这种中间C语言型的PLC的是实现过程。。。。。。
我们都知道信捷PLC是支持C语言函数的,也就是说可以把PLC的一个功能,比如阀门的开关,限位检查写再一个C函数里面,然后再梯形图里调用这个C函数生产的新的指令,就完成了梯形图嵌入C的功能。。。。要实现这个功能,有两种方法,1:把C语言的解释器放在ARM底层的逻辑上,自己设计一个小型的适合单片机运行的C语言解释器,目前市场是成熟的方案有PICOC,或者LUA这种可以运行在单片机上的类C语言的解析器。。。。2:在上位机的IDE上插入GCC编译器,把C函数段翻译成地址无关的函数,然后被底层的程序调用,这个更像是C语言的动态加载库,也就是单片机上支持的C语言动态加载库。。
上面的两种方法都各有优缺点,方法1的优点是实现起来比较直接,目前市场上有成熟的方案可以参考,缺点是和解释性PLC一样,速度慢。。。。适合性能更强带linux系统的arm9以上的芯片。。。方法2是用GCC把用户的功能函数端和梯形图的逻辑一起编译成新的程序下载到单片机里面。。。。这个过程像是ISP的BOOTLOADER,和应用程序的关系。。。。厂商出场前已经在PLC内部内嵌了BOOTLOADER,然后用户在PLC的上位机上写梯形图和C函数库,然后通过GCC编译器生产一个新的BIN文件,然后应用程序就从BOOTLOADER挑战到用户的应用程序上执行,这里也有很多技术细节,比如两个程序如何共享内存实现软元件的共享,不过PLC内部的软元件是地址固定的全局变量,两个应用程序确实都能访问这个共享内存。。。。。。
目前这些都是一个设想的过程,还有很多技术细节需要验证,有兴趣的可以一起创个微信群来讨论,这个技术有一个好处就是可以不把LIB提供给客户,而让客户也有C语言的开发能力,在PLC或者军工产品上可以大放光彩。。。。我们只需要把底层逻辑库处理好,然后让客户用C添加自己的应用库进来,还是实现客户自己的逻辑过程 |