说起协议,我们对http协议比较熟悉,因为每天上网都离不开它。
http协议暂且不表,今天我介绍下modbus协议。modbus是一种应用层协议,它主要在工控场景下使用,比如PLC控制设备,上位机和PLC通过modbus协议通信。
1、modbus的概况
注意:数组长度只是个参考,后面会有详细说明。数据类型也没有列举完。modbus的网络拓扑结构也不是只有master/slave结构,还有其它的结构,比如peer to peer,每一个网络节点既可以是master,也可以充当slaver。不过master/slave结构还是比较典型的网络拓扑。
2、master/slave结构
Reques&Response
正常的请求相应如上图所示,如果发生异常的情况,请看下图:
注意,在modbus协议文档中,提到Query和Response,Query就是Request,Request&Response更多地是参考了Http。上图中的Client相当于Master,Server相当于Slave。为什么呢?因为Client首先发起了请求,所以它就是Master,Master发起查询,Slave收到查询后,解析消息,然后返回。这一点,可能初学者容易混淆。
3、modbus消息体
这里的Start和End 3.5 Char time,意思是消息的每一帧前后间隔的时间。要明确一点,3.5个字符时间是最小间隔时间。为什么需要前后间隔呢?因为modbus rtu是一个流式数据,也就是数据流,它不像modbus ASCII协议,开始位置用:标识。既没有标识,还不停顿,收到消息的一方,就懵逼了,心想:“我该如何处理呢?”
4、modbus消息解析
这是请求包的解析,通俗地说,就是:让哪个Slave,在哪个寄存器上做什么。这就涉及到三个要素: 从机地址、功能码、偏移地址(寄存器地址)。上面的含义:地址为1的从机,从00 0E寄存器开始读取10个寄存器的值。最后两个字节是CRC校验位,验证数据的完整性。如果网络传输过程中,出现数据丢失,就会知道。
Response消息,01和04都是请求时就包含的,表示从机的当前操作返回了数据。20表示10个寄存器的数据量,后面紧接着是数据,最后两位仍然是校验位。
5、modubs rtu和moudus ASCII协议区别
注意:上图中的Function 04,ASCII码这边,缺失一个4,它是把十六进制的每一位都当字符来传,每个字符占一个字节,所以Rtu用一个字节,它就得两个字节。
从上面两个图上可以看出,modbus rtu的优点很明显,在相同的速率下,传输的字节数基本上是modbus ASCII的两倍。那moubus ASCII的优势在哪里?它在传输过程中,字符之间的传输时间间隔是可以长一点的,而不会出现问题。
6、PDU和ADU
从上图可以看出,ADU是一个完成的数据包,PDU是解析时,最后要拿出来的数据。modbus rtu的数据量最大不能超过256个字节。所以,PDU最大字节数是253。同时,说明了modbus Tcp和Rtu的区别,就是有前导字节,没有校验位。
7、设备内存分布
8、常用功能码
9、modbus实际应用
油田注水仪数据接收及解析
10、小结
本篇就modbus协议的方方面面做了介绍,尤其是modbus不同协议及消息帧的解析,主从服务的交互等,希望对初入这一行的同伴有所帮助。