C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右
C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图并存储数据库存储时间200ms左右可以进行历史频谱图和时域图回放可以求的最大值并设置阈值报警可以导出报警最近在搞工业设备监控系统的时候需要实时采集振动和温度数据。正好用C#搭了套方案这里把核心代码和实现思路分享一下。先上张效果图镇楼假装有图频谱图和时域图同屏显示还挺酷的。先说数据采集部分。传感器用的是Modbus协议这里用了个轻量级库NModbusvar 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产线噪音下根本听不见 }数据库选型纠结了很久最后用了SQLiteEF 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.UTF8using var writer new StreamWriter(alarms.csv, false, Encoding.UTF8); writer.WriteLine(时间,最大值);整个系统跑下来最吃资源的其实是频谱计算部分。后来发现用ArrayPool优化内存分配CPU占用直接降了30%。下次可以考虑上SIMD指令加速不过得先搞定兼容性问题。最后给新人提个醒工业现场电磁干扰严重485通信记得加磁环和终端电阻。别问我是怎么知道的...完
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453045.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!