Modbus协议


Modbus RTU 报文帧格式

组成部分 长度 描述
地址域 1 Byte 从设备的地址。范围:1-247(0为广播地址,主设备用,从设备不回复)
功能码 1 Byte 指明要执行的操作类型(如读线圈、写寄存器)
数据域 N Bytes 报文的核心内容,长度和内容取决于功能码(例如,要读取的寄存器起始地址、数量等)
CRC校验 2 Bytes 循环冗余校验,用于检测传输过程中是否出现错误

功能码

功能码 (十进制) 名称 操作对象 操作类型
01 Read Coils 线圈
02 Read Discrete Inputs 离散输入
03 Read Holding Registers 保持寄存器
04 Read Input Registers 输入寄存器
05 Write Single Coil 线圈 写单个
06 Write Single Register 保持寄存器 写单个
15 (0x0F) Write Multiple Coils 线圈 写多个
16 (0x10) Write Multiple Registers 保持寄存器 写多个

读保持寄存器(0x03)

主设备请求报文

字段 值 (十六进制) 说明
地址 01 查询地址为1的从站
功能码 03 读保持寄存器
起始地址高字节 00 起始地址 40001 -> 0x0000
起始地址低字节 00
寄存器数量高字节 00 读取2个寄存器 -> 0x0002
寄存器数量低字节 02
CRC低字节 C4 对前面所有字节计算出的CRC校验码
CRC高字节 0B

从设备正常响应报文

字段 值 (十六进制) 说明
地址 01 来自地址为1的从站
功能码 03 读保持寄存器
字节计数 04 后面跟随的数据字节数(2寄存器 * 2字节/寄存器 = 4字节)
数据1(寄存器40001)高字节 00 寄存器40001的值,假设为 0x0016 (22)
数据1(寄存器40001)低字节 16
数据2(寄存器40002)高字节 00 寄存器40002的值,假设为 0x0017 (23)
数据2(寄存器40002)低字节 17
CRC低字节 79 对前面所有字节计算出的CRC校验码
CRC高字节 8A

写单个保持寄存器(0x06)

主设备请求报文格式

字段 长度 示例值 (十六进制) 说明
从站地址 1 Byte 01 要写入的从设备地址(1)
功能码 1 Byte 06 写单个寄存器的功能码
寄存器地址 2 Bytes 00 01 要写入的寄存器目标地址(例如:40002)
寄存器值 2 Bytes 00 03 要写入的数据(例如:3)
CRC校验 2 Bytes F8 4A 错误校验码

从设备正常响应报文格式

从设备在成功执行后,会原样返回主设备的请求报文。这是一种确认机制。

字段 长度 示例值 (十六进制) 说明
从站地址 1 Byte 01 从设备地址(1)
功能码 1 Byte 06 回声功能码
寄存器地址 2 Bytes 00 01 已写入的寄存器地址
寄存器值 2 Bytes 00 03 已写入的寄存器值
CRC校验 2 Bytes F8 4A 错误校验码

写多个保持寄存器(0x10)

主设备请求报文格式

字段 长度 示例值 (十六进制) 说明
从站地址 1 Byte 01 要写入的从设备地址(1)
功能码 1 Byte 10 写多个寄存器的功能码
起始地址 2 Bytes 00 00 要写入的第一个寄存器地址(例如:40001)
寄存器数量 2 Bytes 00 03 要写入的寄存器总数(例如:3个)
字节计数 1 Byte 06 后面紧跟的数据域的字节数(寄存器数量 × 2 = 3 × 2 = 6字节)
寄存器值 N × 2 Bytes 00 0A 00 0B 00 0C 要写入的数据,每个寄存器2字节。这里依次是10, 11, 12
CRC校验 2 Bytes 26 C6 错误校验码

从设备正常响应报文格式

从设备的响应不包含写入的数据,只包含确认信息:起始地址和寄存器数量。

字段 长度 示例值 (十六进制) 说明
从站地址 1 Byte 01 从设备地址(1)
功能码 1 Byte 10 回声功能码
起始地址 2 Bytes 00 00 已写入的起始寄存器地址
寄存器数量 2 Bytes 00 03 已写入的寄存器总数
CRC校验 2 Bytes 01 C8 错误校验码
posted @ 2025-10-30 15:56  D·Kingson.Mo  阅读(40)  评论(0)    收藏  举报