一、Modbus消息帧
串口通信消息帧
在串口传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。
1.ASCII帧
使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
其它域可以使用的传输字符是十六进制的0…9,A…F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | LRC校验 | 结束符 |
---|---|---|---|---|---|
1个字符 | 2个字符 | 2个字符 | n个字符 | 2个字符 | 2个字符 |
2.RTU帧
使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 |CRC校验 |结束符
-|-|-|-|-|-
T1-T2-T3-T4|1个字节|1个字节|0-255个字节| 2个字节 |T1-T2-T3-T4
举例
现有一ModbusRTU协议的温湿度传感器
1.03功能读取数据,06功能写入设置数据
2.数据格式:9600,N,8,1(9600bps,无校验,8位数据位,1位停止位)
3.协议格式说明(数据都是16进制):
4.读操作
设备地址 | 功能码 | 数据地址 | 读取数据个数 | 16CRC码(低前高后) | ||
主机命令 | 设备地址 | 03 | 00 00 | 00 02 | CRC0 CRC1 | |
设备地址 | 功能码 | 数据字节 | 温度 | 湿度 | 16CRC码(低前高后) | |
丛机返回 | 设备地址 | 03 | 04 | T_hi T_lo | R_hi R_lo | CRC0 CRC1 |
设备地址 | 功能码 | 数据地址 | 新地址 | 16CRC码(低前高后) | |
主机命令 | 设备地址 | 06 | 00 0F | 00 09 | CRC0 CRC1 |
设备地址 | 功能码 | 数据地址 | 新地址 | 16CRC码(低前高后) | |
丛机返回 | 设备地址 | 06 | 00 0F | 00 09 | CRC0 CRC1 |
TCP协议消息帧
Modbus TCP的协议构成可以分为, 报文头, 功能码, 数据码 这几个部分
结构 | 名称 | 长度 | 示例 | 备注 |
报头文 | 事务处理标识符 | 2个字节 | 97 79 |
客户机发起,服务器复制,用于事务处理配对,可以自行设定 |
协议标识符 | 2个字节 | 00 00 |
客户机发起,服务器复制,表示该协议是TCP协议,是固定值,不可以更改 | |
长度标识符 | 2个字节 | 00 06 |
表示该数据帧中,从本子节到最后一个字节的字节个数,根据当前数据帧的情况设定 | |
单元标识符 | 1个字节 | 03 | 客户机发起,服务器复制,这是一个站点号,在多设备通讯时,用来表示该数据的来源于哪个设备或者该数据要去往哪个设备 | |
功能码 | 功能码 | 1个字节 | 05 | 05表示对线圈进行写操作 |
数据码 | 线圈地址 | 2个字节 | 00 10 |
表示对地址为17的线圈进行操作 |
操作命令 | 2个字节 | FF 00 |
FF 00 表示将该线圈置1,00 00 表示将该线圈置0 |
ModbusTCP消息帧与串行链路消息帧的区别
MODBUS TCP和MODBUS RTU的差别不是很大。二者相同的地方是应用数据单元是一致的。差别是MODBUS TCP是传输在TCP/IP网络上的,多了一个报文头,少了CRC校验,采用TCP的502端口,RTU多了设备地址和CRC校验。