Modbus设备接入
# 一、
首选需要创建网关与子设备产品,建立子设备与网关的拓扑关系:参考 网关与子设备 文档
至此,网关与子设备绑定的拓扑关系如下:
下面为子设备创建轮训任务:
这里用子设备01距离创建任务:
# 找到子设备-设备详情-轮训任务
# 新增轮训任务
# 支持的功能码:
# 轮训时间设置:
时间 |
---|
1分钟 |
3分钟 |
5分钟 |
10分钟 |
20分钟 |
30分钟 |
.... |
# 任务列表如下:
至此,modbus子设备的轮训任务创建完成,当网关设备上线后,会自动下发轮询指令。
# 主动采集与采集所有
主动采集 :立即下发读指令读取当前物模型对应寄存器的值
采集所有 :下发所有轮训指令,读取所有寄存器点位的值
# 二、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 |