Modbus设备接入
# 一、
首选需要创建网关与子设备产品,建立子设备与网关的拓扑关系:参考 网关与子设备 文档
至此,网关与子设备绑定的拓扑关系如下:
![](/doc/assets/img/img15.0daa18a7.png)
下面为子设备创建轮训任务:
这里用子设备01距离创建任务:
# 找到子设备-设备详情-轮训任务
![](/doc/assets/img/img16.8b316bb7.png)
# 新增轮训任务
![](/doc/assets/img/img17.7193685d.png)
# 支持的功能码:
![](/doc/assets/img/img20.e7224634.png)
# 轮训时间设置:
时间 |
---|
1分钟 |
3分钟 |
5分钟 |
10分钟 |
20分钟 |
30分钟 |
.... |
# 任务列表如下:
![](/doc/assets/img/img18.21878a7a.png)
至此,modbus子设备的轮训任务创建完成,当网关设备上线后,会自动下发轮询指令。
# 主动采集与采集所有
主动采集:立即下发读指令读取当前物模型对应寄存器的值
采集所有:下发所有轮训指令,读取所有寄存器点位的值
![](/doc/assets/img/img19.6c4fe9fe.png)
# 二、Modbus协议
# 1. Modbus-RTU协议
个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。
- 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
- 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.
- 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
- 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确
# 2. Modbus功能码
Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。如下:
标题 | 标签 | 字段名 |
---|---|---|
01H (opens new window) | 读取输出线圈 | |
02H (opens new window) | 读取输入线圈 | |
03H (opens new window) | 读取保持寄存器 | |
04H (opens new window) | 读取输入寄存器 | |
05H (opens new window) | 写入单线圈 | |
06H (opens new window) | 写入单寄存器 | |
0FH (opens new window) | 写入多线圈 | |
10H (opens new window) | 写入多寄存器 | |
_ (opens new window) |
# 3. 主机对从机读数据操作
0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取. 0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址 0xD5 0xCA: 循环冗余校验 CRC
从机回复报文格式如下: | 从站地址 | 功能码 | 字节计数 | 字节1 |字节2 | 校验 | | 0x01 | 0x03| 0x02| 0x01 | 0x00| 0x17| 0xF8 0x4A |
0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x02: 返回字节数为2个 一个寄存器2个字节 0x00 0x17:寄存器的值是0017 0xF8 0x4A: 循环冗余校验 CRC
# 4. 主机对从机写数据操作
x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容 0x00 0x17: 要修改的数据值为0017 0x98 0x04: 循环冗余校验 CRC
从机回复报文一样
0106000100179804
0x01 | 06 | 00 01 | 00 17 | 98 04 |
---|---|---|---|---|
从机地址 | 功能号 | 数据地址 | 数据 | CRC校验 |
# 5.主机对从机读数据操作
0103020017F84A
0x01 | 03 | 00 01 | 00 01 | D5 CA |
---|---|---|---|---|
从机地址 | 功能号 | 数据地址 | 读取数据个数 | CRC校验 |
0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
0x01 06 00 01 00 17 98 04 从机地址 功能号 数据地址 数据 CRC校验
# 6. 报文实例
读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 21 33
从机地址 | 功能码 | 返回字节个数 | 寄存器40005数据 | 寄存器40006数据 | CRC校验 |
01 | 03 | 04 | 00 00 | 00 00 | 21 33 |
# 7. Modbus-Rtu常用功能码
数据类型 | 读功能码 | 写功能码 | 对象类型 |
离散量输入 | 02 | 单个位 | |
线圈状态 | 01 | 05,15 | 单个位 |
输入寄存器 | 04 | 16位字 | |
保持寄存器 | 03 | 06,16 | 16位字 |
# 8. 寄存器起始地址(起始数据地址)
数据类型 | 参数地址,寄存器编号 |
离散量输入 | 00001~0FFFF |
线圈状态 | 10001~1FFFF |
输入寄存器 | 30001~3FFFF |
保持寄存器 | 40001~4FFFF |