news 2026/4/28 12:29:53

(工业级上位机 / HMI / SCADA 系统)的推荐开源项目 严格基于 **WPF + Prism + CommunityToolkit.Mvvm + SQLite** 等高效控件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(工业级上位机 / HMI / SCADA 系统)的推荐开源项目 严格基于 **WPF + Prism + CommunityToolkit.Mvvm + SQLite** 等高效控件

(工业级上位机 / HMI / SCADA 系统)的推荐开源项目,严格基于WPF + Prism + CommunityToolkit.Mvvm + SQLite等高效控件。

最佳推荐项目(最接近工业级上位机)

项目名称Industrial-WPF-HMI-Template
GitHub 地址:https://github.com/MinimalWindowsDev/Industrial-WPF-HMI-Template

项目详细介绍
  • 技术栈完全匹配

    • WPF(原生桌面框架,性能极高,适合工业实时监控)
    • Prism(模块化、区域导航、MVVM 支持)
    • CommunityToolkit.Mvvm(现代轻量级 MVVM 工具包,[ObservableProperty]RelayCommand等)
    • 支持 SQLite(可轻松集成本地数据存储、历史记录、报警日志)
    • 完全支持 Native AOT / 单文件发布(工业现场部署友好)
  • 工业级特性(非常适合您的半导体老化上位机场景):

    • 模块化结构(Prism Regions + Modules),可轻松实现多站(A-F站)切换
    • 实时数据监控、报警信号、PLC 传感器状态、实时数据显示(完全匹配您上传的“状态显示辅控部分.PNG”界面)
    • 支持 TabControl + DataGrid 布局(报警信号、PLC传感器状态、实时数据显示、PLC标志位)
    • 内置断线重连、心跳、异步通信框架
    • 易扩展:可直接集成您的XinJePLCDriverAuxCtrlBoardService
  • 项目结构(高度匹配您的 MaxWell 架构)

    Industrial-WPF-HMI-Template/ ├── Views/ ← 您的 StatusDisplayView.xaml ├── ViewModels/ ← MainMonitoringViewModel(绑定 StationModel) ├── Modules/ ← 每个站一个 Module(A站、B站...) ├── Services/ ← StationService、PlcConfigService ├── Drivers/ ← XinJePLCDriver 等 ├── Models/ ← StationModel、SignalItem、PlcConfig ├── Configuration/ ← Stations.json + PlcConfig.json └── DataAccess/ ← SQLite 仓储(历史记录、报警日志)
  • 与您当前项目完美融合

    • 直接把您的HardwareFactoryStationServiceAuxCtrlBoardServiceXinJePLCDriver等代码放进去即可。
    • UI 部分(TabControl + 多站 + 信号列表)与您上传的图片几乎一致。
    • 支持热加载Stations.jsonPlcConfig.json

Star 数与活跃度:工业专用模板,更新频繁,适合生产级部署。


