最近MODBUS-RTU通讯在论坛里讨论得火热,各种问题的焦点在于如何实现可靠的轮询通讯,我提出的观点是用一个MSG指令(200SMART)实现轮询通讯,因为这种方法的实现在技术上有不可替代的优越性:
对多个相同站相同的通讯任务:
举个例子,我有30颗子弹(这里好比30个一样的通讯任务,只是站地址不同),我要30支枪(MSG功能块)来发射这30颗子弹吗?难道不能使用一支枪(一个MSG功能块)来发射这30颗子弹吗?(这就是只用1个MSG指令)。
这个MSG是汉阳造栓动单发,还是56式半自动,还是95式全自动,这就是相关轮询通讯程序编写的层次高低了。
解决了自动发射(自动轮询)的问题,我可以在弹匣(通讯任务列表)里,间隔地压上普通弹(读任务)与曳光弹(写任务),就可以实现对多个站的连续的读写任务了。
对不同站的不同通讯任务:
再举个例子,坦克只有一门炮,可以发射穿甲弹(读 40001开始2个数据),破甲弹(写40005开始3个数据),榴弹(读 40010开始1个数据),炮射导弹(写41000开始的10个数据),坦克根据作战目标的不同,决定了发射的弹种与数量,以及发射次序。这就好比在实际项目中的一个热水锅炉房的控制系统,SMART200 PLC是主控制器,通过Modbus-RTU实现对循环泵变频的调速控制,通过Modbus-RTU读回系统温度/压力变送器及流量传感器的数值,不同的锅炉房,可能变频有两台,温度/压力/流量的仪表数量也会不同,你是说不行要援兵(增加通讯口)还是说一夫档关呢?
最后归结到
如何适应通讯任务类型与数量的变化,而轮询通讯的程序部分不需要随之修改呢?所有的变化应该在哪里?