因为各种原因,传输过程中总会出现各种异常。Modbus有LRC/CRC校验,有响应返回,还有异常码,对于传输中出现的异常有一定的发现能力。但是Modbus本身不进行纠错,纠错和重传由开发者定义。

根据通信的原理,在一条不可靠的信道上传输的任何协议都不可能做到完全可靠。即使是一个比较可靠的协议,也会存在一些极端情况,这些情况一旦出现,会让协议的纠错机制完全失效。对此我们要小心谨慎,让这些极端情况出现的概率尽可能小。

分析一下Modbus通信协议可能出现的错误,发现主要有四个来源:

1)某个查询/响应的协议帧错误,可能是PDU错误,也可能是ADU错误,对于ASCII模式,还有可能是引导符和结束符错误;

2)某个查询/响应丢失,或者没在约定时间内送达,导致超时;

3)主机发出了错误的查询,如对不存在的寄存器进行读/写;

4)某个查询/响应的协议PDU传输错误,而且错误的PDU是合法的,恰好LRC/CRC也发生错误,协议帧没有报错,导致错误的查询/响应被接收。这种情况的概率比较低,但在噪音比较大的环境里会出现。

对这些异常情况进行排列组合,得到协议的可能状态:

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同时发生了错误,协议帧没有报错,导致主机接收到了“正确”的响应。

考虑对这些情况进行处理:

    情况1是正常通信,情况4是主机的问题,这里不考虑;

    情况6和10出现的概率极低,而且很难纠错,这里也不考虑。

    情况3出现的概率较低,但如果出现的话很难纠错。所以如果从机的响应结果很重要,最好多次重复查询,确保结果的准确。当然这属于主机端的事情,所以这里也不多说。

    情况2、5、7、9从机响应超时,情况8从机响应错误,这几种情况主机都能发现错误,所以如果给主机增加重传机制,就可以提高这几种情况下的可靠性。但如果主机发送的是关键的控制命令,比如高压脉冲的开关,刹车系统的启动,这些命令如果传输错误,可能带来无法挽回的损失。这些关键的控制命令,需要准确的送达,光靠主机的出错重传无法保证其可靠性。要提高这些命令传输的可靠性,必须对从机程序进行修改。

TCP/IP协议是一个经典的可靠协议,其三次握手四次挥手和给数据段进行编号的机制广负盛名。这些机制,通过损失有限的速度,即可极大地提高可靠性。

控制命令在Modbus协议里的传输,也可以采用类似的机制。比如,采用写寄存器功能码+控制寄存器地址+执行计数的格式传输控制命令,而不用写寄存器功能码+控制寄存器地址+固定控制代码的格式。从机端和主机端分别对控制命令的执行次数计数,只有从机发现自己的计数器等于收到的执行计数-1时,才会执行,否则返回异常码0x03。主机收到异常后响应后,查询从机的计数器。如果主机之前已经发过这个命令,这次是因为错误或超时重传的,且从机的计数器等于于主机的计数器,说明从机已经执行过该命令了,主机结束这一次控制。如果从机的计数不等于主机的计数器或者主机的计数器-1,说明从机或主机可能发生了故障,这时可以通过写从机里的另一个寄存器来更新从机的计数器。

02-28 08:00