夜雨聆风学习资料网

ARTICLE · 1130646

WPF 工业设备数据实时监控看板(附源码)

WPF 工业设备数据实时监控看板(附源码)

前言

工业现场的监控系统,设备一多,数据一杂,界面一乱,现场操作的人根本没法用。这次我们从实际使用场景出发,基于 .NET 8 + WPF 搞了一套轻量但功能完整的监控控制台,把实时图表、报警机制、权限管理这些刚需功能都揉在了一起。

项目介绍

一个面向中小型工业现场的设备实时监控平台,采用 WPF 桌面客户端的形式,不依赖浏览器,响应快,操作流畅。核心定位是:打开就能看,报警及时推,权限分清楚,配置随时改。

整套系统覆盖了从设备数据模拟、实时曲线展示、报警触发与记录、历史查询到用户权限管理的完整链路。数据存储方面,SQLite 负责用户账户和报警日志,设备列表用 JSON 文件保存,兼顾了轻量和可靠性。配置热重载让现场调试参数不用重启程序,对运维人员来说非常友好。

项目功能

功能模块
具体说明
登录认证
用户名密码校验,SHA256 哈希存储,三种角色分级
首页仪表盘
设备统计卡片、在线率进度条、运行设备数、系统信息
设备管理
设备的增删改查,运行状态和报警状态用绿/红标识
实时监控
温度和压力双通道折线图,阈值警戒虚线,报警灯呼吸闪烁
报警中心
按类型筛选报警记录,颜色区分(温度红/压力蓝)
历史记录
按日期范围和设备筛选历史数据,支持分页
系统设置
温度/压力阈值、刷新间隔、滑动窗口大小等参数调整
用户管理
管理员专属功能,可新增用户、启用/禁用账户
权限控制
管理员/操作员/观察者三级权限,操作按钮动态隐藏
退出登录
侧边栏底部一键退出,回到登录界面

项目特点

界面不凑合:用的 HandyControl 控件库,整体风格统一,卡片、按钮、表格都有比较专业的视觉质感,不像很多内部工具那样灰头土脸

数据实时性有保证:数据模拟器采用生产者-消费者模式,高频推送数据,图表 400ms 刷新一次,现场看趋势线基本没有延迟感

报警不胡乱弹:3 秒防抖机制很实用,避免阈值边界来回跳动导致报警刷屏,现场实际跑下来体验明显好于没做防抖的方案

配置调整零停机:改了 appsettings.json 里的阈值或刷新间隔,程序自动感知,不需要重启,这对正在监控的生产线来说非常关键

设备数据关机不丢:设备列表存成 JSON 文件,重启程序或者重新登录,之前添加的设备都还在

权限粒度到按钮级别:观察者登录后,操作类按钮直接隐藏,而不是禁用,界面更干净,避免误触

项目技术

技术组件
版本
用途说明
WPF
.NET 8
桌面 UI 框架,数据绑定驱动界面更新
CommunityToolkit.Mvvm
8.4.2
MVVM 源生成器,简化属性通知和命令定义
LiveCharts2
2.0.5
实时折线图渲染,底层基于 SkiaSharp
HandyControl
3.5.1
企业级 UI 控件库,提供卡片、对话框等组件
Microsoft.Data.Sqlite
最新
SQLite 数据库操作,存储报警记录和用户账户
Dependency Injection
内置
微软 DI 容器,管理服务生命周期
Configuration
内置
appsettings.json 配置系统,支持热重载
System.Text.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、数据持久化

最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!
END
推荐阅读
.NET 后台管理系统,还能用 NuGet 按需装功能
免费开源的 3D 工厂仿真器,用来学 PLC 编程
.NET 10 的 AI Agent 运行时,清洁架构 + 事件驱动

C# 写 MES、上位机、SCADA、视觉检测,缺参考?这几个开源项目值得看

WPF + Modbus RTU 实现的 PLC 实时监控上位机(智能设备生产监控系统)

C# 上位机调试条码生成工具(虚拟条码枪助手)

基于 Avalonia 的跨平台工控上位机(导航+折叠+动效)

.NET 10多协议设备采集与监控平台(S7、Modbus、OPC UA、MQTT运动视觉)

没有 PLC 也能跑:C# 工控上位机框架(西门子 PLC + MES + SQLite)

WinForms + Modbus RTU 温湿度数据采集监控系统

不用 Python,C# 也能跑 YOLOv8 人像检测(附源码)

WPF + Modbus 实现一套开源 MES系统(附完整代码)

WPF 实现的模块化视觉流程框架

不接 PLC 也能调试:WPF + Modbus TCP 模拟器实战

工业协议那么杂,这套 .NET 开源库把ModBus、S7、MC都包了

WinForm 仓库管理系统,该有的功能一个不少

采集和界面解耦,这套 C# 工业上位机是这么拆的

C# + Halcon 车牌图像预处理,从读图到抠目标

WPF + Modbus RTU:多串口并行采集的 SCADA 上位机

WPF 开发数字化监控平台,原生控件改出高级感

通讯、运动控制、视觉、脚本,一个 C# 工业上位机全包了

WPF 工控上位机监控系统( 多协议通信ModBus-RTU/TCP、MQTT、Socket)

一套能跑的 WPF 设备监控界面(菜单、设备树、卡片看板)

基于 SAM 3 的 AI 图像自动标注平台(Vue + .NET + FastAPI)

C# + OpenCV 视觉检测上位机项目 (模拟 PLC 通信 + 真实图像检测)

WPF 写的设备监控上位机,这套代码够你抄了

WinForms 工业设备人机界面(HMI),一套系统搞定配置、监控与报警

WPF + 运动控制上位机:模拟卡与真实 API 的无缝切换

WPF 工业视觉检测制造执行系统 (MES)

WinForm + SunnyUI 固定资产管理系统(扫码枪监听、TSPL打印、防超扣SQL)

觉得有收获?不妨分享让更多人受益

关注「DotNet技术匠」,共同提升技术实力

收藏
点赞
分享
在看

相关学习资料