news 2026/6/10 20:41:06

工业级零丢失、高并发 PLC 数据采集系统(支持 .NET 8/10)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业级零丢失、高并发 PLC 数据采集系统(支持 .NET 8/10)

前言

工业级 PLC 数据采集系统

项目简介

一个基于 .NET 开发的高性能、高可靠工业数据采集系统,专为 PLC(可编程逻辑控制器)场景设计。支持 .NET 8.0 和 .NET 10.0 两个 LTS 版本,采用 WAL-first(Write-Ahead Logging)架构,确保数据零丢失,并提供多 PLC 并行采集、条件触发、批量读取等高级功能。

核心特性

WAL-first 架构:先写本地 Parquet 日志,再写入时序数据库,保障数据不丢

多 PLC 并行采集:支持 Modbus、Beckhoff ADS、汇川、三菱、西门子等主流协议

条件触发采集:支持边沿触发(Rising/Falling Edge)、值变化触发等智能模式

批量读取优化:减少网络往返,提升吞吐效率

配置热更新:JSON 配置 + 文件监听,无需重启服务

实时监控:内置 Prometheus 指标 + Vue3 可视化界面

双存储策略:InfluxDB(主存) + Parquet(本地 WAL)

自动重试机制:网络异常自动重连,失败数据由 RetryWorker 重传

系统架构

整体架构

PLC Device │ ▼ Heartbeat Monitor Layer │ ▼ Data Acquisition Layer (ChannelCollector) │ ▼ Queue Service Layer (LocalQueueService) │ ▼ Storage Layer → WAL (Parquet) → InfluxDB │ ▲ └── RetryWorker ←┘ (失败重试)

核心数据流

1、采集:PLC → ChannelCollector

2、聚合:LocalQueueService 按 BatchSize 缓存

3、持久化:立即写入 Parquet WAL 文件、同步写入 InfluxDB

4、清理:两者成功 → 删除 WAL;任一失败 → 保留 WAL,由 RetryWorker 重试

项目结构

├── Application/ # 应用层(接口定义) ├── Domain/ # 领域模型(数据结构、事件) ├── Infrastructure/ # 基础设施(PLC 客户端、存储、指标) ├── Gateway/ # Web 网关(API + 配置 + 前端) ├── Simulator/ # PLC 模拟器(用于测试)

项目使用

环境要求

  • .NET 8.0 或 .NET 10.0 SDK(LTS 版本)

  • InfluxDB 2.x(可选,用于时序存储)

  • 支持的 PLC(或使用内置模拟器)

版本建议

.NET 10.0:最新 LTS,支持至 2028 年(推荐新项目)
.NET 8.0:稳定 LTS,支持至 2026 年(推荐生产环境)

安装与运行

# 克隆项目 # 恢复依赖 dotnet restore # 运行(默认框架) dotnet run --project xx.Gateway # 指定框架运行 dotnet run -f net10.0 --project xx.Gateway

使用 PLC 模拟器(无需真实设备)

# 启动模拟器(模拟三菱 PLC) cd xx.Simulator dotnet run

模拟器提供:

  • 心跳寄存器(D100 自增)

  • 7 个传感器指标(温度、压力、电流等)

  • 条件触发测试(基于生产序号)

  • 交互式命令(set/get/info)

配置说明

设备配置示例 (M01C123.json)

{ "IsEnabled": true, "PLCCode": "PLC01", "Host": "192.168.1.100", "Port": 502, "Type": "Mitsubishi", "Channels": [ { "Measurement": "temperature", "ChannelCode": "PLC01C01", "AcquisitionInterval": 100, "AcquisitionMode": "Conditional", "EnableBatchRead": true, "BatchReadRegister": "D200", "BatchReadLength": 20, "DataPoints": [ { "FieldName": "temp_value", "Register": "D200", "Index": 0, "DataType": "short", "EvalExpression": "value * 0.1" } ], "ConditionalAcquisition": { "Register": "D210", "DataType": "short", "StartTriggerMode": "RisingEdge", "EndTriggerMode": "FallingEdge" } } ] }

注意:RisingEdge/FallingEdge指数值增减变化(非 0/1 跳变),适用于计数器、状态码等场景。

InfluxDB 映射规则

配置项

InfluxDB 结构

示例

Measurement

Measurement

sensor

PLCCode

Tagplc_code

M01C123

ChannelCode

Tagchannel_code

M01C01

FieldName

Field

up_temp=250i

采集时间

Timestamp

1705312200000000000

条件周期 ID

Fieldcycle_id

"guid-xxx"

Line Protocol 示例:

sensor,plc_code=M01C123,channel_code=M01C01,event_type=Start up_temp=250i,cycle_id="..." 1705312200000000000

