Modbus通信协议

Modbus简介

        Modbus是一种串行通信协议,Modbus通信设备通常通过串口RS485物理层进行通信,如果对RS485不太了解,可以看我的文章“RS232与RS485的介绍”。
        我们都知道使用RS485的网络结构可以实现Master/Slave模式的半双工通信。所以基于RS485作为物理层接口的Modbus通信协议也是一个可以实现一对多通信的半双工通信网络。

通信规则

        由于Modbus是一个Master/Slave架构的协议,所以在一个通信网络中只有一个节点是Master,其它使用Modbus参与通信的设备都是Slave。网络使用Modbus协议进行通信的所有节点一般都处于接收状态,当Master节点需要发送命令时,会由接收状态转换为发送状态,当发送完成后再次转为接收状态,而Slave节点始终处于接收状态,当Slave节点收到了地址为本节点地址的数据包后会转为发送状态,对Master节点发送应答信号,之后转为接收状态。
        Master节点在发送了Slave设备地址的数据包后都会收到Slave节点的应答信号,Master再发送下一个包含Slave设备地址的数据包,但是地址0除外,地址0是广播地址,当Master节点发送了地址为0的数据包后,所有接收到这个数据包的设备都会执行相应的命令,但都不会发送应答信号。通过这样的方式可以保证在通信网络中同一时刻只有一台设备在发送数据,避免了数据碰撞造成的误码。

编码方式

        对于串行连接有两种编码方式,分别为Modbus RTU,一种是Modbus ASCII。
        Modbus RTU:这是一种紧凑型的,采用二进制表示数据的方式,就是所使用二进制码代表一种命令和参数,RTU格式的命令/数据带有循环冗余校验的校验和。
        Modbus ASCII:这个是一种人类可读的,冗长的表示方式,就是使用说将二进制数据按照ASCII码解读后就变成了人类可以直接阅读的某种语言,ASCII格式采用纵向冗余校验的校验和。
        被配置为RTU变种的节点不会和设置为ASCII的节点通信,反之亦然。
        之后我们会介绍循环冗余校验和纵向冗余校验。