移植Modbus到STM32F103(3):考虑可能的通讯错误,保证控制命令的可靠传输

由于各类缘由,传输过程当中总会出现各类异常。Modbus有LRC/CRC校验,有响应返回,还有异常码,对于传输中出现的异常有必定的发现能力。可是Modbus自己不进行纠错,纠错和重传由开发者定义。开发

根据通讯的原理,在一条不可靠的信道上传输的任何协议都不可能作到彻底可靠。即便是一个比较可靠的协议,也会存在一些极端状况,这些状况一旦出现,会让协议的纠错机制彻底失效。对此咱们要当心谨慎,让这些极端状况出现的几率尽量小。原理

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

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

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

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

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

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

一、主机的查询从机正确收到,并作出了正常响应,主机接收到正常响应。db

二、主机的查询从机正确收到,并作出了正常响应,但从机返回的响应丢失或者被干扰产生了帧错误,主机等待超时。开发者

三、(几率较低,这种状况主机没法纠错)主机的查询从机正确收到,并作出了正常响应,但从机返回的响应PDU传输错误,并且错误的PDU是合法的,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使主机接收到了错误但合法的响应。

四、主机的查询从机正确收到,可是从机发现命令没法执行,返回异常响应,主机接收到包含异常码的响应。

五、主机的查询从机正确收到,可是从机发现命令没法执行,返回异常响应,但响应丢失或者包含帧错误,主机等待超时。

六、(几率极低,这种状况主机没法纠错,属于极端状况,不予考虑)主机的查询从机正确收到,可是从机发现命令没法执行,返回异常响应,但从机返回的响应PDU传输错误,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使主机接收到了错误但合法的响应。

七、主机的查询从机没有收到,或从机发现收到的查询包含帧错误,从而不进行响应,主机等待超时。

八、(几率较低,但有可能致使从机执行错误的命令,对关键命令,须要当心这种状况的发生)主机的查询PDU传输错误,并且错误的PDU是合法的,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使从机接收了错误的命令。从机返回了响应,主机接收到响应,发现响应是错误的。

九、(几率极低,但有可能致使从机执行错误的命令,对关键命令,须要当心这种状况的发生)主机的查询PDU传输错误,并且错误的PDU是合法的,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使从机接收了错误的命令。从机返回了响应,但从机返回的响应丢失或者被干扰产生了帧错误,主机等待超时。

十、(几率极低,这种状况主机没法纠错,属于极端状况,不予考虑)主机的查询PDU传输错误,并且错误的PDU是合法的,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使从机接收了错误的命令。从机返回了响应,但从机返回的响应PDU传输错误,并且错误的PDU是合法的,刚好LRC/CRC同时发生了错误,协议帧没有报错,致使主机接收到了“正确”的响应。

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

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

    状况6和10出现的几率极低,并且很难纠错,这里也不考虑。

    状况3出现的几率较低,但若是出现的话很难纠错。因此若是从机的响应结果很重要,最好屡次重复查询,确保结果的准确。固然这属于主机端的事情,因此这里也很少说。

    状况二、五、七、9从机响应超时,状况8从机响应错误,这几种状况主机都能发现错误,因此若是给主机增长重传机制,就能够提升这几种状况下的可靠性。但若是主机发送的是关键的控制命令,好比高压脉冲的开关,刹车系统的启动,这些命令若是传输错误,可能带来没法挽回的损失。这些关键的控制命令,须要准确的送达,光靠主机的出错重传没法保证其可靠性。要提升这些命令传输的可靠性,必须对从机程序进行修改。

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

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

相关文章
相关标签/搜索