wpf-sensorhub

wpf-sensorhub

开源项目 开源工具包

工业传感器实时监控上位机,使用WPF、Material Design、串口和SQLite,用于温度/压力等传感器采集、报警、统计、曲线和历史导出。

核心特性

  • WPF Material Design
  • 传感器数据采集
  • 实时曲线
  • 报警管理
  • 历史导出

产品介绍

WPF SensorHub - 功能详细介绍

概述

WPF SensorHub 是一款基于 .NET 8 的工业传感器实时监控上位机软件,旨在为工业现场提供传感器数据的实时采集、可视化展示、阈值报警、统计分析和持久化存储功能。软件采用 MVVM 架构模式,结合 MaterialDesignThemes 打造现代化深色界面,并集成 ScottPlot 实现高性能实时曲线绘制。

核心功能模块详解

1. 实时监控

1.1 曲线实时绘制

  • 利用 ScottPlot.WPF 的 DataStreamer 类
  • 固定缓存容量 200 个数据点,自动滚动展示最新数据
  • 支持同时展示 3 种不同类型的传感器曲线
  • 每条曲线旁实时显示当前数值、历史最小/最大、平均值

1.2 数据源集成

  • Mock 模式: 生成确定性随机数据,用于无硬件调试和演示
  • 串口通信: 通过 System.IO.Ports 支持可配置波特率、数据位、停止位、校验位、超时设置和流控
  • TCP 网络: 支持 TCP 连接模式,可配置本地监听 IP/端口和远程连接 IP/端口,支持心跳重连
  • 数据源实时切换: 在 参数配置 页面可即时切换数据源,无需重启应用

2. 报警管理

2.1 阈值监控机制

  • 每传感器独立配置上限和下限阈值
  • 上限报警:当数值 > 上限时触发
  • 下限报警:当数值 < 下限时触发

2.2 报警响应动作

  • 弹窗提示: 系统弹出带红色警报图标的弹窗,显示传感器名称、当前数值、触发阈值、时间戳
  • 声音播放: 默认系统提示音,可在配置中开启/关闭
  • 记录持久化: 报警事件自动记录至内存/CSV文件/SQLite 数据库

2.3 报警历史查看

  • 左侧导航 “报警日志” 卡片展示所有历史报警
  • 包含时间、传感器、当前值、触发阈值、状态等列信息
  • 一键导出为 CSV 格式,便于二次分析

3. 参数配置

