[经验分享] Modbus RTU 通讯协议格式

[复制链接]
74|1
观海 发表于 2026-8-4 11:32 | 显示全部楼层 |阅读模式
核心比喻
办公楼 = 一条RS485通讯总线。

每个房间 = 一个设备(例如:1号房间是电表,2号房间是温湿度传感器)。

对讲机频道 = 设备地址。只有调到正确频道(地址)的房间才会应答。

说话内容 = 数据帧。必须快速、连续地说完一整句话,不能有长时间的停顿。

说话格式 = 协议格式。每句话都必须按照固定的格式说,否则对方听不懂。

Modbus RTU 数据帧的固定格式
一帧完整的数据(一句话)就像下面这个表格,它是一串十六进制数:



关键特点:

一问一答:主设备问一帧,从设备答一帧。

连续传输:一帧数据中的所有字节必须连续发出,帧与帧之间需要有至少3.5个字符时间的静止间隔(就像说完一句话要停顿一下,表示说完了)。

二进制/十六进制:它传输的是原始的二进制数据(通常用十六进制显示),非常紧凑高效。

两个最常见的例子(一看就懂)
例子1:主设备读取数据(功能码03)
主设备问: “201房间(地址=0xC8),把你从第0号表格开始(起始地址=0x0000)的2个数据(数量=0x0002)读给我听!”
对应的RTU报文(十六进制):
C8 03 00 00 00 02 **CRC码**

C8 = 设备地址(201)

03 = 功能码(读)

00 00 = 起始寄存器地址(0)

00 02 = 要读的寄存器数量(2)

CRC码 = 由前面所有字节计算得出的校验码

从设备答: “201房间收到!我读了2个数据,每个数据占2字节,所以一共4字节,数值分别是1234和5678。”
对应的RTU报文(十六进制):
C8 03 04 04 D2 16 2E **CRC码**

C8 = 我的地址(201)

03 = 功能码(读)

04 = 后面数据字节的总数(4个字节)

04 D2 = 第一个寄存器的值(0x04D2 = 十进制1234)

16 2E = 第二个寄存器的值(0x162E = 十进制5678)

CRC码 = 校验码

例子2:主设备写入单个数据(功能码06)
主设备问: “201房间,请把你的第1号表格(寄存器地址=0x0001)的值改成288(数据=0x0120)!”
对应的RTU报文(十六进制):
C8 06 00 01 01 20 **CRC码**

06 = 功能码(写单个寄存器)

00 01 = 要写的寄存器地址(1)

01 20 = 要写入的值(0x0120 = 十进制288)

从设备答(成功时): “已修改成功!”(原样返回主设备发来的命令作为确认)
C8 06 00 01 01 20 **CRC码**

总结要点
地址先行:每句话开头都要先喊名字(设备地址)。

功能码定意图:第二个字节***说明要“读”还是“写”等操作。

数据域是细节:说明具体操作哪里、操作多少。

CRC保安全:结尾的校验码像“暗号”,确保数据在传输途中没出错。

RTU模式:数据是紧凑的二进制,用十六进制表示,帧间有停顿。

简单说,Modbus RTU就是一种结构简单、格式固定、高效可靠的串行通讯约定,让主设备能够有序地访问和操作各个从设备的数据。工业上广泛应用就是因为其简单和稳定。
————————————————
版权声明:本文为CSDN博主「运气值爆棚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40539316/article/details/155784373

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
作业天敌在此 发表于 2026-8-31 22:05 | 显示全部楼层
学习了,原来Modbus RTU的数据帧是这么回事,一问一答的交互方式确实很高效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

253

主题

4731

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0