上位机开发 · HMI · SCADA · 学习专题

上位机 / HMI 技术栈选型专题

做上位机,用 WPF 还是 WinForm?Web HMI 能替代桌面吗?组态软件还是自研?MVVM 到底是什么?分辨率适配怎么做?通讯库用哪个? 本专题把这些工程师最常问的问题,按 「认知 → 桌面技术栈 → Web HMI → 组态选型 → 实战开发 → 工程化」 串成一条可照着走的路径,不堆参数表,只讲现场真正用得上的部分。

9 篇实战教程 3 个在线工具 17 款相关软件 持续更新 · 丁丁智造

一条路径走完上位机 HMI(六个阶段)

  1. 01

    先建立整体认知:上位机 / HMI / SCADA 到底是什么、桌面 vs Web 怎么选

    很多工程师入行时被「上位机」「HMI」「SCADA」「组态软件」这些概念搞晕,不知道它们的区别和关系,也不知道该学什么技术栈。先把概念理清、把技术栈全景看清楚,后面的选型和学习才有方向。

    • 上位机(HMI):人机界面(Human-Machine Interface),是人和设备之间的交互界面,负责数据显示、参数设置、操作控制、报警提示。通常指运行在工控机或触摸屏上的监控程序,用 C#/WPF/WinForm、Qt、或组态软件开发
    • SCADA:数据采集与监视控制系统(Supervisory Control And Data Acquisition),是比 HMI 更大的系统,包含实时数据库、报警管理、历史趋势、报表、用户权限、分布式架构等完整功能,适合中大规模工厂监控。HMI 是 SCADA 的一部分(界面部分)
    • 组态软件:专门用来快速开发 HMI/SCADA 界面的工具,如组态王、WinCC、iFIX、CIMPLICITY、InTouch,提供可视化拖拽编辑、图库、脚本、通讯驱动,不用写代码就能做出监控界面。优点是开发快,缺点是灵活性差、授权贵、定制化能力有限
    • 桌面上位机 vs Web HMI:① 桌面上位机(WPF/Qt/WinForm)——性能好、响应快、离线可用、和硬件交互方便,适合单机/产线级监控、对实时性要求高的场景;② Web HMI(Vue/React+TypeScript)——跨平台、免安装、远程访问、多终端适配(电脑/平板/手机)、UI 现代化,适合多站点、多用户、需要远程访问的场景;③ 趋势——Web HMI 是未来方向,但桌面上位机在工业现场仍有不可替代的价值,两者会长期共存
    • 技术栈全景:① .NET 桌面——WPF(主流)、WinForm(老项目)、Avalonia(跨平台)、Uno Platform(跨平台);② C++ 跨平台——Qt(最成熟)、Slint(新兴);③ 嵌入式——LVGL、TouchGFX、Embedded Wizard;④ Web——Vue3/React + TypeScript + ECharts/Element Plus;⑤ 组态——组态王/WinCC/iFIX/CIMPLICITY/InTouch(商业)、Rapid SCADA/FUXA/OpenSCADA(开源)
  2. 02

    桌面技术栈选型:WPF / WinForm / Qt / Avalonia,MVVM 架构是必选项

    做桌面上位机,.NET 生态(WPF/WinForm)和 Qt 是两大主流。WPF 是当前 Windows 桌面开发的主流,MVVM 架构是 WPF 开发的标准范式;WinForm 是老技术但仍有大量存量项目;Qt 是跨平台 C++ 框架,适合需要跨 Windows/Linux 或对性能要求极高的场景;Avalonia 是 .NET 跨平台 UI 框架,WPF 开发者可以平滑迁移。

    • WPF(Windows Presentation Foundation):.NET 平台的桌面 UI 框架,XAML 声明式 UI、数据绑定、MVVM 架构、丰富的样式和模板、矢量图形、硬件加速渲染。是当前 Windows 桌面上位机开发的主流选择,适合中大型项目、复杂界面、需要长期维护的项目。学习曲线比 WinForm 陡,但掌握后开发效率和代码质量远高于 WinForm
    • WinForm(Windows Forms):.NET 平台的老桌面框架,事件驱动、控件拖拽、开发简单,适合快速开发小工具和简单界面。存量项目很多,新项目不建议用(微软已不重点更新),但维护老项目必须会。性能和界面美化能力不如 WPF,复杂界面开发效率低
    • Qt:C++ 跨平台 UI 框架,支持 Windows/Linux/macOS/嵌入式,QML 声明式 UI、信号槽机制、丰富的控件库、跨平台一致体验。适合需要跨平台、对性能要求极高、或团队有 C++ 背景的项目。学习曲线比 WPF 陡,C++ 开发效率低于 C#,但跨平台能力和性能是优势
    • Avalonia UI:.NET 跨平台 UI 框架,风格和 WPF 类似(XAML+MVVM+数据绑定),WPF 开发者可以平滑迁移,支持 Windows/Linux/macOS/浏览器/移动端。适合需要跨平台的 .NET 团队,是 WPF 的跨平替代方案。生态不如 WPF 成熟,但发展很快
    • MVVM 架构:Model-View-ViewModel,是 WPF/Avalonia 开发的标准架构。① Model——数据模型和业务逻辑;② View——XAML 界面,只负责显示;③ ViewModel——界面逻辑,通过数据绑定和 View 通信。好处:界面和逻辑分离、可单元测试、可换肤、团队协作(设计师做 View,开发者做 ViewModel)、代码可维护性高。WPF 开发必须用 MVVM,不用 MVVM 的 WPF 项目后期会变成代码垃圾场
    • 桌面技术栈选型建议:① 新项目、Windows 平台、.NET 团队——WPF + MVVM,首选;② 老项目维护——WinForm,保持技术栈一致;③ 需要跨 Windows/Linux、C++ 团队——Qt;④ 需要跨平台、.NET 团队——Avalonia;⑤ 嵌入式触摸屏——LVGL/TouchGFX
  3. 03

    Web HMI 技术栈:Vue3 + TypeScript + ECharts,工业 Web 界面的现在和未来

    Web HMI 是工业监控的未来趋势——跨平台、免安装、远程访问、多终端适配、UI 现代化。Vue3 + TypeScript 是当前 Web HMI 开发的主流技术栈,配合 Element Plus(UI 组件库)、ECharts(图表)、Vite(构建工具),可以快速开发现代化的工业监控界面。Web HMI 不是要完全替代桌面上位机,而是在多站点、多用户、远程访问场景下提供更好的体验。

    • Vue3 + TypeScript:Vue3 是当前最流行的前端框架之一,Composition API、响应式系统、组件化开发,学习曲线平缓,开发效率高。TypeScript 提供类型安全,适合中大型项目,减少运行时错误,提升代码可维护性。Vue3 + TS 是 Web HMI 开发的首选组合
    • UI 组件库:Element Plus(Vue3 最流行的企业级 UI 组件库,表单/表格/对话框/菜单等组件齐全,适合后台管理和监控界面)、Ant Design Vue(阿里出品,设计规范严谨,适合企业级应用)、Naive UI(轻量、TypeScript 友好、主题定制灵活)。工业 HMI 推荐 Element Plus,组件丰富、文档好、社区活跃
    • 图表库:ECharts(百度出品,国内最流行的图表库,支持折线/柱状/饼图/仪表盘/地图/关系图等,工业监控看板必备)、Chart.js(轻量、简单,适合基础图表)、D3.js(高度灵活、定制能力强,学习曲线陡)。工业 HMI 推荐 ECharts,功能强大、中文文档好、工业场景案例多
    • 构建工具:Vite(新一代前端构建工具,开发服务器启动快、热更新快,Vue3 官方推荐)、Webpack(老牌构建工具,生态成熟但速度慢)。新项目推荐 Vite,开发体验好
    • Web HMI 的优势:① 跨平台——Windows/Linux/macOS/平板/手机都能访问,只要有浏览器;② 免安装——不用在每台电脑上安装客户端,打开浏览器就能用;③ 远程访问——在办公室、家里、手机上都能看车间状态,不用跑现场;④ 多终端适配——响应式布局,电脑/平板/手机自动适配;⑤ UI 现代化——Web 技术的 UI 表现力远强于桌面框架,界面更美观、交互更流畅;⑥ 部署更新方便——只更新服务器,所有客户端自动更新,不用逐台升级
    • Web HMI 的挑战和应对:① 实时性——Web 界面的实时性不如桌面,但用 WebSocket 推送 + 前端缓存可以做到 100ms-1s 级刷新,满足绝大多数监控场景;② 离线可用——Web 界面依赖网络,断网就不能用,可以用 PWA(渐进式 Web 应用)做离线缓存,或关键场景保留桌面客户端;③ 和硬件交互——Web 界面不能直接访问串口/USB,需要通过后端服务(如 MidwayJS/Node.js)中转,或用 Web Serial API(Chrome 支持);④ 安全性——Web 界面暴露在网络上,必须做好认证授权、传输加密(HTTPS/WSS)、接口防护;⑤ 浏览器兼容性——工业现场可能有老版本浏览器,需要做好兼容测试或指定浏览器
  4. 04

    开源 vs 商业组态软件:组态王 / WinCC / iFIX vs Rapid SCADA / FUXA,怎么选

    组态软件是工业 HMI/SCADA 开发的传统方式,可视化拖拽、不用写代码、开发快。商业组态软件(组态王/WinCC/iFIX/InTouch)功能强大、稳定可靠,但授权贵、灵活性差、定制化能力有限。开源组态软件(Rapid SCADA/FUXA/OpenSCADA)免费、可定制,但生态和功能不如商业软件成熟。选型要结合项目规模、预算、定制化需求、团队能力综合判断。

    • 商业组态软件:① 组态王(KingView)——国内最流行的国产组态软件,中文文档好、驱动全、价格相对便宜,适合中小项目;② WinCC(西门子)——西门子出品,和西门子 PLC 无缝集成,功能强大、稳定性高,适合大型项目和西门子生态;③ iFIX 与 CIMPLICITY(Velotic,原 GE Proficy)——同门两款,iFIX 通用易上手、VBA 脚本能力强,适合大型项目;CIMPLICITY 定位企业级,真客户端/服务器架构、点数容量与冗余更强,擅长汽车/电力/轨道交通等超大规模项目;④ InTouch(AVEVA)——全球市场份额最高的组态软件,功能强大、图库丰富,适合大型项目;⑤ Ignition(Inductive Automation)——新一代 SCADA 平台,基于 Java/Web,架构现代化、授权模式灵活(按服务器不限客户端),适合中大型项目。商业软件优点:功能成熟、稳定性高、驱动全、技术支持好;缺点:授权贵(从几万到几十万)、灵活性差、定制化能力有限、升级成本高、绑定供应商
    • 开源组态软件:① Rapid SCADA——C# 开发,功能完整(实时监控/报警/历史/报表/用户权限)、Web 界面、模块化架构、可二次开发,适合中小项目;② FUXA——Node.js 开发,Web 界面、可视化拖拽编辑、支持 Modbus/OPC UA/S7/MC 等协议、轻量易用,适合小型项目和原型验证;③ OpenSCADA——Java 开发,功能强大、架构灵活,但学习曲线陡、文档少;④ FreeSCADA——C++/Qt 开发,跨平台,但更新慢;⑤ Scada-LTS——Java 开发,Web 界面,基于 SCADA 系统。开源软件优点:免费、可定制、无授权限制、自主可控;缺点:生态不如商业成熟、驱动可能不全、技术支持靠社区、需要一定开发能力、大型项目需要自己做稳定性保障
    • 组态软件 vs 自研上位机:① 组态软件——开发快(拖拽配置)、驱动全(不用自己写通讯)、稳定性高(经过大量项目验证),适合标准监控场景、快速交付项目、团队开发能力弱的情况;但灵活性差、定制化能力有限、授权贵、长期维护成本高;② 自研上位机(WPF/Qt/Web)——灵活性高、可以完全按需求定制、无授权费、可以积累自己的技术资产,适合复杂业务逻辑、特殊界面需求、长期产品化项目;但开发周期长、需要自己写通讯驱动、需要自己保障稳定性、对团队开发能力要求高
    • 选型决策:① 项目预算充足、标准监控场景、快速交付——商业组态软件(组态王/WinCC);② 预算有限、中小项目、有一定开发能力——开源组态软件(Rapid SCADA/FUXA);③ 复杂业务逻辑、特殊界面需求、长期产品化——自研上位机(WPF/Web HMI);④ 混合方案——组态软件做标准监控界面,自研程序做特殊业务逻辑和数据处理,通过 OPC UA/数据库交互
    • 国产化替代:信创环境下,商业组态软件首选国产(组态王/力控/亚控),开源组态软件首选 Rapid SCADA(基于 .NET,可在国产 OS 上运行)或 FUXA(基于 Node.js,跨平台)。自研上位机首选 WPF(.NET 可在国产 OS 上运行)或 Web HMI(浏览器原生支持)
  5. 05

    实战开发:WPF MVVM 项目模板、Web HMI 开发实践、通讯库集成

    选型之后就是开发落地。WPF MVVM 项目要有清晰的分层架构和项目模板,Web HMI 要有规范的前端工程结构,通讯库(HslCommunication/TouchSocket/OPC UA 库)的集成是上位机开发的核心。掌握项目模板和通讯库集成,开发效率会大幅提升。

    • WPF MVVM 项目模板:① 项目分层——Models(数据模型)、ViewModels(界面逻辑)、Views(XAML 界面)、Services(业务服务/通讯服务)、Helpers(工具类);② MVVM 框架——CommunityToolkit.Mvvm(微软官方推荐,轻量、Source Generator 自动生成属性和命令)、Prism(功能完整、模块化/导航/依赖注入,但较重)、MvvmLight(老牌但已停止维护)。新项目推荐 CommunityToolkit.Mvvm;③ 数据绑定——ViewModel 继承 ObservableObject,属性用 [ObservableProperty] 自动生成,命令用 [RelayCommand] 自动生成;④ 消息传递——WeakReferenceMessenger 做 ViewModel 间通信,避免直接引用;⑤ 依赖注入——.NET Generic Host + Microsoft.Extensions.DependencyInjection,管理 ViewModel 和 Service 的生命周期
    • WPF 界面开发实践:① XAML 布局——Grid(网格布局,最常用)、StackPanel(堆叠布局)、DockPanel(停靠布局)、Canvas(绝对定位);② 样式和模板——Style 统一样式、ControlTemplate 自定义控件外观、DataTemplate 数据展示;③ 资源字典——把样式/颜色/模板放在 ResourceDictionary 中,统一管理、支持换肤;④ 矢量图标——用 Geometry 画矢量图标,或用 FontAwesome/Segoe MDL2 字体图标,不要用位图(缩放模糊);⑤ 性能优化——虚拟化(ItemsControl VirtualizingStackPanel)、延迟加载、避免频繁 INotifyPropertyChanged、用 Freezable 减少动画开销
    • Web HMI 开发实践:① 项目结构——src/views(页面)、src/components(组件)、src/stores(状态管理 Pinia)、src/api(接口)、src/utils(工具)、src/types(类型定义)、src/assets(静态资源);② 状态管理——Pinia(Vue3 官方推荐,轻量、TypeScript 友好),管理全局状态(用户信息、实时数据、报警);③ 实时数据——WebSocket 连接后端,接收实时数据推送,用 Pinia store 管理,界面响应式更新;④ 路由——Vue Router,页面路由管理,支持路由守卫(登录验证);⑤ 图表封装——把 ECharts 封装成 Vue 组件,统一配置、自动 resize、支持主题切换
    • 通讯库集成:① HslCommunication——国内最流行的工业通讯库(C#),支持 Modbus/西门子S7/三菱MC/欧姆龙/AB/松下等几乎所有主流 PLC,API 简洁、文档全、社区活跃,WPF 上位机首选;② TouchSocket——C# 网络通讯框架,支持 Modbus/TCP/串口/ websocket,高性能、可扩展,适合需要自定义协议的场景;③ OPC UA 库——OPCFoundation .NET Standard(官方)、HslCommunication(集成了 OPC UA 客户端);④ 通讯服务封装——把通讯逻辑封装在 Service 层,ViewModel 通过 Service 接口访问,实现界面和通讯解耦;⑤ 通讯状态管理——连接状态、断线重连、超时重试、数据缓存,都在 Service 层处理
    • 数据持久化:① SQLite——轻量嵌入式数据库,适合上位机本地数据存储(历史数据/报警记录/参数配置),不需要安装数据库服务,单文件部署;② 配置文件——JSON/XML 存参数配置,简单易用;③ 实时数据——内存缓存(ConcurrentDictionary),不需要持久化;④ 历史数据——SQLite(小规模)或时序库(大规模),practice-sqlite-hmi-reliable 有详细的 SQLite 上位机可靠性实践
  6. 06

    工程化落地:分辨率适配、多语言、性能优化、部署更新与长期维护

    从「界面做出来」到「生产环境长期稳定跑」,要解决几个工程问题:不同分辨率屏幕显示不全怎么办?多语言/多单位怎么支持?界面卡顿怎么优化?怎么部署和更新?怎么长期维护?这是上位机开发从「能跑」到「好用」的关键,也是很多工程师容易忽略的部分。

    • 分辨率适配:① WPF 分辨率适配——用 Grid + 比例布局(星号*)、不用固定像素宽高、Viewbox 等比缩放、DPI 感知(PerMonitorV2)、最小窗口尺寸限制;② 常见坑——用 Canvas 绝对定位导致不同分辨率下控件错位、用固定像素导致小屏幕显示不全、忽略高 DPI 导致界面模糊;③ pitfall-hmi-screen-resolution 有详细的分辨率适配踩坑指南;④ Web HMI 分辨率适配——响应式布局(CSS Grid/Flexbox + media query)、rem/vw 相对单位、Element Plus 组件自带响应式、ECharts 自动 resize;⑤ 多终端适配——电脑(1920×1080)、平板(1024×768)、手机(375×667),用响应式布局自动适配
    • 多语言/多单位:① WPF 多语言——资源字典(.xaml)存多语言文本、运行时切换语言、绑定动态资源(DynamicResource);② Web HMI 多语言——vue-i18n 插件,JSON 文件存多语言文本,运行时切换;③ 多单位——公制/英制切换,单位存在配置中,显示时转换,存储统一用公制;④ 多语言注意——文本长度变化(德语比中文长 30%)、布局要留余量、日期时间格式(YYYY-MM-DD vs MM/DD/YYYY)、数字格式(小数点/千分位)
    • 性能优化:① WPF 性能——UI 虚拟化(大列表用 VirtualizingStackPanel)、数据虚拟化(按需加载数据)、避免频繁 PropertyChanged(批量更新)、Freezable 优化动画、图片优化(用矢量图、压缩位图、避免大图)、线程分离(耗时操作放后台线程,UI 只做显示);② Web HMI 性能——虚拟滚动(大列表)、防抖节流(频繁事件)、懒加载(路由/图片按需加载)、避免不必要的重渲染(shouldUpdate、computed 缓存)、WebSocket 数据合并(减少渲染次数)、ECharts 数据降采样(大数据量图表);③ 通讯性能——批量读取(一次读多个寄存器,不要逐个读)、合理的采集频率(不需要 100ms 的就用 1s)、数据缓存(避免重复读取)、断线重连不要死循环(指数退避)
    • 部署更新:① WPF 部署——单文件发布(dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true)、绿色版(不用安装,解压即用)、自动更新(Squirrel/AutoUpdater.NET/自研更新器);② Web HMI 部署——前端静态文件部署到 Nginx/Apache,后端服务部署到服务器/Docker,更新只更新服务器,客户端自动更新;③ 组态软件部署——运行时授权、工程文件打包、驱动安装;④ 版本管理——Git 管理源代码,语义化版本号(MAJOR.MINOR.PATCH),CHANGELOG 记录变更,发布前充分测试
    • 长期维护:① 代码质量——MVVM 架构、分层清晰、命名规范、注释完整、代码审查;② 文档——需求文档、设计文档、用户手册、运维手册、API 文档,文档和代码同步更新;③ 日志——结构化日志(Serilog/NLog),分级(Debug/Info/Warn/Error),按日期滚动,方便排查问题;④ 监控——程序运行状态、内存/CPU 占用、通讯状态、数据异常,异常时告警;⑤ 技术债务——定期重构、更新依赖、修复已知问题,不要让技术债务越积越多;⑥ 知识传承——代码可维护、文档齐全、团队培训,避免关键人员离职后项目无人能维护

边学边用:上位机开发常用工具

上位机开发最常遇到的问题:浮点字节序、状态字解析、Modbus 报文调试。纯浏览器本地计算,不上传数据。

上位机 / HMI 相关软件选型(按用途分组)

更多上位机/HMI 软件见 HMI 开发框架分类和 SCADA 组态软件分类,可用 软件对比正面对比。

上位机 / HMI 常见问题

上位机和 HMI 有什么区别?和 SCADA 又是什么关系?

这三个概念经常被混用,其实它们的范围和定位不同:① HMI(Human-Machine Interface,人机界面)——狭义指人和设备之间的交互界面,负责数据显示、参数设置、操作控制、报警提示,通常指触摸屏上的界面或简单的监控程序;② 上位机——广义指运行在工控机/PC 上的监控程序,相对于「下位机」(PLC/设备)而言,上位机负责和下位机通讯、显示数据、发送指令,功能比 HMI 更丰富,可能包含历史数据、报表、用户权限等;③ SCADA(Supervisory Control And Data Acquisition,数据采集与监视控制系统)——是比上位机更大的系统,包含实时数据库、报警管理、历史趋势、报表、用户权限、分布式架构、多站点管理等完整功能,适合中大规模工厂监控。三者关系:HMI 是上位机的一部分(界面部分),上位机是 SCADA 的一部分(单站点监控)。简单说:HMI = 界面,上位机 = 界面+通讯+简单功能,SCADA = 完整的分布式监控系统。实际项目中,小规模用「上位机」或「HMI」,中大规模用「SCADA」,概念不用太纠结,关键是搞清楚项目需要哪些功能。

做上位机用 WPF 还是 WinForm?2026 年了还学 WinForm 吗?

WPF 和 WinForm 都是 .NET 平台的桌面 UI 框架,但定位和前景不同:① WPF——XAML 声明式 UI、数据绑定、MVVM 架构、丰富的样式和模板、矢量图形、硬件加速,是当前 Windows 桌面开发的主流,微软持续更新,适合新项目、复杂界面、长期维护;② WinForm——事件驱动、控件拖拽、开发简单,是 .NET 的老框架,微软已不重点更新(但仍维护),适合快速开发小工具和维护老项目。2026 年的建议:① 新项目——必须用 WPF,不要用 WinForm,WPF 的开发效率、代码质量、界面表现力都远高于 WinForm,而且 WPF 是 .NET 的重点发展方向;② 老项目维护——必须会 WinForm,因为大量存量项目是 WinForm 开发的,维护老项目需要看懂和修改 WinForm 代码;③ 学习顺序——先学 WPF(主流),再了解 WinForm(维护老项目),不要反过来;④ 跨平台需求——如果需要跨 Windows/Linux,用 Avalonia(WPF 的跨平台版本)或 Qt。关于 MVVM:WPF 开发必须用 MVVM 架构,不用 MVVM 的 WPF 项目后期代码会非常难维护。CommunityToolkit.Mvvm 是微软官方推荐的 MVVM 库,轻量好用,Source Generator 自动生成属性和命令,大幅减少样板代码。总结:新项目用 WPF + MVVM + CommunityToolkit.Mvvm,老项目维护用 WinForm,跨平台用 Avalonia。

Web HMI 能替代桌面上位机吗?工业场景用 Web HMI 靠谱吗?

Web HMI 是工业监控的未来趋势,但目前还不能完全替代桌面上位机,两者是互补关系,会长期共存。Web HMI 的优势:① 跨平台——Windows/Linux/macOS/平板/手机都能访问,只要有浏览器;② 免安装——不用在每台电脑上安装客户端,打开浏览器就能用;③ 远程访问——在办公室、家里、手机上都能看车间状态,不用跑现场;④ 多终端适配——响应式布局,电脑/平板/手机自动适配;⑤ UI 现代化——Web 技术的 UI 表现力远强于桌面框架,界面更美观、交互更流畅;⑥ 部署更新方便——只更新服务器,所有客户端自动更新,不用逐台升级。Web HMI 的挑战:① 实时性——Web 界面的实时性不如桌面,但用 WebSocket 推送 + 前端缓存可以做到 100ms-1s 级刷新,满足绝大多数监控场景(只有运动控制等微秒级场景不适合);② 离线可用——Web 界面依赖网络,断网就不能用,可以用 PWA 做离线缓存,或关键场景保留桌面客户端;③ 和硬件交互——Web 界面不能直接访问串口/USB,需要通过后端服务中转,或用 Web Serial API(Chrome 支持);④ 安全性——Web 界面暴露在网络上,必须做好认证授权、传输加密(HTTPS/WSS)、接口防护;⑤ 浏览器兼容性——工业现场可能有老版本浏览器,需要做好兼容测试或指定浏览器。选型建议:① 多站点、多用户、需要远程访问——Web HMI 首选;② 单机/产线级、对实时性要求极高、需要直接访问硬件——桌面上位机首选;③ 混合方案——桌面上位机做现场实时监控和控制,Web HMI 做远程监控和数据分析,两者通过数据库/OPC UA 交互。实际项目中,越来越多的新项目采用 Web HMI 或混合方案,纯桌面上位机的新项目在减少,但桌面上位机在工业现场仍有不可替代的价值。

WPF 的 MVVM 架构到底是什么?为什么一定要用 MVVM?

MVVM(Model-View-ViewModel)是 WPF/Avalonia 开发的标准架构模式,核心思想是「界面和逻辑分离」。三个部分:① Model(模型)——数据模型和业务逻辑,如设备状态、报警记录、参数配置,不包含任何界面相关代码;② View(视图)——XAML 界面,只负责显示和用户交互,不包含业务逻辑,通过数据绑定显示 ViewModel 的数据,通过命令调用 ViewModel 的方法;③ ViewModel(视图模型)——界面逻辑,如数据获取、状态管理、命令实现,通过数据绑定和 View 通信,不直接引用 View。为什么一定要用 MVVM:① 可测试——ViewModel 不依赖界面,可以写单元测试,测试界面逻辑不用启动界面;② 可维护——界面和逻辑分离,改界面不影响逻辑,改逻辑不影响界面,代码清晰易读;③ 可协作——设计师/前端做 View(XAML 界面),开发者做 ViewModel(逻辑),并行开发;④ 可换肤——界面样式和逻辑分离,可以轻松换主题/皮肤,不用改逻辑;⑤ 可复用——ViewModel 可以在不同界面中复用,如设备列表 ViewModel 可以在列表页和详情页共用。不用 MVVM 的后果:① 代码-behind 里堆了大量业务逻辑,XAML 和代码耦合严重;② 无法单元测试,测试逻辑必须启动界面;③ 改界面容易影响逻辑,改逻辑容易影响界面,bug 满天飞;④ 代码无法复用,每个界面都重复写类似的逻辑;⑤ 项目越大越难维护,后期变成代码垃圾场。MVVM 实践:① CommunityToolkit.Mvvm——微软官方推荐,[ObservableProperty] 自动生成属性,[RelayCommand] 自动生成命令,大幅减少样板代码;② 数据绑定——View 绑定 ViewModel 的属性和命令,不要在 code-behind 里写业务逻辑;③ 消息传递——WeakReferenceMessenger 做 ViewModel 间通信,避免直接引用;④ 依赖注入——.NET Generic Host 管理 ViewModel 和 Service 的生命周期。总结:WPF 开发必须用 MVVM,这是行业标准,不是可选项。

开源组态软件能替代商业组态王/WinCC 吗?

开源组态软件在中小项目中可以替代商业组态软件,但在大型项目和复杂场景中还有差距。具体对比:① 功能完整性——商业组态软件(组态王/WinCC/iFIX)经过 20+ 年发展,功能非常完整(实时监控/报警/历史/报表/趋势/用户权限/脚本/驱动/图库/冗余),开源组态软件(Rapid SCADA/FUXA)核心功能齐全但高级功能(如冗余、复杂脚本、行业图库)可能不如商业软件;② 稳定性——商业组态软件经过大量项目验证,稳定性高,开源组态软件稳定性取决于项目活跃度和社区贡献,Rapid SCADA 和 FUXA 相对稳定;③ 驱动支持——商业组态软件驱动非常全(几乎所有 PLC/仪表/总线),开源组态软件驱动覆盖主流协议(Modbus/OPC UA/S7/MC)但小众协议可能需要自己开发;④ 技术支持——商业软件有官方技术支持(付费),开源软件靠社区和文档,问题解决速度可能慢;⑤ 授权成本——商业软件授权贵(从几万到几十万,按变量/客户端/服务器节点收费,各厂家口径不一),开源软件完全免费,无授权限制;⑥ 定制化——商业软件定制化能力有限(只能在框架内定制),开源软件可以完全定制(改源代码);⑦ 信创/自主可控——商业软件多为国外品牌(西门子/Velotic(原GE)/AVEVA),信创环境下有风险,开源软件自主可控,可在国产 OS 上运行。选型建议:① 大型项目、复杂场景、预算充足、需要官方技术支持——商业组态软件;② 中小项目、预算有限、有一定开发能力、需要自主可控——开源组态软件(Rapid SCADA 适合 .NET 团队,FUXA 适合 Web/Node.js 团队);③ 混合方案——开源组态软件做标准监控界面,自研程序做特殊业务逻辑,通过 OPC UA/数据库交互;④ 长期产品化——如果是做自己的产品,建议自研上位机(WPF/Web HMI),不依赖第三方组态软件,积累自己的技术资产。趋势:开源组态软件发展很快,功能越来越完善,在信创和国产化替代的大背景下,开源组态软件的市场份额会持续增长。Rapid SCADA 和 FUXA 是目前最值得关注的两个开源组态软件。

上位机界面分辨率适配怎么做?不同屏幕尺寸显示不全怎么办?

分辨率适配是上位机开发最常见的坑之一,很多工程师在 1920×1080 上开发的界面,到 1366×768 的工控机上就显示不全,或者在 4K 屏幕上变得很小。WPF 分辨率适配的正确做法:① 用 Grid + 比例布局——Grid 的行和列用星号(*)定义比例(如 <RowDefinition Height="*"/>、<ColumnDefinition Width="2*"/> ),不要用固定像素(Height="100"),界面会自动适应窗口大小;② 不用 Canvas 做主要布局——Canvas 是绝对定位,控件位置固定,不同分辨率下会错位,Canvas 只适合做绘图区域(如趋势图、流程图);③ Viewbox 等比缩放——如果界面设计成固定比例(如 16:9),可以用 Viewbox 包裹整个界面,等比缩放,保持比例不变,但可能有黑边;④ DPI 感知——在 app.manifest 中设置 PerMonitorV2 DPI 感知,避免高 DPI 屏幕上界面模糊;在 Program.cs 中调用 Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);⑤ 最小窗口尺寸——设置 MinWidth/MinHeight,防止窗口太小导致控件重叠;⑥ 字体大小——用相对字体大小(如基于系统字体),不要写死 12px,高 DPI 屏幕上字体会自动放大;⑦ 图片/图标——用矢量图(Geometry/字体图标),不要用位图,缩放不会模糊。常见错误:① 用 Canvas 绝对定位所有控件——最常见的错误,不同分辨率必错位;② 所有控件都写固定宽高——小屏幕显示不全;③ 忽略高 DPI——4K 屏幕上界面模糊;④ 用固定字体大小——高 DPI 上字体太小或太大。Web HMI 分辨率适配:① 响应式布局——CSS Grid/Flexbox + media query,不同屏幕尺寸自动调整;② 相对单位——用 rem/vw/vh 代替 px,根字体大小根据屏幕宽度调整;③ Element Plus 组件——自带响应式,表格/表单/菜单都能自适应;④ ECharts——监听 window resize 事件,自动调用 chart.resize();⑤ 多终端——电脑(1920×1080)、平板(1024×768)、手机(375×667),用响应式布局自动适配。pitfall-hmi-screen-resolution 教程有详细的分辨率适配踩坑指南,建议开发前先读一遍。

