七、功能码与数据模型

7.1 四种数据表

Modbus 定义四种独立的数据表,不依赖传输方式(RTU/TCP通用):

数据表数据类型访问权限读功能码写功能码数据类型数量
离散输入 (Discrete Input)1位只读02-1-65536
线圈 (Coil)1位读写0105(单)/15(多)1-65536
输入寄存器 (Input Register)16位只读04-1-65536
保持寄存器 (Holding Register)16位读写0306(单)/16(多)1-65536

地址范围:理论上 0x0000 ~ 0xFFFF(0-65535),某些实现使用 1-based 地址(需转换)。

7.2 基础功能码详解

7.2.1 功能码 01:读线圈

请求PDU:

字段长度值
功能码1字节0x01
起始地址2字节0x0000 ~ 0xFFFF
线圈数量2字节1 ~ 2000

响应PDU:

字段长度值
功能码1字节0x01
字节数1字节N(=ceil(线圈数/8))
线圈状态N字节每bit对应一个线圈,最低有效位对应起始地址

线圈打包规则:

  • 线圈0(起始地址)→ 字节0的bit0

  • 线圈7 → 字节0的bit7

  • 线圈8 → 字节1的bit0

7.2.2 功能码 03:读保持寄存器

请求PDU:

字段长度值
功能码1字节0x03
起始地址2字节0x0000 ~ 0xFFFF
寄存器数量2字节1 ~ 125

响应PDU:

字段长度值
功能码1字节0x03
字节数1字节N(=2 × 寄存器数)
寄存器值N字节每寄存器2字节,大端序
7.2.3 功能码 06:写单个寄存器

请求PDU:

字段长度值
功能码1字节0x06
寄存器地址2字节0x0000 ~ 0xFFFF
寄存器值2字节任意

响应PDU:回显请求(功能码+地址+值)

7.2.4 功能码 16 (0x10):写多个寄存器

请求PDU:

字段长度值
功能码1字节0x10
起始地址2字节0x0000 ~ 0xFFFF
寄存器数量2字节1 ~ 123
字节数1字节2 × 寄存器数量
寄存器值N字节每寄存器2字节

响应PDU:

字段长度值
功能码1字节0x10
起始地址2字节回显
寄存器数量2字节回显

7.3 高级功能码详解

7.3.1 功能码 23 (0x17):读/写多个寄存器(原子操作)

用途:同时修改和读取,保证中间状态不被其他客户端干扰(如电机位置控制、PID参数调整)。

请求PDU:

字段长度值
功能码1字节0x17
读起始地址2字节-
读数量2字节1 ~ 125
写起始地址2字节-
写数量2字节1 ~ 121
写字节数1字节2 × 写数量
写数据N字节待写入值

响应PDU:

字段长度值
功能码1字节0x17
字节数1字节2 × 读数量
读数据N字节读取的寄存器值

示例:先写寄存器0x0000=0x1234,0x0001=0x5678,再读0x0002开始的2个寄存器。

7.3.2 功能码 43 (0x2B):设备识别

用途:获取设备信息(厂商名、产品代码、版本号等)。

子功能码 14 (0x0E):读设备标识

请求PDU:

字段长度值
功能码1字节0x2B
子功能码1字节0x0E
读取类型1字节01=基本, 02=常规, 03=扩展
对象ID1字节起始对象ID
数量2字节要读取的对象数量

响应PDU:

字段长度值
功能码1字节0x2B
子功能码1字节0x0E
更多标志1字节0x00=无更多, 0xFF=还有
下一对象ID1字节-
对象数量1字节返回的对象数
对象列表变长每对象:ID+长度+数据

预定义对象ID:

ID说明示例
0x00厂商名"Schneider Electric"
0x01产品代码"TM221CE40R"
0x02版本号"V2.1.0"
0x03-0x7F保留-
0x80-0xFF用户自定义-
7.3.3 功能码 08 (0x08):诊断(仅串行线)

子功能码:

子功能码说明Modbus TCP替代
0x0000回显请求/响应TCP ping
0x000A计数清零无

7.4 异常响应

当服务器/从站无法处理请求时,返回异常响应:

异常响应PDU:

字段长度值
功能码1字节原功能码0x80
异常码1字节见下表
异常码名称说明常见原因
0x01非法功能不支持该功能码读只写寄存器、功能码不存在
0x02非法数据地址寄存器地址超范围地址超出设备支持范围
0x03非法数据值写入值不合法写入值超出允许范围、数量为0
0x04从站设备故障设备内部错误硬件故障、校验错(已过CRC)
0x05确认正在处理长命令少见,响应后需等待
0x06从站忙设备正忙RS485总线上尝试重试
0x07否认无法执行权限不足、条件不满足
0x08内存奇偶错误内存错误极少见(老旧设备)
0x0A网关路径不可用TCP网关错误单元ID无效
0x0B网关目标无响应TCP网关超时下游RTU设备无响应

异常响应示例(RTU格式):

请求: 01 05 00 00 00 02 CRC(写线圈地址0x0000,值0x02无效)
响应: 01 85 03 CRC(85=05|0x80, 03=非法数据值)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