采用的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数据传送。
图片说明:
eedc59b7f28fa8134c8a9bdFCa840514
fcbc68359788b0201419ff02fb5b48a0
最佳答案
这个主要原因是:当电表站丢电后,主站无法接受到电表站回授回来的型号。用done的优点是可以利用程序(modbus)通信,提高轮询效率;缺点是从站丢失会造成通信的失败。
采用定时器方式相当于广播式modbus通信,通信轮询时间长,效率低,但可以客服因从站丢失类似的问题,你适当增加一点轮询时间试试。
提问者对于答案的评价:
ok
专家置评
已阅,最佳答案正确。