上一篇我们聊了Modbus最常用的四个读取数据的功能码,它们分别是:
● 01(读线圈): 读取设备内部用于控制输出的开关状态,比如灯亮不亮。
● 02(读离散输入):读取设备接收到的外部开关信号,比如按钮是否被按下。
● 03(读保持寄存器): 读取设备内部的配置参数或设定值,比如设定温度或目标转速。
● 04(读输入寄存器):读取设备的实时测量数据或动态运行状态。
今天我们一起来看看写入数据的功能码。毕竟工控嘛,只能看不能控可不行,对吧?
Modbus功能码人话版
功能码05 - 写单个线圈
(Write Single Coil)
有时也被称为强制单线圈(Force Single Coil),但还是“写单个线圈”这个说法更好理解。
还记得功能码01是用来读取开关量的吗?那功能码05就是用来改变这个开关量状态的。
这就好比你对智能家居下达指令:"把客厅的灯打开!"或者"把空调关掉!"
● 写入值 = 0xFF00 表示开(ON)
● 写入值 = 0x0000 表示关(OFF)
以上两个值是Modbus协议推荐的值。为什么不是直接用1和0呢?这是为了提高数据传输的可靠性,用相差较大的特殊数值来确保指令的准确性。
实际使用中,设备支持的写入值应以说明书为准。
功能码06 - 写单个保持寄存器
(Write Single Register)
还记得功能码03可以读取保持寄存器的值吗?功能码06就是用来修改这些值的。请注意,修改的一般是设备参数或设定值。
例如:
● 把空调的目标温度从25度改成26度
● 把传送带的目标速度从50转/分钟改成60转/分钟
它就像是一个"设定按钮",每次只能调整一个参数。
功能码15 - 写多个线圈
(Write Multiple Coils)
功能码05每次只能控制一个开关,而Modbus协议是请求-响应这种一问一答式的协议,当需要控制多个状态时,多次一问一答很低效。
功能码15则可以一次性控制多个开关。
想象一下这个场景:
你要回家了,想一次性关掉公司所有的灯。与其一个个关(用功能码05发送多次),不如用功能码15一次性发送"全部关闭"的指令,既快速又高效。
而且,功能码15支持混合状态设置,说人话就是,同一条报文中,可以灵活设置多个开关量的不同状态,不一定非要全部开启或全部关闭。
例如,1、3、5号灯开,2、4、6号灯关。这样的控制方式功能码15同样支持。
功能码16 - 写多个保持寄存器
(Write Multiple Registers)
同样的道理,功能码16是功能码06的"批量版本"。它能一次性修改多个参数值。
举个例子:空调系统需要同时设置:
● 目标温度
● 风速大小
● 运行模式
● 定时时间
用功能码16就能一次性搞定,不用发送四次功能码06的写入命令。
极简总结
Modbus协议的功能码可以按照读取和写入两大类分类:
01~04都是用于读取数据:
● 01 读取开关量
● 02 读取外部开关信号
● 03 读取设备设定参数
● 04 读取实时测量数据
05,06,15,16用于写入数据:
● 05 写单个开关量
● 15 写多个开关量
● 06 写单个设定值
● 16 写多个设定值
看到这里你或许会有疑问,为什么介绍完05和06直接就跳到15和16了?07~14这些功能码呢?16之后还有没有了?