当前位置: 首页 > article >正文

《用C#实现工业现场数据的实时采集与存储》的完整、工业级、可落地的实现方案

以下是针对《用C#实现工业现场数据的实时采集与存储》的完整、工业级、可落地的实现方案。内容基于 .NET 8 / .NET 92025–2026 年主流工业实践重点解决高频采集、断线重连、批量写入、数据丢失最小化等问题。1. 工业现场数据采集架构推荐分层数据源层 ↓ (Modbus TCP / RTU / S7 / OPC UA / 串口 / MQTT ...) 采集层BackgroundService 多协议驱动 ↓ (Channel 或 ConcurrentQueue 缓冲) 缓存层内存队列 批量打包 ↓ (每 1–5 秒或达到容量阈值触发写入) 存储层时序数据库优先InfluxDB v2 / TimescaleDB / DolphinDB ↳ 可选SQLite 本地缓存断网场景 → 后续同步 监控层Serilog Prometheus / App.Metrics核心原则采集与存储解耦采集永不阻塞批量写入减少数据库压力断线自动重连 心跳检测异常数据不丢失内存 本地文件双保险2. 设备接口及数据读取多种协议示例2.1 Modbus TCP最常见使用FluentModbus.NET 8 原生 Span 支持性能最佳usingFluentModbus;usingSystem.Net.Sockets;// 推荐封装类publicclassModbusTcpCollector:IAsyncDisposable{privatereadonlystring_ip;privatereadonlyint_port;privateModbusTcpClient?_client;privatebool_isConnected;publicModbusTcpCollector(stringip,intport502){_ipip;_portport;}publicasyncTaskboolConnectAsync(){try{vartcpClientnewTcpClient();awaittcpClient.ConnectAsync(_ip,_port);_clientnewModbusTcpClient(tcpClient);_isConnectedtrue;returntrue;}catch{_isConnectedfalse;returnfalse;}}publicasyncTaskMemoryushortReadHoldingRegistersAsync(byteunitId,ushortstart,ushortcount){if(!_isConnected||_clientisnull)thrownewInvalidOperationException(Not connected);try{returnawait_client.ReadHoldingRegistersAsync(unitId,start,count);}catch{_isConnectedfalse;throw;}}publicasyncValueTaskDisposeAsync(){_client?.Dispose();_clientnull;}}2.2 串口 Modbus RTU高吞吐版推荐使用RJCP.IO.PortsFluentModbusLinux/Windows 通用usingRJCP.IO.Ports;usingFluentModbus;// 类似上面只是 Client 换成 ModbusRtuClientpublicclassModbusRtuCollector:IAsyncDisposable{privatereadonlystring_portName;privateSerialPortStream?_port;privateModbusRtuClient?_client;publicasyncTaskConnectAsync(){_portnewSerialPortStream(_portName,19200,8,Parity.None,StopBits.One);await_port.OpenAsync();_clientnewModbusRtuClient(_port);}// Read 方法同上}2.3 西门子 S7S7-1200/1500/200 SMART使用S7.NetPlus开源、稳定usingS7.Net;publicclassS7Collector{privatePlc?_plc;publicasyncTaskConnectAsync(stringip,CpuTypecpuTypeCpuType.S71200,shortrack0,shortslot1){_plcnewPlc(cpuType,ip,rack,slot);await_plc.OpenAsync();}publicasyncTaskobjectReadAsync(DataTypedataType,intdb,intstart,VarTypevarType,intcount1){returnawait_plc.ReadAsync(dataType,db,start,varType,count);}}3. 采集调度 缓存BackgroundService ChannelpublicclassIndustrialDataCollector:BackgroundService{privatereadonlyModbusTcpCollector_modbus;privatereadonlyChannelCollectedDataPoint_channel;privatereadonlyILogger_logger;publicIndustrialDataCollector(ModbusTcpCollectormodbus,ILoggerFactoryloggerFactory){_modbusmodbus;_channelChannel.CreateBoundedCollectedDataPoint(newBoundedChannelOptions(5000){FullModeBoundedChannelFullMode.DropOldest});_loggerloggerFactory.CreateLoggerIndustrialDataCollector();}protectedoverrideasyncTaskExecuteAsync(CancellationTokenstoppingToken){// 重连循环while(!stoppingToken.IsCancellationRequested){if(!awaitTryEnsureConnected(stoppingToken)){awaitTask.Delay(5000,stoppingToken);continue;}try{vartimernewPeriodicTimer(TimeSpan.FromMilliseconds(500));// 采集周期可配置while(awaittimer.WaitForNextTickAsync(stoppingToken)){vardataawaitCollectDataAsync();await_channel.Writer.WriteAsync(data,stoppingToken);}}catch(Exceptionex){_logger.LogError(ex,采集异常);awaitTask.Delay(3000,stoppingToken);}}}privateasyncTaskCollectedDataPointCollectDataAsync(){varregistersawait_modbus.ReadHoldingRegistersAsync(1,100,20);vartimestampDateTimeOffset.UtcNow;returnnewCollectedDataPoint{Timestamptimestamp,TagsnewDictionarystring,object{[Machine1_Temp]ModbusUtility.ConvertToFloat(registers.Span.Slice(0,2)),[Machine1_Pressure]registers.Span[4],// ... 更多点}};}privateasyncTaskboolTryEnsureConnected(CancellationTokenct){if(await_modbus.ConnectAsync())returntrue;_logger.LogWarning(Modbus 连接失败重试中...);returnfalse;}}CollectedDataPoint 示例结构化便于存储publicrecordCollectedDataPoint{publicDateTimeOffsetTimestamp{get;init;}publicDictionarystring,objectTags{get;init;}new();publicDictionarystring,objectFields{get;init;}new();}4. 高效批量存储推荐 InfluxDB v2 或 TimescaleDB4.1 使用 InfluxDB.Client官方 .NET 客户端NuGetInfluxDB.ClientpublicclassInfluxStorageService{privatereadonlyInfluxDBClient_client;privatereadonlystring_bucket;privatereadonlystring_org;publicInfluxStorageService(stringurl,stringtoken,stringorg,stringbucket){_clientnewInfluxDBClient(url,token);_orgorg;_bucketbucket;}publicasyncTaskWriteBatchAsync(IReadOnlyListCollectedDataPointpoints){varwriteApi_client.GetWriteApi();foreach(varpointinpoints){varwpPointData.Measurement(production_line).Tag(line_id,L001).Field(temp,point.Tags.GetValueOrDefault(Machine1_Temp,0d)).Field(pressure,point.Tags.GetValueOrDefault(Machine1_Pressure,0)).Timestamp(point.Timestamp,WritePrecision.Ns);writeApi.WritePoint(wp,_bucket,_org);}awaitwriteApi.FlushAsync();}}批量消费 Channel 并写入publicclassDataStorageWorker:BackgroundService{privatereadonlyChannelReaderCollectedDataPoint_reader;privatereadonlyInfluxStorageService_storage;privatereadonlyListCollectedDataPoint_batchnew(500);publicDataStorageWorker(ChannelCollectedDataPointchannel,InfluxStorageServicestorage){_readerchannel.Reader;_storagestorage;}protectedoverrideasyncTaskExecuteAsync(CancellationTokenstoppingToken){vartimernewPeriodicTimer(TimeSpan.FromSeconds(3));// 每 3 秒或 500 条写一次while(!stoppingToken.IsCancellationRequested){while(await_reader.WaitToReadAsync(stoppingToken)){if(_reader.TryRead(outvarpoint)){_batch.Add(point);if(_batch.Count500)awaitFlushBatch();}}if(awaittimer.WaitForNextTickAsync(stoppingToken)){awaitFlushBatch();}}}privateasyncTaskFlushBatch(){if(_batch.Count0)return;try{await_storage.WriteBatchAsync(_batch);_batch.Clear();}catch(Exceptionex){// 可记录到本地文件稍后重试}}}5. 注册与启动Program.csbuilder.Services.AddSingletonModbusTcpCollector(spnewModbusTcpCollector(192.168.1.100));builder.Services.AddSingletonInfluxStorageService(spnewInfluxStorageService(http://influxdb:8086,your-token,my-org,industrial));builder.Services.AddHostedServiceIndustrialDataCollector();builder.Services.AddHostedServiceDataStorageWorker();6. 工业级优化建议2025–2026 必备采集周期动态调整低负载 1s高负载 200ms心跳寄存器检测每 10s 读一次固定地址本地缓存兜底写入失败 → 写入 SQLite 或本地文件 → 定时重试指标监控采集延迟、丢包率、写入 QPS、连接状态 → Prometheus GrafanaNative AOT 发布启动快、内存低、GC 压力小如果你想继续扩展例如添加 OPC UA、MQTT、S7 协议、数据压缩、异常告警、WPF 实时曲线展示等告诉我你的具体设备类型或下一个重点模块我可以继续给出更细化的代码和架构。

