重构位置:
models/vibration/vibration_algorithm.py(振动算法)+models/common/(公共查询、报警配置、稳健统计、CSV 输出)。 原合并脚本backend/scan_pks_fault_evolution.py保留不动,本文件只描述振动一侧。
models/vibration/vibration_algorithm.pymodels/common/models/scan_all.pymodels/results/vibration/振动异常段.csvmodels/results/common/报警阈值配置.csv| 点位 | 含义 | 用途 |
|---|---|---|
YSJ_5 |
润滑油压力 | 分析长期下降和低压风险 |
YSJ_10 |
联轴器端振动 | 分析振动峰值和均值异常 |
YSJ_11 |
链轮端振动 | 分析振动峰值和均值异常 |
YSJ_41 |
运行状态 | 判断设备是否运行 |
运行判断规则:
YSJ_41 > 0 表示设备运行
批次与机组的对应关系:
| 批次 | 机组 |
|---|---|
| 30 | 7号机 |
| 31 | 8号机 |
| 32 | 9号机 |
数据库端按小时聚合 5 秒采样数据,每个小时计算:
每小时理论样本数为:
720 个样本(5 秒一个样本)
运行覆盖率计算方式:
运行覆盖率 = 运行样本数 / 720
只有满足以下条件的小时,才参与长期趋势或振动基线分析:
运行覆盖率 >= 0.80
这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。
识别两类振动异常:
核心思想:
工程报警阈值 + 历史稳健基线 + 均值偏离 + 峰值偏离 + 时间段合并
对联轴器端和链轮端分别计算历史基线,使用当前小时之前最多 168 个有效运行小时:
168 小时约等于 7 天
至少需要 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 个触发小时
因此:
振动异常段会进一步标记变化形态:
对活塞、机械部件等故障,重点关注:
链轮端峰值突然增加、在不同运行时段重复出现,但平均振动不一定持续升高
对气阀相关异常,重点关注:
某侧振动整体抬高,随后出现高峰
振动算法不依赖压力代码,公共逻辑在 models/common/。设备号输入、全量/实时模式与告警
落库统一见 全量与实时运行及告警落库.md。
# 按设备号,自动查询起止时间,先清理旧中间/结果再生成,结果写本地
python models/scan_all.py --device 7# 8# 9# --store local
# 本地结果照常生成,并额外写入 compressor_alarm
python models/scan_all.py --device 7# 8# 9# --store db
# 复用小时中间表
python models/vibration/vibration_algorithm.py \
--device 7# 8# 9# \
--hourly-csv models/datas/hourly/pks_hourly_full.csv \
--output-dir models/results/vibration
# 连库扫描
python models/vibration/vibration_algorithm.py --device 7# 8# 9#
python models/vibration/vibration_algorithm.py \
--device 8# \
--hourly-csv models/datas/hourly/pks_hourly_full.csv \
--output-dir models/results/vibration_8
参数含义与默认值:
| 参数 | 含义 | 默认值 |
|---|---|---|
--device |
压缩机编号,可多选,如 7# 8# 9# |
7# 8# 9# |
--start / --end |
扫描起止(连库模式) | 自动:floor(最小)..floor(最大)+1h |
--chunk-days |
每个查询块的天数 | 14 |
--hourly-csv |
复用小时中间表,不查库 | 无 |
--output-dir |
输出目录 | models/results/vibration |
每个振动段在 compressor_alarm 中落 1 行,device_part/device_point 由该段
最强异常侧 决定(链轮端 → YSJ_11,联轴器端 → YSJ_10),与
振动异常段.csv 一行一段一致。实时合并键为 (设备, 告警类型, 等级),不拆段。
优先看以下字段:
振动阶段;阶段综合评分及各项分项得分;最强异常侧;阶段最大振动值;最强侧近期峰值基线和最强侧近期稳健尺度;阶段最大峰值/基线比例;阶段最大连续异常有效小时数。判断重点:
峰值是否真实发生在完整运行小时内,是否重复出现,均值是否同步抬升
振动阶段使用持续时间、平均振动抬升、阶段最大振动值和峰值稳健偏离进行综合评分,总分 0~100 分:
持续时间 40 分 + 平均振动 20 分 + 最大振动值 20 分 + 峰值稳健偏离 20 分
评分分级:
达到以下任一条件时直接判定为严重异常:峰值达到高高报警阈值、存在高高报警小时,或峰值达到 8 个稳健尺度且阶段至少包含 2 个有效运行小时。
其中:
近期峰值基线 = 前 168 个有效运行小时的峰值中位数
稳健尺度 = max(1.4826 × MAD, |近期峰值基线| × 5%, 极小值)
峰值稳健偏离 = (当前峰值 - 近期峰值基线) / 稳健尺度
峰值/基线比例 = 当前峰值 / 近期峰值基线
例如峰值稳健偏离 19.43,表示当前峰值高于近期基线 19.43 个稳健尺度;如果峰值/基线比例为 2.41,则表示当前峰值约为基线的 2.41 倍。两者含义不同。
运行样本数 / 720 一起查看,避免低覆盖率小时造成误判。