恭喜,你发布的帖子
发布于 2018-06-06 23:51:35
8楼
最近我写了个S7-1200PLC与二十来个温控表MODBUS通讯的程序,但是遇到一个问题,假如在通讯过程中,某个从站断电,就无法继续轮询下一个站而卡在这里。
我的程序是这样子做的,首先发送第一个站的温度实际值读取命令,得到一个温度实际值,这个命令的完成位,也就是此次MODBUS-MASTER命令的DONE位为1的时候再触发第二个站的读取命令,如果所有的站在线,这没有问题。但是如果某个站不在线,那么当次的MODBUS-MASTER命令的DONE位就无法为1,从而就触发不了下一步轮询命令。
我的做法是监视每一次的DONE位,如果超时比如一秒钟,就判断为此站掉线,就跳到下一个轮询,但是这严重影响了整个通讯速率。
原来所有的从站在线的话,控制某个站启动,几乎肉眼看不到时间差,你发送启动信号,这个站就启动了,但是加了上述的判断条件后,假如我让某个站断电,然后我控制另外的站启动,这个时候它启动反应就特别久了,好几秒甚至十几秒才有反应。因为每次轮询到断电的站,程序上就得等一个时间才跳到下一站往下轮询。
请问下,怎么处理这种问题呢?
DONE信号不来,ERROR信号会来呀,因此判断一次通讯结束不能只用DONE信号,还需判断ERROR信号。
另外,MODBUS-RTU通讯是基于任务的通讯,站地址包含在任务报文中的,如果是读写某一个站的多个不连贯参数,则需要依次触发多次通讯任务,这时遭遇到第一个参数读写任务失败后,可以考虑直接跳过这个站的其他剩余任务,否则每一次都要等到通讯延时故障触发,会耽误很多时间,导致轮询周期加长。可以考虑三次站级别的轮询失败后,永久跳过此站的通讯,直至手动复位。
请填写推广理由:
分享
只看
楼主