振动算法说明.md 8.5 KB

PKS 振动算法说明

重构位置:models/vibration/vibration_algorithm.py(振动算法)+ models/common/(公共查询、报警配置、稳健统计、CSV 输出)。 原合并脚本 backend/scan_pks_fault_evolution.py 保留不动,本文件只描述振动一侧。

1. 适用脚本

  • 振动算法:models/vibration/vibration_algorithm.py
  • 公共层:models/common/
  • 压力+振动组合扫描:models/scan_all.py
  • 输出:
    • models/results/vibration/振动异常段.csv
    • models/results/common/报警阈值配置.csv

2. 分析点位

点位 含义 用途
YSJ_5 润滑油压力 分析长期下降和低压风险
YSJ_10 联轴器端振动 分析振动峰值和均值异常
YSJ_11 链轮端振动 分析振动峰值和均值异常
YSJ_41 运行状态 判断设备是否运行

运行判断规则:

YSJ_41 > 0 表示设备运行

批次与机组的对应关系:

批次 机组
30 7号机
31 8号机
32 9号机

3. 通用数据处理

3.1 按小时聚合

数据库端按小时聚合 5 秒采样数据,每个小时计算:

  • 总样本数;
  • 运行样本数;
  • 运行覆盖率;
  • 油压均值、最小值、最大值;
  • 两个振动点位的均值和最大值;
  • 各点位超过报警阈值的样本数。

每小时理论样本数为:

720 个样本(5 秒一个样本)

运行覆盖率计算方式:

运行覆盖率 = 运行样本数 / 720

3.2 有效小时

只有满足以下条件的小时,才参与长期趋势或振动基线分析:

运行覆盖率 >= 0.80

这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。

5. 振动算法

5.1 算法目标

识别两类振动异常:

  • 突然出现的高振动或机械冲击峰;
  • 相对历史正常水平持续升高的振动。

核心思想:

工程报警阈值 + 历史稳健基线 + 均值偏离 + 峰值偏离 + 时间段合并

5.2 历史基线

对联轴器端和链轮端分别计算历史基线,使用当前小时之前最多 168 个有效运行小时:

168 小时约等于 7 天

至少需要 24 个历史有效运行小时,才开始进行振动异常判断。

基线采用稳健统计方法:

中心 = 中位数
波动尺度 = max(1.4826 × MAD, |中心| × 5%, 极小值)

其中 MAD 是中位绝对偏差,可以降低异常峰值对基线的影响。

振动均值和振动最大值分别建立基线,并计算当前值相对基线的偏离程度。

5.3 振动分级

严重信号

任一条件满足即可:

高高报警样本比例 >= 1%
或振动峰值 >= 高高报警阈值
或峰值相对基线偏离 >= 8 个稳健尺度

当前高高报警阈值示例:

8.5 mm/s

异常信号

任一条件满足即可:

高报警样本比例 >= 1%
或振动峰值 >= 高报警阈值
或峰值相对基线偏离 >= 5 个稳健尺度
或振动均值相对基线偏离 >= 4 个稳健尺度

当前高报警阈值示例:

7.1 mm/s

轻微信号

满足任一条件:

峰值相对基线偏离 >= 4 个稳健尺度
或均值相对基线偏离 >= 3 个稳健尺度

5.4 两侧振动综合判断

联轴器端和链轮端分别判断后:

  • 取两侧中较高的振动等级作为该小时等级;
  • 取异常更明显的一侧作为主要振动侧;
  • 同时保留两侧的峰值、均值和报警信息。

这样可以识别单侧机械异常,也可以识别两侧同步升高的情况。

5.5 异常段合并

相邻触发小时之间间隔不超过 6 小时,会合并为同一个振动异常段。

异常段保留条件:

至少有 1 个严重信号小时
或至少有 2 个触发小时