API 使用示例

# 获取 Prometheus 指标 curl http://localhost:8000/metrics # 获取 JSON 格式指标 curl http://localhost:8000/api/metrics-data # 查询 PLC 连接状态 curl http://localhost:8000/api/xx/GetPLCConnectionStatus

C# 写入示例

var request = new PLCWriteRequest { PLCCode = "M01C123", Items = new[] { new PLCWriteItem { Address = "D300", DataType = "short", Value = 100 } } }; await httpClient.PostAsJsonAsync("/api/xx/WriteRegister", request);

核心模块说明

PLC 客户端支持

协议

实现类

三菱

MitsubishiPLCClientService

汇川

InovancePLCClientService

倍福 ADS

BeckhoffAdsPLCClientService

西门子

SiemensPLClientService

关键服务

ChannelCollector:负责按通道采集数据,支持条件/持续模式

InfluxDbDataStorageService:批量写入 InfluxDB,带错误回调与重试

MetricsCollector:暴露采集延迟、队列深度、写入成功率等指标

数据处理流程

正常路径:采集 → 队列聚合 → WAL 写入 → InfluxDB 写入 → WAL 清理

异常路径

  • 网络断开 → 心跳监控 + 自动重连

  • 存储失败 → WAL 保留 → ParquetRetryWorker 定期重试

性能建议

参数

推荐值

说明

BatchSize

10–50

平衡吞吐与延迟

AcquisitionInterval

100–500 ms

根据 PLC 负载调整

HeartbeatPollingInterval

5000 ms

连接健康检查频率

项目源码

为了防止丢失,可以在评论区留言关键字「采集系统」,即可获取完整源码地址。

总结

一个面向工业自动化场景的高性能 PLC 数据采集系统,基于 .NET 8/10 开发,专为高并发、零丢失的数据采集需求设计。

系统采用 WAL-first(预写日志)架构,确保在任何异常情况下数据不丢失;

支持多种主流 PLC 协议(如三菱、西门子、汇川、倍福 ADS、Modbus),并提供条件触发、批量读取、配置热更新等高级功能。通过双存储策略(InfluxDB + Parquet)与自动重试机制,系统在保障可靠性的同时兼顾性能与可运维性。

内置 Prometheus 指标暴露与 Web 监控界面,便于集成到 DevOps 体系中。

整体采用分层模块化设计,具备良好的扩展性和维护性,适用于智能制造、能源监控、设备物联等工业物联网(IIoT)场景。

关键词

#工业数据采集、#PLC通信、.NET 8、.NET 10、#零丢失、#WAL、#高并发系统、#条件触发采集、#InfluxDB、#Parquet、#工业物联网、#自动重试机制、#配置热更新、#Prometheus、#监控、#模块化设计、#多协议支持、#Modbus

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:10:06

3分钟快速上手ContextMenuManager:Windows右键菜单专业管理完整教程

3分钟快速上手ContextMenuManager:Windows右键菜单专业管理完整教程 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你的Windows右键菜单是否也变成了…

作者头像 李华
网站建设 2026/6/10 13:35:54

华硕笔记本性能优化终极指南:轻量级控制工具完全解决方案

华硕笔记本性能优化终极指南:轻量级控制工具完全解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…

作者头像 李华
网站建设 2026/6/10 2:03:48

Unity游戏实时翻译解决方案:打破语言障碍的技术实现

Unity游戏实时翻译解决方案:打破语言障碍的技术实现 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏体验的时代,语言壁垒成为许多玩家面临的现实问题。XUnity.AutoTra…

作者头像 李华
网站建设 2026/6/10 15:03:38

重塑游戏体验:Scarab模组管理器的智能革命

重塑游戏体验:Scarab模组管理器的智能革命 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 深夜,当大多数玩家还在为《空洞骑士》模组安装的繁琐流程而苦…

作者头像 李华
网站建设 2026/6/10 10:56:11

如何改进图以提升您的机器学习模型性能

原文:towardsdatascience.com/how-to-improve-graphs-to-empower-your-machine-learning-models-performance-f7a533a73fc2 由拓扑信息定义的图在许多机器学习场景中很有帮助。它们可用于社区检测、节点影响、分类和其他任务。机器学习模型在这些任务上所能达到的性…

作者头像 李华
网站建设 2026/6/9 12:53:05

Dify可视化工具如何缩短AI产品上线周期?

Dify可视化工具如何缩短AI产品上线周期? 在企业竞相追逐“AI原生”转型的今天,一个现实问题摆在面前:为什么很多公司投入大量资源研发AI功能,却迟迟无法交付可用的产品?答案往往不在于模型能力不足,而在于开…

作者头像 李华