4、数据采集基础:采样频率与分辨率、数据采集卡与PLC、边缘计算网关、数据清洗与预处理

各位同行,大家好。今天咱们聊聊状态监测系统的“眼睛”和“耳朵”——数据采集。说实话,我见过太多项目,算法模型再漂亮,数据采集这关没把好,后面全是白搭。数据不准,分析出来的结果就是垃圾。嗯,咱们一步步来。

4.1 采样频率与分辨率:别让数据“说谎”

先说说采样频率。说白了,就是每秒钟从传感器上读多少个数据点。比如你监测一个电机轴承,转速是3000转/分,也就是50Hz。根据奈奎斯特定理,采样频率至少得是信号最高频率的两倍。我个人习惯,一般会取5到10倍,留足余量。

核心原则:采样频率过低,高频故障特征会被“混叠”,看起来像低频信号。我曾经在项目里遇到过,一个齿轮箱的齿面磨损信号,因为采样频率设低了,硬是没看出来,差点误判。

分辨率呢?就是数据采集卡能分辨的最小信号变化。比如一个12位的采集卡,量程0-10V,分辨率就是10V / 2^12 ≈ 2.44mV。分辨率越高,能捕捉到的微小振动、温度波动就越精细。

参数 说明 我的建议
采样频率 每秒采集的点数(Hz) 至少5倍于目标信号最高频率
分辨率 最小可分辨信号变化 振动监测建议16位以上
量程 信号输入范围 根据传感器输出合理选择

避坑指南:我曾经在一条产线上,为了省成本用了低分辨率采集卡,结果温度漂移0.5度以内根本看不出来,导致预热时间判断失误。后来换了16位的,问题迎刃而解。

4.2 数据采集卡与PLC:硬件的选择

数据采集卡,一般是PCIe或USB接口的,适合高速、高精度的振动、声发射信号采集。PLC呢,更擅长处理开关量、模拟量(4-20mA),适合温度、压力、流量这些慢变信号。

你想想看,一个旋转设备,振动频率可能到几千赫兹,PLC的扫描周期通常几十毫秒,根本跟不上。这时候就得用专用的数据采集卡。反过来,一个储罐液位,几秒钟变一次,用PLC就足够了。

我的经验:在钢铁厂的一个项目中,我们同时用了NI的数据采集卡(采集振动)和西门子S7-1200 PLC(采集温度、电流)。两者通过OPC UA通信,数据汇总到边缘网关。这样既保证了高速信号的完整性,又利用了PLC的可靠性。

这里有个表格,帮你快速对比:

特性 数据采集卡 PLC
采样速度 高(可达MHz) 低(通常几十ms)
精度 高(16-24位) 中等(12-16位)
适用信号 振动、声发射、高速电压 温度、压力、液位、开关量
编程难度 较高(需驱动开发) 较低(梯形图、SCL)
可靠性 一般 高(工业级)

4.3 边缘计算网关:把“聪明”放在现场

以前我们做状态监测,数据全往服务器发。后来发现不行,数据量太大,网络带宽扛不住,延迟也高。边缘计算网关就是解决这个问题的——在设备旁边就把数据初步处理了。

边缘网关能干些什么?

  • 数据汇聚:把采集卡、PLC、传感器数据统一收上来
  • 初步计算:做FFT、求均方根值、提取特征
  • 本地预警:超过阈值直接报警,不用等云端
  • 断网续传:网络断了,数据先存本地,恢复后补传

我建议:选边缘网关时,别光看CPU性能。要关注它的IO接口够不够,支不支持你现有的传感器协议。我曾经选了一款网关,性能很强,结果发现不支持Modbus TCP,又得加转换器,麻烦得很。

下面这张图,是我自己总结的数据采集与边缘处理流程,你看看:

传感器层 振动/温度/压力/电流 采集层 采集卡 / PLC / 模块 边缘计算网关 数据汇聚 / FFT / 特征提取 云平台 / 服务器 深度学习 / 长期存储 / 报表 本地预警 / 断网续传 数据清洗与预处理 图:数据采集与边缘处理流程

4.4 数据清洗与预处理:脏数据比没数据更可怕

数据采上来了,但别急着用。原始数据里什么都有:噪声、野点、缺失值、时间戳错乱……不清洗直接扔进模型,结果就是“垃圾进,垃圾出”。

我常用的预处理步骤:

  1. 去野点:用3σ原则或中值滤波,把明显异常的值剔除
  2. 补缺失:线性插值、前向填充,或者干脆丢弃(缺失太多的话)
  3. 去趋势:振动信号常有直流偏置,用高通滤波器去掉
  4. 归一化:把不同量纲的数据映射到0-1或-1到1之间

注意:千万别在不知道数据含义的情况下盲目清洗。我曾经见过有人把设备启停阶段的正常冲击信号当野点给滤掉了,结果模型永远学不到启动特征。清洗前,先看看数据长什么样。

举个例子,一段振动数据的简单预处理代码(Python风格):

import numpy as np
from scipy import signal

# 原始振动数据
vibration_data = np.array([...])

# 1. 去野点:超过3倍标准差视为野点
mean = np.mean(vibration_data)
std = np.std(vibration_data)
clean_data = vibration_data[np.abs(vibration_data - mean) < 3 * std]

# 2. 高通滤波:去除直流分量
b, a = signal.butter(4, 0.01, 'high')
filtered_data = signal.filtfilt(b, a, clean_data)

# 3. 归一化
normalized_data = (filtered_data - np.min(filtered_data)) / (np.max(filtered_data) - np.min(filtered_data))

小技巧:我习惯在边缘网关上就做一部分清洗,比如去野点和去趋势。这样传到云端的数据质量已经很高了,云端只需要做更高级的分析。这叫“边缘预处理”,能大大减轻网络和服务器压力。

好了,数据采集这块儿,核心就是:频率要够、分辨率要高、硬件要选对、边缘要处理、数据要干净。每一步都马虎不得。你想想看,如果采集的数据本身就有问题,后面再好的算法也是白费力气。嗯,今天就到这儿,大家在实际项目中遇到什么问题,随时交流。


专注资料整理