Modbus RTU设备接入

页面导读
一、使用流程
创建网关与子设备拓扑关系
首先需要创建网关与子设备产品,或者直接创建直连设备产品,具体配置方式参考网关与子设备文档,建立子设备与网关的拓扑关系
注意:产品通讯协议选择ModbusRtu协议,传输协议根据设备实际情况选择Mqtt或者Tcp
至此,网关与子设备绑定的拓扑关系如下:
下面为子设备创建轮询任务:
这里就用网关设备-ModbusRtu网关设备创建任务,先找到设备详情-轮询任务
提示
注意:产品设备类型为网关设备、直连设备的支持配置轮询任务,子设备不支持
新增轮训任务

任务列表如下:

至此,modbus设备的轮询任务创建完成,当网关设备上线后,会根据定时时间自动下发轮询指令给网关。
主动采集与采集所有
主动采集:立即下发读指令读取当前物模型对应寄存器的值
采集所有:下发所有轮训指令,读取所有寄存器点位的值
二、Modbus协议
1. Modbus-RTU协议
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

- 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
- 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能
- 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
- 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确
2. Modbus功能码
Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。如下:
| 标题 | 标签 | 字段名 |
|---|---|---|
| 01H | 读取输出线圈 | |
| 02H | 读取输入线圈 | |
| 03H | 读取保持寄存器 | |
| 04H | 读取输入寄存器 | |
| 05H | 写入单线圈 | |
| 06H | 写入单寄存器 | |
| 0FH | 写入多线圈 | |
| 10H | 写入多寄存器 | |
| _ |
3. 主机对从机读数据操作

格式说明:
- 0x01:从机的地址
- 0x03:查询功能,读取从机寄存器的数据
- 0x00 0x01: 代表读取的起始寄存器地址,说明从0x0001开始读取。
- 0x00 0x01: 查询的寄存器数量为0x0001个。
- Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址
- 0xD5 0xCA: 循环冗余校验 CRC
从机回复报文格式如下:
- 0x01:从机的地址
- 0x03:查询功能,读取从机寄存器的数据
- 0x02: 返回字节数为2个 一个寄存器2个字节
- 0x00 0x17:寄存器的值是0017
- 0xF8 0x4A:循环冗余校验 CRC
| 从站地址 | 功能码 | 字节计数 | 字节1 | 字节2 | 校验 |
|---|---|---|---|---|---|
| 0x01 | 0x03 | 0x02 | 0x00 | 0x17 | 0xF8 0x4A |
4. 主机对从机写数据操作

- 0x01:从机的地址
- 0x06:修改功能,修改从机寄存器的数据
- 0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容
- 0x00 0x17: 要修改的数据值为0017
- 0x98 0x04: 循环冗余校验 CRC
- 从机回复报文一样
0106000100179804
| 0x01 | 06 | 00 01 | 00 17 | 98 04 |
|---|---|---|---|---|
| 从机地址 | 功能号 | 数据地址 | 数据 | CRC校验 |
5. 报文实例
读40005、40006两个寄存器,假设从机地址为1
下行报文:01 03 00 04 00 02 85 ca
| 从机地址 | 功能码 | 寄存器起始地址 | 读取寄存器个数 | CRC校验 |
| 01 | 03 | 00 04 | 00 02 | 85 ca |
上行报文:01 03 04 00 00 00 00 fa 33
| 从机地址 | 功能码 | 返回字节个数 | 寄存器40005数据 | 寄存器40006数据 | CRC校验 |
| 01 | 03 | 04 | 00 00 | 00 00 | fa 33 |
6. Modbus-Rtu常用功能码
| 数据类型 | 读功能码 | 写功能码 | 对象类型 |
| 线圈状态 | 01 | 05,15 | 单个位 |
| 离散量输入 | 02 | 单个位 | |
| 保持寄存器 | 03 | 06,16 | 16位字 |
| 输入寄存器 | 04 | 16位字 |
7. 寄存器起始地址(起始数据地址)
| 数据类型 | 参数地址,寄存器编号 |
| 离散量输入 | 00001~0FFFF |
| 线圈状态 | 10001~1FFFF |
| 输入寄存器 | 30001~3FFFF |
| 保持寄存器 | 40001~4FFFF |
8. 支持的功能码:

9. 轮训时间设置:
| 时间 |
|---|
| 1分钟 |
| 3分钟 |
| 5分钟 |
| 10分钟 |
| 20分钟 |
| 30分钟 |
| .... |
10. 平台配置验收
Modbus RTU 接入不仅要看串口能否通讯,还要确认平台产品、寄存器和轮询任务配置正确。
| 验收项 | 正常表现 |
|---|---|
| 产品类型 | 产品选择 Modbus 相关通讯协议 |
| 设备类型 | 直连或网关类型符合现场链路 |
| 从机地址 | 与现场仪表或 PLC 地址一致 |
| 寄存器地址 | 地址、功能码、数据类型、倍率正确 |
| 采集方式 | 需要云端主动采集时已启用云端轮询 |
| 轮询任务 | 周期合理,任务启用 |
| 数据展示 | 设备数据采集或运行状态能看到解析后的值 |
| 指令下发 | 写线圈或写寄存器能被设备响应 |
常见问题
读不到数据
优先检查串口号、波特率、数据位、停止位、校验位、从机地址、功能码和寄存器起始地址。
数据值不正确
检查字节序、数据类型、倍率、小数位、有符号/无符号,以及是否把寄存器编号和协议地址混淆。
平台没有主动采集
检查产品或设备侧是否配置轮询任务,采集方式是否勾选云端轮询,任务是否启用。
修改配置后仍然读取旧数据
检查 Redis 中 Modbus 相关缓存是否需要清理,设备或服务是否需要重启,产品发布状态是否更新。
多从机数据串扰
检查从机地址是否重复,子设备地址是否唯一,网关和子产品绑定关系是否正确。
二次开发入口
| 类型 | 路径或接口 | 说明 |
|---|---|---|
| 前端页面 | vue3/src/views/iot/product、vue3/src/views/iot/device | Modbus 配置、轮询任务和设备采集 |
| 后端接口 | /api/modbus、/modbus/config、/modbus/job | Modbus 配置和任务 |
| 产品 Modbus | /productModbus/gateway、/productModbus/job | 产品级网关和轮询配置 |
| 协议模块 | springboot/fastbee-protocol | Modbus 报文解析 |
| 服务模块 | springboot/fastbee-server | TCP/串口相关服务能力 |
