Modbus数据帧格式
Modbus 协议的数据帧格式是其核心组成部分,理解它有助于实现设备间的通信。以下从物理层、传输模式、协议结构三个方面详细说明:
一、物理层与传输模式
Modbus 协议支持多种物理层,常见的有两种:
- 串行通信(RTU/ASCII 模式):基于 RS-232/RS-485,适用于短距离、多设备通信。RTU 模式:数据以二进制形式传输,每个字节包含 8 位数据,用 CRC 校验,效率高,是最常用的模式。ASCII 模式:数据以 ASCII 字符形式传输,每个字节拆分为两个 ASCII 字符(如 0x5A → '5' 'A'),用 LRC 校验,可读性好,但传输效率低。
- 以太网(TCP 模式):基于 TCP/IP 协议,数据帧通过网络传输,用 MBAP(Modbus 应用协议头)标识,适用于远程通信。
二、RTU 模式数据帧格式
RTU 模式是最常用的传输模式,其数据帧结构如下:
从站地址 | 1 字节 | 标识接收数据的从设备地址(1-247),广播地址为 0(所有从设备响应)。 |
功能码 | 1 字节 | 指定操作类型(如读线圈、写寄存器等),常见功能码: - 0x01:读线圈状态 - 0x03:读保持寄存器 - 0x04:读输入寄存器 - 0x06:写单个寄存器 - 0x10:写多个寄存器 |
数据区 | N 字节 | 根据功能码不同,包含不同含义的数据。 例如:读寄存器时,包含起始地址和寄存器数量;写寄存器时,包含要写入的数据。 |
CRC 校验 | 2 字节(低字节在前) | 用于检测数据传输错误,计算范围包括从站地址到数据区的所有字节。 |
示例:读取保持寄存器(功能码 0x03)
假设主站要读取从站 1 的寄存器 0x0000~0x0002(共 3 个寄存器),数据帧如下:
plaintext
主站发送:01 03 00 00 00 03 84 0A 从站响应:01 03 06 00 01 00 02 00 03 C5 E9
- 主站请求解析:01:从站地址03:功能码(读保持寄存器)00 00:起始寄存器地址(0x0000)00 03:寄存器数量(3 个)84 0A:CRC 校验值
- 从站响应解析:01:从站地址03:功能码06:数据字节数(3 个寄存器 × 2 字节 / 寄存器 = 6 字节)00 01 00 02 00 03:3 个寄存器的值(分别为 1、2、3)C5 E9:CRC 校验值
三、TCP 模式数据帧格式
TCP 模式的数据帧在 RTU 基础上增加了 MBAP 头,结构如下:
事务标识符 | 2 字节 | 用于标识一次通信事务,主站发送时设置,从站响应时原样返回,用于匹配请求和响应。 |
协议标识符 | 2 字节 | 固定为 0(表示 Modbus 协议)。 |
长度字段 | 2 字节 | 表示后续数据(从站地址 + 功能码 + 数据区)的字节数。 |
单元标识符 | 1 字节 | 等同于 RTU 模式中的从站地址。 |
功能码 | 1 字节 | 同 RTU 模式。 |
数据区 | N 字节 | 同 RTU 模式。 |
示例:TCP 模式读取保持寄存器
主站请求:
plaintext
00 01 00 00 00 06 01 03 00 00 00 03
- MBAP 头解析:00 01:事务标识符00 00:协议标识符(0 表示 Modbus)00 06:长度字段(后续 6 字节)01:单元标识符(从站地址)
- 功能码和数据区:03:功能码(读保持寄存器)00 00:起始寄存器地址00 03:寄存器数量
四、异常响应格式
当从站接收到无效请求时,会返回异常响应,格式如下:
- 功能码:原功能码 + 0x80(如 0x03 → 0x83)
- 异常码:1 字节,指示错误类型(如 0x01:不支持的功能码;0x02:无效的数据地址)
总结
Modbus 数据帧格式设计简洁、易于实现,这也是它广泛应用的原因之一。掌握 RTU 和 TCP 模式的数据帧结构,是开发 Modbus 通信程序的基础。实际应用中,还需注意字节序、寄存器地址映射规则等细节。
更多内容全在下方专栏
全网最受欢迎的嵌入式笔试专栏
笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学
3000+订阅还会涨价,提前订阅提前享受,持续更新中。
专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
#嵌入式秋招#