黄昏收获 发表于 2025-5-31 18:54

Modbus RTU的通讯报文怎么看

# Modbus RTU的通讯报文怎么看

Modbus RTU通讯报文的解析需根据其结构化格式逐层拆解。

Modbus RTU报文由‌**地址域**‌、‌**功能码**‌、‌**数据域**‌和‌**CRC校验域**‌四部分组成。

```c
[从站地址 (1B)] [功能码 (1B)] [数据域 (N B)]
```

**从站地址**‌:目标设备地址(1字节),范围1~24717

‌**功能码**‌:操作类型代码(1字节),如`03`读保持寄存器、`06`写单寄存器48

‌**数据域**‌:请求/响应的具体参数(长度可变)

‌**CRC校验**‌:循环冗余校验码(2字节),验证报文完整性。使用CRC16-Modbus算法

## **常用功能码示例**‌

| **功能码**‌ | ‌**含义**‌   | ‌**请求报文数据域**‌                                     | ‌**响应报文数据域**‌         |
| ---------- | ------------ | ------------------------------------------------------ | -------------------------- |
| `03`       | 读保持寄存器 | 起始地址(2B) + 寄存器数量(2B)                        | 字节数(1B) + 寄存器值(N B) |
| `06`       | 写单寄存器   | 寄存器地址(2B) + 写入值(2B)                            | 同请求报文(回显数据)   |
| `10`       | 写多寄存器   | 寄存器地址(2B) + 数量(2B) + 字节数(1B) + 寄存器值(N B) | 写入地址(2B) + 数量(2B)    |

## **异常响应格式**‌

若操作失败,功能码变为`原功能码 + 0x80`,数据域仅含‌**异常码(1字节)**

## **案例1:读保持寄存器(功能码03)**‌

- ‌**请求**‌:`01 03 00 00 00 02 C4 0B`
- `01`:从站地址1
- `03`:读保持寄存器
- `00 00`:起始地址0
- `00 02`:读取2个寄存器
- `C4 0B`:CRC校验
- ‌**正常响应**‌:`01 03 04 00 0A 00 64 8B FB`
- `04`:返回4字节数据(2寄存器×2字节)
- `00 0A`:寄存器0的值=10(0x000A)
- `00 64`:寄存器1的值=100(0x0064)

## ‌**案例2:错误响应(功能码83)**‌

- 请求:`02 03 00 00 00 00 45 F9`(读0个寄存器,无效长度)
- 响应:

```
02 83 03 F1 31
```

- `83`:读操作异常(03+0x80)
- `03`:异常码=03(非法数据值)

页: [1]
查看完整版本: Modbus RTU的通讯报文怎么看