新闻中心
PRESS CENTERModbus是一种工业现场总线协议,通常运行于RS485总线,采用半双工即一问一答的通信机制。Modbus分为Modbus RTU/Modbus TCP/Modbus ASCII三种通信模式,网关目前支持Modbus RTU/Modbus TCP两种通信模式。
Modbus主站请求节点:根据设置的参数(地址码/功能码/寄存器起始地址/寄存器数量等)生成Modbus指令。
Modbus主站解析节点:根据匹配的Modbus主站请求节点,解析响应数据。
Modbus主站解析节点使用时需指定匹配的Modbus主站请求节点(Modbus主站请求和Modbus主站解析节点匹配码一致即可),匹配完成就会按照Modbus主站请求节点的设置来解析数据,因此Modbus主站请求和Modbus主站解析节点必须成对出现且匹配码必须唯一。
节点只对协议报文处理,并未指定相应的物理通道,因此一般配合串口或者TCP节点一起使用。从而可以灵活实现Modbus RTU / Modbus TCP / Modbus RTU over TCP / Modbus TCP over RTU。
以下介绍主要针对Modbus主站请求节点,Modbus主站解析节点无任何设置项。Modbus基础概念此处不在介绍,如果不熟悉,请参考以下资料:https://iotrouter.yuque.com/attachments/yuque/0/2024/pdf/26702863/1726737470503-a9dfc212-14fd-45f3-b41a-0feee6be77b9.pdf
输入
#高级用法-动态传参读取: msg.type = "read" #字符串:read读/write写 msg.payload = [ { "read":true, //执行读操作:必填项 "groups":"", //组名:必填项,详见点位表介绍 "name":"", //点位名称:必填项,详见点位表介绍 "slaveAddr":"1", //从机地址:必填项,详见点位表介绍 "registerAddr":"1", //偏执:必填项,详见点位表介绍 "funCode":"FC1", //功能码:必填项,详见点位表介绍 "type":"Bool", //数据类型:必填项,详见点位表介绍 "decimalPlaces":"1", //保留小数位:范围1-4(选填参数) "slope":"", //斜率K:选填参数,详见点位表介绍 "intercept":"",//截距B:选填参数,详见点位表介绍 "special":"",//特殊处理:选填参数,详见点位表介绍 } ] |
输出
msg.payload #根据配置项生成的Modbus RTU/TCP请求指令 group #当前指令的组名 protocol #协议 cmdJson #本条指令的点位信息 |
功能
1.名称
工作区内节点的命名,方便维护及记忆。
2.匹配码
当请求节点匹配码与解析节点匹配码一致时,自动完成匹配,解析节点会按照请求节点的配置进行解析。
3.协议
Modbus RTU / Modbus TCP。
4.点位表
a勾选框
请勾选要读取的点位。不勾选则不会自动读取,仅用于写入时匹配数据点用。
不勾选的点位只在写入时用作匹配数据点用。如上图所示,C未勾选则不会自动读取C点位,写入时输入格式:【msg.payload.C = 125】,当表中有数据名称为C的点位时,将会匹配该点位,并将值125写入对应的寄存器。
b组
连续 且 可读 且 从机地址相同 且 功能码相同 的点位可配置为一个组,同组点位读取会构造一条指令读取,从而大幅提高读取效率。不同组的点位,会按照一个点位构造一条指令的方式读取。
同组使用时,需严格遵守Modbus协议中关于寄存器读取最大长度的限制!
c数据名称
数据名称作为每个数据点的唯一键(key),请确保其不重复。
d从机地址
Modbus协议站号(10进制地址,范围1-255)。
连接多个从机时,可以在同一个 Modbus 主站节点的点位表中配置多个从机的寄存器地址。
e偏置
数据点的Modbus寄存器地址(填写10进制地址)。
偏置实际上是指Modbus寄存器地址,此处叫做偏执是为了统一表达。
呈现方式:Modbus寄存器地址一般以两种形式呈现:
十六进制地址:例如0X0000、0X0001
十进制地址:例如40001、40002
填写方式:
十六进制地址:将十六进制地址转换为十进制地址后加1。例如:十六进制的 0x0000 偏置填写 1;十六进制的0x0001偏执填写2
十进制地址:去掉十进制地址的首位后,直接填写偏置。例如:十进制的 40001偏置填写 1;十进制的40002偏执填写2
寄存器类型 | 地址形式 | 偏置值 |
十六进制 | 0x0000 | 1 |
十六进制 | 0x0001 | 2 |
十进制 | 40001 | 1 |
十进制 | 40002 | 2 |
f功能码
FC1:对线圈点位进行读写操作,写入操作默认采用05功能码。
FC2:对触点进行读操作。
FC3:对保持寄存器读写操作。写入时,对于单个寄存器默认使用06功能码(针对16位整型),对于多个寄存器或更大位宽(如32位、64位整形及浮点型)写入则采用10功能码。
FC4:对输入寄存器读操作,不支持写入,确保了对存储数据的非侵入式访问,适用于需要监测或收集数据而不改变其状态的场景。
g数据类型
Bool:二进制位解析。
UInt16:占用1个寄存器,2个字节,表示非负整数,数据范围 0 ~ 65535。
Int16:占用1个寄存器,2个字节,表示整数,数据范围 -32768 ~ 32767。
UInt32:占2个寄存器,4个字节,表示非负整数,数据范围 0 ~ 4294967295。
Int32:占2个寄存器,4个字节,表示整数,数据范围 -2147483648 ~ 2147483647。
Float32:占2个寄存器,4个字节,表示浮点数。
Double64:占4个寄存器,8个字节,表示浮点数。
BCD:占用n个寄存器,n*2个字节,表示16进制字符串(n=特殊处理项填入的值)。
String:占用n个寄存器,n*2个字节,表示ASCII字符串(n=特殊处理项填入的值)。
hK(斜率)/B (截距)
按照线性关系 y=kx+B计算,其中 x 是寄存器值,y 是转换后的值。
缩小10倍:K = 0.1,B = 0
放大10倍:K = 10,B = 0
i特殊处理
对于FC3功能码,要求按bit位进行数据解析时,通过在特殊处理框内输入0-15的数值,即可实现对指定数据的位解析。
在String解析模式下,特殊处理的值表示读取字符串寄存器的长度,如下图为读取5个寄存器长度的字符串数据。
在BCD解析模式下,特殊处理的值将表示读取BCD寄存器的长度,如下图为读取5个寄存器长度的BCD数据。
5.超时时间
主站发出一个请求后,等待从站应答的最长时间。如果在这段时间内没有收到从站的应答,主站会触发超时处理。
输入
msg.payload #从站响应的Modbus报文 |
输出
msg.payload #解析后的数据 msg.log #本次通信的原始请求指令和从机响应数据以及一些其它参数 { group:"",//组名 slaveAddr:1,//从机地址 funCode:1,//功能码 dataPoints:[{}],//本次读取的数据点详细配置参数 data:{},//解析后的值 reqpayload:[],//原始请求指令 message:"",//success请求成功,timeout请求超时,error请求错误,一般表示返回的报文不符合格式 reppayload:[],//从机响应的原始报文 } |
功能
名称
工作区内节点的命名,方便维护及记忆。
匹配码
当请求节点匹配码与解析节点匹配码一致时,自动完成匹配,解析节点会按照请求节点的配置进行解析。
模式
合并所有变量输出:将所有变量整合为一个key-value集合,合并输出。
每组变量单独输出:以组的维度进行输出,每个组内的变量以key-value集合的形式输出。
按组合并输出:先以组的维度将输出分类,然后构建一个嵌套的key-value结构,其中外层key为组名,内层为该组内所有变量的key-value集合,实现数据的按组聚合和有序展示。
按从机地址合并输出:先以从机地址的维度将输出分类,然后构建一个嵌套的key-value结构,其中外层key为从机地址,内层为该从机内所有变量的key-value集合,实现数据的按组聚合和有序展示。
1.读单个从机
见文末
2.读多个从机
源码:见文末
3.写从机数据
见文末
4.高级读-动态传参
允许通过msg携带配置参数修改采集指令,从而根据需求动态采集传感器数据。例如:云端根据业务需求,不同情况下,下发不同的采集命令。
源码:见文末
5.高级写-动态传参
允许通过msg携带参数动态写入数据。
源码:见文末
6.高级-组使用方法
如果配置了组,可以通过msg.group = ${组名}来读取指定组的数据。
源码:见文末
上文示例中使用到的是TCP链路的ModbusTCP协议。实际使用中,可以根据自己的需求自由组合来实现不同的应用,例如:Modbus RTU / Modbus TCP / Modbus RTU over TCP / Modbus TCP over RTU。
ModbusRTU协议 串口链路
使用场景:在串口链路上使用MobusRTU协议。
ModbusRTU协议 TCP链路
使用场景:在TCP链路上使用ModbusRTU协议。
源码/原文:https://iotrouter.yuque.com/zn3vdn/eg8000/yg8a2l602l18xc8a