💌 所属专栏:【Modbus协议】
😀 作 者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘
Modbus协议中,功能码 0x03 和 0x10(即16进制的10,十进制为16) 是两种常用的功能码,分别用于:
- 0x03 (Read Holding Registers):从机读取保持寄存器。
- 0x10 (Write Multiple Registers):主机向从机写入多个保持寄存器。
下面分别介绍这两种功能码在 Modbus RTU 或 TCP 模式下主从通信时的报文格式。
一、Modbus 报文通用结构
一个 Modbus 报文通常由以下部分组成:
字段 | 描述 |
---|---|
从机地址 (Slave Address) | 1字节,表示目标从站的地址(0~255) |
功能码 (Function Code) | 1字节,表示要执行的操作 |
数据域 (Data) | N字节,根据功能码不同而变化 |
CRC校验 (RTU模式) / 无 (TCP模式) | 2字节,CRC-16 校验值 |
在 Modbus TCP 中,前缀是 MBAP 头部,包含事务标识、协议标识、长度等信息。
二、功能码 0x03:读保持寄存器(Read Holding Registers)
1. 主机请求报文格式(请求从机发送数据)
字段 | 内容 | 长度(Byte) |
---|---|---|
从站地址 | Slave Address | 1 |
功能码 | 0x03 | 1 |
起始地址 High | 要读取的第一个寄存器地址高位 | 1 |
起始地址 Low | 地址低位 | 1 |
寄存器数量 High | 要读取的寄存器个数高位 | 1 |
寄存器数量 Low | 个数低位 | 1 |
CRC校验(RTU)或无(TCP) | CRC16 | 2 |
示例(RTU模式):
读从站地址为 0x01
的设备,起始地址为 0x0000
,读取 0x0002
个寄存器:
01 03 00 00 00 02 CRCL CRCH
2. 从机响应报文格式(返回数据)
字段 | 内容 | 长度(Byte) |
---|---|---|
从站地址 | Slave Address | 1 |
功能码 | 0x03 | 1 |
字节数 | 返回的数据总字节数 | 1 |
数据 | 各寄存器的值(每个寄存器占2字节) | N=2*寄存器数 |
CRC校验(RTU)或无(TCP) | CRC16 | 2 |
示例(RTU模式):
从机返回两个寄存器的值:0x1234
, 0x5678
01 03 04 12 34 56 78 CRCL CRCH
三、功能码 0x10:写多个保持寄存器(Write Multiple Registers)
1. 主机请求报文格式(写入多个寄存器)
字段 | 内容 | 长度(Byte) |
---|---|---|
从站地址 | Slave Address | 1 |
功能码 | 0x10 | 1 |
起始地址 High | 写入的第一个寄存器地址高位 | 1 |
起始地址 Low | 地址低位 | 1 |
寄存器数量 High | 要写入的寄存器个数高位 | 1 |
寄存器数量 Low | 个数低位 | 1 |
字节数 | 实际写入数据的字节数(=2*N) | 1 |
数据 | 要写入的数据(每个寄存器占2字节) | 2*N |
CRC校验(RTU)或无(TCP) | CRC16 | 2 |
示例(RTU模式):
向从站地址为 0x01
的设备,写入两个寄存器,起始地址为 0x0000
,数据为 0x1234
, 0x5678
01 10 00 00 00 02 04 12 34 56 78 CRCL CRCH
2. 从机响应报文格式(确认写入成功)
从机收到写入命令后,返回确认信息。响应报文中不包含实际数据内容,只确认写入范围。
字段 | 内容 | 长度(Byte) |
---|---|---|
从站地址 | Slave Address | 1 |
功能码 | 0x10 | 1 |
起始地址 High | 确认写入的起始地址高位 | 1 |
起始地址 Low | 地址低位 | 1 |
寄存器数量 High | 确认写入的寄存器个数高位 | 1 |
寄存器数量 Low | 个数低位 | 1 |
CRC校验(RTU)或无(TCP) | CRC16 | 2 |
示例(RTU模式):
确认从地址 0x0000
开始写入了 0x0002
个寄存器
01 10 00 00 00 02 CRCL CRCH
四、总结对比表
功能码 | 名称 | 请求方向 | 响应是否含数据 | 数据格式说明 |
---|---|---|---|---|
0x03 | Read Holding Registers | 主机 → 从机 | 是 | 返回寄存器数值 |
0x10 | Write Multiple Registers | 主机 → 从机 | 否 | 仅确认写入成功 |
五、注意事项
- 所有地址和寄存器编号都是 0-based(从0开始计数)。
- 每个寄存器占 2字节(16位)。
- CRC 校验使用 CRC-16/MODBUS 算法。
- 在 Modbus TCP 中,报文前面加一个 7 字节的 MBAP 头部,不带 CRC。
版权声明:
本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。