ModBus协议-功能码-0x03

本文详细解析了Modbus协议中03功能码的应用,包括如何使用该功能码读取远程设备中连续的保持寄存器内容,以及请求与响应数据包的具体格式和示例。此外还介绍了异常返回情况及分析。


03 (0x03) Read Holding Registers
This function code is used to read the contents of a contiguous block of holding registers in a remote device. The Request PDU specifies the starting register address and the number of registers. In the PDU Registers are addressed starting at zero. Therefore registers numbered 1-16 are addressed as 0-15.
The register data in the response message are packed as two bytes per register, with the binary contents right justified within each byte. For each register, the first byte contains the high order bits and the second contains the low order bits.



The contents of register 108 are shown as the two byte values of 02 2B hex, or 555 decimal. The contents of registers 109–110 are 00 00 and 00 64 hex, or 0 and 100 decimal,respectively.



0x6B = 107
[108,110]

108 02 2B
109 00 00
110 00 64


Tx:01 03 00 6B 00 03
Rx:01 03 06 02 2B 00 00 00 64

发送分析

01 从站

03 功能码

00 6B 起始地址

00 03 读取个数

返回分析

01 从站 

03 功能码

06 读取的字节个数

02 2B 寄存器数值

00 00  寄存器数值

00 64 寄存器数值


异常返回分析

01 83 02

01 从站

83 命令吗 80+03

02 错误号 参看第0节 ModBus Exception codes

注意:当判断返回功能码83的时候同样需要做CRC校验,如果校验通过,则证明是从站返回来的错误提示码,如果不通过则可能是返回命令的时候受到了干扰,很有可能是将03干扰成了83.