3.1 传感器配置

  • 传感器名称、类型选择、单位设置
  • 报警阈值:上下限数值输入,支持小数输入
  • 最小/最大模拟值(用于 Mock 模式演示
  • 单个传感器的启用/禁用状态

3.2 数据源配置

  • 串口参数:端口名称、波特率、数据位/停止位/校验位、超时时间
  • TCP 参数:本地监听 IP/端口、远程连接 IP/端口、心跳间隔

3.3 全球配置

  • 采样间隔(ms),控制数据采集频率(默认 50ms}
  • 最大缓存点数(曲线显示最大历史点数,默认 200 点}
  • 默认传感器数量(同时显示的传感器类型数量,默认 3 种}
  • 存储驱动(“Csv” 或 “Sqlite” 作为默认持久化方式}
  • 报警声音开启/关闭
  • 串口/TCP 连接断开是否自动尝试重连

4. 数据统计

4.1 基础统计指标

  • 平均值:统计周期内数值的算术平均值
  • 最小值:统计周期内的最小值
  • 最大值:统计周期内的最大值
  • 标准差:数值分布的标准差,反映数据波动程度

4.2 直方图可视化

  • 用户可自定义数值区间和 Bin(柱子)数量
  • 直观展示数值在各区间的分布情况
  • 可按日期范围过滤统计数据(最近1小时、24小时、7天等}

4.3 统计数据导出

  • 导出为 CSV 格式
  • 包含传感器名称、统计指标、时间范围等字段
  • 可发送给上位机分析系统或下位机校准

5. 数据持久化

5.1 CSV 持久化模式(默认)

  • 每天一个文件,命名格式 YYYY-MM-DD.csv
  • 存储路径:config/data/ 目录下
  • 每累计 50 条记录写入一次磁盘,减少 I/O 频率
  • 数据格式:逗号分隔,包含字段 Id,SensorName,Type,Value,Unit,Timestamp,AlarmFlag

5.2 SQLite 持久化模式

  • 在 config/settings.json 中将 StorageType 从 “Csv” 修改为 “Sqlite”
  • 数据库位置:config/data/sensorhub.db
  • 支持复杂 SQL 查询、快速检索、事务安全
  • 示例查询:
    SELECT * FROM SensorData WHERE Timestamp >= date('now', '-1 day') AND SensorName = '温度传感器'

5.3 数据字段说明

字段类型说明
Idint自增主键
SensorNamestring传感器名称
Typestring传感器类型(温度/压力/振动等)
Valuedouble测量数值
Unitstring单度 (°C, bar, m/s² 等)
Timestampdatetime数据时间戳
AlarmFlagbool是否触发报警(0/1)

6. UI 界面设计

  • 深色主题:MaterialDesign “Indigo-Cyan” 色系
  • 左侧抽屉导航:Monitor(监控)、Config(配置)、AlarmLog(报警日志)、Statistics(统计)
  • 右侧内容区:通过 ContentControl + DataTemplate 根据当前 ViewModel 切换
  • 共享元素:顶部状态栏、底部状态栏显示当前时间、数据源状态、连接状态

7. 异常与容错

  • 全局异常处理:DispatcherUnhandledException、TaskScheduler.UnobservedTaskException、AppDomain.UnhandledException
  • 异步命令捕获:AsyncRelayCommand 内部统一 try/catch,失败时通过 DialogService 显示错误信息
  • 资源释放:MainWindow.Closing 触发 MainViewModel.Dispose(),释放串口/TCP 连接、后台任务

8. 依赖注入与生命周期

  • DI 容器:Microsoft.Extensions.Hosting,通过 IHostBuilder 搭建一次性容器
  • 服务注册策略:Singleton(单例) MainViewModel/全局配置,Transient(瞬时) 每次请求新实例的服务
  • 生命周期管理:应用启动创建 Host,主窗口数据绑定到 MainViewModel,页面导航自动 dispose 旧页面 ViewModel,应用关闭销毁所有子视图模型

技术架构要点

  1. MVVM 模式实现:ViewModelBase 实现 INotifyPropertyChanged,RelayCommand/AsyncRelayCommand 实现命令
  2. 服务注入模式:接口分离(ISensorSource、IDataStorage 等),通过构造函数注入,生命期由容器管理
  3. 配置文件管理:JSON 配置 config/settings.json,自动持久化,不存在时自动创建默认值
  4. 数据流转路径:传感器/模拟源 → 数据源服务 → MainViewModel(观察者模式) → View(XAML binding) → ScottPlot(实时绘制) → 持久化服务(Csv/Sqlite}

使用场景示例

  1. 新厂房设备调试: 连接传感器到串口网关,配置串口参数(波特率 9600,8-N-1),启动 SensorHub 实时查看数据,设置温度报警(上限 80°C,下限 10°C),持久化模式选择 CSV 导出调试数据备案
  2. 远程设备监控: 在工厂网络部署 TCP 传感器采集设备,配置 SensorHub 为 TCP 监听模式(端口 502),远程电脑通过统计页面查看历史数据,开启 SQLite 持久化便于数据分析部门查询
  3. 产线质量监控: 同时监控温度、压力、振动三个参数,设置三组不同阈值范围,直方图分析数值分布优化生产参数,报警日志导出作为质量改进依据

扩展开发指南

  1. 添加新传感器类型:在 Models/ 添加 SensorType 枚举,在 SensorConfig.cs 添加配置字段,在 ViewModels 扩展统计计算方法,在 Views 添加曲线颜色定义
  2. 集成新数据源:实现 ISensorSource 接口,在 ConfigViewModel 中添加新数据源选项,在 App.xaml.cs 中注册新服务
  3. 自定义 UI 主题:编辑 App.xaml 中颜色资源字典,修改 PrimaryColor/AcentColor 等定义,在各视图 XAML 中引用 StaticResource 关键字
  4. 添加新统计指标:在 DataStatisticsService.cs 添加计算方法,在 StatisticsViewModel 中暴露新属性,在 StatisticsView.xaml 中添加展示控件,更新导出功能包含新字段

产品明细图

wpf-sensorhub
wpf-sensorhub
wpf-sensorhub
wpf-sensorhub

详细使用教程

WPF SensorHub - 详细使用教程

教程 1:快速启动模拟数据演示

1.1 环境准备

1.2 运行项目

# 1. 还原 NuGet 包
dotnet restore

# 2. 编译运行
dotnet run

或直接在 Visual Studio 2022 中打开 工业传感器实时监控上位机.slnx 并按 F5 运行。

1.3 演示步骤

  1. 双击项目 exe 或运行 dotnet run,界面将自动启动
  2. 默认显示 Mock 数据 演示界面(无需连接任何硬件)
  3. 界面左侧导航抽屉展示 4 个主要页面:监控、配置、报警日志、统计
  4. 主界面将显示 3 条实时曲线,随时间自动变化生成随机数据
  5. 查看右侧指标面板:当前值、min、max、avg 将实时更新
  6. 点击左侧 “参数配置” 卡片,验证设置是否生效(如采样间隔、缓存点数)
  7. 再次点击监控页确认参数是否已应用

教程 2:通过串口连接真实传感器

2.1 硬件连接

  1. 将工业传感器(温度/压力/振动等)通过 USB-to-TTL 电平转接线连接到 PC 串口
  2. 识别串口号:
    1. Win + R,输入 devmgmt.msc 打开设备管理器
    2. 查看 "端口(COM和LPT)" 分支,记录端口号(如 COM3COM4
  3. 确认传感器供电状态(部分需要外部 5V/12V 电源)

2.2 软件配置

  1. 运行 SensorHub,点击左侧导航的 “参数配置” 卡片
  2. 设置数据源类型:
    1. 选择 COM 模式
    2. 端口名称: 输入识别到的端口号(如 COM3
    3. 波特率: 根据传感器说明书设置(常见值:9600, 115200, 57600)
    4. 数据位: 通常设置为 8 位
    5. 停止位: 通常设置为 1 位(如为 Modbus 协议可设 2 位)
    6. 校验位: 通常设置为“无”(如为偶/奇校验请相应选择)
    7. 超时时间: 默认 1000ms,根据传感器响应时间调整
  3. 点击 “应用并重启数据源” 按钮

2.3 数据验证

  1. 返回 “监控” 页面,应立即看到实时数据流开始显示
  2. 观察曲线变化:真实传感器数据通常比模拟数据更有规律、波动范围较小
  3. 检查右侧指标面板:当前数值应反映实际传感器读数
  4. 如无数据显示:
    1. 检查物理连接是否牢固
    2. 确认波特率是否匹配(错误的波特率会出现乱码数据)
    3. 确认传感器已开机并正在发送数据
    4. 在控制台窗口查看是否有错误输出

2.4 数据格式识别

传感器通过串口发送的数据格式示例:

TEMP:24.5\r\n
HUMI:55.2\r\n

0xA0 0x01 0x18 0x34 0xFF\r\n

(具体格式取决于传感器协议,可在配置页面的 "调试日志" 中查看原始字节数据)

教程 3:配置报警阈值并查看报警历史

3.1 设置报警阈值

  1. 在左侧导航点击 “参数配置” 卡片
  2. 为任意传感器设置报警阈值:
    1. 例如:温度传感器上限设置为 80.0,下限设置为 20.0
    2. 压力传感器上限设置为 5.0(单位:bar),下限设置为 0.5
  3. 保存配置并返回 “监控” 页面

3.2 实时观察报警

  1. 返回 “监控” 页面进行实时观察
  2. 当实时数值突破设定阈值时:
    1. 上限报警:数值超过上限(如温度 > 80°C),弹出红色警报弹窗
    2. 下限报警:数值低于下限(如温度 < 20°C),弹出红色警报弹窗
  3. 弹窗包含信息:
    1. 传感器名称(如 "温度传感器")
    2. 当前数值(如 "82.5°C")
    3. 触发阈值(如 "上限 80.0°C")
    4. 触发时间戳
  4. 声音提示:系统将播放默认提示音(可在 “参数配置” 页的 "报警声音" 选项中关闭)

3.3 查看报警历史

  1. 点击左侧导航 “报警日志” 卡片
  2. 列表将展示所有历史触发的报警记录,包含:
    1. 时间(如 "2024-01-15 10:30:15")
    2. 传感器名称
    3. 当前数值
    4. 触发阈值(上/下限)
    5. 报警状态("进行中"/"已恢复"}
  3. 导出CSV: 在报警日志页面底部点击 "导出 CSV" 按钮,将报警记录保存为 alarm_log_YYYYMMDD.csv 文件,便于生成报告或进行二次分析。

3.4 报警常见问题排查

  • 报警不触发
    1. 检查阈值设置是否合理(上限应大于当前典型值,下限应小于当前典型值)
    2. 确认传感器数据格式是否正确
    3. 检查是否已正确配置串口/TCP 参数
  • 弹窗消失快
    1. 正常现象,报警弹窗有自动消失计时(默认 5 秒)
    2. 如需永久查看,请立即查看 "报警日志" 页面

教程 4:开启 SQLite 持久化存储

4.1 配置修改

  1. 使用记事本或任意文本编辑器打开 config/settings.json 文件
  2. 找到 "StorageType": "Csv" 这一行
  3. 将其修改为:
"StorageType": "Sqlite"

4.2 重启应用

  1. 重启 SensorHub 应用(或点击 "重新加载配置" 按钮,如果有此功能)
  2. 数据将不再写入 CSV 文件,而是存入 SQLite 数据库
  3. 数据库文件位置:config/data/sensorhub.db

4.3 使用 SQLite 查询工具

推荐使用免费工具 DB Browser for SQLite(下载:https://sqlitebrowser.org/)打开数据库。

4.3.1 基本查询示例

-- 查询最近24小时温度数据
SELECT SensorName, AVG(Value), MIN(Value), MAX(Value)
FROM SensorData
WHERE Timestamp >= date('now', '-1 day')
GROUP BY SensorName;

-- 查询超过阈值的报警记录
SELECT * FROM AlarmRecord
WHERE Value > 80.0
ORDER BY Timestamp DESC;

-- 查询特定传感器的日均数据
SELECT DATE(Timestamp) as DataDate, AVG(Value) as AvgValue, COUNT(*) as SampleCount
FROM SensorData
WHERE SensorName = '压力传感器'
GROUP BY DATE(Timestamp)
ORDER BY DataDate DESC;

4.3.2 数据库结构说明

数据库包含以下主要表:

  • SensorData: 存储每条传感器数据记录(Id, SensorName, Type, Value, Unit, Timestamp, AlarmFlag)
  • AlarmRecord: 存储报警事件记录(Id, SensorName, Value, UpperLower, Timestamp, Status)
  • SensorConfig: 存储传感器配置信息(Name, Type, Unit, AlarmUpper, AlarmLower, MinSimValue, MaxSimValue, Enabled)

教程 5:自定义 UI 主题与画刷

5.1 彩色主题自定义

  1. 打开 App.xaml 文件
  2. 定位到资源字典部分,修改自定义画刷定义:
    
    #00D8FF
    #FF6B6B
    #A855F7
    #1a237e
    #2d3a4b
  3. 在任意视图 XAML 中引用这些颜色:
    
    
    
  4. 保存文件,重启应用即可生效

5.2 整体主题切换

MaterialDesign 默认提供浅色/深色主题切换。如需自定义主题颜色,可在 Themes/MaterialDesign.Xaml.Colors.xaml 中修改系统颜色。建议备份原始 App.xaml 文件后再进行大规模修改。

常见问题疑难解答

问题现象可能原因解决方案
界面不启动或闪退 .NET 8 SDK 未安装或版本不匹配 下载安装 .NET 8 SDK(https://dotnet.microsoft.com/download/dotnet/8.0
串口连接失败 端口被其他程序占用、波特率不匹配 1. 关闭串口监视器等占用端口的程序
2. 核对波特率、数据位、停止位、校验位
曲线不更新或卡死 数据传输中断、缓存点数设置过大 1. 检查物理连接
2. 降低 "最大缓存点数"(参数配置页)
3. 重启数据源
报警不触发 阈值设置不当、数据格式错误 1. 调整阈值范围(上限>典型值、下限<典型值)
2. 检查串口数据格式是否符合预期
3. 查看调试日志获取原始数据
内存逐渐增大 持久化关闭但未清理、缓存未释放 1. 定期重启应用
2. 检查是否开启不必要的统计功能
3. 如长时间运行,每天重启一次
CSV 文件打不开 文件损坏、写入中断 1. 检查磁盘空间是否足够
2. 重启应用重新生成 CSV
3. 如使用 SQLite,建议转为 SQLite 模式

快捷键说明

Ctrl + R刷新当前页面数据
Ctrl + S保存当前配置(自动保存至 settings.json)
F5重启应用(等同重新加载所有配置)
Esc关闭任何弹窗或下拉菜单
Ctrl + Shift + E打开/关闭 调试日志 窗口

技术栈

WPF MaterialDesignThemes SQLite ScottPlot

相关产品

×