news 2026/1/19 9:35:41

工业级零丢失、高并发 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/1/19 15:54:42

“让Windows Phone回来!”网友向微软请愿:重启曾经的第三大OS

整理 | 苏宓出品 | CSDN(ID:CSDNnews)十几年过去了,Windows Phone 早已在主流手机市场消失。尽管曾一度被视为全球第三大操作系统,但它未能抵挡住 Android 和 iOS 的全面攻势,最终黯然退出了手机舞台。那么…

作者头像 李华
网站建设 2026/1/19 11:08:02

Windows右键菜单终极清理指南:用ContextMenuManager一键告别臃肿菜单

Windows右键菜单终极清理指南:用ContextMenuManager一键告别臃肿菜单 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾经在右键点击文件时&am…

作者头像 李华
网站建设 2026/1/19 6:48:50

揭秘电话号码定位技术:一键查询地理位置的开源工具

揭秘电话号码定位技术:一键查询地理位置的开源工具 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors…

作者头像 李华
网站建设 2026/1/19 13:54:14

Unity翻译插件终极指南:轻松打破游戏语言壁垒

Unity翻译插件终极指南:轻松打破游戏语言壁垒 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩文本而困扰?想要快速掌握Unity游戏翻译的核心技巧&#xff1f…

作者头像 李华
网站建设 2026/1/19 23:22:10

python学习交流平台的设计vue0il1o

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项目效果实现截图 同行可拿货,招校园代理 python学习交流平台的设计vue0il1o 开发技术路线 开发语…

作者头像 李华