艾默生EC系列PLC支持modbus协议、自由协议,还有艾默生ECbus协议。
以下讨论一个modbus通讯编程的问题。
由于对modbus指令执行时序、PLC扫描周期之间配合分析不足,经常出现这样的编程问题——不知道为何有的modbus指令不会执行。
如下图所示,PLC是EC10系列,这段程序是在子程序中,本意是调用子程序时,如LM0未置位,顺序执行前2条modbus指令,且当第2条modbus指令执行成功时,通过置位LM1(返回标志),返回主程序。但实际上第2条modbus指令不会被执行。

修改的程序如下。

实际上,上述情况是modbus指令最典型的编程问题。由于modbus指令指令是跨越了多个扫描周期才会完成的,SM124(串口1空闲标志)、还有SM135、SM136等都会在一定的时序上变化,多数编程人员往往忽略了这一点,陷入这样的时序问题中。
这个典型情况还会引发一个更难分析的问题是——modbus指令往往放在子程序中,这样的意外重复调用,由于在一个子程序中modbus指令被悄悄地多执行了一次,也就悄悄地占用了串口,导致其它子程序调用modbus指令时不能正确执行。这个冲突很隐蔽。
最好的办法是,尽量不用SM124等作为触发的主条件,只作为辅助条件。由于modbus指令实际上是上升沿触发的,因此尽量采用上升沿。(当然子程序中往往上升沿是不能用的,要注意)。如下图。