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

滚动至顶部