Modbus功能码对照表

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功能码的核心逻辑与应用场景。实际开发中需结合设备手册确认具体实现细节。

滚动至顶部
Baidu
map