ModBus协议-功能码-0x02

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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 TCP协议中的功能码0x02,也就是读离散量输入功能。首先,我需要回忆一下Modbus的基础知识。Modbus协议是一种应用层报文传输协议,常用于工业自动化领域中的设备通信。它支持多种功能码,每个功能码对应不同的操作,比如读线圈、读寄存器等。 功能码0x02属于读操作,具体是读离散量输入。这里的离散量输入应该是指只读的二进制状态,比如开关的状态,传感器是否触发等。和功能码0x01读线圈状态不同,线圈是可读可写的,而离散量输入是只读的,这点需要区分清楚。用户可能需要知道两者的区别,所以在解释时要提到这一点。 接下来,我需要确定Modbus TCP的报文结构。Modbus TCP的报文包括MBAP头(Modbus Application Protocol header)和PDU(Protocol Data Unit)。MBAP头包含事务标识符、协议标识符、长度和单元标识符。PDU则由功能码和数据组成。对于功能码0x02的请求,PDU部分应该包括功能码、起始地址和要读取的输入数量。 用户可能需要具体的报文例子,所以需要构造一个请求和响应的示例。例如,主机请求从地址0x0000开始读取16个离散量输入,功能码0x02,后面跟着起始地址的高字节和低字节,以及数量高字节和低字节。响应方面,功能码同样是0x02,后面跟着字节数,然后是按位表示的状态数据。需要注意的是,如果读取的数量不是8的倍数,最后一个字节的高位可能会填充0,这点需要说明清楚。 另外,数据解析部分也很重要。用户可能需要知道如何将接收到的字节转换为实际的位状态。比如,第一个字节的每一位对应一个输入的状态,0或1。这里需要举一个例子,比如字节0xCD对应的二进制是1100 1101,那么从地址0开始的各个输入的状态是怎样的。 错误处理也是关键。功能码0x02可能出现哪些异常码,比如非法地址或非法数据值。需要解释每个异常码代表的错误类型,以及可能的解决方法。例如,如果起始地址加上输入数量超过了设备的地址范围,就会返回异常码0x02,这时候用户需要检查地址和数量是否正确。 应用场景方面,离散量输入通常用于监控只读的二进制状态,比如紧急停止按钮、限位开关等。这些设备的状态需要被监控但不能被写入,所以使用功能码0x02来读取是合适的。而如果需要控制继电器等设备,应该使用功能码0x01或0x05来操作线圈。 最后,需要确保整个解释结构清晰,符合用户的要求,使用中文,并且正确使用LaTeX格式的数学表达式和独立公式。例如,地址转换可能需要使用十六进制表示,用$0x0000$这样的格式。同时,响应数据中的字节数计算需要用公式表达,比如$\lceil 16/8 \rceil = 2$字节。 可能还需要检查是否有遗漏的细节,比如Modbus TCP和RTU的区别,但用户只问TCP,所以可以不用深入RTU部分。另外,是否需要提到大端序或小端序?Modbus通常使用大端序,所以在处理地址和数据时需要注意字节顺序,这一点可能在示例中已经体现,但可以进一步说明。 总结一下,回答的结构应该是:功能码定义,报文格式,请求和响应示例,数据解析,错误处理,应用场景,以及与相关功能码的区别。确保每个部分都有足够的细节,并且语言简洁明了,帮助用户逐步理解。</think>### Modbus TCP协议功能码0x02(读离散量输入)详解 #### 1. **功能码定义** 功能码 **0x02** 是Modbus协议中用于**读取离散量输入(Read Discrete Inputs)**的指令。 - **离散量输入**:指设备中只读的二进制状态(1位值,0或1),例如传感器状态、开关输入等。 - **与功能码0x01的区别**:功能码0x01用于读取线圈(可读可写的二进制量),而0x02仅用于读取离散量输入(只读)。 --- #### 2. **报文格式** Modbus TCP报文由 **MBAP头(Modbus Application Protocol Header)** 和 **PDU(Protocol Data Unit)** 组成。 ##### **请求报文(主机→从机)** | MBAP头(7字节) | 功能码(1字节) | 起始地址(2字节) | 输入数量(2字节) | |----------------|----------------|------------------|------------------| | 事务ID、协议ID等 | `0x02` | 高字节 + 低字节 | 高字节 + 低字节 | - **起始地址**:需转换为16进制,例如地址0对应 `0x0000`。 - **输入数量**:需读取的离散量输入个数(1~2000)。 ##### **响应报文(从机→主机)** | MBAP头(7字节) | 功能码(1字节) | 字节数(1字节) | 数据(N字节) | |----------------|----------------|---------------|----------------| | 事务ID、协议ID等 | `0x02` | $\lceil N/8 \rceil$ | 按位存储的输入状态 | --- #### 3. **示例分析** ##### **请求示例** 假设主机请求读取从地址 `0x0000` 开始的16个离散量输入: ``` 请求报文(16进制): 00 01 00 00 00 06 01 02 00 00 00 10 ``` - **MBAP头**:事务ID `00 01`,协议ID `00 00`,长度 `00 06`,单元ID `01`。 - **PDU**:功能码 `02`,起始地址 `00 00`,输入数量 `00 10`(十进制16)。 ##### **响应示例** 假设离散量输入状态为 `1,0,1,1,0,0,1,1`(地址0~7)和 `1,0,0,0,0,0,0,0`(地址8~15): ``` 响应报文(16进制): 00 01 00 00 00 05 01 02 02 CD 80 ``` - **MBAP头**:事务ID `00 01`,协议ID `00 00`,长度 `00 05`,单元ID `01`。 - **PDU**:功能码 `02`,字节数 `02`,数据 `CD 80`(二进制:`1100 1101 1000 0000`)。 --- #### 4. **数据解析** - **字节数计算**:$\text{字节数} = \lceil \text{输入数量}/8 \rceil$。例如16个输入需2字节。 - **位顺序**:每个字节的低位对应低地址输入。例如: - 字节 `0xCD`(二进制 `1100 1101`)对应地址0~7的状态: **地址0=1, 地址1=0, 地址2=1, ..., 地址7=1**。 - 字节 `0x80`(二进制 `1000 0000`)对应地址8~15的状态: **地址8=1, 其余为0**。 --- #### 5. **错误处理** 若请求非法,从机返回异常响应: | MBAP头 | 异常功能码(1字节) | 异常码(1字节) | |-------|--------------------|---------------| | ... | `0x82` | 01/02/03/04 | - **常见异常码**: - `0x01`:非法功能码(不支持的操作)。 - `0x02`:非法数据地址(起始地址或数量超出设备范围)。 - `0x03`:非法数据值(数量超过2000)。 --- #### 6. **应用场景** - 监控传感器状态(如温度报警、液位开关)。 - 读取设备安全状态(如急停按钮、门禁信号)。 --- #### 7. **注意事项** - **地址对齐**:起始地址需从0开始递增,不可跨设备逻辑范围。 - **字节填充**:若输入数量非8的倍数,未使用的位填充0- **性能优化**:单次最多读取2000个输入,避免分多次请求。 通过功能码0x02Modbus TCP实现了对离散量输入的高效、可靠读取,适用于工业自动化中的实时监控场景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值