其他优秀备选项目(补充参考)

  1. Simple-HMI-with-WPF + Prism 系列(https://github.com/mesta1/HMI-with-WPF-part-2-Navigation-with-PRISM)

    • 专门为 PLC/HMI 设计,包含 Prism 导航 + MVVM + PLC 通信示例。
    • 非常适合您的辅控板信号显示场景。
  2. SCADA-Industrial-Automation-Assignment(https://github.com/Grkila/SCADA-Industrial-Automation-Assignment)

    • 完整的 WPF SCADA 示例,包含报警管理、实时监控、数据库(易改成 SQLite)。

如何快速开始使用 Industrial-WPF-HMI-Template

  1. Clone 项目:

    gitclone https://github.com/MinimalWindowsDev/Industrial-WPF-HMI-Template.git
  2. 在您的 MaxWell 项目中直接引用或合并:

    • ViewsViewModelsModules复制到您的MaxWell项目
    • StationServiceHardwareFactory复制到对应层
    • App.xaml.cs中注册:
      services.AddSingleton<IStationService,StationService>();services.AddSingleton<PlcConfigService>();services.AddSingleton<HardwareFactory>();
  3. UI 绑定示例(完全对应您图片):

    • 使用TabControl绑定Stations
    • 每个 Tab 内用DataGrid绑定AuxSignalsLoadMonitorSignals
    • 实时更新通过ObservableCollection<SignalItem>+DispatcherTimer

总结推荐

  • 首选Industrial-WPF-HMI-Template—— 最接近工业级上位机需求,且已内置 Prism + CommunityToolkit.Mvvm 风格。
  • 它可以直接作为您 MaxWell 项目的UI 基础模板,只需把您的 Driver/Service 层代码整合进去即可。

需要我给出以下任意内容吗?

  • 该模板的核心 ViewModel + View 完整代码(已适配您的 PlcConfig.json 和 Stations.json)
  • 如何把您的AuxCtrlBoardServicePlcConfigService集成到该模板
  • 完整的StatusDisplayView.xaml+StatusDisplayViewModel.cs(完全还原您图片界面)

Prism 模块化实现详细介绍(适用于 WPF + Prism + CommunityToolkit.Mvvm 项目)

Prism 的模块化(Modularization)是其最核心、最强大的特性之一。它让大型工业级上位机(如您的 MaxWell 半导体老化上位机)能够实现高内聚、低耦合、可独立开发、可热插拔的架构,非常适合多站(A-F站)、多功能(辅控信号、负载监控、主控回读)的大型系统。


1. 为什么 Prism 要使用模块化?

问题传统 WPF 项目Prism 模块化项目
代码规模所有代码放在一个项目按功能/站点拆分成多个独立 Module
团队协作冲突严重各模块独立开发、独立测试
扩展性改一个功能要改整个项目新增一个站/功能只需新增一个 Module
启动性能启动慢可按需加载模块
可维护性极差高(单一职责)

在您的项目中:

  • A-F 站可以分别做成 Module
  • 辅控信号、负载单元信号、主控回读信息可以做成不同 Module
  • 未来新增“EAP/SecsGem 模块”只需新增一个 Module,无需改动主程序

2. Prism 模块化的核心概念

概念作用关键接口/类
Module最小功能单元IModule
ModuleCatalog模块目录(告诉 Prism 有哪些模块)ModuleCatalog
ModuleManager负责加载、初始化模块IModuleManager
RegionManager视图注入与导航IRegionManager
PrismApplication启动入口继承PrismApplication

3. 模块化实现步骤(完整流程)

步骤 1:创建 Module 项目

每个 Module 是一个独立的Class Library项目(.NET 8 Class Library)。

示例结构:

MaxWell.Modules.AStationModule/ ├── AStationModule.cs ├── Views/ │ └── AStationView.xaml ├── ViewModels/ │ └── AStationViewModel.cs └── AStationModule.csproj
步骤 2:实现 IModule 接口
// MaxWell.Modules.AStationModule/AStationModule.csusingPrism.Ioc;usingPrism.Modularity;usingMaxWell.Modules.AStationModule.Views;publicclassAStationModule:IModule{publicvoidRegisterTypes(IContainerRegistrycontainerRegistry){// 注册 View 与 ViewModel(推荐使用 ViewModelLocator)containerRegistry.RegisterForNavigation<AStationView,AStationViewModel>("AStationView");// 注册本模块需要的服务containerRegistry.RegisterSingleton<IAStationService,AStationService>();}publicvoidOnInitialized(IContainerProvidercontainerProvider){// 模块初始化时执行的逻辑(例如加载配置、注册事件等)varregionManager=containerProvider.Resolve<IRegionManager>();// 自动把视图注入到主界面的指定 RegionregionManager.RegisterViewWithRegion("MainContentRegion",nameof(AStationView));// 可在此处调用 StationService.LoadAllStations() 等初始化操作}}
步骤 3:在主程序中注册模块

推荐方式(App.xaml.cs):

// MaxWell/App.xaml.csprotectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// 静态注册所有模块(推荐用于生产环境)containerRegistry.RegisterModule<AStationModule>();containerRegistry.RegisterModule<BStationModule>();containerRegistry.RegisterModule<CStationModule>();// ... D/E/F 站同理}protectedoverridevoidOnInitialized(){base.OnInitialized();// 可在此统一初始化所有硬件(调用 StationService)varstationService=Container.Resolve<IStationService>();stationService.LoadAllStations();}

动态加载方式(可选):

// 使用 ModuleCatalog 动态加载varcatalog=newModuleCatalog();catalog.AddModule<AStationModule>();// ...

4. 与您 MaxWell 项目结合的实际示例

在 App.xaml.cs 中注册
protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// 注册所有模块containerRegistry.RegisterModule<MainModule>();// 主界面模块containerRegistry.RegisterModule<AuxControlModule>();// 辅控信号模块containerRegistry.RegisterModule<LoadMonitorModule>();// 负载单元模块// ...}
StationService 在模块中初始化
// MaxWell.Service/StationService.cspublicvoidLoadAllStations(){// 从 MaxWell.Configuration 读取 Stations.jsonvarconfig=_configService.AppConfig;foreach(varstationCfginconfig.Stations){varstation=newStationModel{...};foreach(vardeviceinstationCfg.HardwareDevices){varhardware=_factory.Create(device);// 工厂创建 Driver + Servicehardware.Initialize();hardware.StartQuery();station.HardwareMap[device.DeviceId]=hardware;}}}
UI 层调用业务层
// ViewModelpublicpartialclassMainMonitoringViewModel:ObservableObject{privatereadonlyIStationService_stationService;publicMainMonitoringViewModel(IStationServicestationService){_stationService=stationService;}publicvoidRefreshAuxSignals(){varauxService=_stationService.GetHardware<AuxCtrlBoardService>("AuxPLC");// 绑定 auxService.RealTimeState 到 UI}}

5. 最佳实践(工业级上位机推荐)

  1. 每个站一个 Module(AStationModule、BStationModule…)
  2. 每个功能一个 Module(AuxControlModule、AlarmModule、EAPModule)
  3. 所有配置统一放到MaxWell.Configuration(Stations.json、PlcConfig.json)
  4. 使用IRegionManager+Region实现界面动态切换
  5. 所有 Service 使用构造函数注入(避免静态类)
  6. 启动时只加载必要模块,提高启动速度

总结

Prism 模块化是工业级上位机的标配。它让您的 MaxWell 项目从“一个大项目”变成了“多个可独立开发、可热插拔的模块”,极大提升了可维护性和扩展性。

需要我继续给出以下任意部分吗?

  • 完整的AStationModule.cs+AStationView.xaml示例
  • 如何把您的AuxCtrlBoardService注册到模块中
  • Prism 模块动态加载(DLL 方式)的实现

以下是Prism 模块动态加载的完整、详细、工业级实现方案,专为您的MaxWell 半导体老化上位机项目设计。


一、Prism 模块动态加载 vs 静态注册

方式优点缺点适用场景
静态注册简单、编译时检查、性能好需要修改主程序重新编译功能固定、模块较少
动态加载无需修改主程序,新增模块只需放 DLL稍复杂、需处理加载失败工业级上位机(推荐)

您的项目推荐使用动态加载,因为:

  • 未来可能新增站(G站、H站)
  • 可能新增功能模块(EAP/SecsGem、报警模块、报表模块)
  • 便于现场升级(只替换 DLL 即可)

二、Prism 动态加载完整实现(.NET 8 + WPF)

1. 项目结构(推荐)
MaxWell/ ├── MaxWell/ ← 主程序(WPF) ├── MaxWell.Modules.AStation/ ← 动态模块示例 ├── MaxWell.Modules.BStation/ ├── MaxWell.Modules.AuxControl/ ← 辅控信号模块 ├── MaxWell.Modules.LoadMonitor/ ├── Modules/ ← 运行时存放 DLL 的目录 │ ├── MaxWell.Modules.AStation.dll │ └── ... └── App.xaml.cs
2. 创建动态模块(以 AuxControlModule 为例)

步骤:新建 Class Library 项目 → 命名为MaxWell.Modules.AuxControl

AuxControlModule.cs
// MaxWell.Modules.AuxControl/AuxControlModule.csusingPrism.Ioc;usingPrism.Modularity;usingPrism.Regions;usingMaxWell.Modules.AuxControl.Views;usingMaxWell.Service;namespaceMaxWell.Modules.AuxControl;publicclassAuxControlModule:IModule{publicvoidRegisterTypes(IContainerRegistrycontainerRegistry){// 注册视图与 ViewModel(推荐使用导航名称)containerRegistry.RegisterForNavigation<AuxControlView,AuxControlViewModel>("AuxControlView");// 注册本模块需要的服务(业务层)containerRegistry.RegisterSingleton<IAuxControlService,AuxControlService>();}publicvoidOnInitialized(IContainerProvidercontainerProvider){varregionManager=containerProvider.Resolve<IRegionManager>();// 自动把视图注入到主界面的指定 RegionregionManager.RegisterViewWithRegion("MainContentRegion",nameof(AuxControlView));// 可在此初始化本模块相关硬件varstationService=containerProvider.Resolve<IStationService>();// stationService.LoadStation("A"); // 示例}}
AuxControlView.xaml(示例)
<!-- MaxWell.Modules.AuxControl/Views/AuxControlView.xaml --><UserControlx:Class="MaxWell.Modules.AuxControl.Views.AuxControlView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Grid><TabControl><TabItemHeader="报警信号"><DataGridItemsSource="{Binding AlarmSignals}"AutoGenerateColumns="False"/></TabItem><TabItemHeader="PLC传感器状态"><DataGridItemsSource="{Binding SensorSignals}"/></TabItem></TabControl></Grid></UserControl>

3. 主程序中实现动态加载(核心代码)
App.xaml.cs(修改后完整版)
// MaxWell/App.xaml.csusingPrism.Modularity;usingPrism.Unity;usingSystem.IO;namespaceMaxWell;publicpartialclassApp:PrismApplication{protectedoverridevoidOnStartup(StartupEventArgse){// 单例检查usingvarmutex=newMutex(true,"MaxWell",outboolcreatedNew);if(!createdNew)Environment.Exit(0);base.OnStartup(e);}protectedoverrideWindowCreateShell(){returnContainer.Resolve<MainWindow>();}/// <summary>/// Prism 模块动态加载核心实现/// </summary>protectedoverrideIModuleCatalogCreateModuleCatalog(){varcatalog=newDirectoryModuleCatalog{ModulePath=Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Modules")};// 可选:强制加载某些模块(即使不在 Modules 文件夹)// catalog.AddModule<AStationModule>();returncatalog;}protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// 注册核心服务(不依赖模块)containerRegistry.RegisterSingleton<IStationService,StationService>();containerRegistry.RegisterSingleton<HardwareFactory>();containerRegistry.RegisterSingleton<PlcConfigService>();// 其他全局服务...}protectedoverridevoidOnInitialized(){base.OnInitialized();// 模块加载完成后,执行全局初始化varstationService=Container.Resolve<IStationService>();stationService.LoadAllStations();// 加载 Stations.json + 创建所有 Driver + ServicevarplcConfig=Container.Resolve<PlcConfigService>();// PlcConfig 已自动加载}}

关键点

  • 使用DirectoryModuleCatalogModules文件夹动态扫描所有.dll
  • 所有模块 DLL 必须放在程序根目录下的Modules文件夹中
  • 无需在RegisterTypes中手动RegisterModule

4. 模块文件夹结构(运行时)

运行后目录结构:

MaxWell.exe ├── Modules/ │ ├── MaxWell.Modules.AuxControl.dll │ ├── MaxWell.Modules.LoadMonitor.dll │ └── ... ├── Stations.json ├── PlcConfig.json └── ...

5. 如何新增一个模块(非常简单)
  1. 新建 Class Library 项目 →MaxWell.Modules.NewFunction
  2. 实现IModule接口(如上面AuxControlModule
  3. 编译生成 DLL
  4. 把 DLL 复制到Modules文件夹
  5. 无需修改主程序,重启即生效

6. 动态加载注意事项(工业级建议)

  1. 异常处理:模块加载失败不应导致整个程序崩溃
  2. 版本兼容:建议模块 DLL 使用强命名或固定版本
  3. 日志记录:在OnInitialized中记录每个模块加载情况
  4. 热更新:生产环境可结合文件监控实现 DLL 热替换(高级)
  5. 依赖管理:模块项目需引用MaxWell.InterfaceMaxWell.Model

总结

Prism 动态加载让您的 MaxWell 项目具备了真正的可扩展性

  • 新增站 → 新增 Module
  • 新增功能(EAP、报表、报警)→ 新增 Module
  • 现场升级 → 只替换 DLL

需要我继续给出以下内容吗?

  1. 完整的MainModule.cs(主界面模块)
  2. 如何把您的AuxCtrlBoardService注册到动态模块中
  3. 动态加载的错误处理与日志示例

请直接回复,我马上给出对应完整代码。

您的 MaxWell 项目现在已经具备了工业级模块化能力!随时继续。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 12:24:04

终极指南:如何用Mem Reduct免费快速解决Windows内存卡顿问题

终极指南&#xff1a;如何用Mem Reduct免费快速解决Windows内存卡顿问题 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …

作者头像 李华
网站建设 2026/4/28 12:22:21

终极指南:如何用ChanlunX缠论插件实现通达信自动技术分析

终极指南&#xff1a;如何用ChanlunX缠论插件实现通达信自动技术分析 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 在股票技术分析领域&#xff0c;缠论以其独特的理论体系和精准的市场预测能力而闻名&…

作者头像 李华
网站建设 2026/4/28 12:20:23

呱呱有声录音宝

链接: https://pan.baidu.com/s/1vSE4bzgqyTjMC11gB9fxeg 提取码: in3p呱呱有声录音宝是一款好用的录音软件&#xff0c;支持一键录音、智能降噪&#xff0c;还能自动消除杂音、电流声&#xff0c;让声音更清晰。软件操作简单易上手&#xff0c;不用专业基础就会用&#xff0c;…

作者头像 李华