Python实战:基于轴心轨迹图的转子振动分析与故障诊断

张开发
2026/4/16 10:59:11 15 分钟阅读

分享文章

Python实战:基于轴心轨迹图的转子振动分析与故障诊断
1. 轴心轨迹图基础与工业应用想象一下医生用听诊器检查患者心跳工程师们也有类似的听诊器来诊断旋转机械的健康状态——这就是轴心轨迹图。作为转子振动分析的心电图它能直观展示旋转轴在轴承中的运动轨迹。我十年前第一次在电厂看到这种图形时就被它独特的诊断能力所震撼。轴心轨迹图的核心原理很简单用两个互相垂直的传感器通常是电涡流传感器分别采集X/Y方向的振动信号然后将这两个一维信号组合成二维平面轨迹。就像把两个不同角度的监控画面合成一个立体视角这种可视化方式能暴露出许多单维度分析难以发现的问题。在实际工业场景中这种技术应用广泛得惊人。去年我参与的一个案例中某化工厂的压缩机振动值在标准范围内但轴心轨迹图却显示出异常的8字形特征最终发现是联轴器对中偏差导致的早期故障。这种提前预警避免了价值数百万的设备损坏。关键诊断特征健康状态光滑的椭圆或圆形轨迹不对中故障香蕉形或月牙形转子摩擦轨迹边缘出现锯齿或毛刺油膜涡动内环带小环的轨迹松动故障轨迹宽度异常增大2. Python数据处理实战技巧处理振动数据就像烹饪一道精细的菜肴原料处理决定最终成品的质量。我们常用的数据来源包括CSV文件、PLC实时数据流或LabVIEW采集系统。这里分享几个我积累的实用技巧import pandas as pd import numpy as np # 读取现场采集的振动数据 raw_data pd.read_csv(vibration_data.csv, headerNone, names[time,x_axis,y_axis]) # 数据清洗三部曲 def data_cleaning(df): # 去除异常零值传感器断线情况 df df[(df[x_axis] ! 0) (df[y_axis] ! 0)] # 滑动平均降噪 window_size 5 df[x_filtered] df[x_axis].rolling(windowwindow_size).mean() df[y_filtered] df[y_axis].rolling(windowwindow_size).mean() # 消除趋势项防止传感器漂移影响 df[x_detrend] df[x_filtered] - df[x_filtered].mean() df[y_detrend] df[y_filtered] - df[y_filtered].mean() return df.dropna()相位校正是很多新手容易忽略的关键步骤。由于两个传感器安装位置差异采集的信号可能存在相位差。我常用的补偿方法是# 计算互相关函数确定相位差 from scipy.signal import correlate corr correlate(clean_data[x_detrend], clean_data[y_detrend]) delay np.argmax(corr) - len(clean_data[x_detrend]) 1 # 相位补偿 y_shifted np.roll(clean_data[y_detrend], shift-delay)3. 高级可视化与特征提取基础轨迹图只能告诉我们有问题而进阶分析才能揭示问题在哪。这是我开发的一个增强型可视化函数def enhanced_trajectory_plot(x, y, rpm): plt.figure(figsize(12,12)) # 主轨迹图 ax1 plt.subplot2grid((3,3), (0,0), colspan2, rowspan2) ax1.plot(x, y, b-, alpha0.5) ax1.set_title(fEnhanced Axis Trajectory {rpm} RPM) # 瞬时转速矢量 for i in range(0, len(x), 50): dx x[i1] - x[i] dy y[i1] - y[i] ax1.arrow(x[i], y[i], dx, dy, head_width0.02, colorr) # 添加极坐标投影 ax2 plt.subplot2grid((3,3), (0,2), polarTrue) theta np.arctan2(y, x) radius np.sqrt(x**2 y**2) ax2.scatter(theta, radius, cnp.arange(len(x)), cmaphsv) # 时频分析 ax3 plt.subplot2grid((3,3), (2,0), colspan3) ax3.specgram(x, Fs1000, scaledB) plt.tight_layout() return plt特征工程是故障诊断的核心。我通常会提取这些关键指标轨迹椭圆度短轴/长轴比轨迹面积变化率回转方向正/反向涡动谐波能量占比轨迹的傅里叶描述子4. 典型故障模式识别实战去年在诊断某发电厂汽轮机异常振动时我们遇到了一个有趣案例轨迹图在工作转速下表现正常但在通过临界转速时出现花瓣形特征。通过下面这个分类器我们最终识别出是轴承座刚度不足的问题。from sklearn.ensemble import RandomForestClassifier # 构建故障特征数据集 features { ellipticity: [0.85, 0.92, 0.45, 0.3], area_change: [0.05, 0.12, 0.8, 1.2], harmonic_ratio: [0.1, 0.15, 0.6, 0.4], rotation_dir: [1, 1, -1, -1] # 1正向-1反向 } labels [正常, 不对中, 摩擦, 松动] # 训练简单分类器 clf RandomForestClassifier() clf.fit(np.array(list(features.values())).T, labels) # 使用新数据预测 new_case [[0.38, 0.9, 0.55, -1]] print(clf.predict(new_case)) # 输出[摩擦]诊断经验分享油膜涡动通常在(0.42-0.48)倍转速频率处出现特征峰不对中故障的二次谐波幅值会超过基频的30%摩擦故障的轨迹会出现削顶现象松动部件的轨迹在不同转速下变化剧烈5. 工业级应用优化建议在实际项目中我总结出这些提升分析效果的方法硬件配置要点传感器安装角度误差需小于3°采样频率至少为最高关注频率的10倍每个测点应配置键相信号软件处理技巧采用自适应滤波处理变速工况使用小波变换检测瞬态特征建立历史数据库进行趋势分析下面是一个实用的批处理脚本框架import os from multiprocessing import Pool def batch_analysis(data_file): # 实现单个文件的分析流程 ... return result_df if __name__ __main__: data_dir plant_data/2023 files [f for f in os.listdir(data_dir) if f.endswith(.csv)] # 多进程并行处理 with Pool(processes4) as pool: results pool.map(batch_analysis, files) # 合并结果生成报告 final_report pd.concat(results) final_report.to_excel(diagnosis_report.xlsx)记得在某次现场服务中我们发现客户传感器的安装支架存在共振导致采集数据包含虚假频率成分。这个教训告诉我们永远要先验证测量链的可靠性。

更多文章