modbus02报文解析
时间: 2025-07-08 22:01:48 浏览: 12
### Modbus 功能码 02 报文格式解析
#### 请求报文结构
对于Modbus功能码02,其请求报文用于读取离散输入的状态。该请求由主设备发送给从设备,具体字段如下:
- **地址域 (Address Field)**:占1个字节,表示目标从机的地址,在实际应用中有效范围为`1~247`[^1]。
- **功能码域 (Function Code Field)**:同样占用1个字节,此处固定为`02H`,表明这是一个读取离散输入的操作。
- **起始地址高字节 (Starting Address High Byte)** 和 **低字节 (Low Byte)**:这两个连续的字节指定了要读取的第一个离散输入所在的寄存器位置,采用大端序编码方式。
- **数量高字节 (Quantity of Inputs High Byte)** 和 **低字节 (Low Byte)**:这组字节定义了希望获取多少个离散输入状态的数量,最大不超过2000个。
- **错误检测域 (Error Check Field)**:通常使用CRC校验算法来确保传输过程中数据未被篡改或损坏。
示例代码展示如何构建一个简单的Modbus TCP请求帧(假设Python环境):
```python
import struct
def build_modbus_request(slave_id, start_address, quantity):
# 构建请求消息体
message_body = [
slave_id,
0x02, # 功能码02
*struct.pack(">H", start_address), # 起始地址
*struct.pack(">H", quantity) # 数量
]
# 添加CRC校验值
crc = calculate_crc(message_body)
message_body.extend(crc)
return bytes(message_body)
def calculate_crc(data):
"""计算并返回两个字节组成的CRC"""
crc = 0xFFFF
for pos in data:
crc ^= pos
for _ in range(8):
if (crc & 1) != 0:
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return [(crc >> 8) & 0xFF, crc & 0xFF]
# 使用函数创建一个针对特定从站ID、起始地址和数量的查询包
request_packet = build_modbus_request(
slave_id=1, # 假设的目标从站编号
start_address=0x0000,# 开始读取的位置
quantity=0x0E # 需要读取的离散输入数目
)
print(request_packet.hex())
```
#### 响应报文分析
当接收到上述类型的请求后,如果一切正常,则服务器会按照以下格式回复客户端:
- **地址域**:同请求一致,确认回应来自哪个从节点。
- **功能码域**:再次显示为`02H`,证明这是对之前发出的功能码02命令的回答。
- **字节数目**:指示接下来跟随了多少个字节用来描述所请求的信息;此数值等于所需读取的线圈数除以八向上取整的结果加上可能存在的填充零位。
- **数据区**:包含一系列按顺序排列的字节,每个字节代表八个离散输入的状态信息,其中最高位对应第一个输入点,最低位则关联第八个输入点。例如,“1A 15”意味着某些指定范围内存在激活状态的输入点组合[^2]。
通过以上说明可以清晰理解Modbus协议下功能码02的工作机制及其对应的通信流程。
阅读全文
相关推荐

















