# 工业树莓派零代码实现工业协议与MQTT互转

- URL: https://wuming.si/blog/3415/
- Author: Aaron
- Published: 2021-10-25
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: https://blog.wo.ai/archives/3415

在以往的文章中，我们已经介绍了虹科的工业树莓派与Node-RED之间配合的种种可能性。今天，我们将通过实操案例，来看看如何使用Node-RED，以拖拽式低代码，甚至是无代码编程的方式，轻松实现工业协议与MQTT互转以及简单的HMI数据面板，帮助您有效降低在OT协议方面的学习成本，在低经验，甚至是无OT编程经验的情况下，快速在OT协议中的数据与云端数据之间建立联系。

准备工作

1.硬件准备

PC一台

工业树莓派一台

24V直流电源

网线

相关协议网关模块（可选，根据实际需求添加）

2.软件准备

PC上：

Chrome内核的浏览器

树莓派上：

Node-RED、Node-RED RevPi Nodes Server（默认已预装，若发现预装缺失，或需要版本更新可联系广州虹科获取相关文档）

node-red-dashboard（可选，用于制作简单的HMI数据面板）

操作步骤

1.树莓派上电，连好网线，使用Advanced IP Scanner或类似软件扫描工业树莓派的IP地址，或在路由器后台中直接查看DHCP客户端列表，从而确定树莓派所在IP地址。

2.浏览器打开树莓派所在IP地址，出现登录画面，账号为admin，默认密码会印在机身侧面的贴纸上，每台机子默认密码各不相同。

3.登录后打开SERVICES选项卡，分别将以下三项设为Enable，最后点SAVE ALL保存设置。

Modbus Master（本文以Modbus为例，因此需要将Modbus主站功能使能，若不使用Mobus协议则无需Enable此项）

Node-RED

Node-RED RevPi Nodes Server

4.回到APPS选项卡，点击PiCtory右边的START进入树莓派的模块配置界面——PiCtory。

5.首先把主模块按实际情况从左边设备列表中拖到右边（作为例子，本文使用Core作为主模块），把其它IO模块和协议网关模块按实际情况中的左右物理位置，按顺序把模块拖到主模块两边（本文没有使用额外模块）。最后，若要使用主模块的Modbus RTU/TCP主站功能，则在Virtual Devices中找到相应的虚拟模块，拖动到右边，如下图所示。

6.设置相应的协议模块，本文以设置Modbus TCP主站为例：选定要设置的Modbus TCP主站虚拟模块，在右下角变量表中拖到最下方，在slave_IP_address中填入Modbus TCP从站所在IP地址，slave_TCP_port中填入Modbus TCP通讯设置的端口号，默认是502。

7.对着Modbus TCP主站虚拟模块右键点击，打开Extended Data设置界面，并按实际情况设置Modbus变量地址等相关参数，输入完成后点OK确定，附上本文Modbus TCP从站相关参数表：

8.配置完成后点上方菜单的File -> Save as Start-Config. 保存到启动方案，然后点Tools -> Reset Driver立即使配置生效。

9.开一个新标签页，再次输入树莓派IP打开工业树莓派设置主页，点击Node-RED右边的START，或直接访问 [树莓派IP]:1880 进入Node-RED编程界面。

10.在左边的节点列表中找到Revolution Pi分类，此分类底下的节点即为专为工业树莓派设计的节点。拖动一个revpi-multiple-input节点到右边网格区域，然后双击打开对其进行配置。先点击Server右边的铅笔案例，保持默认的localhost地址和8000端口，其它参数保持留空，然后点击右上角的添加，最后在Input Pins列表中找到以下3个变量（该列表只能找到输入变量，输入是对树莓派而言），分别勾上然后点右上角的完成。

Input_Word_1

Input_Word_2

Input_Word_3

11.拖一个Debug节点到revpi-multiple-input节点的右边，简单的把两个模块连上，点整个网页右上角的“部署”。

12.把Modbus TCP从站中的变量值稍作更改，这里我把从站中地址1变量的值改成了321（revpi-multiple-input节点需要它监视的变量中至少一个值有变化，才会向后面的节点输出信息），此时在Debug信息区中找到如下信息表示Modbus TCP数据获取成功。（变量属性是数字形式或者字符串形式都没关系，不影响后续使用）。

13.按下图方式配置节点，其中MQTT输入输出节点仅需配置MQTT地址、端口、Topic等基本信息即可，本文把树莓派的发布Topic设为了RevPiPub，订阅Topic设为了RevPiSub。

分割消息和消息分流节点配置分别如下。

分流节点右边的3个节点为revpi – output，默认会选定前面设置过的localhost:8000作为Server，这部分不需要更改，在下方Pin中分别选择3个输出变量名Output_Word_1、Output_Word_2、Output_Word_3即可。

14.修改完成后，别忘了点击整个网页右上角的“部署”。然后我们尝试把Modbus TCP从站中地址2变量的值改成44555，此时即能通过MQTT获取到一条记录Modbus变量的信息。

15.随后我们通过MQTT发送指令，分别通过JSON中out1、out2、out3三个字段，修改3个Modbus写入变量的值，效果如下图。

16.至此，MQTT和工业通讯协议中的变量交互已经完成，我们既实现了MQTT数据上传，也实现了数据下发。接下来，我们可以尝试创建一个简单的HMI数据面板。首先，在Node-RED右上角的“三”菜单中找到“节点管理”，然后进入“安装”选项卡，搜索node-red-dashboard并安装（安装速度取决于网络环境和树莓派工作负载）。

17.我们在前面的基础上，额外加上按下图形式编排的一些节点。其中左边一列节点均为inject节点，被设为每秒为周期重复注入字符串（变量名），中间一列节点全是工业树莓派专用节点中的revpi – getpin，用以通过变量名获取值，右边全是dashboard分类下的gauge。

18.点击部署后，浏览器访问 访问 [树莓派IP]:1880/ui 即可看到由Node-RED自动生成的简易HMI数据面板。

总结

通过以上的简单步骤，我们可以轻松实现Modbus变量数据与MQTT的交互，中途没有输过任何一行代码，甚至没有进入过命令行界面，全部都是浏览器上的设置操作，其它工业树莓派所支持的通讯协议的配置也是大同小异。总的思路就是给树莓派设置好相应的参数，树莓派自动从相应协议中获取值并存到变量中，我们只需要在Node-RED中拖拽编程，把变量送到MQTT发送组件即可。这种编程方式大幅降低了非OT从业人员开发相关应用的学习成本，用户也不用担心之前从未使用过树莓派，甚至完全没有Linux系统使用经验也没关系。此外，利用Node-RED上的其它开源节点，我们也能够以MQTT以外的多种方式传输数据、以丰富多样方式的展示数据。有编程经验的用户，也可以通过function节点在发送前对数据进行运算、过滤等多种处理，甚至利用exec节点接入其它应用，进行更为复杂的边缘运算。
