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

#嵌入式秋招#
全部评论

相关推荐

12-19 22:04
武汉大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务