我这里是用一个网关接好多485设备,PLC做Modbus_TCP的客户端,用MB_Client功能块。
轮询代码的最前面是一个按钮(起名“读数据”),后面接REQ的线圈set形式。按钮是“瞬时”模式,由人工触发,就是按一下再放掉,它自己就会先置位再复位,留下PLC里的req一直被置位,等通信结束之后req又被done和error复位。就这样完成一次数据刷新。
一般地这个任务都能比较好地完成,就是总能刷新数据,但是时不时有会有在面板上按了“读数据”按钮时,req没有被置位,自然就没有激活MB_Client功能块了,没有刷新数据。这种事不是天天犯的,而是这天或者那天犯的。我以前不重视。但是有一天,这件事严重干扰了工作,我在下午刷新不了数据,到了晚上还刷新不了。我想,确实得解决这个问题了。
起初我以为是PLC的扫描周期导致的,我的解释是:在HMI按了“读数据”按钮时,PLC已经扫描过头了,没有读到这个按钮的置位信号。我还在此论坛上发贴求助过。
但是那天我在七个小时内经常去刷新数据(就是让req置位)而不成功,那肯定就不是PLC扫描周期的问题了。
解决过程复杂,直接说答案吧,这个问题是宕机导致的。就是某次轮询时,你还没有等它结束,就去轮询别的数据了,导致上一个轮询的req位卡在中间,既不能复位,也不能置位(症状就是在面板上触发不了它了);去轮询下一个数据时,又报错说“此通信被另一个实例应用”。
怎么解决的呢?就是从头到尾再轮询一下所有的485设备,比如依次按轮询1、轮询2、轮询3.....一直到最后一个轮询。