相关文章:

《用C#实现工业现场数据的实时采集与存储》的完整、工业级、可落地的实现方案

以下是针对《用C#实现工业现场数据的实时采集与存储》的完整、工业级、可落地的实现方案。内容基于 .NET 8 / .NET 9(2025–2026 年主流工业实践),重点解决高频采集、断线重连、批量写入、数据丢失最小化等问题。 1. 工业现场数据采集架构&am…...

LightOnOCR-2-1B在物流行业的应用:运单自动识别系统

LightOnOCR-2-1B在物流行业的应用:运单自动识别系统 1. 物流运单处理的现实困境 每天清晨六点,某大型快递分拣中心的扫描台前已经排起长队。十几名操作员正快速翻动一叠叠运单,手指在键盘上飞舞录入收件人、发件人、物品类型、重量体积等信…...

毕设程序java网络课程管理系统 Java在线教学资源管理平台的设计与实现 Java数字化课程学习服务系统的研究与开发

毕设程序java网络课程管理系统3123dldt (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着互联网技术的飞速发展和教育信息化的深入推进,传统课堂教学模式已难以满…...

Windows系统下通义千问Qwen-1.5-1.8B/7B/14B模型本地部署与性能调优实战

1. Windows系统下通义千问模型部署全攻略 第一次在Windows系统部署Qwen大模型时,我盯着命令行里红色的报错信息发了半小时呆。作为在AI行业摸爬滚打多年的老手,没想到会被CUDA版本兼容问题绊住脚。现在回想起来,这些坑其实都能避免——只要掌…...

Vivado调试实战:遇到Debug Hub未检测到警告?3种方法快速解决(含时钟配置技巧)

Vivado调试实战:Debug Hub检测失败的深度解决方案与时钟优化技巧 当你在Vivado Hardware Manager中尝试调试带有ILA核的设计时,突然弹出一条令人不安的警告:"The debug hub core was not detected at User Scan Chain 1 or 3"。这种…...

Qwen3-TTS语音设计世界效果展示:砖块跳动频率匹配语音节拍真实案例

Qwen3-TTS语音设计世界效果展示:砖块跳动频率匹配语音节拍真实案例 1. 项目概览:当语音合成遇上像素艺术 欢迎来到基于Qwen3-TTS技术构建的语音设计世界,这是一个将AI语音合成与复古像素艺术完美融合的创新平台。在这里,语音设计…...

Z-Image Turbo动态测试:多轮生成稳定性效果验证

Z-Image Turbo动态测试:多轮生成稳定性效果验证 1. 测试背景与目的 Z-Image Turbo作为一款基于Turbo架构的高性能AI绘图工具,在单次生成中已经展现出令人印象深刻的效果。但在实际应用中,用户往往需要进行多轮连续生成,这时候系…...

translategemma-4b-it功能体验:上传图片自动识别并翻译,简单高效

translategemma-4b-it功能体验:上传图片自动识别并翻译,简单高效 1. 为什么选择translategemma-4b-it 在日常工作和生活中,我们经常会遇到需要翻译图片中文字的场景。传统的解决方案通常需要先使用OCR工具识别文字,再将识别结果…...

UI-TARS-desktop新手入门:无需代码,用对话控制电脑的AI工具

UI-TARS-desktop新手入门:无需代码,用对话控制电脑的AI工具 1. UI-TARS-desktop简介 UI-TARS-desktop是一款革命性的AI工具,它让用户能够通过自然语言对话来控制电脑操作。想象一下,你只需要告诉电脑"打开浏览器搜索最近的…...

Qwen2.5-72B-Instruct-GPTQ-Int4一文详解:开源大模型多场景部署最佳实践

Qwen2.5-72B-Instruct-GPTQ-Int4一文详解:开源大模型多场景部署最佳实践 1. 开篇:为什么你需要关注这个72B的“大家伙”? 如果你正在寻找一个能力全面、部署灵活、效果惊艳的开源大语言模型,那么Qwen2.5-72B-Instruct-GPTQ-Int4…...

春联生成模型-中文-base镜像免配置:预装Gradio+PALM+依赖的一键镜像

春联生成模型-中文-base镜像免配置:预装GradioPALM依赖的一键镜像 春节临近,写春联是家家户户的传统。但提起毛笔、构思对仗、琢磨平仄,对很多人来说是个不小的挑战。有没有一种方法,既能保留春联的文化韵味,又能让创…...

C++进化史:从底层到高能的编程革命

C:从诞生到现代应用的演进之路一、发展历程起源(1979-1985)Bjarne Stroustrup在贝尔实验室基于C语言开发了"C with Classes",首次引入面向对象特性。1983年正式命名为C,核心目标是在保持C高效性的同时增强抽…...

Local SDXL-Turbo用户体验:设计师眼中的灵感激发工具

Local SDXL-Turbo用户体验:设计师眼中的灵感激发工具 一句话总结:这是一个让你"打字即出图"的实时AI绘画工具,键盘敲下的每个词都会瞬间变成画面,特别适合设计师快速捕捉灵感和测试创意。 1. 为什么设计师需要这个工具 …...

C++搜索引擎核心:正倒排索引解析

好的,我们来详细解析一个基于C的Boost搜索引擎项目中正排索引和倒排索引的核心部分代码及其逻辑。搜索引擎的核心是高效地存储和检索信息,正倒排索引是实现这一目标的关键数据结构。核心概念回顾:正排索引 (Forward Index): 以文档…...

数据治理工程师必备:用华为数据之道解读DAMA能力域划分的底层逻辑

数据治理工程师必备:用华为数据之道解读DAMA能力域划分的底层逻辑 在数字化转型浪潮中,数据治理已成为企业核心竞争力的关键组成部分。作为数据治理领域的黄金标准,DAMA框架的十大能力域常被视为行业圣经,但鲜有人深入探讨这些能力…...

每日60秒读懂世界|2026年3月20日:财政收入微增、A股普涨、小米SU7热销、国际能源与债务风险继续抬升

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

bge-large-zh-v1.5快速部署:Triton Inference Server集成方案初探

bge-large-zh-v1.5快速部署:Triton Inference Server集成方案初探 如果你正在寻找一个高性能、易部署的中文文本嵌入模型,那么bge-large-zh-v1.5绝对值得你花时间了解一下。它就像一个理解中文的“语义翻译官”,能把任何一段文字转换成一串高…...

gte-base-zh部署案例:某省级图书馆知识图谱项目中向量引擎选型与压测报告

gte-base-zh部署案例:某省级图书馆知识图谱项目中向量引擎选型与压测报告 1. 项目背景与需求分析 某省级图书馆正在构建新一代知识图谱系统,需要处理海量的图书、期刊、论文等文献资源。传统的基于关键词的检索方式已经无法满足读者对语义检索的需求&a…...

lingbot-depth-pretrain-vitl-14效果展示:单目vs深度补全双模式输出对比,边缘锐利度实测

lingbot-depth-pretrain-vitl-14效果展示:单目vs深度补全双模式输出对比,边缘锐利度实测 最近在折腾机器人导航和3D重建项目,深度信息是关键。市面上的深度传感器要么贵(比如高线数激光雷达),要么在特定场…...

StructBERT在跨境电商场景应用:中英双语商品描述语义对齐方案

StructBERT在跨境电商场景应用:中英双语商品描述语义对齐方案 1. 项目背景与价值 跨境电商平台每天面临海量商品信息处理难题,特别是中英双语商品描述的语义对齐问题。传统方法往往依赖简单的关键词匹配或机器翻译,导致语义理解不准确&…...

LFM2.5-1.2B-Thinking部署教程:Ollama中启用GPU加速(ROCm/CUDA)完整步骤

LFM2.5-1.2B-Thinking部署教程:Ollama中启用GPU加速(ROCm/CUDA)完整步骤 1. 教程简介 今天给大家带来一个实用的技术教程:如何在Ollama中部署LFM2.5-1.2B-Thinking模型,并启用GPU加速。这个模型特别适合在个人设备上…...

造相-Z-Image-Turbo 风格迁移实战:将真人照片转化为特定LoRA风格

造相-Z-Image-Turbo 风格迁移实战:将真人照片转化为特定LoRA风格 最近在玩一个挺有意思的AI工具,叫造相-Z-Image-Turbo。它最吸引我的地方,就是能把一张普普通通的真人照片,一键变成各种酷炫的艺术风格。比如,把你自己…...

基于yz-女生-角色扮演-造相Z-Turbo的GitHub项目实战:开源模型部署

基于yz-女生-角色扮演-造相Z-Turbo的GitHub项目实战:开源模型部署 将AI模型转化为开源项目不仅仅是技术实现,更是社区共建的开始 1. 项目概述与核心价值 yz-女生-角色扮演-造相Z-Turbo是一个专注于二次元角色生成的文生图模型,基于Z-Image-T…...

Local AI MusicGen Prompt优化:从生成失败到高质量输出的5次迭代记录

Local AI MusicGen Prompt优化:从生成失败到高质量输出的5次迭代记录 1. 引言:当AI音乐生成遇到挑战 你有没有试过用AI生成音乐,结果出来的声音完全不是你想要的样子?我最近在使用Local AI MusicGen时,就经历了从&qu…...

Qwen-Image镜像一文详解:PyTorch GPU版本与CUDA12.4严格匹配验证方法

Qwen-Image镜像一文详解:PyTorch GPU版本与CUDA12.4严格匹配验证方法 1. 镜像环境概述 Qwen-Image定制镜像是专为RTX 4090D显卡和CUDA 12.4环境优化的大模型推理解决方案。这个预配置环境让研究人员和开发者能够立即投入多模态AI模型的开发和测试工作,…...

毕设程序java营养预制菜个性化定制平台 SpringBoot驱动的膳食预制餐食智能选配系统 Java营养配餐半成品菜在线定制服务平台

毕设程序java营养预制菜个性化定制平台083e5385 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着现代生活节奏加快,都市人群对便捷、健康的饮食需求日益增长&…...

Pixel Dimension Fissioner效果展示:同一文本种子在不同Temperature下的创意光谱

Pixel Dimension Fissioner效果展示:同一文本种子在不同Temperature下的创意光谱 1. 像素语言工坊的创意魔力 Pixel Dimension Fissioner(像素维度裂变器)是一款基于MT5-Zero-Shot-Augment核心引擎构建的文本创意工具。它将传统AI文本生成转…...

多智能体强化学习实战:SMAC平台从入门到精通

多智能体强化学习实战:SMAC平台从入门到精通 【免费下载链接】smac SMAC: The StarCraft Multi-Agent Challenge 项目地址: https://gitcode.com/gh_mirrors/smac/smac 多智能体强化学习(MARL,指多个AI智能体协同决策的学习方法&#…...

FLUX.小红书极致真实V2惊艳效果:晨光中的厨房场景——面包纹理、咖啡渍、自然阴影

FLUX.小红书极致真实V2惊艳效果:晨光中的厨房场景——面包纹理、咖啡渍、自然阴影 1. 引言:当AI画笔遇见生活美学 想象一下,你是一位美食博主,清晨的阳光刚刚洒进厨房。你想拍一张照片:刚出炉的面包,表面…...

Qwen-Image镜像一文详解:10核CPU/120GB内存环境下Qwen-VL高效加载方案

Qwen-Image镜像一文详解:10核CPU/120GB内存环境下Qwen-VL高效加载方案 1. 镜像概述与核心优势 Qwen-Image定制镜像是专为RTX 4090D GPU环境优化的大模型推理解决方案,预装了完整的CUDA 12.4工具链和Qwen-VL视觉语言模型依赖库。这个镜像最大的特点就是…...