旋转机械的故障诊断是预测性维护里最"经典"的活------也是最容易让新手翻车的活。
2024年那会儿,我带团队给一家煤化工企业做旋转设备在线监测。第一版方案贪大求全,想用一套LSTM搞定所有设备。结果上线一个月,效果惨不忍睹------离心泵的轴承故障完全识别不出来。
后来复盘才发现问题在哪:旋转设备里轴承、齿轮箱、电机的故障机理完全不同,强行用一套模型建模,等于逼一个中医同时看心脏病、骨科和妇科。
后来我们老老实实做分层建模,按"部件---故障机理---信号特征---模型"四步走,效果直接拉满。今天把这套思路分享出来。
轴承故障:包络分析是基本功
轴承是旋转设备里最容易出问题的部件------我经手的项目里,超过60%的故障都是轴承相关。
轴承故障的信号特征非常明确:内圈、外圈、滚动体、保持架四个部件各有一个"通过频率",叫BPFO(外圈)、BPFI(内圈)、BSF(滚动体)、FTF(保持架)。比如某6205-2RS轴承,转速1480rpm,外圈故障频率大约是95Hz左右,内圈在155Hz左右。
光看时域和FFT是看不出这些频率的,因为它们被振动噪声淹没了。真正管用的是包络谱分析------先带通滤波(中心频率是共振频率),再做Hilbert变换提取包络,最后FFT。
python
import numpy as np
from scipy.signal import butter as bfilter, hilbert
from scipy.fft import rfft, rfftfreq
def envelope_spectrum(signal, fs, fc, bw):
"""
带通滤波 + Hilbert 包络 + FFT
fc: 中心频率,bw: 带宽
"""
# 带通滤波
low = max(0.001, (fc - bw/2) / (fs/2))
high = min(0.999, (fc + bw/2) / (fs/2))
b, a = bfilter(4, [low, high], btype='band')
filtered = bfilter(b, a, signal)
# Hilbert 取包络
analytic = hilbert(filtered)
envelope = np.abs(analytic)
# 去直流
envelope = envelope - np.mean(envelope)
# FFT
freqs = rfftfreq(len(envelope), d=1/fs)
amp = np.abs(rfft(envelope))
return freqs, amp
# 实战:某电机轴承共振频率约 1800Hz,带宽 ±500Hz
freqs, amp = envelope_spectrum(vib_signal, fs=25600, fc=1800, bw=1000)
# 找包络谱里的峰值,如果BPFI=155Hz处明显 → 内圈故障
踩坑提醒:fc(共振频率)怎么选?一般用小锤敲击法测出轴承座的共振频率,或者用加速度传感器自带的TEDS数据估算。我们踩过最狠的坑------把fc选成了电机供电频率(50Hz),结果包络出来全是供电谐波,压根看不到轴承故障。
轴承故障的建模,我个人偏好两阶段法:先用包络谱做"是否故障"的二分类判别(特征就是包络谱峰值处的BPFO/BPFI幅值比),再用XGBoost或LightGBM做"故障严重度"分级(轻度/中度/重度)。
齿轮箱故障:边频带是关键
齿轮箱比轴承复杂得多------有啮合频率GMF,还有故障引发的边频带。
举个真实例子:某1.5MW风电齿轮箱,输入转速1480rpm,齿轮齿数比5.13,啮合频率GMF ≈ 1480/60 × 齿数 = 大约1156Hz。如果有一个齿轮有局部缺陷(比如断齿),啮合频率两侧会出现间隔为转频的边频带。
诊断齿轮故障的关键就是:找到啮合频率,看它两侧有没有规则间隔的边频带。 边频带的间隔和形态,能告诉你缺陷在哪个齿轮上、严重到什么程度。
齿轮箱故障建模比轴承难,原因有三:
- 多级齿轮叠加:一个齿轮箱通常有2-4级齿轮,频谱叠加严重。
- 变工况:风电齿轮箱转速随风速变化,频谱会"漂移",必须用阶次分析(order analysis)代替FFT。
- 复合故障:轴承和齿轮可能同时出问题,特征互相干扰。
所以齿轮箱故障,我倾向于用阶次域的CNN。把时序信号先做阶次重采样(把频率域映射到阶次域),再用一维CNN提取特征。PyTorch 2.1搭起来很简单,我们实测在CWRU齿轮箱数据集上准确率能到93%。
电机故障:别忘了定子电流分析
电机故障往往被忽视,但其实占比不小------绝缘老化、定子绕组匝间短路、转子断条、轴承(电机里也有轴承)。
电机故障有个独门武器:定子电流分析(MCSA)。电机定子电流里藏着大量转子状态信息,而且不用装振动传感器,直接从电控柜里取电流互感器信号就行。
转子断条的特征是:在供电频率(50Hz)两侧出现 ±2s × f1 的边频带(s是转差率,f1是供电频率)。这种特征在振动信号里几乎没有,在电流信号里却异常明显。
python
# MCSA 简单示例:从三相电流中找转子断条特征
# 假设电流采样率 10kHz,电机极对数 p=2,供电频率 50Hz
slip = 0.03 # 转差率,从转速估算
f1 = 50
fault_freq = (1 - 2 * slip) * f1 # 47Hz附近
# 步骤:对电流做FFT,看 50±3Hz 范围内有没有峰值
# 如果左右边频对称且明显 → 转子断条
电机故障建模我一般分两类:定子类(匝间短路等)用电流频谱特征,转子类(断条等)用MCSA+振动融合。不要图省事只采集电流------温度和振动一起采,特征维度立刻丰富起来。
一个反对意见:分层建模就一定好吗?
分层建模有个潜在风险:模型边界难以划分。真实设备里,一个故障可能跨多个部件。比如轴承保持架断裂,可能连带齿轮箱异响,最后电机也异常。这种"链式故障"用分层建模处理起来很麻烦。
我们的解法是**"分层+兜底"**:分层模型给出初步诊断,再用一个总览模型(meta-learner)综合多个子模型的输出。效果不错,但复杂度上来了。
如果你团队人手有限、或者设备数量不大,别硬上分层------直接用一个大模型(比如LSTM)吃所有信号也未必不行。我们2024年那次翻车,本质原因是数据质量差(很多传感器没标定),不是分层建模本身的问题。
写在最后
旋转设备故障诊断这件事,做久了会有一种感觉:它不像AI,更像中医的"望闻问切"------每种故障都有它的"脉象",关键是识别和积累经验。
说点得罪人的话:很多同行上来就堆深度学习模型,效果不好就换更大的模型。但在我经手的项目里,特征工程的功夫到位了,XGBoost不输LSTM。先看懂频谱、看懂包络、看懂边频带,再谈深度学习。
如果你刚开始做旋转设备故障诊断,建议先把"BPFO/BPFI/GMF"几个基本频率搞清楚,再上手建模。别急,往下看------这套分层建模思路不需要一开始就有全套数据,从轴承故障的包络分析开始,一点一点扩到齿轮箱和电机,是最稳的路径。
一点碎碎念:旋转设备诊断最大的坑,是现场工况太复杂------负载波动、温度漂移、润滑状态变化都会影响信号。我们现在的做法是建一个"工况自适应"模块,根据转速、负载自动调整判别阈值。这块展开讲又是另一个大坑了,下次再聊。