基于边缘计算网关与开源SCADA构建轻量工业监控系统实践

发布时间:2026/8/3 10:37:16

基于边缘计算网关与开源SCADA构建轻量工业监控系统实践 1. 项目概述当边缘计算网关遇上开源SCADA最近在折腾一个工业数据可视化的项目客户现场有几台老旧的PLC数据需要采集、本地处理并实时展示给操作员看。传统的方案要么是上一套昂贵的商业SCADA软件要么就是自己从零开始写个上位机前者成本太高后者开发周期长且维护麻烦。正好手头有一台Jetson Orin Nano核心的reComputer R1000边缘计算设备性能强劲且接口丰富我就琢磨着能不能在这上面跑一个轻量、开源且功能足够的SCADA系统。一番搜寻和测试后我锁定了fuxa这个基于Web的开源SCADA/HMI解决方案并成功在reComputer R1000上完成了部署和应用。整个过程下来感觉这个组合非常适合中小型工业现场、实验室原型验证或者教学演示场景成本可控灵活性极高。简单来说这个项目就是在reComputer R1000这台基于NVIDIA Jetson平台的边缘AI网关设备上部署并运行fuxa这个开源SCADA软件从而构建一个集数据采集从PLC、Modbus设备等、逻辑处理、可视化监控于一体的边缘侧工业控制系统。它解决了传统PC商业软件方案成本高、部署笨重的问题也避免了纯代码开发的高门槛让工程师能快速搭建出专业级的监控界面。如果你正在寻找一种经济、高效且能部署在设备边缘的监控方案那么接下来的内容会非常对味。2. 核心方案选型与设计思路2.1 为什么是 reComputer R1000 fuxa在启动项目前我评估过几种方案。用一台工控机跑Windows和商业SCADA软件是最稳的但授权费动辄数万对于点数不多的项目来说性价比太低。用树莓派之类的开发板配合Node-RED或自己用Python写虽然成本低但要实现复杂的图形界面、历史趋势、报警管理等功能开发量巨大且界面美观度和专业性难以保证。reComputer R1000的核心优势在于其搭载的NVIDIA Jetson Orin Nano模组。它不仅仅是一个性能不错的ARM计算机CPU性能媲美高端x86GPU带有AI算力更关键的是其工业级的可靠性设计、丰富的接口多个USB、以太网、RS232/485、DI/DO等以及宽温工作能力让它能直接部署在车间、机柜等环境相对恶劣的现场作为边缘网关和数据枢纽。它的算力足以同时处理数据采集、本地轻量AI推理比如基于视觉的质检信号接入、协议转换以及运行一个Web服务。而fuxa的出现完美补上了“软件”这一环。它是一个完全由JavaScript/TypeScript开发的前后端一体的开源SCADA/HMI平台。其特点非常鲜明零安装的Web架构服务器端运行后客户端操作员站只需要一个现代浏览器Chrome, Edge等即可访问无需安装任何客户端软件。这对于维护和跨平台访问极其友好。拖拽式图形编辑提供了丰富的工业图形库按钮、指示灯、图表、管道、仪表盘等通过直观的拖拽和属性配置就能搭建出专业的监控画面大大降低了UI开发门槛。多协议支持内置了OPC UA、Modbus TCP/RTU、Siemens S7、MQTT等主流工业通信协议的客户端可以直接连接PLC、传感器、仪表等设备。核心功能完整支持数据绑定、脚本处理JavaScript、报警系统、历史数据记录与趋势图、用户权限管理这些构成了一个合格SCADA系统的骨架。将fuxa部署在reComputer R1000上相当于把“大脑”数据处理和“面孔”人机界面都集成到了边缘设备内部。数据采集后直接在本地处理、显示和存储响应速度快且不依赖于云端网络稳定性。对于很多需要快速响应和本地闭环控制的场景这种边缘SCADA方案是最优解。2.2 系统架构设计我的项目架构很简单但体现了边缘计算的思想[现场设备层] (PLC、传感器、仪表等) | | 通过 Modbus RTU/TCP, OPC UA 等协议 | [边缘层] reComputer R1000 (运行 fuxa-server 数据库) |--- 功能1协议转换与数据采集 |--- 功能2本地逻辑处理与脚本执行 |--- 功能3Web SCADA/HMI 服务提供 |--- 功能4本地历史数据存储 | | 通过局域网 HTTP/WebSocket | [监控层] 工程师/操作员电脑、平板、手机 (浏览器)在这个架构中reComputer R1000是绝对的核心。它通过自身的串口RS485连接现场的Modbus RTU仪表通过网口连接支持Modbus TCP的PLC。fuxa服务器负责与这些设备通信将采集到的数据点Tag映射到内部变量。然后我在fuxa编辑器里创建的画面中将这些变量绑定到对应的图形元素如一个液位计的形状其数值绑定到“水箱液位”这个变量。当变量值变化时画面会实时更新。注意虽然fuxa功能强大但它主要定位于监控和数据采集SCADA对于需要毫秒级精确时序的硬实时控制仍应由下位的PLC或专用控制器来完成。fuxa更适合做设定值下发、模式切换、启停命令等非实时性要求极高的操作。3. 环境准备与fuxa部署详解3.1 reComputer R1000基础系统配置拿到reComputer R1000后第一步是安装操作系统。我推荐使用NVIDIA官方提供的JetPack SDK它包含了适配Jetson的Ubuntu Linux、CUDA、cuDNN、TensorRT等全套AI和计算库。虽然fuxa本身不直接依赖CUDA但JetPack系统是官方优化最完善的稳定性最好。刷写系统镜像从Seeed StudioreComputer制造商或NVIDIA官网下载对应reComputer R1000的JetPack镜像如JetPack 5.1.2。使用Etcher或balenaEtcher工具将镜像写入SD卡建议至少64GB高耐用度工业级卡或直接写入设备自带的eMMC。首次启动与配置插入刷好的存储设备上电启动。按照提示完成Ubuntu系统的初始设置包括语言、时区、用户名密码、网络连接等。务必配置好静态IP地址因为工业现场中作为服务器的设备IP最好是固定的方便浏览器访问。系统更新与依赖安装通过终端更新软件包列表并安装一些基础工具。sudo apt update sudo apt upgrade -y sudo apt install -y curl wget git vim net-tools配置RS485接口如需reComputer R1000的40-pin GPIO接头中包含UART串口通常需要配置为RS485模式。这可能需要修改设备树Device Tree或使用特定的配置工具。Seeed Studio通常会提供文档和脚本。一个典型的步骤是启用对应的串口设备如/dev/ttyTHS1并设置其参数波特率、数据位、停止位、校验位。这部分需要根据你具体的RS485转换模块或芯片来调整。3.2 安装Node.js与PM2fuxa服务器端是基于Node.js的因此我们需要安装Node.js环境。在ARM架构的Jetson上最简单的方法是使用NodeSource提供的安装脚本。安装Node.js访问NodeSource官网找到最新的LTS版本如Node.js 18.x的安装指令。在终端中执行curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs安装完成后验证版本node --version npm --version安装PM2进程管理工具PM2对于生产环境至关重要它可以保证fuxa服务在后台稳定运行崩溃后自动重启并方便查看日志。sudo npm install -g pm23.3 部署与运行fuxa服务器fuxa提供了多种安装方式包括Docker、直接克隆代码运行等。为了最简化部署我选择直接使用其预构建的服务器包。下载fuxa服务器前往fuxa的GitHub Releases页面下载适用于Linux ARM64架构的服务器包通常文件名为fuxa-server_linux_arm64.tar.gz。你可以使用wget命令直接下载到reComputer上。wget https://github.com/frangoteam/FUXA/releases/download/v1.3.0/fuxa-server_linux_arm64.tar.gz提示版本号请替换为最新的稳定版。ARM64架构包完美适配Jetson Orin的CPU。解压并运行tar -xzf fuxa-server_linux_arm64.tar.gz cd fuxa-server解压后目录里会有一个可执行文件fuxa-server。直接运行它./fuxa-server如果一切正常终端会输出服务器启动日志显示监听的端口默认是1881。使用PM2守护进程直接在前台运行不是长久之计。使用PM2将其变为后台服务pm2 start ./fuxa-server --name fuxa-scada pm2 save pm2 startup执行pm2 startup后会生成一个命令让你复制执行目的是将PM2设置为系统服务实现开机自启。务必执行它。验证服务打开reComputer R1000的浏览器访问http://localhost:1881。或者在同一局域网内的其他电脑上访问http://reComputer的IP地址:1881。你应该能看到fuxa的Web登录界面。默认的用户名和密码通常是admin/admin首次登录后请立即修改。4. fuxa核心功能配置与实操成功登录fuxa后我们就进入了它的管理界面。左侧是功能菜单整个配置流程可以遵循“设备 - 数据点 - 画面 - 报警与历史”的逻辑。4.1 连接物理设备以Modbus RTU为例假设我们要连接一个通过RS485接口接入的Modbus RTU温湿度传感器。创建设备连接在左侧菜单进入“设备” - “添加设备”。名称给设备起个名字如“车间温湿度传感器”。类型选择“Modbus RTU”。接口选择reComputer R1000上对应的串口设备文件例如/dev/ttyTHS1。这需要你在系统配置中确认好。通信参数设置与传感器一致的波特率如9600、数据位8、停止位1、校验位None。这些参数必须与传感器手册完全一致否则无法通信。从站地址填写传感器的Modbus从站地址如1。定义数据点Tags设备添加成功后点击进入该设备开始添加数据点。这是SCADA中最核心的概念每一个数据点对应一个物理信号或内部变量。点击“添加数据点”。名称Temperature。地址类型对于Modbus可能是“保持寄存器”Holding Register或“输入寄存器”Input Register根据传感器手册确定。假设温度值在保持寄存器40001中。地址填写40001。注意有些软件使用0基地址40001对应地址0而fuxa通常使用直接地址需要根据实际情况测试。一个技巧是都试一下。数据类型选择“16位整数”INT16或“32位浮点数”FLOAT32这同样取决于传感器手册。缩放因子如果传感器读出的原始值需要转换例如原始值100代表10.0°C可以在这里设置系数和偏移量。同理添加湿度数据点Humidity。保存后fuxa会开始尝试按照设定的扫描频率可在设备或数据点级别设置读取这些寄存器。你可以在数据点列表页面看到“质量戳”Quality Stamp如果通信成功会显示“好”并看到实时数值。实操心得Modbus调试初期强烈建议使用一个USB转RS485适配器在PC上用Modbus调试软件如Modbus Poll先确认传感器的通信参数和寄存器地址是否正确。这能排除一大半的硬件和协议问题。4.2 设计监控画面HMI这是最能体现fuxa价值的部分。进入“画面”菜单创建一个新画面比如叫“车间监控总览”。编辑画布你会进入一个所见即所得的编辑器。左侧是控件面板有基本形状、按钮、指示灯、图表、仪表盘、管道、阀门等丰富的工业符号。添加并绑定控件从“仪表”类中拖拽一个“温度计”控件到画布上。选中这个温度计在右侧属性面板中找到“值”或“绑定”选项。点击绑定按钮会弹出数据点浏览器。选择我们之前创建的Temperature数据点。这样温度计的数值和颜色变化就与真实的传感器数据关联起来了。同样可以添加一个圆形的指示灯控件绑定到某个设备运行状态的点添加一个趋势图控件绑定多个数据点来观察变化曲线。使用脚本增强逻辑fuxa支持在控件事件或定时任务中执行JavaScript脚本。例如我想让当温度超过30°C时画面上一个报警灯闪烁。先创建一个代表报警灯的图形比如一个红色的圆形。为这个图形添加一个“动画”或“脚本”。在脚本编辑器中可以写// 获取温度数据点的值 var temp await $.getTagValue(Temperature); // 判断并设置图形的可见性或颜色 if (temp 30) { scope.vm.view.widgets[alarmLight].style.fill red; // 这里可以触发更复杂的动画或声音报警需结合报警功能 } else { scope.vm.view.widgets[alarmLight].style.fill green; }设置这个脚本由一个定时器例如每秒触发或者由温度数据点“值改变”事件触发。4.3 配置报警与历史数据一个完整的监控系统离不开报警和记录。报警配置在“报警”菜单中可以创建报警规则。点击“添加报警”。名称温度过高报警。数据点选择Temperature。触发条件设置“值 ” 30。优先级设置高、中、低。还可以配置报警文本、是否需确认、通知方式目前fuxa主要是在Web界面显示高级通知可能需要结合其他工具。配置好后当条件满足fuxa顶部的报警栏会显示报警信息之前画面中绑定的报警灯脚本也会生效。历史数据配置fuxa使用内嵌的SQLite数据库也可配置外部数据库如MySQL来存储历史数据。在“设置” - “历史数据”中启用历史记录。为你关心的数据点如Temperature,Humidity勾选“记录历史”。可以设置记录间隔如每10秒记录一次。之后在画面中添加“趋势图”控件并将其数据源绑定到这些历史数据点就可以查看过去一段时间的变化曲线了。这对于分析工艺过程非常有用。5. 系统优化与生产环境考量在开发测试环境跑通后要部署到真正的工业现场还需要做一些优化和加固。5.1 性能与稳定性优化优化数据扫描不要将所有数据点的扫描频率都设得很高比如100ms。对于变化缓慢的温度、液位1-5秒扫描一次足矣。过高的频率会增加reComputer的CPU负载和串口/网络拥堵。在设备或数据点设置中合理配置“扫描间隔”。管理画面复杂度一个画面中不要放置成百上千个动态控件。复杂的画面会影响浏览器渲染性能。对于大型系统采用多画面、分层级的方式组织或者使用“模板”功能复用控件。使用PM2管理如前所述PM2能保证服务持续运行。可以配置PM2在内存使用过高或异常退出时自动重启。通过pm2 monit可以监控服务的CPU和内存占用。日志管理fuxa和PM2都会产生日志。定期清理日志文件避免占满存储空间。可以配置logrotate工具来管理。5.2 安全加固修改默认密码这是最基本也最重要的一步。登录后立即在“用户管理”中修改admin用户的密码并创建不同权限级别的用户如操作员、工程师。HTTPS访问在生产环境应启用HTTPS。你可以在reComputer R1000上使用Nginx作为反向代理配置SSL证书将HTTP请求转发到本地的fuxa服务端口1881。这样所有浏览器通信都是加密的。防火墙配置使用ufw等工具配置防火墙只开放必要的端口如HTTPS的443端口。关闭reComputer上所有不必要的服务端口。网络隔离尽可能将reComputer R1000和它连接的工业设备放在同一个独立的子网或VLAN中与办公网络进行逻辑隔离防止来自办公网的网络攻击波及生产控制层。5.3 数据备份与恢复你的SCADA配置画面、数据点、设备连接都存储在fuxa的工程文件中。定期备份这些文件至关重要。找到工程文件fuxa的默认工程目录通常在运行它的用户家目录下的.fuxa文件夹内例如/home/username/.fuxa或者就在你解压运行的fuxa-server同级目录下。具体位置可以查看fuxa的启动日志或配置文件。定期备份编写一个简单的Shell脚本使用tar或rsync命令将整个.fuxa目录打包并拷贝到另一个安全的位置如另一块硬盘、网络存储NAS。可以使用cron定时任务每天自动执行备份。恢复如果需要迁移或恢复只需停止fuxa服务用备份的工程文件覆盖现有目录然后重启服务即可。6. 常见问题与故障排查实录在实际部署和运行中我遇到并解决了一些典型问题这里记录下来供大家参考。6.1 通信连接失败这是最常见的问题尤其是使用串口Modbus RTU时。现象fuxa中设备状态显示“错误”或“断开”数据点质量戳为“坏”。排查步骤检查物理连接确认RS485接线A/B线是否正确、牢固终端电阻是否匹配长距离通信时需要在总线两端接120Ω电阻。确认串口权限在Linux中普通用户可能无权访问串口设备。使用ls -l /dev/ttyTHS1命令查看权限。通常需要将用户加入dialout组sudo usermod -a -G dialout $USER然后注销重新登录生效。验证串口参数波特率、数据位、停止位、校验位必须与从站设备完全一致。一个比特的错误都会导致无法通信。使用调试工具在reComputer上安装minicom或screen工具尝试直接监听串口数据或者发送简单的Modbus指令看是否有响应。这能帮你确定问题是出在硬件/链路层还是fuxa的配置层。检查从站地址确认fuxa中配置的Modbus从站地址与设备拨码开关或软件设置一致。6.2 画面加载缓慢或卡顿现象在浏览器中打开fuxa画面时加载时间很长或者操作不流畅。可能原因与解决浏览器缓存尝试清除浏览器缓存或使用无痕模式访问。画面过于复杂检查是否在一个画面中使用了过多尤其是带有动画的控件。尝试拆分画面或减少非关键控件的刷新频率。reComputer性能瓶颈通过htop命令查看CPU和内存使用率。如果fuxa-server进程占用过高考虑优化数据点扫描频率。同时确保reComputer有良好的散热。网络问题如果通过Wi-Fi访问信号不稳定会导致卡顿。对于工业环境强烈推荐使用有线以太网连接。6.3 历史数据不记录或趋势图不显示现象配置了历史记录但趋势图没有数据。排查步骤确认历史功能已启用在“设置” - “历史数据”中检查是否已开启。确认数据点已勾选在数据点编辑页面确保“记录历史”选项被勾选。检查数据库文件权限历史数据存储在SQLite文件中。确保运行fuxa的用户对该数据库文件有读写权限。检查磁盘空间使用df -h命令查看磁盘使用情况确保存储空间充足。6.4 服务无故停止现象PM2列表中的fuxa服务状态为stopped或errored。排查步骤查看日志使用pm2 logs fuxa-scada命令查看最新的错误日志这是最直接的线索。常见的错误包括端口被占用、配置文件格式错误、依赖缺失等。检查端口冲突fuxa默认使用1881端口。使用sudo netstat -tlnp | grep 1881检查是否有其他程序占用了该端口。内存不足Jetson Orin Nano内存有限通常8GB或16GB。如果同时运行了其他占用内存大的程序如AI推理服务可能导致Node.js进程因内存不足OOM被系统终止。通过PM2日志或系统日志dmesg可以确认。解决方法是为fuxa服务设定内存限制或优化其他服务。7. 项目总结与扩展思考经过这一轮从零到一的搭建reComputer R1000运行fuxa的方案已经稳定运行了数月成功替代了原先一台老旧的工控机组态软件。这个组合给我的最大感受是轻盈而强大。硬件上reComputer R1000体积小巧、功耗低、接口全能直接塞进控制柜软件上fuxa的Web化和图形化大大降低了开发和维护成本。踩过几个坑之后我总结出几条关键经验第一前期通信调试务必扎实用专业工具先验证物理层和协议层能节省后期大量排查时间第二画面设计要有规划避免一个画面承载所有信息合理的导航和层级是关键第三别忘了安全即使是内网改密码、关端口这些基本操作也必须做。这个方案还有很大的扩展空间。reComputer R1000的GPU算力还没充分利用。我下一步的计划是利用其AI能力在fuxa中集成一个自定义的“智能控件”。例如通过一个USB摄像头采集设备现场的图像在reComputer上运行一个YOLO模型来检测仪表盘读数或者设备状态灯然后将识别结果比如“运行中”、“故障”作为一个虚拟数据点发布给fuxa从而将传统的传感器数据采集扩展到了视觉感知。fuxa的灵活性和开放性使得这种深度定制成为可能。对于想要尝试的同行我的建议是先从一个小型的、非关键的系统开始比如实验室的一套模拟装置或者一条小型产线。熟悉了整个流程后你会发现在边缘侧构建轻量、智能的监控系统并没有想象中那么复杂。reComputer R1000和fuxa这个组合无疑为工业物联网和边缘计算的应用落地提供了一个非常值得参考的实践路径。

相关新闻