功能码与 PDU
Function Code(FC) 决定“对哪张表做什么”
正常响应:回显 FC;异常响应:FC | 0x80+ 异常码
依据:Modbus Application Protocol V1.1b3。
1. PDU 结构
请求 PDU
1 | ┌──────────────┬────────────────────┐ |
正常响应 PDU:Function Code 相同 + 数据
异常响应 PDU:Function Code + 0x80 + Exception Code(1 字节)
2. 常用功能码(必记)
| FC | 名称 | 表 | 操作 |
|---|---|---|---|
| 01 | Read Coils | 线圈 | 读多个位 |
| 02 | Read Discrete Inputs | 离散输入 | 读多个位 |
| 03 | Read Holding Registers | 保持寄存器 | 读多个寄存器 |
| 04 | Read Input Registers | 输入寄存器 | 读多个寄存器 |
| 05 | Write Single Coil | 线圈 | 写单线圈(0xFF00/0x0000) |
| 06 | Write Single Register | 保持寄存器 | 写单寄存器 |
| 15 (0x0F) | Write Multiple Coils | 线圈 | 写多线圈 |
| 16 (0x10) | Write Multiple Registers | 保持寄存器 | 写多寄存器 |
其它常见:
| FC | 用途 |
|---|---|
| 07 | Read Exception Status(串行) |
| 08 | Diagnostics |
| 20/21 | 文件记录读写 |
| 22 | Mask Write Register |
| 23 | Read/Write Multiple Registers |
| 43/14 | Read Device Identification |
以设备支持列表为准;很多仪表只实现 03/06/16。
3. 读保持寄存器示例(FC 03)
请求 Data:
| 字段 | 大小 | 含义 |
|---|---|---|
| Starting Address | 2 B | 起始地址(0-based) |
| Quantity | 2 B | 寄存器数量 |
响应 Data:
| 字段 | 含义 |
|---|---|
| Byte Count | 后续字节数 = Quantity × 2 |
| Register Values | 每寄存器 2 字节,高字节在前(大端) |
4. 写多寄存器示例(FC 16)
请求含:起始地址、数量、字节数、寄存器值…
响应通常回:起始地址 + 数量(确认),不回显全部数据。
5. 异常码(常见)
| 码 | 名称 | 含义 |
|---|---|---|
| 01 | Illegal Function | 不支持该 FC |
| 02 | Illegal Data Address | 地址/范围非法 |
| 03 | Illegal Data Value | 数据值非法 |
| 04 | Slave Device Failure | 设备故障 |
| 06 | Slave Device Busy | 忙,可稍后重试 |
排障:先看是超时无响应还是异常响应——两者原因完全不同。
6. 实现检查清单
- FC 与表类型匹配(别对输入寄存器用 06)
- 数量未超设备/规范上限
- 地址用 0-based 还是手册点号已换算
- 写线圈用
0xFF00而非0x0001(FC05) - 处理异常码,不要只当通信失败
正在加载留言…