Modbus RTU设备接入
大约 5 分钟

一、使用流程
创建网关与子设备拓扑关系
首先需要创建网关与子设备产品,或者直接创建直连设备产品,具体配置方式参考网关与子设备文档,建立子设备与网关的拓扑关系
注意:产品通讯协议选择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分钟 |
| .... |
