新闻中心
PRESS CENTER本文主要实现的功能:使用EG系列网关,对Modbus TCP协议从站实现写数据操作。Modbus RTU与Modbus TCP协议的区别在网关上的体现仅仅是一个配置项,因此不单独区分介绍。
节点使用详情查看:此处为语雀内容卡片,点击链接查看:https://iotrouter.yuque.com/zn3vdn/eg8000/deauhgopg8ggogap
确认点位信息
线圈:
功能码:01/05/0F | ||
寄存器地址 | 权限 | 解析方式 |
0x0000 | 读写 | 位 |
0x0001 | 读写 | 位 |
保持寄存器:
功能码:03/06/10 | ||
寄存器地址 | 权限 | 解析方式 |
0x0000 | 读写 | 16位无符号整型 |
0x0001 | 读写 | 16位无符号整型 |
写单个线圈(静态方式写)
从节点库拖出一个Modbus 写节点,两个注入节点来注入开和关,调试节点打印写入成功还是失败。如下图所示:当点击注入的时候,左侧Modbus模拟从机的第一个线圈点位会跟随变化。
写单个线圈(动态方式写)
Json格式:
{ uid: 1, //从机地址 fc: 5,//功能码写单个线圈 address: 0,//寄存器地址 value: false//写入的状态 } |
相比于静态的优势:不需要一个点位用一个写节点,要写入的寄存器地址以及要写入的值都可以通过传参的方式去动态修改。
写多个线圈(静态方式写)
示例写入两个线圈 0x0000和0x0001。当点击注入的时候,左侧Modbus模拟从机的两个线圈点位也会跟随变化:
Q:为什么注入3两个继电器闭合,注入0两个继电器会断开?
[3](十进制) = [00000011](二进制) ,按照Modbus协议规范,写线圈是按位写。因此 [00000011]表示从起始寄存器开始的两个线圈闭合。同理, [0]表示断开。
写多个线圈(动态方式写)
Json格式:
{ uid: 1, //从机地址 fc: 15,//功能码写多个线圈 address: 0,//寄存器地址 quantity: 2,//写入的寄存器数量 value: [3]//写入的值,写多个传入数组 } |
以下示例为,收到“open”字符串则闭合两个线圈,收到“close”字符串则断开两个线圈:
写单个保持寄存器(静态方式写入)
向寄存器0x0000写入100,当点击写入后左侧Modbus从机寄存器0x0000的值变成100:
写单个保持寄存器(动态的方式写入)
Json格式:
{ uid: 1, //从机地址 fc: 6,//功能码 写单个保持寄存器 address: 0,//寄存器地址 value: msg.payload//写入的值,写多个传入数组 } |
写多个保持寄存器(动态写入)
Json格式:
{ uid: 1, //从机地址 fc: 16,//功能码 写多个保持寄存器 address: 0,//寄存器地址 quantity: 2, //写入的寄存器数量 value: [0x03,0xE8,0x00,0xC8]//写入的值,写多个传入数组 } |
写多个不支持静态写入,因为需要传入参数格式是数组。以上参数配置为动态的形式向寄存器0x0000写入1000,0x0001写入200。
Q:为什么写入1000,2000,实际传参是 [0x03,0xE8,0x00,0xC8]?
[1000](十进制) = [0x03E8](十六进制HEX)
[200](十进制) = [0x00C8](十六进制HEX)
如上所示,实际传参为要写入值的十六进制,拆分为2个字节的表现形式。(Modbus协议规范)
源码:https://iotrouter.yuque.com/zn3vdn/eg8000/nm3zgvrtlcssmlbd