由于RS485接口的半双工特性,以及MODBUS RTU协议属于主从通讯,决定了在 MODBUS 通讯的网络段内,同一时刻最多只能有一个设备是发送状态。
主站控制着整个网络的通讯状态,通讯只能由主站发起,从站处于接收状态。主站发出指令,只有当收到地址码和其一致的指令时,才能做出响应。校验指令,如果指令没有错误,则根据指令的功能码,按协议返回相应的数据。当地址码和其本身不一致,或者校验错误,则忽略该指令。主站接收到从站返回的数据,如果校验没有错误,将数据相应处理后一个通讯循环结束,如果在设定时间没有收到从站返回的数据,或者返回的数据校验错误、格式错误,则重发次数加1后重发指令,直到并重复以上过程,直到收到正确响应或者达到设定重发次数。
那么,200/200smart中的MODBUS库指令是怎么做的呢?首先,通过MBUS_CRTL设置通讯端口,激活或关闭自由口(modbus通讯属于自由口通讯),然后,剩下的事情就交由MBUS_MSG处理了。
MBUS_MSG指令的EN端,当然在一个通讯循环中需要一直保持为1。First端就是一个通讯循环的开始,直到一个通讯循环结束,First端不应该再有1的信号。
引用在线帮助:有新请求要发送时,将参数 First 设置为接通,并仅保持一个扫描周期。First
输入以脉冲方式通过边沿检测元素(例如,上升沿),这将导致程序发送请求一次。 MBUS_CTRL指令并不是检测FIRST的上升沿,而是需要用户程序给First端一个只接通一个扫描周期的信号。有在线帮助为证: EN 输入和 First 输入同时接通时,MBUS_MSG/MB_MSG2 指令会向 Modbus 从站发起主站请求。
发送请求、等待响应和处理响应通常需要多个 PLC 扫描时间
也就是说,该指令的激活时间也是需要多个PLC扫描周期的
重点在这,看我下面画的图
如果连接First的不是一个只接通一个扫描周期的指令,或者在MBUS_MSG指令的Done位还没有重新为1前(就是 扫描周期 N+ X 前 )又再次为1了,那么恭喜你,错误代码6出现了。
什么时候会出现这种情况呢?
1、First信号不是一个单周期信号,会持续多个扫描周期
2、First信号虽然是一个单周期信号,但是在一个通讯循环中多次出现。比如通过SM0.5的上升沿定时执行MBUS_MSG指令,正常情况下一个通讯循环不需要1s的时间,但是如果出现通讯干扰,线路故障,从站故障等,从站没有及时响应,主站需要重发,根据默认设置,3次重发,1s的超时设定,最多需要3s多的时间才能完成一个通讯循环,这时就会报6号错误。
3、MBUS_CTRL指令多次调用,调用时序不合理