算法由以下脚本实现:
backend/scan_pks_fault_evolution.py
脚本为只读扫描器,只查询数据库,不修改数据库。主要输出:
报警阈值配置.csv
润滑油压力小时等级.csv
润滑油压力小时阶段段.csv
润滑油压力演化周期.csv
振动异常段.csv
| 点位 | 含义 | 用途 |
|---|---|---|
YSJ_5 |
润滑油压力 | 分析长期下降和低压风险 |
YSJ_10 |
联轴器端振动 | 分析振动峰值和均值异常 |
YSJ_11 |
链轮端振动 | 分析振动峰值和均值异常 |
YSJ_41 |
运行状态 | 判断设备是否运行 |
运行判断规则:
YSJ_41 > 0 表示设备运行
批次与机组的对应关系:
| 批次 | 机组 |
|---|---|
| 30 | 7号机 |
| 31 | 8号机 |
| 32 | 9号机 |
数据库端按小时聚合 5 秒采样数据,每个小时计算:
每小时理论样本数为:
720 个样本(5 秒一个样本)
运行覆盖率计算方式:
运行覆盖率 = 运行样本数 / 720
只有满足以下条件的小时,才参与长期趋势或振动基线分析:
运行覆盖率 >= 0.80
这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。
识别润滑油压力是否出现真实的长期恶化,而不是把单个采样点或短时掉点误判为长期故障。
核心思想:
周期基线 + 下降百分比 + 持续下降趋势 + 工程报警阈值 + 连续确认
对每台机组的有效运行小时建立油压周期:
周期基线取周期开始阶段前 24 个有效运行小时油压均值的中位数:
周期基线 = 前 24 个有效小时油压均值的中位数
同时计算近期 24 个有效小时基线,用于辅助判断当前油压是否偏离近期水平。
对最近 6 个有效运行小时计算油压线性斜率,并统计连续下降的有效小时数。
认为油压处于下降趋势的条件为:
连续下降有效小时数 >= 3
或最近 6 个有效小时斜率 < -0.0005
相对周期基线变化计算方式:
相对变化 = (当前油压 - 周期基线) / 周期基线
例如结果为 -16.7%,表示当前油压比周期基线下降约 16.7%。
同时满足:
相对周期基线下降 >= 5%
且处于下降趋势
满足任一条件:
相对周期基线下降 >= 10%,且处于下降趋势
或油压 <= 低报警阈值
满足任一条件:
相对周期基线下降 >= 20%,且处于下降趋势
或油压 <= 低低报警阈值
当前实际阈值示例:
低报警阈值:0.34 MPa
低低报警阈值:0.31 MPa
报警阈值从数据库中的 site_point 和对应 AlarmType 配置读取,不固定写死某一个报警配置编号。
一个小时内,只有当达到报警阈值的运行样本占比至少达到 20% 时,才将该小时标记为对应的低报警小时:
报警样本比例 = 报警运行样本数 / 运行样本数
报警样本比例 >= 20%
为减少短时异常误报,油压阶段采用连续有效小时确认:
因此,短时间低压掉点不会直接形成长期严重故障阶段,但原始报警不会丢失。
油压结果分为三层:
阶段合并时,同一机组、同一周期、同一等级且间隔不超过 6 小时的小时会合并。
典型演化结果:
轻微 -> 异常 -> 严重异常
识别两类振动异常:
核心思想:
工程报警阈值 + 历史稳健基线 + 均值偏离 + 峰值偏离 + 时间段合并
对联轴器端和链轮端分别计算历史基线,使用当前小时之前最多 336 个有效运行小时:
336 小时约等于 14 天
至少需要 24 个历史有效运行小时,才开始进行振动异常判断。
基线采用稳健统计方法:
中心 = 中位数
波动尺度 = max(1.4826 × MAD, |中心| × 5%, 极小值)
其中 MAD 是中位绝对偏差,可以降低异常峰值对基线的影响。
振动均值和振动最大值分别建立基线,并计算当前值相对基线的偏离程度。
任一条件满足即可:
高高报警样本比例 >= 1%
或振动峰值 >= 高高报警阈值
或峰值相对基线偏离 >= 8 个稳健尺度
当前高高报警阈值示例:
8.5 mm/s
任一条件满足即可:
高报警样本比例 >= 1%
或振动峰值 >= 高报警阈值
或峰值相对基线偏离 >= 5 个稳健尺度
或振动均值相对基线偏离 >= 4 个稳健尺度
当前高报警阈值示例:
7.1 mm/s
满足任一条件:
峰值相对基线偏离 >= 4 个稳健尺度
或均值相对基线偏离 >= 3 个稳健尺度
联轴器端和链轮端分别判断后:
这样可以识别单侧机械异常,也可以识别两侧同步升高的情况。
相邻触发小时之间间隔不超过 6 小时,会合并为同一个振动异常段。
异常段保留条件:
至少有 1 个严重信号小时
或至少有 2 个触发小时
因此:
振动异常段会进一步标记变化形态:
对活塞、机械部件等故障,重点关注:
链轮端峰值突然增加、在不同运行时段重复出现,但平均振动不一定持续升高
对气阀相关异常,重点关注:
某侧振动整体抬高,随后出现高峰
python backend/scan_pks_fault_evolution.py --help
| 参数 | 含义 | 默认值 |
|---|---|---|
--batch |
批次,可多选 | 30 31 32 |
--start |
开始时间 | 2025-04-01 00:00:00 |
--end |
结束时间 | 2026-05-01 00:00:00 |
--chunk-days |
每个数据库查询块的天数 | 14 |
--output-dir |
输出目录 | cache/pks_scanner/evolution |
批次对应关系:
30 = 7号机
31 = 8号机
32 = 9号机
python backend/scan_pks_fault_evolution.py
python backend/scan_pks_fault_evolution.py \
--batch 30 31 32 \
--start "2025-04-01 00:00:00" \
--end "2026-05-01 00:00:00" \
--chunk-days 14 \
--output-dir cache/pks_scanner/evolution_pct_confirmed
python backend/scan_pks_fault_evolution.py \
--batch 31 \
--start "2025-10-20 00:00:00" \
--end "2025-11-05 00:00:00" \
--chunk-days 7 \
--output-dir cache/pks_scanner/evolution_8_verify
优先看以下字段:
相对周期基线变化;近6有效小时油压斜率;连续下降有效小时数;压力等级;是否形成确认等级;低报警小时数、低低报警小时数。判断重点:
是否在完整运行小时内持续下降,并且连续达到确认时长
优先看以下字段:
振动等级;主要振动侧;最大振动值;触发小时数;严重信号小时数;最大峰值相对近期基线偏离;变化形态。判断重点:
峰值是否真实发生在完整运行小时内,是否重复出现,均值是否同步抬升
运行样本数 / 720 一起查看,避免低覆盖率小时造成误判。