『7x24小时有问必答』

前言

工业现场的监控软件,市面上并不缺。但从我们实际接触到的项目来看,不少传统 SCADA 界面还停留在 XP 时代的审美,配置靠改代码,协议驱动跟业务逻辑揉成一团,每次设备变动都让人头疼。我们是不是可以重新做一套既符合当下技术审美,又把"可维护性"真正落到实处的采集终端?
本文分享一套基于 .NET 8 + WPF 开发的轻量级数据采集与监控系统,目标很直接:好看、好改、好扩展。

项目介绍

项目定位为面向中小型产线或测试台架的数据采集终端,支持 Modbus TCP、OPC UA 等主流工业协议,通过插件式驱动实现协议与上层业务解耦。
整体采用 Prism MVVM 框架管理界面与逻辑,配合 LiveCharts2 呈现实时趋势,配置文件用 JSON 存放,改完自动热加载,不需要停机。
项目开源,可以直接下载源码编译运行,配套的 Python 模拟设备脚本也一并提供,方便在没有真实 PLC 的环境下体验完整流程。

项目功能

实时数据看板:仪表盘组件直观展示关键测点当前值,折线图实时绘制数据变化趋势,支持多测点叠加对比。
设备与测点管理:左侧导航切换至"设备详情"和"数据点详情"页面,树形结构展示所有设备及下属测点的实时状态、数值、质量戳。
参数下发(写操作):针对具备写入权限的测点,通过无边框弹窗进行指令下发,系统自动完成类型转换和协议适配,无需关心底层字节序。
警报实时拦截:数据异常时自动产生警报记录,导航栏右上角显示未读数量,点击可查看历史警报列表。
配置热加载:修改 config 目录下的 JSON 配置文件,系统通过 FileSystemWatcher 自动检测变更并重新加载采集通道,期间正在运行的数据采集不受影响。
深色/浅色主题切换:全局主题热切换,适配不同光照条件下的操作环境,配色经过多轮调整,长时间盯着不累眼。
本地状态缓存:断网或异常重启后,历史缓存数据可快速恢复,保证看板不出现大面积空白。

项目特点

插件式驱动架构,新增协议只需实现标准接口,不影响现有采集任务
高性能 Skia 渲染引擎支撑下的流畅图表交互,缩放平移跟手
采集引擎内置防抖滤波和死区压缩,避免大量冗余数据涌向界面
断线自动重连机制,网络波动后无需人工干预
自定义无边框窗口,整套 UI 没有原生 WinForm 的影子,风格统一
轻量化部署,单机运行即可覆盖中小规模采集需求

项目技术

技术组件
用途说明
.NET 8.0
运行时框架,长期支持版本,性能与稳定性兼顾
WPF
桌面 UI 框架,配合 XAML 实现灵活布局和样式定制
Prism  
MVVM框架,负责依赖注入、模块间事件通信、弹窗服务
LiveCharts2+
SkiaSharp
高性能图表库,利用 Skia 图形引擎实现 GPU 加速渲染
Serilog
结构化日志记录,支持滚动文件和调试输出
NModbus
Modbus TCP/RTU 协议实现,用于与 PLC 或模拟设备通信
Newtonsoft.Json
配置文件序列化与反序列化,可读性强
FileSystemWatcher
监听配置文件变更,触发采集通道热重载

项目代码

核心采集引擎的轮询逻辑封装在  xxxx.Acquisition  中,它维护一个后台线程池,按设备配置的采样周期轮询驱动插件获取数据,并经由  Channel  推送到存储层和 UI 层。
驱动插件只需实现  IDriver  接口,包含连接、读取、写入、断开等标准方法。
public  interface  IDriver  :  IDisposable

{

       Task<bool>  ConnectAsync(DeviceConfig config);

       Task<tagvalue>  ReadAsync(TagPoint tag);

       Task  WriteAsync(TagPoint tag,  object  value);

       bool  IsConnected {  get; }

       event  EventHandler<driverstatuschangedeventargs> StatusChanged;

}

Modbus 驱动基于 NModbus 实现,其中针对浮点数处理了 CDAB 字节序转换,确保与主流 PLC 的数据表示一致。配置热加载的触发点放在  App.xaml.cs  的启动流程中,初始化一个单例的  ConfigWatcher  组件,当检测到 JSON 文件变化时,通过  EventAggregator  发布  ConfigReloadedEvent,采集引擎订阅该事件后重新加载设备列表。
UI 层中,折线图使用  CartesianChart  控件绑定  ISeries  集合,数据更新通过  ObservableCollection  驱动,保证了高帧率刷新时的稳定性。仪表盘组件则基于  RadialGauge  做了样式调整,指针动画流畅。

项目效果

主界面采用左右布局,左侧是导航菜单,右侧  ContentControl  承载各页面视图。导航选中项会有高亮反馈,状态栏实时显示采集引擎的连接状态和当前页面。

深色主题下,整体以深灰蓝为基底,关键数据用品牌色高亮,视觉重心明确。图表区域支持鼠标滚轮缩放和拖拽平移,查看历史趋势很方便。
配合 Python 模拟器运行时,仪表盘指针会随模拟数据规律摆动,折线图持续滚动更新,警报列表会在数值超出预设阈值时自动追加记录,同时右下角弹出通知气泡,整体观感很舒服。

项目源码

使用 Visual Studio 2022 打开  xxxx.sln,确保已安装 .NET 8 SDK,将  xxxx.UI  设为启动项目后编译运行即可。
模拟设备脚本位于  config/python_modbus_slave.py,启动前请安装依赖:
pip install pymodbus

python config/python_modbus_slave.py

模拟器默认监听  localhost:502,预设了 10 个保持寄存器和 10 个输入寄存器,涵盖整型、浮点型和布尔型数据,足够覆盖多数功能演示场景。

总结

项目算是一个把"能用"和"好用"之间的距离拉近了一些的尝试。通过合理的分层架构和插件机制,它把配置、采集、存储、展示这些环节拆得比较干净,后续无论是替换协议驱动还是调整 UI 风格,成本都相对可控。如果大家正在找一个轻量、现代且开源的 SCADA 选项,可以试试这个项目,也可以作为参考。

关键词

WPFPrismMVVM工业数据采集SCADA、Modbus TCP、OPC UA、实时监控、配置热加载、LiveCharts2SkiaSharp、NET 8、数据可视化插件架构
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠]  社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END

推荐阅读

觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力

收藏
点赞
分享
在看
</driverstatuschangedeventargs></tagvalue>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码