菜鸟科技网

Modbus命令码有哪些常见类型及作用?

Modbus协议作为一种工业领域广泛应用的通信协议,其核心在于通过不同的命令码实现对从设备的读写操作,命令码是Modbus报文中的关键字段,决定了从设备需要执行的具体功能,直接关系到数据交互的准确性和设备控制的可靠性,深入理解Modbus命令码的分类、功能及实现逻辑,对于开发、调试和维护基于Modbus的自动化系统具有重要意义。

Modbus命令码有哪些常见类型及作用?-图1
(图片来源网络,侵删)

Modbus协议支持多种传输介质(如RS-232、RS-485、TCP/IP等),但命令码的定义与传输介质无关,主要分为两大类:基于串行链路的Modbus RTU命令码和基于以太网的Modbus TCP命令码,其中大部分命令码在两种模式下功能保持一致,根据功能划分,Modbus命令码可分为 coils(线圈)读写、discrete inputs(离散输入)读取、holding registers(保持寄存器)读写、input registers(输入寄存器)读取四大类,此外还包括少量用于文件记录、诊断等功能的扩展命令码。

在基础功能命令码中,读取线圈状态(功能码01)是最常用的命令之一,用于读取从设备中1-2000个连续线圈的ON/OFF状态(0或1),主设备发送的请求报文包含从设备地址、功能码01、起始地址(两个字节,0000-FFFF)及线圈数量(两个字节),从设备成功响应后,会返回一个字节数据场,其中每一位对应一个线圈的状态,若返回字节为05(二进制00000101),则表示前两个线圈为OFF,第三、四个线圈为ON,与之相对,写入单个线圈(功能码05)则用于将指定线圈置为ON或OFF,请求报文包含从设备地址、功能码05、线圈地址及输出值(FF00表示ON,0000表示OFF),从设备响应时需回显整个请求报文以确认操作。

读取离散输入状态(功能码02)与读取线圈状态类似,但针对的是只读的离散输入点(如限位开关、按钮状态等),其报文结构与功能码01基本一致,起始地址和数量的定义范围也相同,区别仅在于数据来源为从设备的输入映射表,而非可写的线圈映射表,对于保持寄存器的读写,功能码03(读取保持寄存器)和功能码06(写入单个保持寄存器)是核心命令,保持寄存器是16位的寄存器,用于存储数值型数据(如设定值、测量值等),其地址范围通常为40001-49999(十进制)或0000-FFFF(十六进制),功能码03的请求报文包含起始寄存器地址和寄存器数量(1-125个),响应报文的数据场中每个寄存器占两个字节(大端格式);功能码06则用于写入单个16位寄存器,请求报文包含寄存器地址和写入值(两个字节),响应报文与请求报文一致,当需要写入多个保持寄存器时,可采用功能码16(写入多个寄存器),其请求报文包含寄存器数量、字节计数及连续的寄存器值,支持最多123个寄存器(246字节)的批量写入,显著提高了数据传输效率。

输入寄存器的读取通过功能码04实现,与保持寄存器不同,输入寄存器为只读,通常来自从设备的模拟输入模块(如温度、压力传感器值),其报文结构与功能码03完全相同,但数据来源为输入寄存器映射表(地址范围通常为30001-39999或0000-FFFF),除了上述基础命令码,Modbus还包含一些扩展功能码,如功能码15(强制多个线圈)与功能码16类似,但用于写入多个线圈状态;功能码22(屏蔽写寄存器)则允许对保持寄存器的特定位进行修改,而不影响其他位,适用于需要精确控制寄存器数值的场景;功能码08(诊断)用于从设备的自检和故障诊断,可通过子功能码实现不同的诊断操作,如回显数据、返回事件计数等。

Modbus命令码有哪些常见类型及作用?-图2
(图片来源网络,侵删)

在实际应用中,Modbus命令码的正确使用需注意以下几点:一是地址格式的一致性,不同设备可能采用十进制或十六进制地址,需确保主从设备地址定义统一;二是字节序问题,多字节数据(如寄存器值)需按大端格式(高位在前)传输;三是错误处理,从设备在无法执行命令时会返回异常响应,异常码指明错误原因(如非法地址、非法数据值等),主设备需具备异常处理机制;四是通信参数匹配,RTU模式需保证波特率、数据位、停止位、校验位的一致性,TCP模式则需关注MBAP报头中的单元标识符与从设备地址的对应关系。

以下是Modbus部分基础命令码的功能总结表:

功能码 功能名称 请求报文数据场 响应报文数据场 支持的数据类型
01 读取线圈状态 起始地址(2字节)、线圈数量(2字节) 字节计数(1字节)、线圈状态字节(N字节) 单个比特(ON/OFF)
02 读取离散输入状态 起始地址(2字节)、输入点数量(2字节) 字节计数(1字节)、输入状态字节(N字节) 单个比特(ON/OFF)
03 读取保持寄存器 起始地址(2字节)、寄存器数量(2字节) 字节计数(1字节)、寄存器值(2N字节) 16位有符号/无符号整数
04 读取输入寄存器 起始地址(2字节)、寄存器数量(2字节) 字节计数(1字节)、寄存器值(2N字节) 16位有符号/无符号整数
05 写入单个线圈 线圈地址(2字节)、输出值(2字节) 线圈地址(2字节)、输出值(2字节) 单个比特(ON/OFF)
06 写入单个保持寄存器 寄存器地址(2字节)、写入值(2字节) 寄存器地址(2字节)、写入值(2字节) 16位有符号/无符号整数
15 强制多个线圈 起始地址(2字节)、线圈数量(2字节)、字节计数(1字节)、线圈状态字节(N字节) 起始地址(2字节)、线圈数量(2字节) 单个比特(ON/OFF)
16 写入多个寄存器 起始地址(2字节)、寄存器数量(2字节)、字节计数(1字节)、寄存器值(2N字节) 起始地址(2字节)、寄存器数量(2字节) 16位有符号/无符号整数

相关问答FAQs:

  1. 问:Modbus功能码03和04都可以读取寄存器,它们的主要区别是什么?
    答:功能码03(读取保持寄存器)和功能码04(读取输入寄存器)的核心区别在于数据来源和访问权限,保持寄存器(功能码03)通常为可读写寄存器,用于存储用户配置的参数、设定值或中间计算结果,地址范围一般为40001-49999(十进制);而输入寄存器(功能码04)为只读寄存器,通常来自从设备的模拟输入模块或内部传感器,用于采集实时数据(如温度、压力等),地址范围一般为30001-39999(十进制),两者的数据映射表在从设备中是独立的,不可混用。

  2. 问:当Modbus从设备返回异常码04(非法数据地址)时,可能的原因有哪些?
    答:异常码04表示主设备请求的地址超出了从设备的有效范围,可能的原因包括:① 主设备发送的起始地址或寄存器/线圈数量超出从设备支持的地址范围(如从设备保持寄存器最大地址为41000,但主设备请求了41001的地址);② 地址格式不匹配,如主设备使用十六进制地址而从设备期望十进制地址;③ 从设备的映射表未配置相关地址,例如请求读取未分配的模拟输入通道;④ 通信干扰导致地址字段在传输过程中发生错误,此时需检查主从设备的地址定义、参数配置及通信线路的稳定性。

分享:
扫描分享到社交APP
上一篇
下一篇