Modbus通信协议具有多个变种,其具有支持串口(主要是RS-485总线)、以太网。其中最著名的是
- Modbus RTU(串口)
- Modbus ASCII(串口)
- Modbus TCP(以太网)
三种。
其中Modbus RTU与Modbus ASCII均为支持RS-485总线的通信协议,其中Modbus RTU由于其采用二进制表现形式以及紧凑数据结构,通信效率较高,应用比较广泛。
而Modbus ASCII由于采用ASCII码传输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU协议,一般只有在通信数据量较小的情况下才考虑使用Modbus ASCII通信协议,在工业现场一般都是采用Modbus RTU协议,一般而言,大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。
在此我们着重讨论Modbus RTU协议,而Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码.
用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK。虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。
RTU协议中的指令由
- 地址码(一个字节)
- 功能码(一个字节)
- 起始地址(两个字节)
- 数据(N个字节)
- 校验码(两个字节)
五个部分组成,其中数据又由数据长度(2 字节,表示的是寄存器个数为 M)和数据正文(2*M
字节)组成,
RTU协议是采用3.5个字节的空闲时间作为指令的起始和结束,
一般而言,只有当从机返回数据或者主机写操作的时候,才会有数据正文,而其他时候比如主机读操作指令的时候,没有数据正文,只需要数据长度即可。