发 帖  
原厂入驻New
[问答]

Modbus通信协议的错误及解决办法

1511 Modbus 通信协议
分享
Modbus通信协议可能出现的错误
Modbus通信协议错误的解决办法
0
2021-1-11 07:32:16   评论 分享淘帖 邀请回答
3个回答
  因为各种原因,传输过程中总会出现各种异常。Modbus有LRC/CRC校验,有响应返回,还有异常码,对于传输中出现的异常有一定的发现能力。但是Modbus本身不进行纠错,纠错和重传由开发者定义。
  根据通信的原理,在一条不可靠的信道上传输的任何协议都不可能做到完全可靠。即使是一个比较可靠的协议,也会存在一些极端情况,这些情况一旦出现,会让协议的纠错机制完全失效。对此我们要小心谨慎,让这些极端情况出现的概率尽可能小。
  分析一下Modbus通信协议可能出现的错误,发现主要有四个来源:
  1)某个查询/响应的协议帧错误,可能是PDU错误,也可能是ADU错误,对于ASCII模式,还有可能是引导符和结束符错误;
  2)某个查询/响应丢失,或者没在约定时间内送达,导致超时;
  3)主机发出了错误的查询,如对不存在的寄存器进行读/写;
  4)某个查询/响应的协议PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC也发生错误,协议帧没有报错,导致错误的查询/响应被接收。这种情况的概率比较低,但在噪音比较大的环境里会出现。
2021-1-11 11:22:35 评论

举报

  对这些异常情况进行排列组合,得到协议的可能状态:
  1、主机的查询从机正确收到,并做出了正常响应,主机接收到正常响应。
  2、主机的查询从机正确收到,并做出了正常响应,但从机返回的响应丢失或者被干扰产生了帧错误,主机等待超时。
  3、(概率较低,这种情况主机无法纠错)主机的查询从机正确收到,并做出了正常响应,但从机返回的响应PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致主机接收到了错误但合法的响应。
  4、主机的查询从机正确收到,但是从机发现命令无法执行,返回异常响应,主机接收到包含异常码的响应。
  5、主机的查询从机正确收到,但是从机发现命令无法执行,返回异常响应,但响应丢失或者包含帧错误,主机等待超时。
  6、(概率极低,这种情况主机无法纠错,属于极端情况,不予考虑)主机的查询从机正确收到,但是从机发现命令无法执行,返回异常响应,但从机返回的响应PDU传输错误,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致主机接收到了错误但合法的响应。
  7、主机的查询从机没有收到,或从机发现收到的查询包含帧错误,从而不进行响应,主机等待超时。
  8、(概率较低,但有可能导致从机执行错误的命令,对关键命令,需要小心这种情况的发生)主机的查询PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致从机接收了错误的命令。从机返回了响应,主机接收到响应,发现响应是错误的。
  9、(概率极低,但有可能导致从机执行错误的命令,对关键命令,需要小心这种情况的发生)主机的查询PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致从机接收了错误的命令。从机返回了响应,但从机返回的响应丢失或者被干扰产生了帧错误,主机等待超时。
  10、(概率极低,这种情况主机无法纠错,属于极端情况,不予考虑)主机的查询PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致从机接收了错误的命令。从机返回了响应,但从机返回的响应PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC同时发生了错误,协议帧没有报错,导致主机接收到了“正确”的响应。
2021-1-11 11:22:46 评论

举报

  考虑对这些情况进行处理:
  情况1是正常通信,情况4是主机的问题,这里不考虑;
  情况6和10出现的概率极低,而且很难纠错,这里也不考虑。
  情况3出现的概率较低,但如果出现的话很难纠错。所以如果从机的响应结果很重要,最好多次重复查询,确保结果的准确。当然这属于主机端的事情,所以这里也不多说。
  情况2、5、7、9从机响应超时,情况8从机响应错误,这几种情况主机都能发现错误,所以如果给主机增加重传机制,就可以提高这几种情况下的可靠性。但如果主机发送的是关键的控制命令,比如高压脉冲的开关,刹车系统的启动,这些命令如果传输错误,可能带来无法挽回的损失。这些关键的控制命令,需要准确的送达,光靠主机的出错重传无法保证其可靠性。要提高这些命令传输的可靠性,必须对从机程序进行修改。
  TCP/IP协议是一个经典的可靠协议,其三次握手四次挥手和给数据段进行编号的机制广负盛名。这些机制,通过损失有限的速度,即可极大地提高可靠性。
  控制命令在Modbus协议里的传输,也可以采用类似的机制。比如,采用写寄存器功能码+控制寄存器地址+执行计数的格式传输控制命令,而不用写寄存器功能码+控制寄存器地址+固定控制代码的格式。从机端和主机端分别对控制命令的执行次数计数,只有从机发现自己的计数器等于收到的执行计数-1时,才会执行,否则返回异常码0x03。主机收到异常后响应后,查询从机的计数器。如果主机之前已经发过这个命令,这次是因为错误或超时重传的,且从机的计数器等于于主机的计数器,说明从机已经执行过该命令了,主机结束这一次控制。如果从机的计数不等于主机的计数器或者主机的计数器-1,说明从机或主机可能发生了故障,这时可以通过写从机里的另一个寄存器来更新从机的计数器。
2021-1-11 11:22:57 评论

举报

只有小组成员才能发言,加入小组>>

12485个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表