上位机和 PLC 通讯用什么库?HslCommunication 怎么样?

上位机和 PLC 通讯是上位机开发的核心,通讯库的选择直接影响开发效率和稳定性。C# 生态的通讯库:① HslCommunication——国内最流行的工业通讯库,作者是胡磊(大连),支持 Modbus RTU/TCP、西门子 S7-200/S7-1200/S7-1500/S7-300/S7-400、三菱 FX/Q/L 系列(MC 协议)、欧姆龙 CP/CJ/CS/NJ 系列(FINS/Host Link)、AB(罗克韦尔)、松下、汇川、信捷、台达等几乎所有主流 PLC,还支持 OPC UA 客户端、MQTT、串口、TCP 等。API 设计简洁、中文文档非常全、QQ 群/公众号活跃、NuGet 包持续更新,是 C# 上位机开发的首选通讯库;② TouchSocket——C# 网络通讯框架,作者是若汝棋茗,支持 TCP/串口/WebSocket/Modbus/HTTP,高性能、可扩展、插件化架构,适合需要自定义协议或高性能网络通讯的场景,和 HslCommunication 互补(Hsl 专注工业协议,TouchSocket 专注网络框架);③ OPCFoundation .NET Standard——OPC 基金会官方的 OPC UA 库,功能完整但 API 较复杂,学习曲线陡,适合需要完整 OPC UA 功能的场景;HslCommunication 也集成了 OPC UA 客户端,简单场景用 Hsl 更方便;④ S7.Net——西门子 S7 协议的开源库,轻量简单,只支持西门子,适合只需要西门子通讯的简单场景;⑤ libmodbus——C 语言的 Modbus 库,C# 可以通过 P/Invoke 调用,但不如直接用 HslCommunication 的 Modbus 支持。HslCommunication 的优点:① 协议全——几乎所有主流 PLC 都支持,不用为每个 PLC 写不同的通讯代码;② API 简洁——ReadInt16/ReadFloat/Write 等方法,几行代码就能读 PLC 数据;③ 中文文档全——官方文档、示例代码、视频教程都是中文,学习成本低;④ 社区活跃——QQ 群几万人,问题响应快;⑤ 持续更新——NuGet 包频繁更新,bug 修复快,新协议不断加入;⑥ 免费开源——MIT 协议,商业项目免费使用。HslCommunication 的注意事项:① 版本——用最新稳定版,旧版本可能有 bug;② 连接管理——不要频繁创建和销毁连接,用单例或连接池;③ 断线重连——自己实现断线重连逻辑(指数退避),Hsl 提供了连接状态事件;④ 批量读取——一次读多个寄存器,不要逐个读,提高通讯效率;⑤ 异常处理——所有通讯操作都要 try-catch,处理超时和通讯异常。其他语言的通讯库:① C++——libmodbus(Modbus)、open62541(OPC UA)、Qt Modbus;② Python——pymodbus(Modbus)、opcua(OPC UA)、python-snap7(西门子);③ Java——Eclipse Milo(OPC UA)、j2mod(Modbus)、Apache PLC4X(多协议)。总结:C# 上位机开发首选 HslCommunication,配合 TouchSocket 做自定义协议,OPC UA 场景可以用 Hsl 集成的 OPC UA 客户端或官方库。

继续往深走

项目里要做上位机/HMI,不确定用什么技术栈?可以在「技术咨询」描述你的项目规模、设备数量、界面需求和部署环境; 也可以到软件库按六维评分挑选合适的开发框架和组态软件。

先看 WPF 桌面开发框架 返回技术专题列表