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

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右,可以进行历史频谱图和时域图回放,可以求的最大值并设置阈值报警可以导出报警

最近在搞工业设备监控系统的时候,需要实时采集振动和温度数据。正好用C#搭了套方案,这里把核心代码和实现思路分享一下。先上张效果图镇楼(假装有图),频谱图和时域图同屏显示还挺酷的。

先说数据采集部分。传感器用的是Modbus协议,这里用了个轻量级库NModbus:

var factory = new ModbusFactory(); using var master = factory.CreateRtuMaster(serialPort); // 一次读取10个寄存器的振动数据 ushort[] vibrationData = master.ReadHoldingRegisters(slaveAddress, startAddress, 10);

不过实际项目中更常用的是异步读取,避免界面卡死。这里有个小技巧——用BackgroundWorker搭配Queue处理数据流,实测200ms间隔完全hold住。

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右,可以进行历史频谱图和时域图回放,可以求的最大值并设置阈值报警可以导出报警

频谱计算部分,FFT转换是核心。别自己造轮子,MathNet库真香:

// 时域数据转频域 var complexSignal = vibrationData.Select(x => new Complex(x, 0)).ToArray(); Fourier.Forward(complexSignal, FourierOptions.Default); // 取前1/2频率分量 int halfLength = complexSignal.Length / 2; double[] magnitudes = new double[halfLength]; for (int i = 0; i < halfLength; i++) { magnitudes[i] = complexSignal[i].Magnitude; }

记得加汉宁窗减少频谱泄漏,这个在振动分析里特别重要。不过车间老师傅们更关心的是幅值超没超阈值,报警功能才是刚需:

// 实时报警检测 double currentMax = magnitudes.Max(); if (currentMax > threshold) { LogAlarm(DateTime.Now, currentMax); PlayAlertSound(@"alarm.wav"); // 别用默认Beep,产线噪音下根本听不见 }

数据库选型纠结了很久,最后用了SQLite+EF Core的组合。重点优化了批量插入:

context.VibrationData.AddRange(dataBuffer); await context.SaveChangesAsync();

实测每秒5000条记录无压力。不过要注意设置PRAGMA同步模式,不然断电丢数据产线要骂娘。历史回放的关键在于时间索引:

CREATE INDEX idx_timestamp ON VibrationData (timestamp);

界面绘制推荐ScottPlot,比ZedGraph更现代,支持实时渲染优化:

formsPlot.Plot.AddSignal(signalData, sampleRate:500); formsPlot.RefreshRequest();

导出报警记录建议直接用CSV格式,比Excel更省资源。遇到个坑——中文字符编码问题记得用Encoding.UTF8:

using var writer = new StreamWriter("alarms.csv", false, Encoding.UTF8); writer.WriteLine("时间,最大值");

整个系统跑下来,最吃资源的其实是频谱计算部分。后来发现用ArrayPool优化内存分配,CPU占用直接降了30%。下次可以考虑上SIMD指令加速,不过得先搞定兼容性问题。

最后给新人提个醒:工业现场电磁干扰严重,485通信记得加磁环和终端电阻。别问我是怎么知道的...(完)

http://www.jsqmd.com/news/541824/

相关文章:

  • Mojo项目无法import本地.py模块?工程师连夜修复的6种路径/环境变量/Loader级配置错误
  • OpenClaw批量处理:ollama-QwQ-32B同时操作100个PDF文件转换
  • 23:L应对量子计算威胁:蓝队的量子防御
  • Citrix:尽快修复这两个 NetScaler 漏洞
  • Android SELinux权限实战:从基础到高级策略定制
  • OpenClaw跨平台文件同步:ollama-QwQ-32B智能去重与版本管理
  • OpenClaw定时任务专家:百川2-13B-4bits模型实现24/7自动化巡检
  • ArcGIS在线底图调用全攻略:从World Imagery到山体阴影,你的项目该选哪个?
  • AI 大模型落地系列|Eino 组件核心篇:ChatTemplate 为什么不是字符串拼接
  • 解锁论文写作新姿势:书匠策AI,你的学术智囊团已上线!
  • JasperReport变量实战:5分钟搞定报表总计与分组统计(附避坑指南)
  • AI 大模型落地系列|Eino 组件核心篇:文档进入 RAG 之前,Loader 和 Parser 到底各管什么
  • 基于QP的路径规划与ST图速度规划:各场景避障探秘
  • 利用快马平台快速原型验证trae状态管理库的核心机制
  • 吃透synchronized锁机制:从使用到底层,一文破解Java线程安全难题
  • Python - itertools.pairwise函数在算法刷题中的高效应用
  • OpenClaw权限管理:GLM-4.7-Flash操作系统的安全边界
  • 解决Intel X520-DA2万兆光卡第三方模块兼容性问题:从驱动加载到永久修复
  • 无公网IP解决方案:内网穿透玩转OpenClaw+nanobot
  • OpenWRT 中 AdGuard Home 插件更新核心失败的排查与修复
  • AI 大模型落地系列|Eino 组件核心篇:为什么很多人会写 Tool,却没真正看懂 ToolsNode
  • 嵌入式命令分发库:零依赖静态调度设计
  • 三分钟用快马AI搭建全栈技术博客原型,告别繁琐环境配置
  • 用ai跳过安装与初码:在快马平台描述需求直接生成可运行python应用
  • 构建自动驾驶安全评估的数字孪生解决方案:CitySim交通数据集深度解析
  • 从CTF实战到真实威胁:手把手教你用Wireshark和Python分析蓝牙伪装攻击流量
  • 实战应用:基于快马平台构建openclaw多模型自适应抓取工业分拣模拟系统
  • ANPC拓扑结构示意图
  • ComfyUI完全指南:从零开始掌握AI图像生成工作流
  • 2026西南地区电梯安装工程费用评测报告:加装一台电梯多少钱/四川电梯加装/四川电梯安装公司/家用电梯加装/成都电梯加装费用/选择指南 - 优质品牌商家