一套能直接用的 WPF 工业上位机(HMI)框架,带源码
目录
前言
项目介绍
项目功能
项目特点
项目技术
项目代码
整体结构
项目效果
项目源码
总结
前言
工业上位机软件这块,市面上的方案要么太重,要么太定制化,每次新项目都得从零搭一遍架子。之前做过几个设备控制项目,发现大量时间花在重复的架构搭建和基础功能实现上,真正投入业务逻辑的时间反而不多。
这次基于 WPF 和 DDD 分层架构做了一套快速开发框架,把设备通讯、数据采集、配方管理、实时监控这些工业场景的通用能力都集成好了,目标是下次再做类似项目时,可以直接拿来用,把精力放在业务本身。
项目介绍
一套面向工业自动化场景的上位机控制框架,采用 DDD 领域驱动设计分层架构,界面基于 Material Design 风格。涵盖了设备通讯、数据采集、配方管理、实时监控等核心能力,可用于搭建半导体、CMP 等工业设备的运行控制与监控软件。
框架整体按 DDD 经典分层拆成表示层、应用层、领域层、基础设施层,外加独立的控件库和插件层,每一层的职责边界都很清楚。
项目功能
功能模块 | 具体说明 |
|---|---|
登录鉴权 | 用户登录入口,权限验证基础 |
首页看板 | 关键指标与设备状态概览 |
工作台 | 日常作业主界面,承载核心操作 |
实时监控 | 设备状态监控,LiveCharts 实时曲线展示 |
配方管理 | 工艺配方的增删改查与下发 |
业务配置 | 业务参数配置管理 |
系统设置 | 系统级参数配置 |
主题切换 | Material Design 多皮肤切换 |
数据持久化 | SQLite 本地存储,基于 SqlSugarCore ORM |
Excel 导入导出 | 基于 MiniExcel 的高性能处理 |
远程文件操作 | 基于 Renci.SshNet.Async 的 SFTP/SSH 操作 |
项目特点
DDD 分层清晰:领域层和基础设施层严格分离,业务逻辑不依赖具体技术实现,替换数据库或通讯协议不影响核心业务
MVVM 样板代码极少:CommunityToolkit.Mvvm 的源生成器模式,[ObservableProperty]和[RelayCommand]在编译时生成绑定代码
CQRS 风格的协作方式:MediatR 处理命令和事件,模块之间通过消息通信,耦合度低
通讯协议可插拔:ReaderFactory + ReaderStrategy 工厂策略模式,换设备类型只需要新增策略实现,不用动现有代码
插件化打包:DillonMvvm.Plugins 可独立生成 NuGet 包,功能模块可以按需分发
项目技术
技术方向 | 具体选型 |
|---|---|
运行时 | .NET 8.0 (WPF) |
MVVM 框架 | CommunityToolkit.Mvvm 8.4.0 |
UI 主题 | MaterialDesignThemes 5.2.1 |
中介者/CQRS | MediatR 13.0.0 |
ORM | SqlSugarCore 5.1.4.198 |
数据库 | Microsoft.Data.Sqlite 9.0.8 |
对象映射 | Mapster 7.4.0 |
日志 | Serilog 4.3.0 |
Excel 处理 | MiniExcel 1.41.3 |
工业通讯 | HslCommunication 12.3.3 |
远程交互 | Renci.SshNet.Async 1.4.0 |
图表 | LiveCharts.Wpf 0.9.7 |
依赖注入 | Microsoft.Extensions.Hosting 9.0.7 |
项目代码
整体结构
解决方案包含七个项目,按 DDD 分层组织:
├── sss.GenericWpf.App/ # 表示层,启动入口 │ ├── Views/ # 所有视图 │ ├── ViewModels/ # 所有视图模型 │ ├── Resources/ # 字体、图片、样式 │ └── Themes/ # 主题资源 ├── sss.GenericWpf.Application/ # 应用层 │ ├── Dtos/ # 数据传输对象 │ ├── Services/ # 应用服务 │ └── EventHandlers/ # 事件处理器 ├── sss.Wpf.Domain/ # 领域层 │ ├── Entities/ # 领域实体 │ ├── EventBus/ # 领域事件 │ └── Extension/ # 领域扩展 ├── sss.Wpf.Domain.Core/ # 领域核心 │ ├── EntityBases/ # 实体基类 │ ├── Repository/ # 仓储抽象接口 │ └── Communication/ # 通讯抽象接口 ├── sss.Wpf.Infrastructure/ # 基础设施层 │ ├── Repositories/ # 仓储具体实现 │ ├── Communication/ # 通讯具体实现 │ └── Configuration/ # 配置文件 ├── sss.GenericWpf.Controls/ # 通用控件库 └── DillonMvvm.Plugins/ # 插件层项目效果
启动后的主界面左边是导航菜单,右边是内容区域。首页看板展示设备运行状态、产量统计等关键指标。实时监控页面用 LiveCharts 绘制实时曲线,数据刷新流畅。
配方管理页面提供配方的增删改查和下发操作,数据存储在本地的 SQLite 数据库中。通讯模块支持配置多种设备地址和协议类型,切换设备时只需要调整策略配置,业务代码不用动。
主题切换功能可以在亮色和暗色之间切换,界面风格统一。整个界面基于 Material Design,视觉上比较现代,和传统工控软件的风格有明显区别。
项目源码
可以直接克隆、还原依赖、编译运行,示例数据已经预置好了。https://github.com/chinaxuyanan/YR_TM
总结
框架把工业上位机开发中那些重复性的基础设施工作都封装好了。项目结构DDD分层确实让职责边界清晰了不少,换数据库或者换设备通讯协议的时候,影响范围被限制在基础设施层,领域层不需要改动。
CommunityToolkit.Mvvm 的源生成器模式用起来确实省事,View 和 ViewModel 之间的绑定代码量少了很多。MediatR 做模块间通信的方式也算顺手,命令和事件的处理逻辑各自独立,不会堆在一个类里越写越大。
如果大家也在做类似的工业上位机项目,这套架子可以拿过去直接用,或者在它的基础上做定制扩展。
引入地址