ARTICLE · 1130646
WPF 工业设备数据实时监控看板(附源码)
前言
工业现场的监控系统,设备一多,数据一杂,界面一乱,现场操作的人根本没法用。这次我们从实际使用场景出发,基于 .NET 8 + WPF 搞了一套轻量但功能完整的监控控制台,把实时图表、报警机制、权限管理这些刚需功能都揉在了一起。
项目介绍
一个面向中小型工业现场的设备实时监控平台,采用 WPF 桌面客户端的形式,不依赖浏览器,响应快,操作流畅。核心定位是:打开就能看,报警及时推,权限分清楚,配置随时改。
整套系统覆盖了从设备数据模拟、实时曲线展示、报警触发与记录、历史查询到用户权限管理的完整链路。数据存储方面,SQLite 负责用户账户和报警日志,设备列表用 JSON 文件保存,兼顾了轻量和可靠性。配置热重载让现场调试参数不用重启程序,对运维人员来说非常友好。
项目功能
项目特点
界面不凑合:用的 HandyControl 控件库,整体风格统一,卡片、按钮、表格都有比较专业的视觉质感,不像很多内部工具那样灰头土脸
数据实时性有保证:数据模拟器采用生产者-消费者模式,高频推送数据,图表 400ms 刷新一次,现场看趋势线基本没有延迟感
报警不胡乱弹:3 秒防抖机制很实用,避免阈值边界来回跳动导致报警刷屏,现场实际跑下来体验明显好于没做防抖的方案
配置调整零停机:改了 appsettings.json 里的阈值或刷新间隔,程序自动感知,不需要重启,这对正在监控的生产线来说非常关键
设备数据关机不丢:设备列表存成 JSON 文件,重启程序或者重新登录,之前添加的设备都还在
权限粒度到按钮级别:观察者登录后,操作类按钮直接隐藏,而不是禁用,界面更干净,避免误触
项目技术
项目代码
项目整体采用 MVVM 分层结构,各层职责清晰。
先来看一下 ViewModel 层的基类设计,所有 ViewModel 都继承自 ObservableObject,配合源生成器可以少写很多样板代码:
publicpartialclassMainViewModel : ObservableObject{privatereadonly ILogger<MainViewModel> _logger;privatereadonly IDeviceManagerService _deviceManager;privatereadonly IAlarmLogService _alarmService;privatereadonly IServiceProvider _serviceProvider; [ObservableProperty]privateobject? _currentView; [ObservableProperty]privatestring _currentTitle = "首页总览"; [ObservableProperty]private User? _currentUser;}报警引擎是实时监控的核心部分,关键逻辑在于防抖和阈值判断。每次数据点到来时,会检查是否连续超出阈值达到设定的秒数:
privatevoidCheckAlarm(DeviceData data){var config = _configService.GetConfig();var isTempAlarm = data.Temperature > config.TemperatureThreshold;var isPressAlarm = data.Pressure > config.PressureThreshold;if (isTempAlarm || isPressAlarm) {if (!_alarmStartTime.HasValue) _alarmStartTime = DateTime.Now;elseif ((DateTime.Now - _alarmStartTime.Value).TotalSeconds >= config.AlarmDebounceSeconds) {// 触发报警记录 TriggerAlarm(data, isTempAlarm, isPressAlarm); _alarmStartTime = null; } }else { _alarmStartTime = null; }}服务层的注册在 App.xaml.cs 中完成,采用 Singleton 和 Transient 混合的生命周期管理:
privatevoidConfigureServices(IServiceCollection services){ services.AddSingleton<IDeviceManagerService, DeviceManagerService>(); services.AddSingleton<IAuthService, AuthService>(); services.AddScoped<IAlarmLogService, AlarmLogService>(); services.AddScoped<IMockDataService, MockDataService>(); services.AddScoped<LoginViewModel>(); services.AddScoped<MainViewModel>(); services.AddScoped<DashboardViewModel>(); services.AddScoped<MonitoringViewModel>();// 其他 ViewModel 注册...}项目效果
登录界面走的是简洁路线,深色背景配品牌色,输入框带浅色占位提示。

首页仪表盘用 HandyControl 的卡片组件展示设备总数、在线数、报警数等统计信息,在线率用进度条呈现,比较直观。设备列表里每个设备都有状态圆点标识,绿色代表正常运行,红色表示报警状态,一眼就能看出哪台设备出了问题。

实时监控页面是整套系统里信息密度最高的地方。顶部用 TabControl 切换不同设备,中间区域是双通道折线图,温度和压力两条曲线颜色不同,阈值线用虚线标出。图表下方是最近报警列表,分页展示,现场操作人员反馈这个布局很合理,看图的同时余光就能扫到报警信息。

报警中心支持按类型筛选,温度类报警显示为红色标签,压力类为蓝色标签,阈值上下文会直接显示"温度 87.5℃ > 85℃"这样的信息,不需要点进去看详情。

系统设置页面把所有可调参数列在一个表单里,修改后保存即可生效,不用重启。修改密码也是在这个页面完成,旧密码校验通过后才能更新。


项目源码
项目代码已托管,目录结构清晰,分 Model、ViewModel、View、Service、Converter 等标准文件夹。
├── Models/│ ├── DeviceData.cs # 设备数据点模型,包含温度、压力、时间戳│ ├── AlarmRecord.cs # 报警记录模型,映射到 SQLite 表结构│ ├── MonitorConfig.cs # 监控配置强类型模型,对应 appsettings.json│ ├── NavMenuItem.cs # 侧边栏导航菜单项模型│ └── User.cs # 用户模型,包含角色枚举│├── Services/│ ├── IMockDataService.cs # 数据模拟器服务接口│ ├── IAlarmLogService.cs # 报警日志服务接口│ ├── IDeviceManagerService.cs # 设备管理服务接口│ ├── IConfigService.cs # 配置读取服务接口(支持热重载)│ ├── MockDataService.cs # 高频数据模拟实现,采用生产者-消费者模式│ ├── AlarmLogService.cs # SQLite 报警存储实现,含分页和筛选│ ├── DeviceManagerService.cs # 设备生命周期管理,JSON 文件持久化│ ├── ConfigService.cs # 配置文件读取,自带文件变更监听│ └── AuthService.cs # 认证与权限服务,SHA256 哈希 + RBAC 判断│├── ViewModels/│ ├── MainViewModel.cs # 主外壳 ViewModel,管理导航切换和当前用户│ ├── LoginViewModel.cs # 登录逻辑,校验用户名密码│ ├── DashboardViewModel.cs # 首页统计卡片,2 秒定时刷新数据│ ├── MonitoringViewModel.cs # 实时监控页,管理多个 DeviceViewModel│ ├── DeviceViewModel.cs # 单设备监控 ViewModel,包含图表数据源和报警引擎│ ├── AlarmCenterViewModel.cs # 报警中心,支持类型筛选和分页查询│ ├── DeviceManagementViewModel.cs # 设备管理,列表增删改操作│ ├── HistoryViewModel.cs # 历史记录,日期范围筛选 + 分页│ ├── SettingsViewModel.cs # 系统设置表单,配置保存和密码修改│ ├── UserManagementViewModel.cs # 用户管理,仅管理员可见│ └── NavigationViewModel.cs # 侧边栏菜单控制,按角色过滤菜单项│├── Views/│ ├── LoginWindow.xaml # 登录窗口,带背景和输入校验│ ├── MainWindow.xaml # 主窗口壳子,Sidebar + Header + 内容区│ ├── SidebarView.xaml # 深色侧边栏,220px 宽,菜单项动态绑定│ ├── HeaderView.xaml # 顶部状态栏,面包屑 + 当前用户 + 实时时钟│ ├── DashboardView.xaml # 首页仪表盘,HandyControl Card 布局│ ├── MonitoringView.xaml # 实时监控,TabControl 切换设备 + 图表区│ ├── AlarmCenterView.xaml # 报警中心,筛选下拉框 + 分页 DataGrid│ ├── DeviceManagementView.xaml # 设备管理,ListView 展示 + 增删改按钮│ ├── HistoryView.xaml # 历史查询,日期选择器 + DataGrid│ ├── SettingsView.xaml # 系统设置,参数表单 + 修改密码区域│ └── UserManagementView.xaml # 用户管理,用户列表 DataGrid + 新增表单│├── Converters/│ ├── AlarmTypeColorConverter.cs # 报警类型转颜色(温度 → 红,压力 → 蓝)│ ├── AlarmThresholdConverter.cs # 报警类型 + 阈值 → 上下文描述文字│ ├── ActiveButtonTextConverter.cs # IsActive 布尔值 → 按钮文字(启用/禁用)│ ├── BoolToVisibilityConverter.cs # 布尔值 → 可见性转换│ └── StatusColorConverter.cs # 设备状态 → 圆点颜色(绿/红)│├── App.xaml # 应用资源字典,全局样式定义├── App.xaml.cs # 程序入口,DI 容器配置和启动流程├── MainWindow.xaml # Shell 外壳布局,网格行列划分├── appsettings.json # 可热重载配置文件,所有运行时参数├── appsettings.Development.json # 开发环境专用配置(可选)├── IndustrialMonitor.csproj # 项目文件,包含所有 NuGet 包引用└── Properties/ └── AssemblyInfo.cs # 程序集元信息这种分层方式配合依赖注入,每层之间的耦合度比较低,替换数据源或者调整界面布局都不会牵一发动全身。
运行方式很简单,命令行进入项目目录执行 dotnet run 即可。首次启动会自动创建 users.db 数据库文件和 devices.json 设备持久化文件,默认三个账户开箱即用。

总结
从实际需求出发做出来的监控工具,跟那种照着模板堆出来的 Demo 完全不一样。这套平台的各个功能模块都不是拍脑袋加的——设备管理来自现场资产盘点需求,防抖报警来自真实误报痛点,配置热重载来自运维人员反复重启的抱怨。
技术选型上,WPF + MVVM 的组合在工业桌面端依然能打,LiveCharts2 的渲染性能也经得住高频数据更新。整套代码保持了较低的学习成本,新人接手也能快速定位到对应模块。后续还可以扩展设备分组、报表导出、OPC UA 数据接入等方向,但目前这套核心框架已经能覆盖绝大多数中小型产线的监控需求了。
关键词
#WPF、.NET 8、MVVM、#LiveCharts2、#实时监控、#工业设备、#报警引擎、SQLite、RBAC、#依赖注入、配置热重载、#HandyControl、SHA256 哈希、SkiaSharp、数据持久化
作者:小码编匠
C# 写 MES、上位机、SCADA、视觉检测,缺参考?这几个开源项目值得看
WPF + Modbus RTU 实现的 PLC 实时监控上位机(智能设备生产监控系统)
基于 Avalonia 的跨平台工控上位机(导航+折叠+动效)
.NET 10多协议设备采集与监控平台(S7、Modbus、OPC UA、MQTT运动视觉)
没有 PLC 也能跑:C# 工控上位机框架(西门子 PLC + MES + SQLite)
不用 Python,C# 也能跑 YOLOv8 人像检测(附源码)
WPF + Modbus 实现一套开源 MES系统(附完整代码)
不接 PLC 也能调试:WPF + Modbus TCP 模拟器实战
工业协议那么杂,这套 .NET 开源库把ModBus、S7、MC都包了
WPF + Modbus RTU:多串口并行采集的 SCADA 上位机
WPF 工控上位机监控系统( 多协议通信ModBus-RTU/TCP、MQTT、Socket)
基于 SAM 3 的 AI 图像自动标注平台(Vue + .NET + FastAPI)
C# + OpenCV 视觉检测上位机项目 (模拟 PLC 通信 + 真实图像检测)
WinForms 工业设备人机界面(HMI),一套系统搞定配置、监控与报警
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力



