关于MODBUS TCP通讯 S7-1500与几台第三方设备进行通讯,S7-1500做客户端,现在通讯基本上成功,读写都没有问题,还有几个细节不是很清楚,请教一下各位。 1.关于轮询:现在采用的是定时轮询,不管DONE BUSY ERROR等位的状态,也不管STATUS的信息,定时轮流将调用的几个客户端FB的 EN 和 REQ位置1。这样是否合理?采取DONE位或者STATUS的信息去触发轮询,我担心出现故障后不能正常轮询。 请问下你们在进行MODBUS TCP通讯的时候如何轮询?跟一台设备进行MODBUS_TCP通讯20个字节左右的数据交换,通常需要设置多长时间轮询一次? 2.关于DISCONNET位:每台设备通讯完成后都需要将DISCONNET位置1以断开此台设备的通讯吧? DISCONNET位需要保持1的状态为几个扫描周期?还是要通过 DONE位或STATUS的信息去复位? 3.关于读写MB_MODE:每台设备不管是读还是写都只能用同一个实例吧?一直去读的话,STATUS的信息都比较正常。读写切换时,总觉得STATUS的信息就没有那么好看了,有时候是818D,80C4等等。这种情况是属于正常的吗?我感觉还是跟轮询的方式或者读写切换有关。 感谢关注!
-------MODBUS TCP 也是异步通讯。不能“不管DONE BUSY ERROR等位的状态”来“定时”轮询。在DONE位没有置一前通讯是没有完成的。 在 TCP 通讯中,它是开放的 ProfiNet IE 通讯,其响应完全看网络负载程度。可能十几毫秒;也可能上百毫秒。还可能没有响应。 因此,根据需要采用DONE/ERROR结束通讯,这是最快的通讯交换数据。当然也可以定时中断,但要满足最大通讯时常。避免通讯负载大时,通讯完全中断。 在没有达到最大通讯连接时,应该不需要断开连接。
读写切换应该在完成DONE/ERROR之后再进行。不能再BUSY时进行,也不能做第二次请求。
------读写切换是在EN和REQ为1前进行的。
我做了下监测,现在的定时轮询,偶尔出现某个设备超过5秒还未通讯上的情况(通过DONE判断的) 我明天使用 DONE/RRROR结束通讯和不把DISCONNET位置1试试轮询效果。另外, EN和REQ同时为1,应该没什么问题吧?
------另外, EN和REQ同时为1,”? 我觉得不是,连接总是存在的(除非连接数达到最大,需要断开一个,连接另外一个。) 那个REQ只是“触发”一次通讯交换(设置读写、数据块内容之后)。
---------过去我在做1200PLC的MODBUS TCP通信时,指令版本是V3.0,EN和REQ用同一个位,但REQ 是该位的上升沿,DONE位轮询,成功了。但是这次用的V4.0版本却不能成功,改成定时轮询才可以,不知道为什么。DISCONNET一直设为0的。
-----今天试图不把 DISCONNET位置1 ,结果偶尔会出现读到数据为0的情况,我读到的数据是在DONE位为1的情况下传送的。可以肯定的是服务器那里的数据没有变化,改回原来的就没有问题。
--------今天又用1500PLC做MODBUS TCP实验,EN常ON,REQ 用读写常开触点或其上升沿,DISCONNET一直设为0,DONE位轮询成功了。
|