<think>首先,用户的问题是:“我想了解Modbus-RTU功能码0x4的主机和从机协议格式 请问Modbus-RTU function code 0x4 master and slave protocol format”。所以,我需要专注于Modbus-RTU协议功能码0x04的格式。 功能码0x04是“读取输入寄存器”(Read Input Registers)。根据引用[3],它被描述为:(0x04): read input registers —> 读取输入寄存器。 现在,我需要回忆Modbus-RTU协议的基本结构。引用[4]提到:Modbus帧的格式,包括从站地址、功能码、起始寄存器地址、寄存器数量、CRC等。引用[3]给出了一个具体的帧格式示例: - 发送帧格式:slave address (1 byte), function code (1 byte), start reg (2 bytes), reg number (2 bytes), CRC (2 bytes)。 对于功能码0x04(读取输入寄存器),主机请求帧和从机响应帧的结构如下: 1. **主机请求帧(Master Request)**: - 从站地址(Slave Address):1字节 - 功能码(Function Code):1字节(0x04) - 起始寄存器地址(Starting Address):2字节(指定要读取的寄存器的起始地址) - 寄存器数量(Number of Registers):2字节(指定要读取的寄存器数量) 2. **从机响应帧(Slave Response)**: - 从站地址(Slave Address):1字节 - 功能码(Function Code):1字节(0x04) - 字节计数(Byte Count):1字节(表示数据部分的字节数) - 寄存器值(Register Values):每个寄存器2字节,因此数据长度是寄存器数量 * 2字节 - CRC:2字节 在响应帧中,字节计数表示数据部分的字节数。由于每个寄存器是16位(2字节),所以字节计数 = 寄存器数量 * 2。 现在,我需要确保我的回答使用中文,因为用户指定了“使用中文回答”。用户的问题是用中文写的,所以我应该用中文回复。 回答结构需要清晰,帮助用户逐步解决问题。系统指令说:“回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠”。 此外,我需要生成相关问题。系统指令说:“生成相关问题”。在示例中,相关问题以“§§相关问题§§”开头。 引用:我需要自然地添加引用标识。引用[^1]、[^2]、[^3]、[^4]是提供的参考,我应该基于这些引用。引用[3]直接提到了功能码0x04,所以我应该引用它。 关键点: - 主机请求帧:从站地址、功能码(0x04)、起始地址、寄存器数量。 - 从机响应帧:从站地址、功能码(0x04)、字节计数、寄存器数据、CRC。 CRC是循环冗余校验码,用于错误检测。 在Modbus-RTU中,帧以静默时间(silence period)开始和结束,但帧格式本身是上述内容。 现在,构建回答: 1. 介绍功能码0x04。 2. 解释主机请求帧格式。 3. 解释从机响应帧格式。 4. 可能给出一个示例。 5. 添加相关问题。 使用LaTeX格式: - 行内数学表达式用$...$,如地址值。 - 独立公式用$$...$$,但可能不需要复杂公式,所以用行内即可。 例如,起始地址可以是$0x0000$。 最后,生成相关问题。 相关问题示例: 1. 功能码0x04与其他读取功能码的区别? 2. 如何计算Modbus-RTU帧的CRC? 3. Modbus-RTU协议中错误处理机制? 确保回答真实可靠:基于Modbus标准协议。 完整回答结构: - 开头:简要介绍。 - 主机请求帧详细格式。 - 从机响应帧详细格式。 - 示例。 - 相关问题。 引用:在相关部分添加[^3]或[^4],因为引用[3]提到了功能码,引用[4]提到了帧格式。</think>### Modbus-RTU 功能码 0x04 协议格式详解 Modbus-RTU 是一种基于串行通信(如 RS-232 或 RS-485)的工业协议,用于主机(Master)和从机(Slave)之间的数据交换。功能码 0x04(读取输入寄存器)用于主机读取从机设备中的输入寄存器值(例如传感器数据)。每个输入寄存器为 16 位(2 字节),只读属性。下面我将逐步解释主机请求帧和从机响应帧的协议格式,确保内容真实可靠,基于 Modbus 标准协议[^3][^4]。 #### 1. **主机请求帧(Master Request)** 主机发送请求帧以查询从机输入寄存器。帧格式固定,由以下字段组成(总长度 8 字节): - **从站地址(Slave Address)**:1 字节,指定目标从机 ID,范围 $0x01$ 到 $0xF7$(1~247 十进制),其中 $0x00$ 为广播地址(但功能码 0x04 不支持广播)[^1]。 - **功能码(Function Code)**:1 字节,固定为 $0x04$(表示读取输入寄存器)。 - **起始寄存器地址(Starting Address)**:2 字节,指定要读取的第一个寄存器的地址,采用大端序(高位字节在前)。地址范围通常为 $0x0000$ 到 $0xFFFF$(例如,$0x0000$ 表示第一个寄存器)。 - **寄存器数量(Number of Registers)**:2 字节,指定要读取的寄存器数量,范围 $0x0001$ 到 $0x007D$(1~125 十进制),因为最大读取量受帧大小限制。 - **CRC 校验(Cyclic Redundancy Check)**:2 字节,基于前述字段计算出的错误检测码,用于确保数据完整性[^4]。 帧格式示例(十六进制表示): - 假设主机请求读取从机 ID $0x01$ 的起始地址 $0x0002$(第三个寄存器),数量 $0x0003$(3 个寄存器): ``` 01 04 00 02 00 03 [CRC] ``` 其中 `[CRC]` 为 CRC 计算值(如 $0x31D1$)。 #### 2. **从机响应帧(Slave Response)** 从机收到有效请求后,返回响应帧。帧格式包括数据值,长度可变(最小 5 字节 + 数据部分): - **从站地址(Slave Address)**:1 字节,回显主机请求中的从机 ID(如 $0x01$)。 - **功能码(Function Code)**:1 字节,固定为 $0x04$(与请求一致)。 - **字节计数(Byte Count)**:1 字节,表示后续数据字段的总字节数。计算公式:$ \text{寄存器数量} \times 2 $(因为每个寄存器占 2 字节)。 - **寄存器数据(Register Data)**:变长字段,每个寄存器以 2 字节大端序存储。数据长度 = 字节计数。 - **CRC 校验(Cyclic Redundancy Check)**:2 字节,基于前述字段计算[^3][^4]。 帧格式示例(十六进制表示): - 接上例,从机返回 3 个寄存器的值:$0x1234$(第一个值)、$0x5678$(第二个值)、$0x9ABC$(第三个值): ``` 01 04 06 12 34 56 78 9A BC [CRC] ``` 其中: - `06` 是字节计数(3 寄存器 × 2 = 6 字节)。 - `12 34` 等为寄存器值。 - `[CRC]` 为 CRC 计算值(如 $0x45F2$)。 #### 关键注意事项 - **错误处理**:如果请求无效(如地址越界或寄存器数量超限),从机返回异常响应(功能码 $0x84$ + 错误码),但这不是功能码 0x04 的正常格式[^3]。 - **CRC 计算**:CRC 使用多项式算法(如 CRC-16-Modbus),工具如 Modbus Poll 可辅助调试[^3]。 - **协议限制**:最大读取 125 个寄存器(250 字节数据),避免帧过长导致超时[^4]。 #### 示例场景 - **主机请求**:读取从机 $0x02$ 的起始地址 $0x0000$,数量 $0x0002$。 ``` 02 04 00 00 00 02 [CRC] ``` - **从机响应**:返回值 $0x55AA$ 和 $0x33CC$。 ``` 02 04 04 55 AA 33 CC [CRC] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值