关于S7-200 modbus rtu通讯报警6#
今天在找答案栏目中看到有这样一个提问,大致含义调用库通讯指令modbus rtu通讯,程序中除初始化Ctrl指令外,仅仅只调用到一个(次)MSG指令,但MSG指令error管脚仍然报警6#。
打开官方资料modbus rtu通讯错误报警标设含义,6#错误为:“modbus正忙于另一个请求,同一个时刻只能激活一个mbus_msg指令”。
那么,是什么原因造成这个报警呢?根据提问者描述整个程序中只有一个(次)MSG指令的调用,怎么会出现这个报警?提问者在补充问题上提及到没有连接下位机。那么,如果没有连接下位机,MSG的错误报警应该为3(接收超时,从站无相应)的可能,这个可以理解,因为是没有实际连接到下位机的原因。
如果整个程序中仅仅调用一个(次)MSG指令,那么,First管脚在没有完成MSG指令时,多次(2次以上)被触发,提问者虽然已经在该管脚上调用了沿触发。
我按提问者的意思,模拟一下描述过程,就是用modbus rtu初始化指令的Done位触发MSG指令,结果如下所示:用200 samrt plc验证。
当MSG指令的First管脚用modbus rtu的 mbus_ctrl初始化完成标志位Done触发时,MSG指令的error管脚值正如提问者描述的报警6#。但是,我是没有将prot0口连接到电脑的串口调试软件的状态下测试的,这时,我串口软件没有打开,更谈不上连接状态问题了。
问题我一直锁定在这个初始化完成标志位M0.0的调用上,修改这个控制位,MSG指令必定会报警3#错误了的,图示:
当触发M0.2 = 1,MSG错误报警位为3,正是我理解的那样,相当于peot0口没有正确连接或从站没有相应时的错误结果。
不难理解,造成错误报警6,而没有显现错误报警3的原因是MSG指令“优先”激活了错误报警6的值,这时,并不说明没有错误报警3,而是被错误报警6暂时掩盖罢了。
那回过头来看这个mbus_ctrl的Done位究竟是一个什么值?仅仅从字面上理解,可以理解为初始化完成后的标志位。打开库mbus_ctrl指令的注释,图示:
官方给出的答案是SM0.0的set值。那么,既然是SM0.0的set值,我将程序重新置换网络段位置,看程序运行结果,图示:
将M0.0在状态图表中写入0后,MSG的error值为3,没有再出现错误报警6的值,符合官方给出注释的位值结果。
这个情况正如我昨天发过的那篇贴子【关于200smart PLC程序的扫描机制】描述的那样,是程序扫描工作机制引起的其中原因之一,当然由于初始化指令Done位的特殊性,造成MSG指令错误报警,First管脚在MSG指令未完成时触发了“2”次,因为MSG指令运行完毕时间无论如何不可能小于程序扫描周期,那怕通讯速率最高及通讯数据最小。