
什么是Modbus功能码?
简单来说,功能码是Modbus协议的核心指令集,用来告诉从站设备(Slave)具体执行什么操作。它们通常由一字节(8位)表示,范围为0x01(1)到0x7F(127),其中常用的功能码集中在0x01到0x10之间。功能码分类清晰,既适用于读(Read)操作,也支持写(Write)操作。
为了让这部分更直观,我们先来看下面的功能码表:

0x01到0x04:数据读取功能码
这四个功能码主要用于读取不同类型的数据,适用于从设备中获取传感器状态、寄存器数据等。
◆0x01-读线圈状态
描述:读取数字量输出(DO)接点的状态,即线圈的通电和断电状态。线圈是二进制值开关型数据(例如继电器状态:开/关)。主设备发送查询帧,指定要读取的线圈地址范围,从站返回对应状态数组。
案例场景: 若你需要查看PLC控制中的特定灯泡是否点亮,就可使用这个功能码读取灯的线圈状态。
◆0x02-离散输入
描述:读取数字量输入(DI)接点的状态(与功能码0x01类似,但读取的是DI接点)。与线圈类似,但“离散输入”是只读的状态数据,常用于读取传感器的开关信号。
◆0x03-读保持寄存器
描述:这是Modbus中最常用的功能码之一,用于读取存储在保持寄存器里的模拟量(例如温度值、电表读数)。支持16位无符号整数。
案例场景: 你可以用此功能码读取现场温度传感器的实时温度数据。
◆0x04-读输入寄存器
与0x03相似,但用于只读寄存器(例如设备自带的计量数据或传感器固定参数)。
0x05到0x10:数据写入功能码
与读取功能码对应,这部分功能码用于向从设备发送指令,进行数据写入或修改。
◆0x05-写单个线圈
这个功能码允许主设备改变某个线圈的状态(开/关)。常见于控制场景,比如启动一个电机或关掉一个灯。
◆0x06-写单个寄存器
用来修改特定寄存器的值。例如将一个控制阀开度设为50%。
◆0x0F-写多个线圈
支持对多个连续线圈一次性进行改写,可通过减少帧通信次数提升效率。
案例场景: 批量控制多个电机同时启动或停止。
◆0x10-写多个寄存器
这是写操作中最高效的功能码之一,支持一次性向多个寄存器写入数据。适用于复杂场景,例如配置设备的多个工作参数。
Modbus功能码的应用案例
假设需要采集一个设备中温度传感器和压力变送器数据,并同时控制若干个伺服电机的运行:
1、可以用0x03读取温控模块的加热温度,用0x04读取压力变送器数据。
2、再通过0x05控制电机线圈的启动,用0x10一次性配置多个寄存器的速度及运行参数。
通过合理选择Modbus功能码,可以大幅提升设备的通信效率和控制性能。
Modbus功能码选择的注意事项
1、兼容性检查:某些设备并不支持完整的功能码,需要查阅设备手册。
2、通信效率:用批量操作(如0x0F和0x10)替代单一操作(如0x05和0x06)可以减少通信次数,提升运行速度。
3、错误处理:当设备无法执行功能码指令时,将返回异常代码,需要在程序中妥善处理以防止中断。
从0x01到0x10的Modbus功能码几乎涵盖了读写操作的所有基础场景。对每个Modbus功能码及其适用场景的熟练掌握,是高效构建工业通信系统的基础。它不仅提高了设备间的交互效率,还能让故障排查和诊断更加快捷。