功能码与 PDU

功能码与 PDU

Function Code(FC) 决定“对哪张表做什么”
正常响应:回显 FC;异常响应:FC | 0x80 + 异常码

依据:Modbus Application Protocol V1.1b3。


1. PDU 结构

请求 PDU

1
2
3
4
┌──────────────┬────────────────────┐
│ Function Code│ Data │
│ 1 byte │ 地址、数量、值… │
└──────────────┴────────────────────┘

正常响应 PDU:Function Code 相同 + 数据
异常响应 PDUFunction 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)
  • 处理异常码,不要只当通信失败

下一篇:03-串行线RTU与ASCII.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…