一、内容简介
本篇内容主要介绍Node-Red如何通过node-red-contrib-buffer-parser插件来解析Modbus数据,此处以ModbusTCP协议为例,ModbusRTU协议的解析方法与之类似。
有关Modbus Slave软件及node-red-contrib-modbus插件的具体配置方法在Node-Red与ModbusTCP设备通信——读数据中有详细说明,在此不再赘述。
二、环境搭建
1.Modbus Slave配置
根据之前的经验,通过node-red-contrib-modbus插件采集的线圈(0x01功能码)数据直接被解析成了布尔型的数组,因此这里主要以保持寄存器(0x03功能码)为例进行说明,输入寄存器(0x04功能码)则与之类似。
一般情况下,打开Modbus Slave软件会默认新建10个保持寄存器,如果没有,则点击File->New菜单即可新建,
再点击菜单Connection->Connect...,设置连接类型为Modbus TCP/IP,端口为502,点击OK按钮确认,启动监听。
Modbus Slave支持Signed、Unsigned、Hex、Binary、Long、Float、Double等多种数据类型,如图所示,后面我们将一一说明。
2.安装插件
点击Node-Red工作区右上角的菜单,选择“节点管理”菜单项,在弹出的对话框中选择“安装”标签页,在搜索框中输入“buffer”,可以看到插件node-red-contrib-buffer-parser出现在第二行,点击该插件旁边的安装按钮进行安装,
在弹出的对话框中点击“安装”按钮再次确定,
安装完成之后,在工作区左侧的面板中多了buffer-maker和buffer-parser两个蓝色的节点。
三、数据解析
从工作区左侧面板中分别拖动一个inject节点、一个Modbus-Getter节点和一个debug节点到工作区,并将其按顺序连接,如下图
双击Modbus-Getter节点进行设置,FC选择“FC 3: Read Holding Registers”选项,Address输入“0”,Quantity输入“10”,Server IP设置为127.0.0.1,端口设置为“502”,点击完成按钮并部署流程。
1.按类型Signed解析
Modbus Slave软件中的Signed类型实际上为16位有符号整型,取值范围为-32768~32767,新建的保持寄存器(0x03功能码)默认按Signed编码,菜单项Display->Signed默认被勾选,
双击寄存器可修改其值,尝试将前三个寄存器值分别修改为1000、10000、40000,
第三个值修改失败,提示超出范围。
回到Node-Red,点击inject节点触发一次流,读一次数据,可以看到调试面板显示如下:
Modbus-Getter节点默认按类型Signed解析。
2.按类型Unsigned解析
在Modbus Slave软件选中所有寄存器,点击菜单Display->Unsigned项,将寄存器编码类型设置为Unsigned,即无符号16位整型,取值范围为0~65535,尝试将第三个寄存器的值修改为40000,修改成功。
从Node-Red左侧面板中拖放buffer-parser节点和debug节点到工作区,将其按顺序连接到Modbus-Getter节点第一个输出点。
双击buffer-parser节点进行配置,Name设置为“Unsigned”,勾选“multiple results”选项,最下面的解析类型选择“Type uint16 (be)”,Length改为“-1”,其余保持默认值,点击“完成”按钮确定,并部署流程。
为了方便查看,点击debug1节点后面的小方框,禁止其在调试面板显示信息,再点击调试面板上的删除按钮,清空日志。
通过点击inject(时间戳)节点触发一次流,可以在调试面板看到,解析的数据与Modbus Slave软件中设置的一致。
类型Hex和类型Binary实际上表示的也是16位无符号整数,只是显示方式不同,在此不另作说明。
3.按类型Long解析
Modbus Slave软件中的类型Long表示的是32位有符号整数,取值范围为-2147483648~2147483647,按照内存中排列顺序不同,分为LongABCD、LongCDAB、LongBADC、LongDCBA四种。
LongABCD
跟上面类似,选中Modbus Slave软件中的寄存器,点击菜单Display->Long AB CD将寄存器编码类型设置为LongABCD,此时寄存器的值变成了65546000和-1673527296。
回到Red-Red工作区,复制Unsigned节点及其后的debug2节点,并将其与Modbus-Getter节点连接,双击刚复制的Unsigned节点,修改Name为“LongABCD”,修改解析类型为“Type int32 (be)”,其余保持不变,
确定修改并部署流程。
触发流,读到的数据如下图所示:
与设定数据一致,解析成功。
LongDCBA
选中Modbus Slave软件中的寄存器,点击菜单Display->Long DC BA 将寄存器编码类型设置为LongDCBA,此时寄存器的值变成了271050755和16540。
在Node-Red中复制LongABCD节点及其后的debug3节点,并将其与Modbus-Getter节点连接,双击刚复制的LongABCD节点,修改Name为“LongDCBA”,修改解析类型为“Type int32 (le)”,其余保持不变,
点击“完成”按钮确定修改,并部署流程。
点击inject(时间戳)节点触发流,读到如下数据:
数值与前面一致,解析成功。
LongCDAB
将Modbus Slave软件中的寄存器编码类型设置为LongCDAB,此时寄存器的值变成了655361000和40000。
在Node-Red中复制LongDCBA节点及其后的debug4节点,并将其与Modbus-Getter节点连接,双击刚复制的LongDCBA节点,修改Name为“LongCDAB”,Byte swap选择“Swap 16”,其余保持不变,
点击“完成”按钮确定修改,并部署流程。
经测试,读到的数据如下:
与Modbus Slave软件中的数据一致。
LongBADC
将Modbus Slave软件中的寄存器编码类型设置为LongBADC,此时寄存器的值变成了-402452441和1083965440。
在Node-Red中复制LongCDAB节点及其后的debug5节点,并将其与Modbus-Getter节点连接,双击刚复制的LongCDAB节点,修改Name为“LongBADC”,修改解析类型为“Type int32 (be)”,其余保持不变,
确定修改,并部署流程。
经测试解析正确。
4.按类型Float解析
Modbus Slave软件中的类型Float表示的是32位短浮点数,取值范围为-3.4E+38 ~ 3.4E+38,按照内存中排列顺序不同,分为FloatABCD、FloatCDAB、FloatBADC、FloatDCBA四种。
在Node-Red工作区复制Long类型解析的所有节点,包括后面的debug节点,从上至下依次修改类型解析节点的名称为FloatABCD、FloatDCBA、FloatCDAB、FloatBADC,并将其连接到Modbus-Getter节点的第一个输出。
双击FloatABCD节点,将数据解析类型修改为“Type float (be)”,如下图所示,
分别以同样的方式将FloatDCBA、FloatCDAB、FloatBADC节点的数据解析类型修改为“Type float (le)”、“Type float (le)”、“Type float (be)”,修改完成后部署流程。
将Modbus Slave软件中寄存器类型修改为FloatABCD,在寄存器中输入两个数据12.5和666.25。
在Node-Red通过控制debug节点,只显示FloatABCD节点的输出信息,触发流读到了正确的数据。
以同样的方式测试其它Float解析节点,均解析正确。
注意:Modbus Slave软件中设置的寄存器类型需与Node-Red中允许显示的节点类型保持一致。
5.按类型Double解析
Modbus Slave软件中的类型Double表示的是64位短浮点数,取值范围为-1.79769313486232e308和+1.79769313486232e308,分为DoubleABCDEFGH、DoubleGHEFCDAB、DoubleBADCFEHG、DoubleHGFEDCBA四种类型。
在Node-Red工作区复制所有Float类型解析节点及其后的debug节点,并将其连接到Modbus-Getter节点的第一个输出。
双击复制的FloatABCD节点,将其改名为DoubleABCDEFGH,修改数据解析类型为“Type double (be)”,点击“完成”按钮确定修改。
分别以同样的方式依次将刚复制的其它Float节点名称改为DoubleHGFEDCBA、DoubleGHEFCDAB、DoubleBADCFEHG,对应的数据解析类型分别改为“Type double (le)”、“Type double (le)”、“Type double (be)”,修改完成之后部署流程。
修改Modbus Slave软件中寄存器类型为DoubleABCDEFGH,在寄存器中输入两个数据12.5和666.25。
在Node-Red通过控制debug节点,只显示DoubleABCDEFGH节点的输出信息,触发流之后数据解析正确。
以同样的方式测试其它Double解析节点,数据正确。
如果您想获取文章相关的代码、工具等资料,关注公众号“NodeRed物联网”,回复“nr”即可。