"等坏了再修"(事后维护)→"到日子就修"(定期维护)→"看着状态修"(预测性维护,PdM)------维护策略的进化史,就是采集系统的价值进化史。第三个实战项目:给一条产线的关键设备群装上"体检系统"。全文约4500字。
一、预测性维护的商业账
事后维护的真实成本:
非计划停机 = 停产损失 + 加急抢修费 +
二次损坏 + 安全风险
→ 常为计划检修的3~10倍
PdM的收益(行业统计):
✓ 非计划停机 -30~50%
✓ 维护成本 -10~20%
✓ 设备寿命 +20~40%
投入: 传感器+采集+软件 ≈ 一次非计划停机损失的零头
→ 决策不难, 难在落地方法
二、监测对象与参数选择
不是所有设备都值得上PdM------按故障后果排序:
| 优先级 | 设备 | 监测参数 | 故障模式 |
|---|---|---|---|
| ★★★ | 关键风机/泵 | 振动+温度 | 轴承/不平衡 |
| ★★★ | 主传动电机 | 电流+振动+温度 | 绕组/轴承 |
| ★★ | 减速机 | 振动+油温 | 齿轮/轴承 |
| ★★ | 空压机 | 振动+压力脉动+温度 | 阀片/轴承 |
| ★ | 一般辅机 | 电流(便宜全面) | 过载/堵转 |
参数选择三原则 :轴承类→振动(频谱指纹);电气类→电流(MCSA电机电流特征分析);热类→温度(趋势);先用便宜的(电流/温度)广覆盖,贵的(振动)点关键。
三、系统架构(产线级)
层1 感知层(每台关键设备):
[IEPE加速度计×1~2] [K偶×1] [CT×3]
│ (屏蔽双绞, 就地接线盒)
层2 采集层:
方案A: 集中式------多路屏蔽线汇到控制室采集卡
(距离<50m, 干净环境)
方案B: 分布式------边缘节点(卡+树莓派)就地,
特征值上网 ★产线主流
层3 分析层(边缘本地):
特征提取: 振动RMS/谱峰/包络/温度趋势/电流FFT
(原始数据本地存7天, 特征值永久)
层4 服务器:
时序数据库+趋势+规则引擎+通知
(可选: ML异常检测)
四、特征提取流水线(边缘侧核心代码)
python
import numpy as np
from scipy import signal
class FeatureExtractor:
"""原始波形→特征向量(每10分钟一批)"""
def __init__(self, fs, rpm, bearing):
self.fs = fs
self.fr = rpm/60
# 轴承特征频率(第29篇公式)
n, d, D = bearing
self.BPFO = n/2*(1-d/D)*self.fr
self.BPFI = n/2*(1+d/D)*self.fr
def extract(self, vib_g, i_a, temp_c):
feats = {}
# --- 振动总量 ---
feats['vib_rms'] = np.sqrt((vib_g**2).mean())
# --- 频谱特征 ---
f, a = amplitude_spectrum(vib_g, self.fs)
feats['peak_1x'] = self._band(a, f, self.fr, 3)
feats['peak_2x'] = self._band(a, f, 2*self.fr, 3)
feats['bpfo'] = self._band(a, f, self.BPFO, 5)
feats['bpfi'] = self._band(a, f, self.BPFI, 5)
# --- 包络特征(轴承冲击) ---
env = np.abs(signal.hilbert(
signal.sosfilt(signal.butter(4,
[2000, 6000], 'bandpass', fs=self.fs,
output='sos'), vib_g)))
f_e, a_e = amplitude_spectrum(
env - env.mean(), self.fs)
feats['env_bpfo'] = self._band(
a_e, f_e, self.BPFO, 8)
# --- 电流特征(MCSA) ---
f_i, a_i = amplitude_spectrum(i_a, self.fs)
feats['i_1x'] = self._band(a_i, f_i,
self.fr, 2)
# --- 温度 ---
feats['temp'] = temp_c
feats['temp_slope'] = None # 趋势另算
return feats
def _band(self, a, f, fc, width):
"""特征频率±width bin邻域峰值"""
m = (f > fc-width) & (f < fc+width)
return float(a[m].max()) if m.any() else 0
特征的设计哲学 :每个特征对应一种故障模式(1×不平衡、2×不对中、BPFO/BPFI轴承、包络轴承冲击、电流断条)------特征不是越多越好,是"每个都能解释"才好。
五、三级预警体系
python
class HealthMonitor:
"""规则引擎: 三级阈值+趋势"""
LEVELS = [
('正常', 'green'),
('关注', 'yellow'), # 趋势异常
('预警', 'orange'), # 阈值超越
('告警', 'red'), # 严重超越
]
def __init__(self):
self.baseline = {} # 健康期基线(前30天统计)
def judge(self, feats, history):
# ① 绝对阈值(标准/经验)
if feats['vib_rms'] > 0.07: return 3 # 7m/s²级
# ② 相对阈值(对自身基线)
base = self.baseline['vib_rms']
if feats['vib_rms'] > base*2.5: return 2
# ③ 趋势(30天斜率外推, 第343篇思路)
slope = fit_slope(history['bpfo'], 30)
if feats['bpfo'] > base_bpfo*3 \
and slope > 0: return 2
# ④ 组合判据(轴承晚期)
if (feats['env_bpfo'] > base_env*4
and feats['temp'] > base_t + 15):
return 3
# 趋势抬头但未超限 → 关注
if slope > threshold_slow: return 1
return 0
分级响应:关注 →加密监测(10min→1min);预警 →工单派检+备件预占;告警→计划停机窗口安排(赶在"坏"之前修)。
六、基线的建立:冷启动策略
新系统没有历史怎么办?三阶段:
第1阶段(前2周): 学习期
只记录不报警------采集各工况的正常波动
第2阶段(2~4周): 基线期
按工况分桶(负载档/转速档)统计μ与σ
建立基线表 baseline[工况][特征] = (μ, σ)
第3阶段: 运行期
实时特征对基线判读(z-score, 第342篇)
+ 工况标签必须对齐(50%负载的振动
不能和100%负载比!) ★新手最常犯
七、数据流与看板
特征值上报(每10min, 每设备~20个float):
MQTT → 时序库(InfluxDB)
看板(Grafana):
□ 设备健康总览: 全厂设备红黄绿灯
□ 单设备详情: 各特征趋势(90天)+基线带
□ 频谱瀑布: 振动谱随时间演化
□ 工单联动: 预警自动创建工单
通知:
yellow → 每日汇总邮件
orange → 即时IM消息+工单
red → 电话/短信(值班)
八、实施节奏与踩坑
分期实施路线(不要一口吃成胖子):
一期(1个月): 3~5台最关键设备试点
验证: 传感器存活率/数据完整性/基线合理性
二期(3个月): 扩展到全部关键设备+看板
三期: 规则引擎调优+接入CMMS工单系统
四期(可选): ML异常检测(数据积累6个月+后)
| 踩坑 | 预防 |
|---|---|
| 传感器装在非刚性位置 | 安装刚度检查(第29篇) |
| 工况不分桶导致基线混乱 | 特征必须带工况标签 |
| 阈值照搬教科书 | 用自身基线的相对阈值为主 |
| 报警太多,全员麻木 | 分级+趋势触发+告警预算(每日上限) |
| 边缘节点失联无人知 | 心跳监控(第39篇) |
九、总结
PdM系统四层楼:布点按故障后果排序(贵的点关键)、特征每个可解释(对应故障模式)、基线分工况分桶(冷启动三阶段)、预警三级响应(关注/预警/告警)。它的本质是把"听老师傅的经验"翻译成"数据+规则+趋势"------采集卡是耳目,特征是语言,规则是诊断书。至此三大实战完成,下一篇把视野拉到行业地图:各行各业怎么用采集卡。
下一篇预告:《行业应用地图:产线、楼宇、新能源、科研与医疗》