前阵子帮客户做一套设备远程监控的评估方案,对方开口就问:能不能把车间里的控制器数据直接放到浏览器上,让几个经理同时打开页面就能看,不用装一堆客户端?我第一反应是想推荐商业组态软件,但报价单递过去之后,甲方项目负责人直接摇头。于是我开始认真翻开源社区,最后把目光锁定在 FUXA 这套开源的 Web 可视化组态软件上。折腾了一周,把一台 Linux 服务器、若干台 Modbus 从站和一个大屏页面完整打通了。这篇就把这套软件是什么、能干什么、怎么搭、有哪些坑,一次讲透。
FUXA 本质是一套基于 Web 的 SCADA/HMI 组态平台。它把传统组态软件里的设备通讯、数据采集、画面编辑、历史存储、告警事件全部搬到了浏览器和服务端:后端用 Node.js 处理采集与逻辑,前端直接在线拖拽设计画面,最终给用户看到的也是浏览器里的一套实时监控界面。对中小规模的工业现场、设备远程运维、实验室演示、高校课题来说,它基本覆盖了「可视化监控」的绝大部分需求。
1. 为什么还要折腾一套Web组态软件:传统方案的痛点与FUXA的位置
1.1 组态软件到底干了什么活
组态软件这个行当,干的事说穿了就是把两样东西打包起来:底层各设备的通讯协议,和上层的人机交互界面。现场有几十台仪表、PLC、传感器,它们各自说话的协议不一样,组态软件负责把这些协议统一收拢,转成一组干净的数据点;然后工程师在画图板上拖几个管道、阀门、仪表盘,把这些数据点填进去,画面就「活」了。
过去做一套集中监控,基本绕不开商业组态平台。边界说法就是:比较成熟的商业平台确实功能全、生态好,但问题也不少。最头痛的是费用,很多商业组态按点位收费,一个项目几百上千个点,授权费就上去了,后面每加一台设备都得再算钱。部署也重,工程做完了发到现场,往往还要装运行时、装驱动、配授权,运维人员稍微操作错一步就起不来。至于跨平台能力,基本被操作系统绑死,想放到 Linux 服务器上长跑,或者让领导在手机上快速瞄一眼,都得额外做一堆适配。
1.2 传统组态软件的三个尴尬
我在实际项目里遇到的尴尬,基本可以归纳成三类。
第一是远程访问难。传统组态软件的核心交互在桌面客户端,要做远程访问,要么上远程桌面,要么再套一层网页发布模块。前者体验差,后者往往要加钱买模块,而且配置链路很长。客户要的其实很简单:一个链接,浏览器打开,实时数据看得到。
第二是二次开发门槛高。商业组态大多有自己的脚本语言和组件体系,学起来有一套自己的逻辑。遇到特殊需求,比如对接内部 API、把数据推到企业数据库,厂商支持的脚本接口够不够用就完全看人品。实在不行想改底层,源码根本拿不到,只能打电话提需求等版本更新。
第三是项目交付和修改的节奏脱节。画面改一个阀门颜色、加一个趋势曲线,在组态软件里做完还要导出、发布,浏览器端才会更新。客户在现场看效果,提意见,改一版,再导出再发布,循环几轮,大家都很累。
1.3 FUXA到底是什么
FUXA 走的路子完全不同。它是开源的,源代码挂在社区里,想改哪块改哪块,不存在授权点数的说法。技术栈上后端是 Node.js,用 Express 提供 Web 服务,用 Socket.IO 做实时推送;前端是一套基于浏览器画布的可视化编辑器,也是最终运行时的载体。
整套系统跑起来,就一个 Node.js 进程:它负责设备通讯采集、历史数据落盘、告警判断、Web 服务分发。客户端什么插件都不用装,Chrome 或者 Edge 打开页面就能看到画面,并且支持多人同时在线查看——这一点在传统组态里往往要折腾很久。数据存储层面支持本地文件、内嵌数据库和外部数据库几种模式,小项目开箱即用,大一点的数据量也能撑住。
它适合谁来用?我认为主要是这三类人:
- 自动化、物联网方向的工程师,需要快速给客户交付一套监控 Demo;
- 设备厂商,给自己的产品配一个远程运维看板;
- 高校或实验室,用低成本搭一套数据采集与可视化实验平台。
当然边界也得说清楚:FUXA 定位是轻量级 SCADA/HMI,中小规模项目很合适;要做大型集散控制、高可靠性冗余、复杂调度策略,目前它还不是这个量级。别拿它去直接闭环控制关键工艺,这是原则问题。
2. 功能地图:FUXA能覆盖哪些监控需求
2.1 跟传统组态平台放在一起看
与其逐个列功能菜单,不如把 FUXA 和商业组态软件放在一张表里对比。这样选型的时候心里更有底。
| 对比项 | 传统商业组态软件 | FUXA |
|---|---|---|
| 部署方式 | 开发端安装软件、现场端安装运行时 | 服务器一个 Node 进程,浏览器访问 |
| 授权费用 | 按点位/按套收费,远期成本高 | 开源免费 |
| 跨平台 | 多绑 Windows,部分支持 Linux | 服务端跨平台,客户端纯浏览器 |
| 远程访问 | 需额外模块或远程桌面 | 天然 Web 化,手机也能开 |
| 二次开发 | 闭源,脚本接口有限 | 开源,可改源码,可写脚本 |
| 图形能力 | 图库丰富,工业组件多 | 内置基础控件,支持 SVG 导入 |
| 数据接入 | 驱动库庞大 | 覆盖主流通讯,长尾驱动需自研 |
| 适合规模 | 大中小均可,偏大中项目 | 中小项目最佳 |
这个表不是要论证 FUXA 能取代传统组态,而是说明在不同场景下两者各有阵地。如果是上百台设备的大型工厂集控,商业组态成熟可靠、驱动丰富、技术支撑到位,该花钱就花钱。但如果项目规模在几台到几十台设备,点数不过千,又要快速上线、频繁改版,FUXA 的性价比就非常突出。
2.2 数据采集这块能接什么
FUXA 的数据采集模块是它最核心的部分,直接决定这软件能不能进入你的项目。目前支持的主流协议包括:
- Modbus TCP 和 Modbus RTU(通过串口连接时走 RTU);
- OPC UA,用于对接支持 OPC UA 的 PLC、仪表或上层软件;
- MQTT,物联网场景最常见,设备数据通过消息服务器转发;
- BACnet/IP,楼宇自控领域常用的协议;
- Siemens S7 系列通讯,针对西门子 PLC 的直连场景。
实际项目里,Modbus TCP 是最省事的。几乎所有 PLC、仪表、网关都支持 Modbus TCP,甚至一块树莓派都能跑一个 Modbus 从站模拟器来测试。你在 FUXA 里配好设备的 IP 和端口,把寄存器地址映射成标签,数据就开始源源不断地往里灌。OPC UA 适合那些数据已经汇到上层的数据环境,比如工厂里的多套设备统一通过 OPC UA 服务器对外提供数据,FUXA 直接作为客户端去读就行。
2.3 画面、脚本、告警、历史这些上层功能
数据采上来了,接下来就是组态软件发挥价值的地方。
画面编辑方面,FUXA 提供在线拖拽式编辑器:按钮、开关、指示灯、实时数值显示、仪表盘、趋势图、报警列表、下拉框、表格组件这些基本控件都有。更重要的是它支持直接导 SVG 图元,复杂设备外形、工艺管线可以用设计软件画好再导入,工业现场那套「画得好看」的诉求基本能满足。
脚本和联动逻辑是 FUXA 相比某些轻量级物联网平台的加分项。你可以在画面控件的事件里写 JavaScript 代码,比如点了某个按钮,切换页面;也可以在后台写定时脚本,每小时把累计产量归档一次。我们做项目的时候常用它做简单的数据处理:把原始寄存器值乘一个系数换算成工程单位,或者判断设备状态字里的某个位是否为 1,再决定指示灯亮什么颜色。
告警和历史是监控系统的标配能力。标签可以设置上下限和死区,越限后触发告警事件,告警列表会把时间、位号、描述显示出来;历史数据方面,勾选了存储的标签会按设定周期写入存储,在趋势控件里选中位号就能拉出曲线。用户权限分了多个角色,可以做到只看画面的只读账号和能改配置的工程师账号分离。
3. 半小时跑起来:安装部署与工程创建
3.1 环境准备和启动
FUXA 对服务器要求不高,我建议给它准备一台能跑 Node.js 的 Linux 机器就行,1 核 2G 跑小项目完全没问题。Windows 上也能开发调试,但生产环境我更推荐 Linux,长期跑更稳。
第一步是装 Node.js。不一定非要用最新版,建议选 LTS 版本装好,版本太新或者太旧都可能遇到依赖编译的坑。装完确认一下:
node -v npm -v第二步把代码拉下来。开源项目直接在社区仓库里,克隆或者下载压缩包都行:
git clone <仓库地址> cd 项目目录 npm installnpm install 这一步耐心等,如果网络慢可以给 npm 配上国内镜像加速。装完直接启动:
npm start看到控制台输出启动成功的日志后,浏览器打开启动日志里提示的地址和端口。第一次访问会要求用初始管理员账号登录,登录成功后第一件事就是改掉默认密码,这个习惯要养成。
3.2 数据存储方案的取舍
FUXA 支持几种存储方式,装的时候没想清楚,后面会后悔。我的建议是:
- 纯测试、体验,用默认的本地文件存储模式就够了,数据全在一个数据目录里,导出备份很方便;
- 项目要跑几个月、点位又多,此时把历史数据落在数据库里更稳,避免文件越滚越大。
- 有 MongoDB 基础条件的,可以用外部数据库;没有额外依赖就选用内嵌数据库方案,对中小项目最省心。
实际项目中我倾向内嵌式数据库,因为少一个外部服务的依赖,部署和运维难度都低。历史数据量如果大到单文件承受不住,再考虑外部数据库。
存储方案确定后,后续工程里就别频繁切换了,否则历史曲线会断档。我们吃过一次亏,项目上线的第一周为了测试切换存储模式,结果头两天积累的趋势曲线全丢。对甲方来说,历史数据是凭证,丢了很难解释。
3.3 新建工程和画面
登录之后进到编辑器主界面,整个操作逻辑跟常见组态软件类似。左侧是功能面板,中间是画布,右侧是属性栏。
我的建议是先创建一个「总览」画面,把整体布局想好:左侧放设备状态区,中间放工艺流程或设备分布图,右侧放实时数据卡,底部放告警列表。FUXA 的工程管理和习惯的组态软件不太一样:画面文件、图元文件、脚本文件都要分门别类整理,命名规则从第一天就定好。否则等到画面上百个图元的时候,找东西会找到怀疑人生。
画面布局确定后,先别急着精雕细琢。第一步是走通「数据链路」:建设备、建标签、往画面上拉一个数值控件、绑定标签、保存、预览。这条链路通了,整个软件的核心用法就算掌握了。我用一个章节专门讲这条链路,因为它太容易被忽视。
4. 让画面动起来:从设备到控件的数据链路
4.1 创建设备和标签,先建立数据源头
FUXA 里的「设备」就是数据源头。进入设备管理页,点新增设备,协议下拉框就是第一节提到的那几种。以最常见的 Modbus TCP 为例,需要填从站的 IP 地址、端口、从站号,以及字节序设置。
字节序这里非常容易踩坑,我在现场就遇到过「数据看起来跳得离谱」的情况。Modbus 的寄存器本质是 16 位整数,两个相邻寄存器才能拼成一个 32 位浮点数,拼的时候高位在前还是低位在前,各家设备实现并不统一。FUXA 的配置项里有多少种字节序组合,需要试验得出。好的做法是:配一个已知的固定值进去,逐个切换字节序看哪个读数对了,再批量应用。
设备建好之后,下一步就是建「标签」。标签也叫数据点,相当于组态软件里的变量。每个标签对应设备的一个可读或可写的量,需要定义它的名称、数据类型、地址或数据源。数据类型要严格和实际变量匹配,常见有开关量、有符号整型、无符号整型、单精度浮点等。
以 Modbus TCP 设备为例,读一个保持寄存器时,地址填法和设备手册对得上就行,然后定义好标签名称,比如Tank_Level。建标签的时候还要考虑轮询周期:某个点的刷新频率设为多久。全部标签统一设 100ms 是很傻的做法,既浪费带宽又拖慢整体,后面第五章专门讲怎么设置合理。
4.2 控件绑定标签,这是最核心一步
建好标签后,进入画面编辑。在控件库里拖一个「数值显示」或者「仪表盘」到画布上,然后在右侧属性面板里找到数据源绑定相关的配置,把刚刚建的Tank_Level标签挂上去。
这里要说清楚 FUXA 的一个设计:控件显示内容是靠「属性绑定」完成的。每个控件有一堆属性,比如背景颜色、文本内容、可见性、角度、填充进度等,每个属性都可以绑定一个标签或者一个表达式。表达式的意思就是,不只是简单显示标签值,还可以写一段文本或公式,控制属性在特定条件下变化。
举个例子,指示灯控件有一个「颜色」属性,我想让它根据设备运行状态变化:状态是 1 显示绿色,是 0 显示灰色。可以直接在颜色属性里写一个条件表达式,判断绑定标签的值来决定返回什么颜色。这样一来,画面上所有动态效果,本质上就是一系列控件属性对标签值的映射关系。
这步是 FUXA 区别于普通图表工具的精髓:不是画完图再贴数据,而是画布上的每一个图形和属性,都直接和数据源建立了活链接。保存画面后切换到运行预览模式,数据变化立刻反映在控件上。
4.3 最小可复现的完整示例
我建议每个初学 FUXA 的人,花二十分钟做一个最小示例。步骤如下:
- 在本机跑一个 Modbus 从站模拟器,随便什么工具都行,创建一个保持寄存器,内容定义一个不断变化的值;
- 在 FUXA 里新建一个 Modbus TCP 设备,指向模拟器的 IP 和端口;
- 为该设备建两个标签:一个是开关量,一个是整型数值;
- 新建画面,拖两个开关量指示灯和一个数值仪表盘;
- 分别把控件的颜色/数值属性绑定到标签;
- 进运行模式,看看控件有没有跟着模拟器的数据变化。
如果这个最小示例走通了,FUXA 的数据链路机制你就掌握了八成。后面无论接多少设备多少个点,核心都是这一步的放大版。第一阶段整个项目调试时,我们也是先用一个模拟从站验证完了链路,再切换成现场真实设备,大大减少了联调时的排障压力。
4.4 用脚本做进阶联动
标签绑定解决的是「数据显示」,脚本解决的是「业务联动」。FUXA 支持在控件事件和服务端逻辑里写 JavaScript。现场最典型的需求场景是:
现场操作员按了一个启动按钮,要经过确认提示、校验设备状态、发送写指令、再更新画面按钮颜色。这些用纯属性绑定做不完整,但脚本就很顺手。按钮点击事件里判断设备是否处于远程模式,不是就弹窗提示,是就执行写寄存器操作,成功后把按钮文本改为「运行中」。
脚本功能给 FUXA 带来了非常强的扩展性:对接内部 HTTP API、把报警信息推送给我们自己的消息通道、定时抓取外部数据再写入标签,都能实现。开源项目的脚本接口就是一张白纸,能画什么取决于你自己的想象力。
5. 真实项目的选型与调优实践
5.1 一个模拟改造项目的配置思路
这边说一个之前做过的模拟改造项目。需求是给一套小型设备环境做远程监控,甲方要能看到设备启停状态、主要工艺参数、历史趋势和告警信息,部署位置就是一台办公室里的 Linux 小主机。
整个项目的结构是这样的:
- 数据源:一台 OPC UA 服务器,整合了五台 Modbus 仪表的数据;
- 采集端:FUXA 部署在 Linux 上,通过 OPC UA 客户端接入;
- 画面端:三台办公电脑用浏览器访问,其中经理的账号设置为只读;
- 外网访问:通过反向代理提供 HTTPS 接入,方便在外面打开手机看状态。
实施第一步仍然是分模块验证:先把 OPC UA 数据源接入成功,标签建好可以看到实时值;再画主页面;最后才是做告警和趋势。整个过程用了一周,大头反而花在画面上——甲方对视觉呈现的要求不比功能低。
这个项目验证了 FUXA 的中小项目承载力:100 多个点位同时刷新,多台浏览器并发访问,稳定性完全 OK。服务器资源占用也比较低,日常 CPU 保持在个位数百分比。
5.2 轮询与性能优化,别一上来就全 100ms
数据刷新频率是整个系统性能的命门。不少第一次用的人习惯把所有点位的刷新周期都设为 100ms 或者 200ms,结果设备通讯负载陡增,画面反而卡顿。因为 FUXA 的采集是服务器主动去读设备,每个点位一个周期,点位一多,大量频繁请求会挤爆通讯通道。
我的建议是分类设置:
- 开关量、设备运行状态,刷新周期设 1 秒,反映按钮状态变化足够快了;
- 模拟量、温度压力液位等过程量,设 2~5 秒,工业过程本来就不是毫秒级突变的;
- 累积量、电表读数,10~30 秒甚至更久,这类数据变化缓慢,读太勤没有意义。
实时性和负载是权衡关系。客户问你为什么页面数据不是每毫秒更新,你跟他解释清楚工业现场的物理本质,他会理解。反倒是一股脑全设成快刷新,现场通讯一不稳定,画面数据偶尔跳一下,客户反而觉得系统不可靠。
画面上图元数量也要控制。趋势图、SVG 复杂图形本身就占渲染资源,一个画面塞几百个复杂图元,低配电脑浏览器会明显卡顿。合理做法是一个监控主题一页,每页重点图元数量控制在几十个量级,次级信息放到跳转页去。
5.3 远程访问与安全部署
FUXA 服务默认监听的端口不要直接暴露到公网,这是底线。生产环境的推荐做法是让它跑在内网,只通过反向代理对外提供 HTTPS 服务,同时把 WebSocket 升级也代理好,因为 FUXA 实时推送依赖 WebSocket。
对外访问链路可以这样规划:
- 内网:设备 → 交换机 → FUXA 服务器;
- 外网:手机/电脑 → HTTPS 反向代理 → FUXA 服务。
用户权限上,FUXA 内置的角色体系要启用起来。给甲方领导配只读账号,只能看画面和趋势;给现场工程师配维护账号,可以修改配置、确认告警;管理员账号自己保存好。权限这东西平时不觉得重要,出事的时候就是背锅和免责的分界线。
工程备份也要制度化。开发完一个阶段,就用 FUXA 的工程导出功能打一个包存起来,跟版本号对应。我们后来还写了个定时脚本,每天凌晨把工程数据和历史数据库目录整体压缩一份,扔到备份盘里。对于小团队,这就是性价比最高的容灾方案。
6. 实测踩坑记录:我替你先趟过的问题
6.1 三个值得展开说的坑
第一个坑是中文乱码。现象:在 Linux 服务器上部署后,浏览器打开画面,所有中文标注全部变方框。原因是服务器本身没有装中文字体,浏览器渲染字体时找不到字符就显示成占位符。这个坑前期完全想不到,因为本地 Windows 开发环境根本不会缺字体。解决办法很直接:安装系统里的中文字体包,或者给两端统一指定一款常见中文字体。改了字体之后,图元文本要统一规范,别不同图元用不同字体,否则画面风格很乱。
第二个坑是 Modbus 读数莫名其妙。现象:现场一个温度传感器的值,在仪表上显示 25.6 摄氏度,FUXA 画面上读出来却是异常负值或跳变的数字。排查过程花了不少时间:先怀疑是 IP 和从站号配错,检查后没问题;再怀疑是地址偏移,对照设备手册也没错;最后发现是字节序配置和实际寄存器排列不匹配。现场工程师给的寄存器表不会明确告诉你字节序是高位在前还是低位在后,只能通过试验来确定。我的经验是:第一次接入新设备时,先在从站端设置一个固定的、好识别的数值,然后把字节序的各个选项切一遍,看哪个读数最稳、最合理,选中之后再批量建点。
第三个坑是历史数据文件疯长。现象:项目跑了两周,突然收到磁盘空间告警。查看数据目录,发现历史文件已经从几百兆涨到几个 G。原因:当时图省事,给大部分标签都勾了历史存储,刷新周期又设得短,数据被大量重复写入。解决办法:只对关键参数和历史分析需要的点位开启存储,把存储周期从秒级放宽到分钟级;然后写好历史数据清理策略,超过三个月的数据归档后删除。历史数据要有,但不是所有数据都值得长期保存。
6.2 踩坑速查表
除了上面三个,还有几个频率较高的坑,整理成表方便新手排查:
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 页面打开空白 | 浏览器缓存了旧版本 | 硬刷新或清理缓存,再重新登录 |
| 编辑器报错、无法启动 | Node 版本过新或过旧 | 切换到 LTS 版本,重新 npm install |
| 反向代理后画面加载但数据不更新 | WebSocket 代理未开启 | 在代理配置里把 WebSocket 直通流量放行 |
| 运行模式点击控件没反应 | 控件事件或属性绑定配置错误 | 逐个检查绑定关系,先在预览模式里测试单个标签 |
| 画面能访问但登录不了 | 初始账号密码被改过且遗忘 | 重置用户数据或恢复工程备份 |
6.3 给新手的排障方法论
最后想分享一个通用排障思路:开源项目出问题,第一反应别是猜,而是去翻日志。FUXA 启动时控制台会输出一堆信息,通讯失败、存储异常、脚本报错,基本都会留下痕迹。顺着日志,大概率能精准定位问题。
第二个思路是「最小化复现」。异常出现时,不要在一堆标签和画面里找原因,而是建一个最简单的场景:一条链路、一个标签、一个控件,看能不能复现问题。能在最小环境复现,就能快速做排除法。不能复现,大概率是配置量太大导致的边界情况,这时候逐步加回来,直到复现为止。很多 Modbus 类的问题都是这样做排查的。
至于更深层的功能特性,FUXA 毕竟是开源项目,遇到文档没写清楚的地方,直接去翻源码是最靠谱的路径。我曾在源码里查到某个控件的完整属性列表,比文档列得还全。学会读源码,开源软件在你的手上才真正变成「自己的工具」。
最后再分享一点个人体会
FUXA 折腾了这些天,我的整体判断是:它不一定能替代商业组态软件,但在中小规模项目里,它确实提供了一条高效、低成本的路线。尤其是那种甲方预算有限、周期紧,又想远程看数据的场景,FUXA 几乎是刚需方案。
真要动手做,第一件事不是急着搭环境,而是想清楚自己的点位规模、通讯协议、数据保留周期。把这些定下来,再带着需求去配设备、建标签、画画面,速度会快很多。过程里千万记得及时导出工程备份,这个习惯救过我很多次。
后面如果再深入,我会考虑自己写几个自定义图元,或者给它的协议层做一个扩展。开源的好处就在这——工具不够用,那就自己补一块。希望这篇介绍能帮你少走几条弯路,顺利把第一套界面跑起来。