基于reTerminal DM与Node-RED的工业边缘HMI系统实战部署指南

📅 2026/8/2 11:28:06
基于reTerminal DM与Node-RED的工业边缘HMI系统实战部署指南
1. 项目缘起当工业边缘计算遇上可视化低代码最近在折腾一个工厂车间的数据采集与监控项目客户现场有几台老旧的PLC通信协议是经典的Modbus TCP而管理层希望能在车间门口的触摸屏上实时展示产线状态、设备运行参数甚至能做一些简单的逻辑控制比如当某个温度传感器超限时自动触发报警灯。这个需求听起来简单但实操起来有几个痛点PLC数据需要稳定采集、触摸屏需要友好的可视化界面、中间的逻辑处理要灵活可配置并且整个系统最好能部署在车间现场一个低功耗、可靠的边缘设备上。传统的做法可能是写一个C#或Python的采集程序再搭配一个组态软件或者自己用QT写个界面开发周期长后期维护也麻烦。就在我琢磨方案时一个硬件圈的朋友给我安利了reTerminal DM。这是一款基于树莓派CM4计算模块的工业级HMI人机界面设备自带一块5英寸的触摸屏接口丰富支持-20°C到70°C的宽温工作IP65防护等级直接扔车间里完全没问题。硬件选型敲定了软件栈呢如果还在上面装个完整的桌面环境跑传统软件总觉得有点“杀鸡用牛刀”而且资源利用也不够高效。这时Node-RED进入了我的视野。它是一个基于Node.js的开源流编程工具用“连线”的方式就能构建应用特别适合处理物联网IoT数据流。而它庞大的节点库中正好有node-red-contrib-modbus这个节点可以轻松连接Modbus TCP设备。一个想法瞬间成型把reTerminal DM作为硬件载体运行Node-RED用它来桥接Modbus TCP设备和前端可视化界面实现一个一体化的边缘HMI解决方案。这个组合的优势在于Node-RED的低代码特性极大降低了开发门槛reTerminal DM的工业设计保证了现场可靠性而Modbus TCP又是工业领域最通用的协议之一普适性极强。接下来我就把自己从环境搭建、流程设计到实际部署调试的完整过程以及过程中踩过的坑和总结的经验详细分享一下。无论你是工业自动化工程师、物联网开发者还是对边缘计算感兴趣的爱好者这套方案都值得一试。2. 核心组件深度解析为什么是它们三个在深入动手之前我们有必要把这三个核心组件拆开看看理解它们各自扮演的角色以及组合在一起产生的化学反应。这能帮助我们在后续设计和排错时心里更有底。2.1 reTerminal DM不止于“带屏的树莓派”reTerminal DM的核心是树莓派Compute Module 4CM4这意味着它继承了树莓派庞大的软件生态和社区支持。你可以把它理解为一个“工业强化版”的树莓派。与普通树莓派加个屏幕的方案相比它的优势非常明显工业级可靠性宽温设计适应车间冬夏温差IP65防尘防水能应对粉尘和偶尔的液体溅射金属外壳和良好的散热设计保障7x24小时稳定运行。这是消费级产品无法比拟的。集成化与节省空间5英寸电容触摸屏、千兆以太网口、RS-485接口这对Modbus RTU也很有用、CAN总线接口、USB、GPIO等全部集成在一个紧凑的机身内无需额外接线和扩展减少了故障点。预装优化的操作系统官方提供了基于Raspberry Pi OS的定制镜像对触摸屏、硬件接口做了深度优化开箱即用省去了大量驱动调试的时间。在本次项目中它承担着“边缘网关”和“人机界面”的双重角色。作为网关它通过以太网与Modbus TCP设备PLC通信作为HMI它的屏幕直接运行Node-RED提供的Web可视化界面。2.2 Node-RED低代码流编排的核心引擎Node-RED本质上是一个运行在Node.js环境中的可视化编程工具。它的核心概念是“流”Flow由“节点”Node通过“连线”Wire连接而成。节点可以接收、处理、发送消息。它的强大之处在于协议连接器拥有海量的社区贡献节点几乎可以连接任何东西从MQTT、HTTP到Modbus、OPC UA再到各种数据库和云平台如AWS IoT, Azure IoT Hub。node-red-contrib-modbus节点就是专门为Modbus协议设计的。数据处理与逻辑内置了函数Function节点可以用JavaScript编写任意处理逻辑还有切换Switch、变更Change、延迟Delay等节点能实现复杂的流控制。可视化与仪表盘node-red-dashboard节点库可以让你通过拖拽快速创建包含图表、仪表、开关、滑块的控制面板并自动生成一个Web页面。这正是我们需要的HMI界面。对于我们的场景Node-RED完美替代了传统的“采集程序组态软件”。一个流可以同时完成数据采集Modbus节点、逻辑处理Function节点和界面展示Dashboard节点所有逻辑一目了然修改起来也极其方便。2.3 Modbus TCP工业设备的通用语言Modbus是一种应用层报文传输协议位于TCP/IP协议栈之上。它采用主从Master/Slave架构在我们的场景中Node-RED通过modbus节点充当主站Master而PLC等设备充当从站Slave。理解Modbus TCP关键要抓住以下几点功能码与数据区主站通过发送包含“功能码”的请求来读写从站的数据。常见功能码如0x03读保持寄存器、0x06写单个寄存器、0x10写多个寄存器。数据存储在从站的四个不同区域线圈Coils、离散输入Discrete Inputs、输入寄存器Input Registers、保持寄存器Holding Registers。最常用的是保持寄存器通常用来存储设备的温度、压力、速度等模拟量参数。地址与映射这是最容易混淆的地方。Modbus协议中的地址是从0开始的。例如设备手册上标注的“保持寄存器40001”在协议报文里使用的地址是0。而很多软件包括一些PLC编程软件和node-red-contrib-modbus节点为了兼容习惯允许你直接输入40001它在内部会自动做转换。但你必须清楚你用的工具遵循哪种约定否则读写的地址会完全错误。TCP与RTU的区别这是网络热词中常被问到的问题。Modbus TCP和RTU是两种不同的传输方式。TCP运行在以太网上使用标准网络端口默认502报文自带MBAP头用于寻址RTU通常运行在RS-485串行总线上使用二进制编码依靠设备地址和报文间隔来区分。TCP更适用于现代网络化车间布线方便抗干扰能力强传输距离远受网络限制。reTerminal DM的千兆网口正是为TCP准备的。理解了这三者的角色我们的系统架构就清晰了reTerminal DM作为硬件平台运行Node-RED服务。Node-RED使用Modbus TCP节点作为主站主动轮询或读写车间PLC从站的数据。然后通过Dashboard节点将处理后的数据以图表、数值的形式渲染在reTerminal DM的本地浏览器上形成一个完整的边缘HMI。3. 实战部署从零搭建一体化HMI系统理论清晰后我们进入实战环节。我会假设你拿到了一台全新的reTerminal DM带你一步步完成整个系统的搭建。3.1 reTerminal DM基础系统准备首先我们需要为reTerminal DM安装操作系统并进行基础配置。烧录系统镜像前往reTerminal DM的官方Wiki或下载页面获取最新的预装Raspberry Pi OS的镜像文件通常是.img格式。使用SD卡烧录工具如Raspberry Pi Imager、BalenaEtcher将镜像写入一张至少16GB的Micro SD卡中。这里有个关键点使用Raspberry Pi Imager时在烧录前可以提前配置主机名、开启SSH、设置Wi-Fi和用户密码这对于无头无显示器键盘启动非常方便。首次启动与配置将烧录好的SD卡插入reTerminal DM连接网线或确保Wi-Fi已预先配置好上电启动。系统启动后你可以直接在触摸屏上操作或者通过SSH远程登录。更推荐后者因为后续操作多在命令行完成。SSH地址就是你设置的主机名如reterminaldm.local或IP地址用户默认为pi。登录后首先建议运行sudo raspi-config进行必要设置扩展文件系统确保SD卡所有空间都被利用。更改密码修改默认的pi用户密码。本地化选项设置时区、区域和键盘布局。性能选项酌情分配更多内存给GPU如果后续需要运行复杂的图形界面但对我们以Node-RED Web界面为主的应用默认即可。最后执行sudo apt update sudo apt upgrade -y更新系统到最新状态。3.2 Node-RED及其关键节点的安装与配置reTerminal DM的官方镜像可能已经预装了Node.js和Node-RED但为了确保版本和完整性我们手动安装一次。安装Node.js与Node-RED# 安装Node.js推荐使用NodeSource的版本比树莓派默认仓库的更新 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs # 验证安装 node -v npm -v # 安装Node-RED sudo npm install -g --unsafe-perm node-red注意使用-g参数全局安装。--unsafe-perm参数在树莓派这类环境下有时是必需的以防权限问题。安装必备节点包 我们需要两个核心节点包Modbus通讯和Dashboard仪表盘。# 进入Node-RED的用户数据目录通常为~/.node-red cd ~/.node-red # 安装modbus节点 npm install node-red-contrib-modbus # 安装dashboard节点 npm install node-red-dashboard安装过程可能需要几分钟。如果遇到网络问题可以考虑配置npm的国内镜像源。配置Node-RED开机自启作为系统服务 为了让Node-RED在reTerminal DM开机后自动运行我们将其设置为systemd服务。# 创建服务文件 sudo nano /etc/systemd/system/nodered.service将以下内容粘贴进去注意Userpi要替换为你的用户名[Unit] DescriptionNode-RED Aftersyslog.target network.target [Service] ExecStart/usr/bin/env node-red-pi $NODE_OPTIONS $NODE_RED_OPTIONS # 如果全局安装的node-red命令路径不同可以用 which node-red 查看 # ExecStart/usr/local/bin/node-red-pi Restarton-failure KillSignalSIGINT SyslogIdentifiernode-red Userpi Grouppi [Install] WantedBymulti-user.target保存退出后启用并启动服务sudo systemctl daemon-reload sudo systemctl enable nodered.service sudo systemctl start nodered.service # 检查状态 sudo systemctl status nodered.service如果状态显示active (running)说明服务已成功启动。默认情况下Node-RED运行在1880端口。你可以在reTerminal DM本机的浏览器访问http://localhost:1880或者在同一网络下的其他电脑访问http://reTerminal DM的IP:1880即可看到Node-RED的流编辑器界面。3.3 构建第一个Modbus TCP数据流现在我们打开Node-RED编辑器开始构建核心的数据流。配置Modbus TCP客户端在左侧节点面板的“网络”分类下找到“modbus”相关节点。拖拽一个“modbus read”节点到工作区。双击这个节点进行配置。你需要创建一个新的Modbus客户端。Type选择TCP。Host填写你的Modbus从站PLC的IP地址例如192.168.1.100。Port默认为502。Unit ID从站设备的单元标识符Slave ID通常为1。如果PLC有多个站号按实际填写。配置好后点击“更新”然后“完成”。这个客户端配置可以被多个读写节点共享。读取保持寄存器数据在“modbus read”节点的配置中设置读取参数FC功能码选择3: Read Holding Registers。Address这里需要特别注意假设我们要读取PLC手册上定义的“温度值1”地址为40001。在node-red-contrib-modbus节点中通常直接输入40001即可节点会自动处理偏移。但为了绝对准确最好查阅该节点包的文档。我们输入40001。Quantity要读取的寄存器数量。一个寄存器通常是16位2字节。如果温度值占用1个寄存器就填1。Poll Rate轮询频率例如每2秒读取一次就填2000ms。将这个节点的输出连线到一个“debug”节点并部署流。点击debug节点的标签在右侧调试窗口查看输出的消息。消息的payload应该是一个数组包含了读取到的寄存器值。如果看到[0]或[NaN]或者连接错误说明地址、从站ID或网络连接可能有问题这是排查的第一步。数据转换与处理 Modbus寄存器读取到的往往是原始整数INT16, UINT16或两个寄存器组成的32位浮点数。我们需要将其转换为有意义的工程值。从左侧面板拖拽一个“function”节点连接到“modbus read”节点之后。双击function节点编写JavaScript代码进行转换。例如假设PLC中40001地址存储的温度值实际是放大10倍的整数即125表示12.5°C且数据类型为INT16有符号。// msg.payload 是包含一个元素的数组如 [125] var rawValue msg.payload[0]; // 处理有符号整数INT16如果最高位是1则为负数 if (rawValue 0x8000) { rawValue rawValue - 0x10000; } // 转换为实际工程值假设放大了10倍 var realValue rawValue / 10.0; // 将结果赋值回msg.payload供后续节点使用 msg.payload realValue; // 也可以添加一个属性比如 msg.topic temperature1; return msg;部署后再次查看debug输出应该能看到转换后的浮点数如12.5。3.4 创建Dashboard可视化界面数据已经能正确读取和转换了现在把它展示到屏幕上。安装并配置Dashboard确保node-red-dashboard已安装。安装后左侧节点面板会出现一个“dashboard”分类。首先拖拽一个“dashboard”节点通常是ui_tab和ui_group来组织你的界面布局。你可以创建多个标签页Tab和分组Group来分类显示不同设备或参数。添加显示控件将处理完数据的function节点的输出连线到一个“gauge”仪表节点或“chart”图表节点。配置gauge节点Group选择你之前创建的分组。Label设置为“温度1”。Units设置为“°C”。Range根据你的实际值设置例如0到100。同样你也可以添加“text”节点来显示数值“button”节点来发送写命令控制PLC。访问Dashboard UI部署整个流。Node-RED Dashboard提供了一个独立的UI地址默认在1880端口下的/ui路径。在reTerminal DM本机浏览器中访问http://localhost:1880/ui你就能看到刚刚创建的仪表盘了。一个优化技巧为了让reTerminal DM开机后自动全屏显示这个界面你可以将Chromium浏览器设置为开机启动并全屏打开该URL。编辑自动启动脚本如~/.config/lxsession/LXDE-pi/autostart添加一行chromium-browser --kiosk --incognito http://localhost:1880/ui这样reTerminal DM启动后就会直接进入全屏的监控界面完全就是一个定制的工业HMI。4. 进阶配置与深度避坑指南基础流程跑通只是第一步要让系统稳定可靠地运行在工业环境还需要考虑很多细节。下面是我在实际项目中总结的进阶要点和常见坑位。4.1 Modbus地址映射的“陷阱”与标准化实践地址问题是Modbus通讯中最常见的错误来源。不同厂商、不同软件对地址的诠释可能不同。“基地址”差异有些系统认为寄存器40001的地址是0协议地址有些则认为就是40001逻辑地址。node-red-contrib-modbus节点通常支持直接输入40001这很方便但你必须确认你的PLC编程软件或手册使用的是同一套约定。最稳妥的方法是进行小范围测试先尝试读取一个你知道确切值的寄存器比如一个设置为0的寄存器分别用40001和0去试。数据类型与字节序32位浮点数一个浮点数占用两个连续的16位寄存器。这里涉及字节序Endian和字序Word Order问题。常见的有“ABCD”大端序、“CDAB”小端序也称为“字节交换”、“BADC”字交换等。如果读取两个寄存器后转换出的浮点数毫无意义大概率是字节/字序不对。Function节点中的Buffer对象可以帮助你进行灵活的字节操作。有符号与无符号16位整数需明确是INT16有符号范围-32768~32767还是UINT16无符号0~65535。上文Function节点中的位运算就是处理INT16的方法。我的标准化建议在Node-RED中为每个数据点建立一个清晰的命名规范。例如使用msg.topic PLC1.Temperature.Tank1。将地址、数据类型、转换系数如放大10倍、字节序等信息统一记录在一个JSON配置节点或一个独立的Function节点中而不是散落在各个Modbus节点里。这样便于管理和修改。4.2 Node-RED流的稳定性与性能优化工业现场要求系统长期稳定运行Node-RED流的设计需要格外注意。错误处理Modbus通讯可能因网络抖动、设备忙而失败。node-red-contrib-modbus节点在发生错误时通常会输出一个包含错误信息的msg。你应该使用“catch”节点来捕获流中任何节点抛出的错误并将其记录到文件或发送报警通知例如通过邮件节点或MQTT节点。不要让错误悄无声息地失败。// 在catch节点的function中可以记录错误 node.error(Modbus读取失败: msg.error.message, msg); // 可以在这里将错误信息通过另一个流发送给管理员避免阻塞Node-RED是单线程的。如果在Function节点中执行非常耗时的同步操作如复杂的循环计算、同步文件读写会阻塞整个事件循环导致其他流处理延迟。对于耗时操作应将其异步化或使用“delay”节点分散压力甚至考虑拆分成多个子流。内存管理长期运行后注意监控reTerminal DM的内存使用情况使用free -h命令。如果流非常复杂消息对象很大可能会积累内存。确保流中的消息在不需要后被正确释放JavaScript的垃圾回收会处理但要避免全局变量持续引用大对象。4.3 reTerminal DM作为生产环境设备的加固措施将树莓派衍生品用于工业环境需要做一些加固。只读文件系统为了防止突然断电导致SD卡文件系统损坏可以将根文件系统挂载为只读。但这会使得日志写入、Node-RED节点安装等操作变得复杂。一个折中的方案是将频繁写的目录如/var/log,/tmp,~/.node-red中的logs目录通过tmpfs挂载到内存中或者符号链接到外部USB存储设备上。看门狗与自恢复虽然我们设置了Node-RED为系统服务并自动重启但还可以启用Linux内核的硬件看门狗如果硬件支持并在上层编写一个简单的监控脚本定期检查Node-RED的Web接口是否存活如果无响应则强制重启服务。网络与电源为reTerminal DM配置静态IP地址避免因DHCP问题失联。使用优质的工业电源适配器避免电压波动导致设备重启。如果条件允许为其配备UPS不间断电源。4.4 从调试到部署工作流的平滑过渡在开发阶段我们频繁地在Node-RED编辑器中修改和部署流。但在生产环境我们需要一个更稳定、可版本管理的工作流。项目文件管理Node-RED的流定义保存在~/.node-red目录下的flows.json文件或其他你命名的文件中。定期备份这个文件你可以使用Git对这个目录进行版本控制方便回滚和协作。环境变量不要在流中硬编码IP地址、端口、密码等敏感信息。使用Node-RED的环境变量功能。你可以在settings.js文件中定义全局变量或者在流的“环境”标签页中设置。在节点配置中使用{{env_var_name}}的形式来引用。这样同一套流可以轻松部署到测试和生产环境只需改变环境变量即可。“生产”模式部署当你完成开发并测试无误后可以在Node-RED的设置中settings.js启用“只读”模式禁用编辑器前端只保留/ui仪表盘可访问。这样既能防止误操作也能提高安全性。通过以上这些步骤和注意事项reTerminal DM Node-RED Modbus TCP的组合就从一个小巧的原型转变为一个能够胜任实际工业场景的、稳定可靠的边缘HMI解决方案。这个方案的魅力在于其极高的灵活性和可扩展性——未来如果需要接入MQTT上报云平台或者增加一个SQLite数据库记录历史数据只需要在Node-RED中拖拽几个新节点并连线即可无需重写任何底层代码。