Modebus的使用
表格功能码操作对象用途你的场景例子01线圈(输出)读开关状态确认 LED 灯是否点亮02离散输入读按钮 / 传感器状态读按键是否按下05/15线圈(输出)控制开关点亮 / 熄灭 LED、蜂鸣器03保持寄存器读设备参数读 PID 参数、报警值04输入寄存器读传感器数据读温湿度、电压电流06/16保持寄存器设置设备参数修改报警上下限、设备地址控制 LED / 蜂鸣器:用的是写线圈(05)读温湿度:用的
·
Modbus RTU 串口的协议
表格
| 字段 | 长度 | 含义 | 大白话解释 |
|---|---|---|---|
| 起始间隙 | ≥3.5 字符时间 | 帧开始标记 | 总线空这么久了,设备就知道 “新报文要来了” |
| 设备地址 | 8 位(1 字节) | 从站 ID | 告诉总线:这条消息是发给哪个设备的(0~247) |
| 功能代码 | 8 位(1 字节) | 要做什么操作 | 比如 01 读线圈、03 读保持寄存器、04 读输入寄存器 |
| 数据 | N×8 位(N 字节) | 操作的具体参数 | 比如 “从地址 0 开始读 1 个寄存器” 的地址和数量 |
| CRC 校验 | 16 位(2 字节) | 数据校验 | 防传输错误,设备收到后会重新计算校验码,不对就丢弃 |
| 停止间隙 | ≥3.5 字符时间 | 帧结束标记 | 总线又空了这么久,设备就知道 “这一帧发完了” |
先看操作码 Modbus 协议的 “操作说明书”
① 读线圈状态(01)bit
你可以把它理解成:查开关的状态。线圈就是我们之前说的 “数字量输出(DO)”,比如 LED、蜂鸣器、继电器。功能码01就是让设备告诉你:“我这几个开关,现在是开还是关?”比如你想确认 LED 灯有没有被点亮,就发这个指令。
② 读离散输入状态(02)bit
理解成:查按钮的状态。离散输入就是 “数字量输入(DI)”,比如接的按钮、开关、接近传感器。功能码02就是让设备告诉你:“我这几个按钮,现在是按下还是松开?”比如你接了个按键,想知道用户有没有按它,就用这个指令。
③ 写单个线圈(05)、写多个线圈(15)bit
理解成:控制开关。
05:只控制一个开关,比如 “把 LED1 打开”15:一次控制多个开关,比如 “把 LED1、LED2、蜂鸣器都关掉”-
modbus_write_bit,底层就是用的功能码05,来控制 LED 亮灭的。
④ 读保持寄存器(03)16bit
理解成:读设备里存的 “参数”。保持寄存器里存的是设备的可配置参数,比如 PID 控制器的参数、报警上下限、设备地址等。功能码03就是让设备把这些设定好的参数发给你,你可以读出来看看对不对。
⑤ 读输入寄存器(04)16bit
理解成:读传感器的实时数据。输入寄存器里存的是设备实时采集的原始数据,比如温湿度、电压、电流。功能码04就是让设备把这些传感器数据发给你。你之前读温湿度的代码,用的就是这个功能码!
⑥ 写单个保持寄存器(06)、写多个保持寄存器(16)16bit
理解成:给设备 “设置参数”。
06:只改一个参数,比如 “把温度报警上限设为 50℃”16:一次改多个参数,比如 “把 PID 的 P、I、D 三个参数都改掉”这些参数写进去后,设备就会按你设定的新值运行。
一句话总结
表格
| 功能码 | 操作对象 | 用途 | 你的场景例子 |
|---|---|---|---|
| 01 | 线圈(输出) | 读开关状态 | 确认 LED 灯是否点亮 |
| 02 | 离散输入 | 读按钮 / 传感器状态 | 读按键是否按下 |
| 05/15 | 线圈(输出) | 控制开关 | 点亮 / 熄灭 LED、蜂鸣器 |
| 03 | 保持寄存器 | 读设备参数 | 读 PID 参数、报警值 |
| 04 | 输入寄存器 | 读传感器数据 | 读温湿度、电压电流 |
| 06/16 | 保持寄存器 | 设置设备参数 | 修改报警上下限、设备地址 |
- 控制 LED / 蜂鸣器:用的是写线圈(05)
- 读温湿度:用的是读输入寄存器(04)

传感器点位


更多推荐




所有评论(0)