Modbus功能码是Modbus协议中用于定义操作类型的指令代码,主设备通过功能码指示从设备执行特定操作,如数据读写或设备控制。常用功能码包括:0x01(读线圈状态)、0x02(读离散输入)、0x03(读保持寄存器)、0x04(读输入寄存器)用于数据读取;0x05(写单个线圈)、0x06(写单个寄存器)、0x0F(写多个线圈)、0x10(写多个寄存器)用于数据写入。功能码分为位操作(如线圈和离散输入)和字操作(如保持寄存器和输入寄存器),支持单点或多点操作,是实现工业设备数据采集、参数配置和远程控制的核心机制。
一、Modbus功能码分类
Modbus功能码分为三类,具体分类及范围如下:
- 公共功能码:明确定义且唯一,通过MODBUS.org社区验证,可公开使用。例如,读写线圈、寄存器等基本操作。
- 用户自定义功能码:分为两个范围(十进制65-72和100-110),允许用户自定义功能,但无法保证唯一性。需通过RFC流程才能转为公共功能码。
- 保留功能码:由部分公司用于旧产品,不对外公开。
类别 | 代码范围(十进制) | 说明 |
---|---|---|
公共功能码 | 1-127 | 已定义功能,如0x01-0x1B等 |
用户自定义功能码 | 65-72. 100-110 | 用户可自定义,需通过RFC转为公共码 |
保留功能码 | 未公开范围 | 公司内部使用,不开放 |
二、公共功能码详解(常用功能码列表)
以下为常用公共功能码的用途及操作对象:
功能码(十六进制) | 名称 | 操作类型 | 数据模型 | 最大操作数量 | 典型应用场景 |
---|---|---|---|---|---|
0x01 | 读线圈状态 | 读 | 线圈(可读写) | 2000 | 监控开关、继电器状态 |
0x02 | 读离散输入状态 | 读 | 离散输入(只读) | 2000 | 读取按钮、传感器二进制输入 |
0x03 | 读保持寄存器 | 读 | 保持寄存器(可读写) | 125 | 读取设备参数(如温度设定值) |
0x04 | 读输入寄存器 | 读 | 输入寄存器(只读) | 125 | 采集模拟量(如温度、压力传感器) |
0x05 | 写单个线圈 | 写 | 单个线圈 | 1 | 控制单个设备开关 |
0x06 | 写单个保持寄存器 | 写 | 单个保持寄存器 | 1 | 修改设备参数(如速度设定) |
0x0F (15) | 写多个线圈 | 写 | 多个线圈 | 1968 | 批量控制设备开关 |
0x10 (16) | 写多个保持寄存器 | 写 | 多个保持寄存器 | 123 | 批量配置设备参数 |
0x17 (23) | 读写多个寄存器 | 读写 | 保持寄存器 | 125 | 同时读取和写入多寄存器 |
0x07 | 报告从设备ID | 诊断 | – | – | 获取从设备标识信息 |
0x2B | 设备诊断 | 诊断 | – | – | 通信链路测试或错误检测 |
注:异常响应码为正常功能码加0x80(如0x86表示写入单个寄存器异常)。
三、功能码请求与响应格式
以功能码0x01(读线圈)和0x06(写单个寄存器)为例:
1.0x01 读线圈
请求帧:[从机地址][0x01][起始地址高字节][起始地址低字节][线圈数量高字节][线圈数量低字节][CRC校验]
响应帧:[从机地址][0x01][字节数][线圈状态数据(按位打包)][CRC校验]
示例:读取线圈0x0001-0x000A(共10个线圈),响应数据为2字节(16位,后6位补0)。
2.0x06 写单个寄存器
请求帧:[从机地址][0x06][寄存器地址高字节][寄存器地址低字节][写入值高字节][写入值低字节][CRC校验]
响应帧:与请求帧相同,表示操作成功。
四、Modbus RTU与ASCII模式的差异
特性 | RTU模式 | ASCII模式 |
---|---|---|
数据编码 | 二进制直接传输 | 每个字节转为两个ASCII字符 |
起始/结束标志 | 无显式标志,靠时间间隔 | 以冒号“:”开始,CR/LF结束 |
校验方式 | CRC校验(16位) | LRC校验(8位) |
传输效率 | 高(数据密度大) | 低(数据体积翻倍) |
适用场景 | 实时性要求高的环境 | 设备不支持RTU定时管理时 |
示例:字节0x5B在ASCII模式下编码为字符“5”和“B”(ASCII码0x35和0x42)。
五、扩展说明
用户自定义功能码实现:用户可在65-72或100-110范围内定义功能码,但需注意与其他设备的兼容性。
保留功能码的特殊性:部分厂商(如台达电子)在RTU模式下支持0xFE等特殊功能码,用于旧设备兼容。
数据类型处理:寄存器数据支持多字节类型(如32位浮点数),需按高/低字节顺序组合。
通过上述对照表及详解,可全面掌握Modbus功能码的核心逻辑与应用场景。实际开发中需结合设备手册确认具体实现细节。