采用的1500的 modbus模块与电表通讯,开始时候采用modbus_master的done位、error位置为下一块仪表的REQ位,同时复位上一块表的REQ位的方式轮训方式,但是这种方式问题在于当电表未上电时候,modbus_master的done位、error、busy位有可能都为0,导致这种方式轮训停止不前;不知道为什么?
后来不再采用上述的轮询方式,改用时间轮询,基本思路是通过定时器第1秒调用一次modbus_master,DATA_PTR数据传给DB1;第二秒再调用modbus_master,DATA_PTR数据传给DB2.....依次类推。但是发现DB1...DB2...会有清零的状态,可能的问题应该在于DATA_PTR数据传给DB过程中与扫描周期之间产生的,但是不清楚如何处理,求助!
附图1:正常接受的数据;
附图2:数据被清零;
附图3:modbus-Comm_LOAD调用;
附图4:过程中;
附图5:modbus_master调用
附图6:站地址及REQ处理;
附图7:DATA_PTR数据传送。
图片说明:
最佳答案
这个主要原因是:当电表站丢电后,主站无法接受到电表站回授回来的型号。用done的优点是可以利用程序(modbus)通信,提高轮询效率;缺点是从站丢失会造成通信的失败。
采用定时器方式相当于广播式modbus通信,通信轮询时间长,效率低,但可以客服因从站丢失类似的问题,你适当增加一点轮询时间试试。
提问者对于答案的评价:
ok
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc167383.html