# PrismHandyTemplate **Repository Path**: MY_JR/prism-handy-template ## Basic Information - **Project Name**: PrismHandyTemplate - **Description**: PrismHandyTemplate 是一个基于 Prism + HandyControl + Opencvsharp架构的 WPF 工业自动化上位机开发框架,集成了通信、运动控制、视觉处理、报警管理、配方管理等核心功能模块待完善 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2026-08-05 - **Last Updated**: 2026-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PrismHandyTemplate - WPF工业自动化上位机框架 ## 📖 项目简介 PrismHandyTemplate 是一个基于 **Prism + HandyControl** 架构的 WPF 工业自动化上位机框架,集成了通信、运动控制、视觉处理、报警管理、配方管理等核心功能模块,适用于快速开发现代化 HMI 上位机应用。 ### ✨ 核心特性 - 🖥️ **现代化 UI** — HandyControl 控件库 + 自定义主题,支持深色/浅色切换 - 🏗️ **MVVM 架构** — Prism.DryIoc 依赖注入,开箱即用 - 🌐 **多语言本地化** — JSON 资源文件,运行时切换 - 📊 **实时图表** — OxyPlot 数据可视化 - 🔌 **通信集成** — Modbus TCP/RTU、OPC UA、PLC 编程 - 🎯 **运动控制** — 雷赛运动控制卡集成 - 👁️ **视觉处理** — OpenCvSharp 图像处理 - 🗄️ **数据持久化** — SqlSugar ORM + 多数据库支持 - 📈 **数据采集** — NI/阿尔泰采集卡 - 📋 **报表/配方** — 报表生成与配方管理 ### 技术栈 | 组件 | 版本 | 说明 | |------|------|------| | UI 框架 | WPF (.NET 10.0) | 现代化桌面 UI | | MVVM 框架 | Prism.DryIoc 9.0.537 | 依赖注入 + ViewModelLocator | | 控件库 | HandyControl 3.5.1 | 开源 WPF 控件库 | | ORM | SqlSugarCore 5.1.4 | 国内流行的高性能 ORM | | 图表 | OxyPlot.Wpf 2.2.0 | 实时数据可视化 | | 视觉处理 | OpenCvSharp4 4.13.0 | OpenCV .NET 封装 | | 运动控制 | 雷赛 Leadshine | 多轴运动控制卡 | | 通信 | NModbus4 + OPC UA | 工业通信协议栈 | --- ## 🚀 快速开始 ### 环境要求 - Windows 10/11 - .NET 10.0 SDK 或更高 - Visual Studio 2022+ / JetBrains Rider 2024+ ### 运行项目 ```powershell # 克隆项目 git clone https://gitee.com/davva/prism-handy-template.git cd prism-handy-template # 还原依赖 dotnet restore # 编译并运行 dotnet run # 或构建解决方案 dotnet build PrismHandyTemplate.sln ``` --- ## 📁 项目结构 ``` prism-handy-template/ ├── App.xaml # 应用入口 & 资源字典 ├── MainWindow.xaml # 主窗口 (导航框架) ├── GlobalUsings.cs # 全局 using 指令 │ ├── Commands/ # 命令类 │ ├── AsyncDelegateCommand.cs # 异步命令封装 │ └── NavigateCommand.cs # 参数化导航命令 │ ├── Converters/ # 值转换器 │ └── CommonConverters.cs # 通用 IValueConverter 实现 │ ├── Core/ # 核心基础设施 │ ├── DisposableViewModelBase.cs # 可释放 ViewModel 基类 │ ├── LocExtension.cs # 本地化 MarkupExtension │ ├── ObservableObject.cs # INotifyPropertyChanged 基类 │ ├── SafeExecute.cs # 安全执行扩展方法 │ ├── UiThread.cs # UI 线程调度帮助类 │ └── ViewModelBase.cs # ViewModel 完整基类 │ ├── Languages/ # 多语言资源 │ ├── en-US.json # 英文 │ └── zh-CN.json # 简体中文 │ ├── Models/ # 数据模型 (18个) │ ├── AlarmLevelList.cs # 报警级别枚举 │ ├── AlarmModels.cs # 报警数据模型 │ ├── BackupModels.cs # 备份数据模型 │ ├── ConnectionConfig.cs # 连接配置 │ ├── DaqConfiguration.cs # 采集卡配置 │ ├── DaqModels.cs # 数据采集模型 │ ├── DatabaseConfig.cs # 数据库配置 │ ├── DatabaseEntities.cs # 数据库实体 │ ├── DeviceInfo.cs # 设备信息 │ ├── DiagnosticModels.cs # 诊断模型 │ ├── MotionModels.cs # 运动控制模型 │ ├── OpcUaModels.cs # OPC UA 模型 │ ├── PlcModels.cs # PLC 数据模型 │ ├── RecipeModels.cs # 配方模型 │ ├── ReportModels.cs # 报表模型 │ └── VisionModels.cs # 视觉处理模型 │ ├── Services/ # 服务层 (36个文件) │ ├── ── 日志与配置 ── │ │ ├── ILoggerService.cs # 日志接口 │ │ ├── FileLoggerService.cs # 文件日志实现 │ │ ├── IConfigService.cs # 配置接口 │ │ └── JsonConfigService.cs # JSON 配置实现 │ │ │ ├── ── 本地化与主题 ── │ │ ├── ILocalizationService.cs # 本地化接口 │ │ ├── LocalizationService.cs # 本地化实现(运行时切换) │ │ ├── IThemeService.cs # 主题接口 │ │ └── ThemeService.cs # 主题实现 │ │ │ ├── ── 通信服务 ── │ │ ├── ICommunicationService.cs # 通信通用接口 │ │ ├── ModbusTcpService.cs # Modbus TCP 实现 │ │ ├── ModbusRtuService.cs # Modbus RTU 实现 │ │ ├── IOpcUaService.cs # OPC UA 接口 │ │ └── OpcUaService.cs # OPC UA 实现 │ │ │ ├── ── 运动控制服务 ── │ │ ├── IMotionControlService.cs # 运动控制基础接口 │ │ ├── ModbusMotionControlService.cs # Modbus 运动控制实现 │ │ ├── ILeadshineMotionService.cs # 雷赛专用接口 │ │ └── LeadshineMotionService.cs # 雷赛运动控制实现 │ │ │ ├── ── 视觉与图像 ── │ │ ├── IVisionService.cs # 视觉接口 │ │ └── OpenCvVisionService.cs # OpenCV 实现 │ │ │ ├── ── 业务服务 ── │ │ ├── IAlarmService.cs # 报警接口 │ │ ├── AlarmService.cs # 报警实现(事件驱动) │ │ ├── IRecipeService.cs # 配方接口 │ │ ├── RecipeService.cs # 配方实现 │ │ ├── IPlcProgramService.cs # PLC 编程接口 │ │ ├── PlcProgramService.cs # PLC 编程实现 │ │ ├── IReportService.cs # 报表接口 │ │ ├── ReportService.cs # 报表实现 │ │ ├── IBackupService.cs # 备份接口 │ │ ├── BackupService.cs # 备份实现 │ │ ├── IDiagnosticsService.cs # 诊断接口 │ │ └── DiagnosticsService.cs # 诊断实现 │ │ │ ├── ── 数据与外部接口 ── │ │ ├── IDatabaseService.cs # 数据库接口 │ │ ├── SqlSugarDatabaseService.cs # SqlSugar 实现 │ │ ├── IDataAcquisitionService.cs # 采集卡接口 │ │ ├── NiDaqService.cs # NI 采集卡实现 │ │ ├── AltaiDaqService.cs # 阿尔泰采集卡实现 │ │ ├── IWebApiService.cs # Web API 接口 │ │ └── WebApiService.cs # Web API 实现 │ │ │ └── obj/ # 编译中间输出 │ ├── Themes/ # 主题资源 │ ├── CustomBrushes.xaml # 自定义画刷 │ └── CustomBrushes.Dark.xaml # 深色主题画刷 │ ├── ViewModels/ # 视图模型 (13个) │ ├── AlarmManagementViewModel.cs # 报警管理(完整生命周期) │ ├── DataAcquisitionViewModel.cs # 数据采集 │ ├── DeviceManagementViewModel.cs # 设备管理 │ ├── DiagnosticsViewModel.cs # 系统诊断 │ ├── HomeViewModel.cs # 首页/仪表盘 │ ├── MainWindowViewModel.cs # 主窗口导航 │ ├── MotionControlViewModel.cs # 运动控制(实时监控) │ ├── OpcUaViewModel.cs # OPC UA 客户端 │ ├── PlcProgramViewModel.cs # PLC 编程 │ ├── RecipeManagementViewModel.cs # 配方管理 │ ├── ReportsViewModel.cs # 报表 │ ├── SettingsViewModel.cs # 设置 │ └── VisionProcessViewModel.cs # 视觉处理(图像处理) │ └── Views/ # 视图 (13个) ├── AlarmManagementView.xaml # 报警管理界面 ├── DataAcquisitionView.xaml # 数据采集界面 ├── DeviceManagementView.xaml # 设备管理界面 ├── DiagnosticsView.xaml # 系统诊断界面 ├── HomeView.xaml # 首页/仪表盘 ├── MainWindow.xaml # 主窗口(导航框架) ├── MotionControlView.xaml # 运动控制界面 ├── OpcUaView.xaml # OPC UA 界面 ├── PlcProgramView.xaml # PLC 编程界面 ├── RecipeManagementView.xaml # 配方管理界面 ├── ReportsView.xaml # 报表界面 ├── SettingsView.xaml # 设置界面 └── VisionProcessView.xaml # 视觉处理界面 ``` --- ## 🏗️ 核心架构 ### 基类体系 ``` ObservableObject (INotifyPropertyChanged) └── ViewModelBase (INavigationAware, IConfirmNavigationRequest, IDestructible) └── DisposableViewModelBase (IDisposable) └── 具体 ViewModel ``` **核心特性:** - `DisposableViewModelBase` — 实现 `IDisposable`,自动取消事件订阅 - `SafeExecute` — 统一异常处理 + 日志记录 - `UiThread` — 线程安全的 UI 调用(WinForms 风格 `Invoke` / `BeginInvoke`) ### 重要开发经验 ⚠️ #### DelegateCommand 泛型约束 Prism 的 `DelegateCommand` 要求 `T` 必须是引用类型或可空类型。使用值类型 `int` 会抛出 `InvalidCastException`: ```csharp // ❌ 错误 — 运行时抛 System.InvalidCastException AcknowledgeCommand = new DelegateCommand(OnAcknowledge); // ✅ 正确 — 使用可空类型 int? AcknowledgeCommand = new DelegateCommand(OnAcknowledge, CanExecuteAcknowledge); private bool CanExecuteAcknowledge(int? alarmId) => SelectedAlarm?.Status == AlarmStatus.Active; private void OnAcknowledge(int? alarmId) { _alarmService.AcknowledgeAlarm(alarmId ?? 0, "Operator"); } ``` #### 依赖注入注册 (App.xaml.cs) ```csharp // 运动控制服务 — 已启用 containerRegistry.RegisterSingleton(); // 视觉服务 — 已启用 containerRegistry.RegisterSingleton(); // 报警服务 containerRegistry.RegisterSingleton(); ``` --- ## 📦 功能模块 ### 🔔 报警管理 - 实时报警通知(基于事件机制) - 报警确认 / 清除 / 批量操作 - 关键字搜索 + 多级别过滤 - 报警详情面板 - CSV 导出 - 实时统计面板 ### ⚙️ 运动控制 - 雷赛运动控制卡集成 - 多轴状态监控(实时 OxyPlot 图表) - 绝对 / 相对定位,JOG 手动控制 - 急停 / 复位操作 - 位置 / 速度实时曲线 ### 👁️ 视觉处理 - OpenCvSharp4 图像处理 - 模板匹配 / 边缘检测 / 特征识别 - 实时图像采集与显示 - 处理历史记录与结果绑定 ### 🔌 通信协议 - Modbus TCP / RTU 集成(NModbus4) - OPC UA 客户端 - PLC 编程通信 ### 🗄️ 数据持久化 - SqlSugar ORM,多数据库支持(SQL Server / MySQL / SQLite / Oracle) - 数据库自动初始化 - 备份 / 恢复服务 ### 📊 数据采集 - NI 采集卡支持 - 阿尔泰采集卡支持 - 实时数据图表显示 ### 🌐 多语言本地化 - JSON 资源文件(`Languages/zh-CN.json`, `Languages/en-US.json`) - 运行时动态切换(无需重启应用) - XAML 中 `{lex:Loc Key}` 直接绑定 ### 📋 报表与配方 - 报表生成与管理 - 配方导入 / 导出 / 版本控制 - 多格式数据交换 --- ## 🚧 开发规范 ### 命令使用规范 ```csharp // 引用类型参数 T public DelegateCommand QueryCommand { get; } QueryCommand = new DelegateCommand(OnQuery); // 值类型参数 → 必须使用可空类型 int? / double? 等 public DelegateCommand UpdateCommand { get; } UpdateCommand = new DelegateCommand(OnUpdate, CanUpdate); // 异步命令 public AsyncDelegateCommand ExportCommand { get; } ExportCommand = new AsyncDelegateCommand(OnExportAsync); // 无参数命令 public DelegateCommand RefreshCommand { get; } RefreshCommand = new DelegateCommand(OnRefresh); ``` ### ViewModel 创建模板 ```csharp public class MyViewModel : DisposableViewModelBase { private readonly IMyService _service; public MyViewModel(IMyService service, ILoggerService logger, ILocalizationService loc) { _service = service; Title = loc["NavMyView"]; Items = new ObservableCollection(); LoadCommand = new AsyncDelegateCommand(OnLoadAsync); _service.DataChanged += OnDataChanged; _loc.LanguageChanged += OnLanguageChanged; _ = LoadData(); } #region Properties public ObservableCollection Items { get; } #endregion #region Commands public AsyncDelegateCommand LoadCommand { get; } #endregion protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { _service.DataChanged -= OnDataChanged; _loc.LanguageChanged -= OnLanguageChanged; } } } ``` --- ## 🔧 贡献指南 1. Fork 本仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'feat: 添加新功能'`) 4. 推送分支 (`git push origin feature/AmazingFeature`) 5. 发起 Pull Request --- ## 📝 更新历史 **2026-07-06** - 修复 `DelegateCommand` 泛型类型异常,改为 `DelegateCommand` - 启用运动控制和视觉处理服务的依赖注入注册 - 新增模块:OPC UA、PLC 编程、报表、系统诊断、数据采集 - 扩展服务层:Web API、备份、诊断、主题管理 - 增加 ViewModels:DataAcquisition、Diagnostics、OpcUa、PlcProgram、Reports、VisionProcess - 增加 Views:DataAcquisition、Diagnostics、OpcUa、PlcProgram、Reports、VisionProcess --- ## 📜 许可证 本项目基于 **MIT 开源许可证** 授权,可免费用于个人和商业用途。 ``` MIT License Copyright (c) 2026 PrismHandyTemplate Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` --- ## 📮 联系方式 如有问题,请提交 Issue 或联系项目负责人。