因此:

  • 单个严重振动峰不会被过滤;
  • 普通振动需要至少两次触发才形成异常段;
  • 当前实际合并逻辑不是严格要求连续 3 小时。

5.6 变化形态

振动异常段会进一步标记变化形态:

  • 间歇冲击型:峰值明显升高,但均值变化不大;
  • 持续抬升型:均值持续升高并且多次触发;
  • 混合型:同时存在峰值冲击和均值变化,但不满足前两类条件。

对活塞、机械部件等故障,重点关注:

链轮端峰值突然增加、在不同运行时段重复出现,但平均振动不一定持续升高

对气阀相关异常,重点关注:

某侧振动整体抬高,随后出现高峰

6. 运行方法

振动算法不依赖压力代码,公共逻辑在 models/common/。设备号输入、全量/实时模式与告警 落库统一见 全量与实时运行及告警落库.md。

6.1 全量扫描(推荐)

# 按设备号,自动查询起止时间,先清理旧中间/结果再生成,结果写本地
python models/scan_all.py --device 7# 8# 9# --store local

# 本地结果照常生成,并额外写入 compressor_alarm
python models/scan_all.py --device 7# 8# 9# --store db

6.2 单独运行振动算法

# 复用小时中间表
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#

6.3 只分析指定设备

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

6.4 写库说明

每个振动段在 compressor_alarm 中落 1 行,device_part/device_point 由该段 最强异常侧 决定(链轮端 → YSJ_11,联轴器端 → YSJ_10),与 振动异常段.csv 一行一段一致。实时合并键为 (设备, 告警类型, 等级),不拆段。

7. 结果解读建议(振动)

振动

优先看以下字段:

  • 振动阶段;
  • 阶段综合评分及各项分项得分;
  • 最强异常侧;
  • 阶段最大振动值;
  • 最强侧近期峰值基线和最强侧近期稳健尺度;
  • 阶段最大峰值/基线比例;
  • 阶段最大连续异常有效小时数。

判断重点:

峰值是否真实发生在完整运行小时内,是否重复出现,均值是否同步抬升

7.1 振动阶段综合评分

振动阶段使用持续时间、平均振动抬升、阶段最大振动值和峰值稳健偏离进行综合评分,总分 0~100 分:

持续时间 40 分 + 平均振动 20 分 + 最大振动值 20 分 + 峰值稳健偏离 20 分

评分分级:

  • 0~29 分:轻微;
  • 30~59 分:异常;
  • 60~100 分:严重异常。

达到以下任一条件时直接判定为严重异常:峰值达到高高报警阈值、存在高高报警小时,或峰值达到 8 个稳健尺度且阶段至少包含 2 个有效运行小时。

其中:

近期峰值基线 = 前 168 个有效运行小时的峰值中位数
稳健尺度 = max(1.4826 × MAD, |近期峰值基线| × 5%, 极小值)
峰值稳健偏离 = (当前峰值 - 近期峰值基线) / 稳健尺度
峰值/基线比例 = 当前峰值 / 近期峰值基线

例如峰值稳健偏离 19.43,表示当前峰值高于近期基线 19.43 个稳健尺度;如果峰值/基线比例为 2.41,则表示当前峰值约为基线的 2.41 倍。两者含义不同。

8. 重要限制

8. 重要限制

  1. 算法输出的是异常候选和演化阶段,不是最终故障诊断。
  2. 停机、启动和停机过渡期间的低值或峰值不能直接作为故障证据。
  3. 油压长期下降更适合判断润滑系统风险,不能单独确定具体损坏部件。
  4. 振动异常可以提示气阀、活塞或机械冲击风险,但具体归因仍需结合功图、高频波形和维修记录。
  5. 当前振动结果重点是异常段识别,不等同于严格的三小时连续确认。
  6. 报警阈值来自数据库的点位配置,应定期检查配置是否正确。
  7. 建议结合 运行样本数 / 720 一起查看,避免低覆盖率小时造成误判。