一、Modbus RTU通信流程
如果在一个正确接收的 MODBUS ADU 中,不出现与请求 MODBUS 功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求 MODBUS 功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。
例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数据内容。
当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑 1。
主机上MODBUS 事务处理的一般处理过程,程序大致的框架也是如此。
一旦服务器处理请求,使用合适的 MODBUS 服务器事务建立 MODBUS 响应。根据处理结果,可以建立两种类型响应:
(1)一个正 MODBUS 响应:响应功能码=请求功能码
(2)一个MODBUS 异常响应:用来为客户机提供处理过程中与被发现的差错相关的信息;响应功能码 = 请求功能码 +0x80;提供一个异常码来指示差错原因。
传输模式状态图:
主节点状态图:
二、校验和异常处理
1、校验码
modbus rtu中一般使用循环冗余校验(CRC),循环冗余校验(CRC)字段为两个字节,包含一个二进制16位值,发送设备计算CRC值,将CRC值附加到报文中,在接收报文过程中,接收设备重新计算CRC值,并将计算值与接收到的CRC字段中实际值相比较,如果两个值不相等,则说明报文有错误。
通过对一个16位寄存器预装载全“1"来启动CRC计算,然后开始将报文中的后续8位字节与当前寄存器中的内容进行计算,只有每个字符中的8个数据位参与生成CRC的计算,起始位,停止位和校验
位不参与CRC 计算。
在生成CRC过程中,每个8位字符与寄存器中的值异或,然后,向最低有效位(1LSB)方向移动这个结果,而用零填充最高有效位(MSB),提取并检查LSB,如果LSB为1,则寄存器中的值与一个固定的预置值异或:如果LSB为0,则不进行异或操作。
这个过程将重复直到执行完8次移位、完成最后一次(第8次)移位之后,下一个8位字节与寄存器的当前值异或,然后像上述描述的那样重复8次这个过程,在已经计算报文中所有字节之后,寄存器的最终值就是CRC。