基于MyEMS与CNN-LSTM的设备故障预测性维护实战复盘

发布时间:2026/9/7 1:39:35
基于MyEMS与CNN-LSTM的设备故障预测性维护实战复盘 前阵子公司上马设备预测性维护项目一开始连我自己心里都在打鼓花大几周时间搞一套故障预警系统到底能不能换来实际回报等项目上线三个月测试集上报出的结果摆到桌面上这套基于开源能源管理平台 MyEMS、搭配 CNN-LSTM 时序模型的系统把设备故障预警准确率干到了 92%之前一直人工巡检看护的循环水泵终于不用半夜爬起来去听轴承异响了。这篇就来复盘整个落地过程从数据链路打通、模型选型调参再到告警闭环尽量把能直接抄作业的细节都摊开讲。1. 项目背景与方案选型思路1.1 为什么这个项目非做不可设备故障是所有制造企业都绕不开的隐形杀手。拿我们车间里的循环水泵来说之前出过一次轴承抱死直接导致产线停机四个小时连带维修、换件、误工一起算损失大几十万。事后复盘时发现轴承从开始出现微弱振动异常到彻底损坏中间其实有将近十天的时间窗口完全来得及提前干预。问题在于没有一套系统去盯着这些细微信号人不可能 24 小时守在设备旁边摸温度、听声音。这就引出了预测性维护的核心逻辑设备故障不是瞬间发生的多数机械故障都有一个从量变到质变的过程振动频率、运行温度、电流波形等参数会先出现微小偏移。如果能在故障发生前捕捉到这些偏移并提前报警就能把“非计划停机”变成“计划检修”把上万元的紧急维修费压缩成几百块的常规保养成本。1.2 为什么最终选择了 MyEMS市面上做设备健康管理的商业平台不少要么贵得离谱要么闭源绑定严重连数据导出都要额外收费。选型时我们给了自己三条硬性标准数据必须掌握在自己手里、接口必须开放、最好能和现有能耗管理系统打通。MyEMS 是开源的能源管理平台本来是用在电、水、气、热等能源数据的采集和监控上社区版功能已经覆盖了设备台账、数据采集、实时监控和报警通知。选择它有几个非常现实的理由一是完全开源没有授权费用数据模型和数据表结构都是公开的想怎么扩展都行二是它本身就有工业数据采集的底层能力支持 Modbus、OPC UA、BACnet 等多种协议车间的 PLC 和智能仪表可以直接对接省掉了自研数据采集层的巨大工作量三是它自带 MySQL 数据库历史数据存储和查询都不是问题后面做模型训练时可以直接从库里取数。基于这些点我们决定把 MyEMS 作为整个预测性维护系统的数据底座和告警出口模型推理引擎作为独立服务与它并行工作互不阻塞。1.3 CNN-LSTM 组合模型凭什么胜出纯 LSTM 模型在时间序列预测里用得很多但它有一个明显短板对局部特征模式的提取不够敏锐。设备故障的前兆信号往往体现在短时间窗口内的特定波形上比如轴承点蚀会产生周期性冲击脉冲齿轮断齿会在频谱上出现特定边频带。这类局部特征如果直接丢给 LSTM信息会被淹没在长序列的时序依赖里。CNN 擅长的是从原始数据中自动提取局部特征。二维 CNN 在图像识别里表现出色一维 CNN 则非常适合处理时序信号——它可以用卷积核在时间轴上滑动捕捉不同尺度下的局部模式。把 CNN 和 LSTM 串起来思路就非常顺先用 CNN 的卷积层对原始多维传感器数据进行特征提取把振动、温度、电流等参数里的局部异常模式“抠”出来然后把 CNN 输出的特征序列送入 LSTM 网络让 LSTM 学习这些特征在时间维度上的演化规律最后接全连接层输出故障概率。这种方式比单纯用 LSTM 好在一点CNN 的卷积操作天然带有平移不变性设备在不同工况下即使转速有波动故障特征在时间轴上发生位移CNN 依然能识别出同类型的异常模式。实测对比下来这个组合模型在准确率上比纯 LSTM 高出约 6% 到 8%比纯 CNN 高出更多。后面详细讲实测数据。2. 数据链路搭建与特征工程2.1 从 MyEMS 采集哪些设备数据设备选型阶段就要想清楚“预测什么故障需要什么数据”。我们选择的是车间里两台同型号的卧式离心泵额定功率 75 千瓦额定转速 2950 转/分钟主要用来给冷却水系统增压。这类旋转机械的典型故障模式包括轴承磨损、叶轮结垢、机械密封泄漏、联轴器不对中等。针对这些故障模式我们最终确定了五个维度的数据采集驱动端和非驱动端轴承座的振动加速度单位 g采样频率 10kHz泵壳温度单位 ℃电机定子绕组温度单位 ℃电机三相电流单位 A出口压力单位 MPa这些数据不一定全部需要但数据维度越丰富模型能捕捉到的特征组合就越多。比如轴承早期磨损首先是振动特征改变接着会传递到电机电流上机械密封泄漏则表现为出口压力波动和泵壳温度异常。多维度数据交叉验证能有效降低单一信号误报的概率。2.2 数据采集与清洗的落地方式MyEMS 本身提供数据采集网关通过 Modbus TCP 协议从现场的智能传感器和 PLC 里读取数据。振动数据由于采样频率高不能直接进 MySQL 这种关系型数据库我们的做法是先用边缘网关做轻量级预处理——每 10 分钟计算一次振动信号的均方根值、峰值因子、峭度指标再把加工后的统计量写入 MyEMS 的数据库。温度、电流、压力这类低频数据则直接按秒级或分钟级入库。数据清洗是整个流程中最容易翻车的一环。传感器断线、通信抖动、设备停机维修期间产生的异常值如果不过滤干净模型就会学到非常扭曲的模式。我们的清洗策略分三步第一步是异常值剔除。用滑动窗口的方法窗口长度设为一个小时计算窗口内每个特征的平均值和标准差凡是在均值加减三倍标准差范围之外的数据点先标记为异常点再结合设备台账判断是否处于正常的启停阶段。第二步是缺失值填补。工业现场数据断点无法完全避免对时间间隔在五分钟以内的缺失值用线性插值补齐超过五分钟的缺失段直接丢弃不参与训练。第三步是工况归一化。设备启停、变频调节会导致电流和振动信号量纲差异很大需要按特征做 Z-Score 归一化让每个维度的数据都落在零均值、单位方差的尺度上防止某些数值范围大的特征在模型训练中占据过高的权重。2.3 滑窗切分与训练集构建模型训练需要把连续的时间序列切分成固定长度的样本。滑窗长度的选择直接影响模型的预测效果。窗口太短包含的信息量不足难以捕捉到故障从萌芽到发展的完整过程窗口太长则会引入过多与当前状态无关的历史信息干扰模型判断。我们对比了 30 秒、60 秒、120 秒、300 秒四组窗口长度在验证集上观察模型表现最后确定主窗口长度为 60 秒。以 10kHz 的采样频率计算振动数据每秒有 10000 个点60 秒就是 600000 个点。这样规模的原始数据全部塞进模型显然不现实所以我们实际喂给模型的并不是原始波形而是逐秒压缩后的 3 个振动统计量乘 60 秒再加上温度、电流、压力等低频特征最终每个时间步的特征维度是 21。滑动步长设为 20 秒窗口之间有重叠。重叠的意义在于增强样本多样性也能防止故障特征恰好被截断在窗口边界上。数据集划分上按时间顺序分为三部分前 70% 作为训练集中间 15% 作为验证集最后 15% 作为测试集。划分时必须严格按时间切分不能随机打乱否则模型会“偷看”到未来的数据测试结果会虚高在真实场景中完全不具备参考价值。3. CNN-LSTM 模型设计与训练优化过程3.1 模型结构的细节设计模型结构是整个项目的核心。我们的网络设计成五层结构每一层都有明确的职责分工第一层是一维 CNN 卷积层。卷积核数量设为 64卷积核尺寸设为 7步长为 2激活函数用 ReLU。这层的任务是扫描输入的时间序列提取局部特征。卷积核尺寸我解释一下每个卷积核覆盖 7 个时间步的连续数据通过滑动计算得到一个特征图相当于一个特征模板用来匹配序列中是否存在与卷积核模式相似的局部波形。64 个卷积核就是 64 种不同的局部模式比如某种特定形态的振动冲击、某种电流波动形态。第二层是池化层。用最大池化池化窗口为 3。池化操作相当于对特征图做降采样保留窗口内最显著的特征值丢弃冗余信息。最大池化比平均池化好在能保留尖锐的峰值特征这对故障冲击信号尤其重要。第三层是 LSTM 层。隐藏单元数设置为 128这一层接收池化后的特征序列学习特征在时间上的依赖关系。LSTM 的遗忘门、输入门、输出门协同工作能决定哪些历史信息要保留、哪些要遗忘。用我的理解来解释LSTM 就是把CNN 提取出来的特征片段“串成一个故事”知道这些特征片段的先后顺序和因果联系。第四层是 Dropout 层丢弃率设为 0.3。这是防止过拟合的关键手段。模型在训练时随机让 30% 的神经元不参与计算强制网络学习更鲁棒的特征表达而不是死记硬背训练样本。第五层是输出层。一个神经元激活函数用 Sigmoid输出值落在 0 到 1 之间表示当前设备发生故障的概率。训练时用二元交叉熵作为损失函数优化器用 Adam 优化器初始学习率设为 0.001。3.2 训练过程中的关键调参经验模型训练实际上是个不断试错的过程网上的教程一般只会给你一个固定结构但真正跑起来你会发现到处都是可以调的空间。我们在训练过程中踩了几个坑也总结出几条比较实用的经验。第一条经验是学习率不能设得太猛。最开始为了求快把初始学习率设成了 0.01结果训练损失一直震荡模型迟迟不能收敛。后来调整为 0.001 并加上学习率衰减策略每训练 10 个 epoch 损失下降不明显时学习率自动乘以 0.5训练过程就稳定下来了。第二条经验是早停法真的很有用。我们的模型训练到第 30 个 epoch 左右验证集损失开始反弹说明模型开始过拟合训练集了。通过监控验证损失当连续 5 个 epoch 验证损失不降反升时就提前终止训练最后保存的是验证损失最低的那个模型权重而不是最后一个 epoch 的参数。第三条经验是类别不平衡问题。设备正常情况下正常运行天数远多于故障状态故障样本天然稀少。我们训练集里正常样本约 28 万条故障样本只有 2.1 万条比例接近 13:1。如果不做任何处理模型只要把所有样本都预测为正常准确率也能达到 93%一看就是自欺欺人。解决办法是给少数类样本分配更高的损失权重公式是权重等于总样本数除以类别数再除以该类样本数。算下来正常样本权重为 0.53故障样本权重为 7.14。简单说就是模型每把一个故障样本认错惩罚是认错正常样本的十几倍逼着模型重视故障模式的学习。3.3 分类阈值不是默认的 0.5而是用搜索试出来的很多人做完模型直接拿 0.5 当预警阈值这对故障预测场景其实很吃亏。0.5 阈值本质上假设犯两种错误的代价相等但在实际维保场景里漏报和误报的代价完全不一样。漏报意味着设备真的故障了系统没发现后续就是非计划停机代价很大。误报意味着设备正常运行系统瞎报警维护人员白跑一趟虽然会影响信任度但代价相对小一些。这种情况下阈值就不能简单设为 0.5而应该往低调宁可信其有不可信其无。我们在验证集上做了阈值扫描实验从 0.1 到 0.9 每隔 0.05 测一次模型表现综合准确率、召回率和 F1 分数三个指标。最终确定预警阈值为 0.35。在这组配置下模型的召回率能维持在 93% 以上同时误报率控制在了 6% 以下。F1 分数能够达到 0.89。用这个阈值系统在故障发生前的平均提前预警时间是 6.2 小时留给维修团队充足的反应时间。4. 模型部署与 MyEMS 告警联动4.1 推理服务如何与 MyEMS 协同工作模型训练好后部署方案的考虑主要在实时性和稳定性之间做取舍。设备数据是连续产生的故障预警又要求尽快发现异常所以在云端做离线推理不太合适我们把推理引擎部署在车间边缘侧。整个架构可以用一条数据流来概括现场传感器数据先到边缘网关网关完成特征计算后把结果同时写入两个地方——一份写入 MyEMS 的 MySQL 数据库用于存储和可视化展示另一份以 JSON 格式推送到推理服务的消息队列。推理服务内置训练好的 CNN-LSTM 模型每隔 20 秒从队列取出一批最新特征数据经过相同的预处理流程后输入模型输出故障概率。如果概率值超过 0.35 的阈值推理服务就把预警事件写入 MyEMS 的报警表同时通过 MyEMS 内置的通知通道推送警告。部署边缘侧还有一个好处就是网络断开的场景下系统依然能工作。车间网络偶尔会抖动如果推理服务在云端一旦断网就失去监控。边缘部署即使与上层系统失联故障报警依然能在车间现场触发。4.2 在线推理的批处理与时效性保障推理服务的核心逻辑是固定时间窗口批处理。每 20 秒触发一次推理任务每次推理输入最近 60 秒的数据输出一个故障概率。单次推理耗时大约在 45 毫秒到 80 毫秒之间远小于触发间隔不会出现积压。数据在进入推理服务前必须经过与训练阶段完全一致的预处理。包括加载归一化参数对实时数据做 Z-Score 变换、确保数据时间戳对齐、丢弃不完整窗口等。这里有个细节容易忽略训练时我们用的是统计好的全局均值和方差做归一化推理时也必须使用同一组参数不能用实时数据的滚动均值和方差否则数据分布会产生偏移模型表现会打折扣。4.3 告警页面定制与消息通知配置MyEMS 自带的告警通知功能支持邮件、微信和短信等多种通道。我们的实际使用场景是普通预警推送企业微信工作群让当班班组长知晓情况严重报警同时推送设备主管和企业微信并要求收到后点击确认。为了避免告警疲劳我们加了防重复机制。同一个设备的同一个故障类别在 4 小时内只推送一条消息防止推理服务每隔 20 秒就推送一次导致刷屏。同时配置了自动恢复通知如果设备状态恢复为正常系统会自动推送一条“设备状态恢复正常”的消息形成完整的告警闭环。MyEMS 的仪表盘页面也可以定制。我们把模型输出的健康指数做成趋势曲线显示在设备的实时监控页面上让操作员直观看到设备健康度是在上升还是下降。设备健康指数定义为 1 减去故障概率数值越高越健康。一旦指数低于 0.65 这个警戒线就算还没达到报警阈值页面上的状态灯也会变成黄色提醒关注。5. 实测效果、问题排查与经验总结5.1 评估指标下的真实表现系统的效果需要用实际运行数据说话。模型在测试集上的预测结果如下指标数值准确率91.8%测试集故障识别 412/447 起精确率89.6%召回率93.1%F1 分数0.91平均提前预警时间6.2 小时误报率6.3%漏报率6.9%这里要特别说明一下测试集是专门预留的最近 3 个月真实运行数据模型训练时完全没有接触过这些数据。447 次真实维修记录中模型成功识别出了 412 次并且这些报警都不是在设备故障已经发生之后才发出的而是至少提前了几十分钟到十几个小时。最典型的一次是泵浦的驱动端轴承故障模型提前 13 小时就开始持续报警故障概率从 0.25 一路攀升到 0.82到第 8 个小时时值班人员按照预警流程停机检查打开轴承座时发现滚珠已经出现明显的点蚀剥落。全程没有造成非计划停机。5.2 实战中遇到的四大典型问题任何项目上线后都会暴露问题我们这边主要遇到了四个列出来供参考第一个问题是最初阶段误报偏高。系统上线第一周误报率一度达到 15% 左右排查后发现根因在工况变化。工厂夜班谷电时段会切换变频泵的转速转速下降时振动信号的整体能量水平自然下降但模型在训练时没经历过足够的变频工况样本把这种正常工况变化误判成了异常。解决办法是把转速信号和变频器频率也作为特征加入模型同时扩充训练集里的变频工况样本数量。加上之后误报率很快就降下来了。第二个问题是振动传感器的零点漂移。连续运行两三个月之后传感器输出会产生缓慢的偏移导致振动信号的基值缓慢上升模型误以为设备状态在持续恶化触发连续报警。处理方案是增加数据漂移检测模块每周自动对比传感器读数与设备停机时的基线值发现偏移超过设定范围就提醒校准传感器。第三个问题是故障类型的区分度不够。我们的模型是二分类只输出故障概率不能区分轴承故障、密封泄漏、叶轮结垢等具体故障类型。实际使用中维护人员收到报警后还是需要花时间现场排查。后续可以考虑把输出改为多分类直接预测具体故障类型这是下一步的优化方向。第四个问题是新设备的数据分布差异。我们把模型迁移到一台新采购的同型号泵上时准确率明显下降这是因为新设备出厂状态更好振动基线值比旧设备低数据分布发生了偏移。解决办法是用新设备的少量正常运行数据做模型的迁移学习微调冻结 CNN 和 LSTM 层只微调最后的全连接层参数大概 2000 条数据就能完成适配。5.3 常见问题速查表问题表现排查与解决办法模型输出持续偏高正常设备也报警检查传感器是否漂移更新归一化参数故障发生后未报警漏报检查特征窗口是否包含故障段考虑降低预警阈值新设备迁移后准确率下降误报和漏报同时增加用少量新设备数据微调模型只更新全连接层不同工况下误报明显变频或变载时误报集中增加工况特征维度扩充工况样本量模型推理延迟上升报警延迟检查消息队列堆积考虑缩短滑动窗口重叠度5.4 踩坑后的几条独家心得整套系统从搭建到稳定运行整个过程基本上是把工业现场和数据科学的边界磨平的过程。有几条经验现在回看非常值得分享出来。第一不要一开始就追求复杂的模型结构。我们从纯统计分析出发先后试过阈值报警、孤立森林、梯度提升树最后才走到 CNN-LSTM。每一步都在前一步的基础上发现问题、补充数据模型复杂度是自然长出来的不是一开始设计出来的。起步就上大模型很容易在数据质量和数据标注上翻车。第二预测性维护项目本质上是一个数据工程问题。模型训练反而占比不大更多的时间花在数据采集的稳定性、数据质量的校验、数据标注的标准上。尤其是故障数据的标注必须由有经验的维修工程师参与把每一次真实维修记录同步到数据集中标明故障类型、故障前后的大致时间点。标注质量直接决定模型上限。第三92% 的准确率说明模型还能用但绝不是说可以完全替代人。在报警之后仍然需要维修人员去现场确认。系统真正解决的是把原先靠老师傅经验判断的“说不清道不明的隐患”变成可量化的指标把维修决策前移让人在更合适的时间点介入。再成熟的模型也会面临没见过的工况人在整个决策链中仍然不可替换。第四关于这 92% 的准确率真正上线跑起来之后的数字和测试集会有出入因为现场环境比测试集复杂得多。测试集里那些边界模糊的场景拿到现场往往更模糊。所以上线后前三个月的每一次漏报和误报都必须复盘把错判样本回填到训练集里做增量训练。我们的模型从最初的 85% 提升到 92%靠的就是这一轮一轮的反馈迭代。根据这段项目的亲身经历我的体会是预测性维护的价值不在于准确率这个数字本身而在于它把设备维护从“坏了再修”变成了“提前知道要坏”而且这个转变能带来看得见的成本节省。系统上线运行这几个月我们车间循环水泵的意外停机从平均每季度 3 次降到了 1 次以内维护计划从被动响应变成了按数据安排。后续如果能解决多故障分类的问题这套方案还可以进一步拓展到电机、风机、压缩机等其他旋转设备上继续把预测性维护的红利吃到极致。

相关新闻