ModBus协议-功能码-0x02

本文介绍Modbus协议中使用功能码02读取远程设备中连续的离散输入状态的方法。详细解释了请求与响应PDU的具体内容,包括起始地址、输入数量及如何将状态打包为数据字段。


02 (0x02) Read Discrete Inputs
This function code is used to read from 1 to 2000 contiguous status of discrete inputs in a remote device. The Request PDU specifies the starting address, i.e. the address of the firstinput specified, and the number of inputs. In the PDU Discrete Inputs are addressed starting at zero. Therefore Discrete inputs numbered 1-16 are addressed as 0-15.The discrete inputs in the response message are packed as one input per bit of the data field.Status is indicated as 1= ON; 0= OFF. The LSB of the first data byte contains the input addressed in the query. The other inputs follow toward the high order end of this byte, and from low order to high order in subsequent bytes. If the returned input quantity is not a multiple of eight, the remaining bits in the final d ata byte will be padded with zeros (toward the high order end of the byte). The Byte Count field specifies the quantity of complete bytes of data.

The status of discrete inputs 204–197 is shown as the byte value AC hex, or binary 1010 1100. Input 204 is the MSB of this byte, and input 197 is the LSB.
The status of discrete inputs 218–213 is shown as the byte value 35 hex, or binary 0011 0101.Input 218 is in the third bit position from the left, and input 213 is the LSB.

Tx:01 02 00 C4 00 16
Rx:01 02 03 AC DB 35

0xC4 = 196
0x16 = 22

[197,218]



[197,204]
[205,212]
[213,218]


[204,197] 204:MSB 197:LSB
[212,205] 212:MSB 205:LSB
[218,213] 218:MSB 213:LSB










<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] ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值