『7x24小时有问必答』

前言

工业场景里,设备数据采集和监控从来不是一件简单的事。PLC、传感器、各类仪表分散在车间各处,协议五花八门,数据格式也各说各话。更麻烦的是,设备还没接入,就得先搞定用户管理、权限控制、数据存储这些基础能力,光搭架子就要花不少时间。
本文推荐一个用 .NET 9 从头搭建一个设备接入、数据采集、实时监控、报警处理、历史查询和第三方接口开放的全链路平台。

项目介绍

一个基于 .NET 9 的工业设备数据采集与监控平台。它的目标很直接:模拟工业现场中设备接入、数据采集、实时监控、报警处理、历史查询和第三方接口开放等典型业务链路。
这套系统采用典型的分布式架构,后端 API 负责提供业务接口和实时推送,后台采集服务独立运行、持续拉取设备数据,桌面客户端作为监控界面,设备模拟器用来模拟真实设备的数据上报行为。各个模块各司其职,互不干扰。
当前项目已经完成了基础框架的搭建:解决方案分层、基础实体定义、EF Core + SQLite 数据访问、Serilog 日志、Swagger 接口文档、WPF 客户端外壳、采集 Worker 和设备模拟器。后面可以继续在此基础上补齐设备管理 API、真实采集协议、SignalR 推送和监控界面。

项目功能

从业务场景来看,这套平台覆盖了工业设备监控的完整链路:
功能模块
说明
设备管理
设备编码、名称、协议类型、IP 地址、端口、采集周期等基础信息维护
数据采集
后台 Worker 服务按配置周期拉取设备数据,支持多设备并行采集
实时监控
通过 SignalR 将采集到的数据实时推送到 WPF 客户端
报警处理
基于报警规则(数据项、比较符、阈值、报警等级)自动触发报警记录
历史查询
设备历史数据的检索、导出和分析
第三方接口
对外提供标准 API,方便其他系统集成

项目特点

特点
描述
分层清晰
Domain / Application / Infrastructure / Api / Collector 各层职责明确,便于维护和扩展
采集与 API 分离
采集 Worker 独立运行,不影响 API 服务的稳定性,也方便单独部署和扩容
实时数据推送
SignalR 加持,数据采集后能第一时间推送到监控端,不用等轮询
本地存储优先
SQLite 作为数据存储,无需单独安装数据库服务,开箱即用
设备模拟支持
自带设备模拟器,开发阶段就能跑通全流程,不用依赖真实硬件
桌面监控客户端
WPF + HandyControl + LiveCharts2,界面响应式和实时图表都有现成方案
可观测性
Serilog 结构化日志,开发和生产环境都能方便地追踪问题

项目技术

后端技术栈

技术
用途
.NET 9.0
运行时和基础框架,标准期限支持版本
ASP.NET Core Web API
提供 RESTful API 和 SignalR 推送能力
Entity Framework Core
ORM 数据访问,支持自动迁移和多种数据库
SQLite
嵌入式数据库,无需独立服务端
SignalR
实时双向通信,将设备数据推送到 WPF 客户端
Serilog
结构化日志,支持滚动文件和多种输出目标
FluentValidation
请求参数校验,把验证逻辑从控制器里抽出来
Mapster
对象映射,DTO 和实体之间的转换不用手写

环境要求

Windows 10/11
.NET SDK 9.0
Visual Studio 2022 或 Rider(需支持 .NET 9 和 WPF)
SQLite 数据库由 API 启动时自动创建,无需额外安装

项目代码

项目采用清晰的分层架构,解决方案结构是这样的:
IndustrialMonitorPlatform.sln

src/

├── IndustrialMonitor.Api/                     # API 服务,Swagger,迁移入口

├── IndustrialMonitor.Application/         # 应用层,业务编排

├── IndustrialMonitor.Collector/            # 后台采集 Worker

├── IndustrialMonitor.DeviceSimulator/   # 设备模拟器

├── IndustrialMonitor.Domain/                 # 领域实体

├── IndustrialMonitor.Infrastructure/     # EF Core DbContext,迁移

├── IndustrialMonitor.Shared/                 # DTO,常量等共享类型

└── IndustrialMonitor.Wpf/                     # WPF 桌面客户端

看一下采集 Worker 的核心实现思路。BackgroundService  是 .NET 提供的长期运行服务基类,采集 Worker 继承它之后,在  ExecuteAsync  方法里写循环任务:
public  classCollectorWorker  :  BackgroundService

