一、内容简介
本篇主要介绍Node-Red通过node-red-contrib-modbus插件向ModbusTCP设备写数据,用Modbus Slave工具来模拟从站设备,Node-Red作为主站,从地址0开始向从站设备的线圈和保持寄存器写入一个或多个数据,分别用Modbus-Write、Modbus-Flex-Write两个节点以不同的方式来实现。
本篇内容基于Node-Red与ModbusTCP设备通信——读数据,有关Modbus Slave软件设置、node-red-contrib-modbus插件安装、节点中关联的Modbus Server的添加等操作请参考该文章,在此不再赘述。
二、设置Modbus-Write节点
1.写单个线圈
在Node-RED的工作区中,从左侧面板将一个Modbus-Write节点拖放到流程中,双击节点进行配置,在Unit-Id输入框中输入设备地址“1”,FC下拉框选择“FC 5: Force Single Coil”选项,Address输入框输入“0”,Server选择“modbus-tcp@127.0.0.1:502”选项,如果没有该选项,请参考上一篇内容进行添加,点击“完成”按钮确认。
从工作区左侧面板分别将一个inject节点、一个function节点、一个debug节点拖放到流程中,并依次连接,双击function节点进行配置,添加如下代码:
msg.payload = true;
点击“完成”按钮确认,再点击工作区右上角的“部署”按钮部署流程。
下面开始进行测试,点击前面的inject节点触发流,向Modbus TCP设备写入一个数据,此时,Modbus Slave软件中线圈地址为0处的值变为“1”,同时Node-Red工作区右侧的调试面板也会显示设备返回的数据。
双击function节点,将msg.payload的值改为false,点击“完成”确认,再部署流程。
再次点击前面的inject节点,Modbus Slave软件线圈地址为0处的值重新变为“0”。
function节点中msg.payload的值可以用“true”或“false”表示,也可以用“1”或“0”表示。
为方便区分,从工作区左侧面板拖入一个comment节点来对该流进行标注,命名为“写单个线圈”。
2.写多个线圈
在工作区按住鼠标左键拖动,选中流名称为“写单个线圈”的所有节点,按下“Ctrl+c”键或点击鼠标右键选择“复制所选节点”菜单项复制节点,再按下“Ctrl+v”键或点击鼠标右键选中“粘贴节点”菜单项粘贴节点,修改comment节点将该流命名为“写多个线圈”。
双击“写多个线圈”流中的Modbus-Write节点,将FC下拉框中的选项改为“FC 15: Force Multiple Coils”,在Quantity输入框中输入“3”,其余参数保持不变,点击“完成”按钮确认。
双击“写多个线圈”流中的function节点,修改代码如下:
msg.payload = [false,true,true];
点击“完成”按钮确定,再点击工作区右上角的“部署”按钮部署流程。
接下来进行数据写入测试,点击“写多个线圈”流中的inject节点触发流,此时,Modbus Slave软件中线圈地址从0开始的三个值分别变成了“0”、“1”、“1”,写入数据成功。
Node-Red工作区右侧调试面板显示如下:
3.写单个保持寄存器
按照上述方法在工作区复制“写单个线圈”流的所有节点,并命名为“写单个保持寄存器”。
双击该流中的Modbus-Write节点,将FC下拉框中的选项改为“FC 6: Preset Single Register”,其余参数保持不变,点击“完成”按钮确认。
双击该流中的function节点,修改代码,点击“完成”按钮确认,再点击工作区右上角的“部署”按钮部署流程。
msg.payload = 888;
接下来进行测试,点击该流前面的inject节点触发流,Modbus Slave软件中保持寄存器地址为0处的值变成了“888”,说明数据写入成功。
4.写多个保持寄存器
在工作区复制“写多个线圈”流的所有节点,命名为“写多个保持寄存器”。
双击该流中的Modbus-Write节点,将FC下拉框中的选项改为“FC 16: Preset Multiple Register”,其余参数保持不变,点击“完成”按钮确认。
双击该流中的function节点,修改代码,点击“完成”按钮确认,再点击工作区右上角的“部署”按钮部署流程。
msg.payload = [66,77,88];
然后点击该流前面的inject节点触发流,Modbus Slave软件中保持寄存器地址从0开始处的值分别变成了“66”,“77”,“88”,数据写入成功。
三、设置Modbus-Flex-Write节点
1.写单个线圈
在工作区复制“写单个线圈”流的所有节点,命名为“写单个线圈2”,从左侧面板中拖入Modbus-Flex-Write节点,替换该流中的Modbus-Write节点。
双击“Modbus-Flex-Write”节点,将Server选项改为“modbus-tcp@127.0.0.1:502”,如果已经默认选择该选项,则保持默认值不变,点击“完成”按钮确定。
双击function节点,修改代码为如下内容,确定后部署流程。
msg.payload = { value: true, 'fc': 5, 'unitid': 1, 'address': 0, 'quantity': 1 };
点击inject节点触发流,Modbus Slave软件中线圈地址为0处的值变成了“1”,
Node-Red工作台调试也显示了返回信息,写入数据成功。
2.写多个线圈
在工作区复制“写单个线圈2”流的所有节点,命名为“写多个线圈2”,
双击该流中的function节点,修改代码,确定后部署流程。
msg.payload = { value: [true,false,true], 'fc': 15, 'unitid': 1, 'address': 0, 'quantity': 3 };
点击inject节点测试,Modbus Slave软件显示如下,
成功写入多个线圈。
3.写单个保持寄存器
写单个保持寄存器跟上述流程类似,复制“写多个线圈2”的所有节点,命名为“写单个保持寄存器2”,
双击流中的function节点,修改代码,
msg.payload = { value: 666, 'fc': 6, 'unitid': 1, 'address': 0, 'quantity': 1 };
点击inject节点,测试结果如下
数据写入成功。
4.写多个保持寄存器
复制“写单个保持寄存器2”的所有节点,命名为“写多个保持寄存器2”,
将function节点中的代码修改为
msg.payload = { value: [333,444,555], 'fc': 16, 'unitid': 1, 'address': 0, 'quantity': 3 };
点击流中的inject节点测试,Modbus Slave软件显示如下
成功写入预先设置的值。
如果您想获取文章相关的代码、工具等资料,关注公众号“NodeRed物联网”,回复“nr”即可。