
干这行久了你就知道一说SCADA很多人第一反应就是组态王、WINCC、iFix这些商业软件一开口就是授权费多少、组态、点数限制多少。我当年在厂里做设备监控改造预算卡得紧老板天天催我硬是用开源方案把整条产线的数据监控、历史曲线、报警管理全跑起来了。今天不整虚的直接把我挑出来、真正花时间研究过的5个开源SCADA组态项目摆出来涵盖Qt、C#、Web三个技术方向各有各的脾气也各有各的适用场景。想低成本落地、想学习组态软件架构、或者想二次开发搞一套自己的监控平台这篇够你玩一整年。1. 先搞清楚SCADA到底是个啥和上位机有什么区别很多刚入行的朋友看到“SCADA”和“上位机”这两个词就迷糊觉得它们是一回事。其实不然。上位机通常指的是PC端那个能跟PLC、仪表通信并且显示数据的软件说白了就是“坐在上位的那台机器上跑的程序”。而SCADA全称是Supervisory Control And Data Acquisition字面意思是数据采集与监视控制它是一个完整的体系除了人机界面还包含数据采集、历史存储、报警、趋势、权限管理、甚至调度控制策略。可以说上位机是SCADA的一个“脸面”和“手”但SCADA的能力边界比单纯一个上位机软件要大得多。做开源项目选型之前脑子里得有这个概念你要做的到底是一个“单机读数据再画出来”的上位机Demo还是一个带历史数据库、报警中心、多用户权限的SCADA系统。选错了架构后期折腾成本会让你怀疑人生。我见过有人拿PyQt写了一个串口数据展示软件然后非说自己在做SCADA结果要加报警存储的时候整段代码重写哭都来不及。所以下面的开源项目我按“能不能撑起SCADA体系”的标准来评价而不单看界面好不好看。2. 三个技术栈五个项目选型逻辑先说清楚2.1 为什么必须有Qt、C#、Web三条路线写SCADA和写普通业务系统不一样它对实时性、稳定性、硬件对接能力的要求很高。技术栈选错后面做通信驱动、画面组态、跨平台部署都会遇到阻力。Qt是传统工业软件的老牌选手。C嘛跟PLC通信、做底层驱动、搞点高性能图形渲染一点都不虚跨平台还能在X86工控机、ARM嵌入式板子上跑。很多老的监控组态软件都有Qt的影子选它不容易错。C#在Windows工控圈子里属于“统治级”存在。你打开组态王、力控的老版本安装目录里面大把DLL都是用.NET写的。特别是做西门子、三菱、Modbus协议对接厂商的例程几乎都是C#的生态太成熟了。如果你主攻Windows平台、和PLC打交道多C#就是最顺手的。Web是近五六年才杀进SCADA领域的。浏览器组态、云端监控、手机大屏这些需求传统桌面组态非常难做而Web天生合适。缺点是实时性和浏览器兼容性要花功夫但现在WebSocket打包Modbus数据已经很成熟了趋势不可逆。2.2 5个项目的筛选标准和适用人群这次挑的5个项目都是GitHub上能直接搜到、社区活跃度不错、文档能看得下去的东西。标准很简单能真正装起来、能接上数据、能画出画面而且你跟着文档能跑通。openSCADAQt/C适合想研究底层架构、对跨平台有要求、不怕在配置里折腾的人。Rapid SCADAC#/.NET Core适合Windows环境、中小型项目快速落地、想基于ASP.NET做二次开发的人。FUXAWeb/Node.js适合喜欢拖拽式组态、快速搭Web监控界面、前端技术栈偏JavaScript的人。Scada-LTSJava/Web适合需要历史数据库支撑、有较大规模监控点、看中Java生态的人。Grafana 工业插件Web可视化严格说不算传统SCADA但做数据大屏和趋势分析太好用了值得单独占一个位置。3. 逐个拆解安装、架构、实操、踩坑一次说清3.1 openSCADA老牌开源组态底层逻辑扎实openSCADA是我最早接触的开源SCADA项目之一。它核心用C写的UI基于Qt最新版本对Qt5/Qt6都做了适配。它不是一个简单的人机界面软件它自带一个很完整的模块化体系数据采集、数据库、通信服务、UI界面、报警、归档都是模块化管理。我第一次看这套架构的时候说实话有种“这不就是个开源版组态王”的感觉。安装的时候有个要注意的地方。如果你是在Ubuntu/Debian上装别只装主程序包要找齐全套模块。我用的是这种命令sudo apt-get install openscada openscada-mod-* openscada-ui-qtstarter通配符装上所有模块避免后面跑起来发现缺少某功能模块又要现找包。如果不想用apt官方提供源码包自己用qmake或者CMake编。不过除非你要改内核代码不然真没必要自己编译耗时间还容易遇到Qt版本不兼容。启动之后你面对的是一个空壳系统。第一次用的人经常懵这啥也没有啊别慌openSCADA的设计就是“万物皆配置”你得在项目里新建通信参数、添加数据源、绑定采集设备。举个例子接一个Modbus TCP设备路径大致是这样的在“数据源”里选ModBus新建传输参数填IP和端口默认502再新建Modbus节点把设备寄存器地址映射到系统变量里。这些概念和组态王里的“设备配置寄存器变量”几乎一一对应只是它把每一层拆得更细。实操里面我遇到最大的坑是Qt版本不匹配。有段时间我机器上是Qt 5.15.2openSCADA某个老版本还是按5.6编译的启动直接报“cannot mix incompatible Qt library”。解决方式是别用系统自带的旧包直接用官方仓库源装匹配版本或者用Docker包好一套环境。现在我建议所有人都用Docker跑省得折腾docker run -d --name openscada -p 10001:10001 -v /opt/oscada:/data openscada/openscada不过Docker跑的是纯服务端Qt界面部分要另想办法挂X11转发确实有点绕。如果你只是想熟悉架构、测试数据采集直接在Linux裸机装全套最省心。openSCADA的文档在官网有协议、模块、API很全的说明虽然中文资料少但对想做底层二次开发的人来说这套模块化设计非常宝贵值得花时间啃。3.2 Rapid SCADAC#/NET系最实用的开源选择Rapid SCADA在圈子里口碑一直不错。它最大的优点就是“开箱即用”的程度高而且整个框架分得很清晰Server负责数据采集和存储Agent负责和前端通信Webstation是Web端界面还有Administrator做组态配置。你在官网下载安装包一路Next就能跑出一个完整的监控平台里面已经有用户管理、报警、趋势图、报表这些SCADA该有的基础能力。Rapid SCADA旧版当年是基于.NET Framework做的只支持Windows到了v5.x就迁移到了.NET Core现在跨平台也行了不过实际部署还是Windows最顺。它默认的存储是内置的SQLite和PostgreSQL对于几千个采集点的中小型项目完全够用。要是点数过万建议直接配置PostgreSQL并定期做分区归档。C#方向的朋友用这套东西二次开发相当舒服。整个代码库开源你可以直接在通信层加新的设备驱动也可以在Web层改界面逻辑。我本地跑了一个Demo做了一个简单Modbus从站来测试它的采集链路过程很简单在Administrator里新建一个通信线路选Modbus TCP填从站IP和寄存器地址表它自动帮你把点位生成到系统表里然后Web端拖出来就能显示实时数据。这里想强调一下搞C#上位机/SCADA的人有几样基本功必须过关不然用Rapid SCADA也费劲。第一是TCPListener多客户端处理SCADA服务器要同时接收多台设备连接一个TcpListener配上线程池是常见模型但很多人写不好资源释放和并发安全。第二是委托和事件因为耗时操作在后台线程跑刷UI必须用Invoke否则控件会直接假死。这些坑在Rapid SCADA的二次开发中都会遇到官方文档里也有Demo代码可参考。另外一个常见问题是通讯不稳特别是用EasyModbus之类的库经常在断开重连时抛异常报“远程主机强迫关闭了一个现有的连接”。这块的排查思路我在第5节专门展开这里先提醒一句上位机通不通95%的问题不在界面在网络链路和通信参数。3.3 FUXAWeb组态里的香饽饽拖拽式画面上手极快如果你觉得openSCADA和Rapid SCADA的界面都有点“工业风太重”那FUXA可能会让我眼前一亮。FUXA是一个基于Node.js和Web技术的开源SCADA系统它内置了一个非常顺手的图形化组态编辑器拖拽元件、连线、绑定变量和在组态王里画流程图差不多甚至更流畅。我拿它一周内搭了一个水电厂的监控页面给客户做展示客户第一句话是“这个界面好看你们下功夫了”。安装FUXA也相当顺利只要Node.js环境是较新的版本即可npm install -g fuxa fuxa默认端口1881浏览器打开就能进编辑界面。它支持Modbus TCP/RTU、OPC UA、BACnet、MQTT等一堆常用协议在编辑界面里添加设备填IP端口和寄存器映射然后把元件和数据点绑定在一起实时数据就通了。我第一次用FUXA的编辑器时有个小习惯差点卡壳它不是像传统组态软件那样“双击元件就自动关联变量”而是要在元件的属性面板里手动选数据源和点位。刚开始觉得麻烦后来发现这对复杂画面的维护反而更清晰——你能精确控制每个元件绑定哪个测点。另外FUXA的存档数据默认放到本地SQLite你也可以接外部数据库做历史存储。踩过的坑说一个FUXA升级版本时老项目的画面文件和新版兼容性偶尔出问题比如加载界面报“InvalidStateError”多半是Service Worker缓存没更新这时候强制刷新浏览器、清掉缓存就能好。开发阶段我建议把所有项目文件用Git管理每次改画面之前先提交不然界面改崩了想回退都找不到版本。整体来说FUXA适合做中小型Web组态监控后台二次开发用的是TypeScript/JavaScript前端工程师转型过来很顺。3.4 Scada-LTSJava老炮的Web SCADA方案Scada-LTS这个项目我关注了很久它脱胎于Mango自动化平台用Java写的界面是纯Web端后端用Spring这类框架。和FUXA相比它的定位更“重”一些自带数据采集、历史归档、报警、图表、用户权限管理更像一个完整的SCADA服务器。如果你的团队Java基础好又需要一个能长期演进、带数据库支持完善的Web SCADA我会推荐Scada-LTS。安装部署以Tomcat MySQL/PostgreSQL为主官方提供打包好的WAR包和安装向导。我第一次部署时最大的感受是配置项真的多从数据源驱动、SQL方言到邮件报警服务都要设置。不过只要按安装向导一步一步走基本能跑起来。跑起来之后监控点管理、图表绘制、报警触发规则的配置都算清晰。Scada-LTS也是模块化的支持Modbus TCP、OPC DA/UA、MQTT、HTTP采集等。它有一个不错的地方就是历史数据处理比FUXA更成熟能配置点位的采样计划、数据压缩策略查历史趋势响应也快。如果你项目里监控点数很多而且在乎历史数据的长期积累Scada-LTS比FUXA更对路。要说缺点Scada-LTS界面风格比较传统现代化程度不如FUXA二次开发主要面向Java后端工程师很多人拿到代码会觉得工程有点重、结构有点绕。不过只要你忍过前期的熟悉阶段它的稳定性在Web SCADA里算是第一梯队。选它的项目我见过典型的就是学校实验室、污水处理厂监控、光伏电站数据看板特点是点数不少、数据要存好几年、团队能有人维护Java服务。3.5 Grafana 工业数据插件类组态的数据大屏利器把Grafana放进这个清单可能会有同行质疑Grafana不是做监控看板的吗怎么能算SCADA组态我的回答是如果你把SCADA狭义理解为“拖图画管道连接阀门”那Grafana确实不算但如果你关注的是“数据采集后如何呈现、报警、分析”Grafana能干掉一堆传统组态软件而且效果还好得多。我自己做的很多项目中真正的HMI组态画面用FUXA或Rapid SCADA但中控室的大屏、日报表、夜班趋势分析全是用Grafana做的两边配合得挺好。Grafana有丰富的插件生态比如Modbus数据源插件、MQTT插件、MySQL/PostgreSQL数据源插件你只要把采集到的数据写进数据库Grafana就能拉出来做实时曲线、热力图、仪表盘自动刷新秒级完全没问题。配置上唯一需要花点心思的是去掉大屏的边框和菜单开启Kiosk模式就是全屏播放。我常用的技巧是建立若干个Dashboard每个监控室一个然后给每个看板配一个短链接值班人员用浏览器打开就是专属大屏。用Grafana做历史趋势分析Freeboard、Zoom、Annotations这些功能比传统组态软件好用太多了这几年我在项目里一直这么干客户满意度很高。4. 到底该选哪个按项目场景对号入座看完了5个项目的介绍估计还是会有人问“那我到底该用哪个”。我给一个按场景选择的思路别一上来就盯着技术栈自己偏好哪个你得看你的实际约束是什么。如果你是小团队、想快速出演示系统、界面还要现代好看直接选FUXA。Node.js部署方便拖拽编辑器做了大部分工作后端接Modbus、MQTT都容易前端工程师一个人一周就能从零搭出能看的原型。如果你的项目在Windows环境、客户现场全是组态王、iFix的思维习惯、团队只会C#那不用犹豫Rapid SCADA是最稳的。它自带管理端和Web发布端最接近商业SCADA的“外形”你给客户演示的时候不会被吐槽“这东西好山寨”。而且基于.NET、源码开源真要对接什么冷门协议你写个驱动DLL放进去就行。如果项目有嵌入式设备、工控机是Linux或者你需要在ARM板上跑采集网关那openSCADA的Qt/C路线最合适。它的跨平台能力是这几个里最好的能编译到X86也能编译到ARM做边缘采集节点非常香。但UI组态体验确实老派做好心理准备。如果系统规模很大监控点数在一万以上而且有长期历史数据存储归档需求建议上Scada-LTS或用Grafana做上层可视化。原因就是它带成熟的数据库归档和历史查询底层服务的稳定性也经过了多年的生产环境考验。最后提醒一个很多新手常犯的错选型时过分纠结“界面能不能拖拽动画”忽略了通信层的数据完整性和报警及时性。SCADA的核心永远是“可靠地拿到数据、正确地显示、及时地报警”画面好看是锦上添花不是雪中送炭。你先把系统的数据链路通好再来考虑动效问题。5. 常见问题与排查技巧实录开源SCADA项目最大的麻烦是社区分散、文档不完整遇到问题四处找不到答案。我踩过的坑整理几个高频的你们提前避开就能省很多时间。Qt环境问题是老传统了。很多朋友从官网下载Qt 5.15.2安装后跑项目发现找不到QtSerialPort提示“unknown module in qt: serialport”。这是因为安装时默认没勾选“Serial Port”模块解决方法是回到Qt安装管理器里在对应编译器套件下勾上“Qt Serial Port”模块重新安装即可。至于报“could not find the qt platform plugin linuxfb”多半是嵌入式平台缺了platforms插件编译时把插件目录加到QT_QPA_PLATFORM_PLUGIN_PATH或者确保该目录在可执行文件同级目录下。C#通讯库EasyModbus的坑也不少。最常见的“无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接”原因通常是PLC从站主动断开了连接或者超时设置太短。你先把读写超时调大到1000毫秒以上失败后增加重试机制重试前先关闭TcpClient再重新连接不要在一个连接上反复读写很多问题能直接消失。另外注意Modbus寄存器的字节序问题有些设备大小端不对读出来的数据就是天书别怀疑是库坏了。Web端SCADA容易遇到缓存导致画面不更新的问题尤其是部署了PWA或者Service Worker的。FUXA和Scada-LTS的浏览器端都有类似机制更新后页面还显示老版本CtrlF5强制刷新几次通常能解决。我在生产环境里还会在反向代理层关掉静态资源缓存或者给静态文件加版本号从根上解决刷新不一致。Modbus TCP通讯时好时坏前几秒正常过一会就不响应这种十有八九是超时和轮询频率设置不合理。你一个线轮询几百个点的寄存器每50毫秒扫一次无线设备或老旧PLC根本扛不住把轮询间隔放大到200毫秒以上痛点就少了。碰到串口Modbus RTU的别忘了校验和、地址和波特率要一致否则一直在忙等超时设备反应跟死了似的。还有个小问题挺多人踩过用Qt模拟鼠标点击事件或做界面自动化测试时坐标对不准、点击无效。这不一定是代码问题多半是系统开启了显示缩放DPI缩放逻辑坐标和物理坐标对不上。开发机上关掉缩放、或程序中设置Qt::AA_EnableHighDpiScaling属性往往能解决。6. 我的个人体会这些开源项目用下来最大的感受是别贪多别想着一下子把五套全搞懂你只需要根据项目场景挑一个深入研究、改造、跑通生产环境就已经能在简历上写一笔扎实的开源SCADA实战经验。而我自己的习惯是底层采集用openSCADA或Rapid SCADA这样的成熟平台上层展示用FUXA/Grafana做现代化界面中间用Modbus/MQTT打通这套组合在客户现场的存活率极高。以后再有人问我“怎么低成本搞一套能落地的SCADA”我都是把这5个项目的名字丢过去让他们按项目特点挑。线下的坑上文基本都写了照着走至少能少熬夜几个晚上。