{

       privatereadonly  ILogger<collectorworker> _logger;

       privatereadonly  IServiceScopeFactory _scopeFactory;

       protected  override  async  Task  ExecuteAsync(CancellationToken stoppingToken)

      {

             while  (!stoppingToken.IsCancellationRequested)

            {

                   // 这里遍历所有设备,执行采集逻辑

                  _logger.LogInformation("采集任务执行中...");

                   await  Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);

            }

      }

}

API 这边的 DbContext 配置也很常规,在  Program.cs  里注册 EF Core 并指定 SQLite 提供程序:
builder.Services.AddDbContext<appdbcontext>(options =>

      options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));

API 启动时会自动执行  db.Database.Migrate(),数据库文件直接在运行目录下生成,不用操心建表的事 。
设备模拟器更简单,就是一个控制台程序,定时读取配置里指定的设备编码和发送间隔,模拟往采集服务发送数据。目前已经能读到配置并输出日志,后续扩展成 TCP、Modbus 或 MQTT 上报都很方便。
WPF 客户端这边用了 MVVM 模式,CommunityToolkit.Mvvm 提供了  ObservableObject  和  RelayCommand,ViewModel 写起来比较干净。HandyControl 负责界面控件,LiveCharts2 用来画实时曲线。

项目效果

启动流程:API、采集 Worker、设备模拟器、WPF 客户端四个服务可以分别启动,也可以把多个项目设置为同时启动,一次跑通全链路。
数据流验证:设备模拟器生成模拟数据 → 采集 Worker 接收 → 存入 SQLite → API 提供查询接口 → WPF 通过 Refit 调用 API 展示数据。这套流程的数据链路已经通了,后续只是把各个环节的业务逻辑补全。

Swagger 文档:API 启动后访问  /swagger,接口文档自动生成,调试和联调都很方便。
日志输出:Serilog 配置了滚动文件输出,开发阶段看控制台,生产环境看文件,排查问题有迹可循。
从实际搭建体验来看,从拉代码到全部跑起来,基本在十分钟以内。对于工业场景里的数据采集项目,这种"拿来就能跑"的体验还挺难得的。

项目源码

本地运行需要几步
# 还原依赖

dotnet restore

# 编译整个解决方案

dotnet build

# 启动 API(默认端口 5281)

dotnet run --project src/IndustrialMonitor.Api/IndustrialMonitor.Api.csproj

# 启动采集 Worker

dotnet run --project src/IndustrialMonitor.Collector/IndustrialMonitor.Collector.csproj

# 启动设备模拟器

dotnet run --project src/IndustrialMonitor.DeviceSimulator/IndustrialMonitor.DeviceSimulator.csproj

# 启动 WPF 客户端

dotnet run --project src/IndustrialMonitor.Wpf/IndustrialMonitor.Wpf.csproj

如果用 Visual Studio,直接打开  IndustrialMonitorPlatform.sln,把多个项目设置为同时启动就行。
如果后续实体模型发生变化,可以通过 EF Core 的迁移命令更新数据库:
dotnet ef migrations add MigrationName \

   --project src/IndustrialMonitor.Infrastructure/IndustrialMonitor.Infrastructure.csproj \

   --startup-project src/IndustrialMonitor.Api/IndustrialMonitor.Api.csproj \

   --output-dir Database/Migrations

GitHub:https://github.com/Timi0v0/IndustrialMonitorPlatform

总结

项目没有一上来就追求大而全的功能覆盖,而是先把分层架构、数据访问、日志、实时推送这些基础能力搭扎实了。设备管理、采集、报警、监控这些核心业务模块都留好了接口和位置,后续只需要按顺序往里面填业务逻辑就行。
从技术选型来看,.NET 9 + EF Core + SignalR + SQLite 这套组合,在工业数据采集场景下是够用的。采集 Worker 和 API 分离的架构也为后续扩展留了余地——采集服务可以单独部署到靠近设备的边缘节点,API 服务集中部署在云端或中心机房。
大家做工业物联网相关的项目,或者想找一个 .NET 9 的全栈实战案例来练手,这套框架值得花点时间跑起来看看。光是研究它的分层设计和采集 Worker 的实现,就能学到不少东西。

关键词

工业数据采集设备监控、.NET 9、ASP.NET Core、SignalR实时推送、WPF桌面客户端、EF Core、SQLite、BackgroundService、设备模拟器报警处理MVVMLiveCharts2Serilog日志、Worker Service
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠]  社区,与其他热爱技术的同行一起交流心得,共同成长!
作者:小码编匠
出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

END

推荐阅读

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

收藏
点赞
分享
在看
</appdbcontext></collectorworker>

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

本帖子中包含更多资源

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

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

本版积分规则

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

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

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


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