工业现场的监控软件,市面上并不缺。但从我们实际接触到的项目来看,不少传统 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 ConnectAsync(DeviceConfig config);Task ReadAsync(TagPoint tag);Task WriteAsync(TagPoint tag, object value);bool IsConnected { get; }event EventHandler}Modbus 驱动基于 NModbus 实现,其中针对浮点数处理了 CDAB 字节序转换,确保与主流 PLC 的数据表示一致。配置热加载的触发点放在 App.xaml.cs的启动流程中,初始化一个单例的ConfigWatcher组件,当检测到 JSON 文件变化时,通过EventAggregator发布ConfigReloadedEvent,采集引擎订阅该事件后重新加载设备列表。
UI 层中,折线图使用 CartesianChart控件绑定ISeries集合,数据更新通过ObservableCollection驱动,保证了高帧率刷新时的稳定性。仪表盘组件则基于RadialGauge做了样式调整,指针动画流畅。
项目效果主界面采用左右布局,左侧是导航菜单,右侧 ContentControl承载各页面视图。导航选中项会有高亮反馈,状态栏实时显示采集引擎的连接状态和当前页面。


深色主题下,整体以深灰蓝为基底,关键数据用品牌色高亮,视觉重心明确。图表区域支持鼠标滚轮缩放和拖拽平移,查看历史趋势很方便。

配合 Python 模拟器运行时,仪表盘指针会随模拟数据规律摆动,折线图持续滚动更新,警报列表会在数值超出预设阈值时自动追加记录,同时右下角弹出通知气泡,整体观感很舒服。

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