# 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` | 运行状态 | 判断设备是否运行 | 运行判断规则: ```text YSJ_41 > 0 表示设备运行 ``` 批次与机组的对应关系: | 批次 | 机组 | |---:|---| | 30 | 7号机 | | 31 | 8号机 | | 32 | 9号机 | ## 3. 通用数据处理 ### 3.1 按小时聚合 数据库端按小时聚合 5 秒采样数据,每个小时计算: - 总样本数; - 运行样本数; - 运行覆盖率; - 油压均值、最小值、最大值; - 两个振动点位的均值和最大值; - 各点位超过报警阈值的样本数。 每小时理论样本数为: ```text 720 个样本(5 秒一个样本) ``` 运行覆盖率计算方式: ```text 运行覆盖率 = 运行样本数 / 720 ``` ### 3.2 有效小时 只有满足以下条件的小时,才参与长期趋势或振动基线分析: ```text 运行覆盖率 >= 0.80 ``` 这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。 ## 5. 振动算法 ### 5.1 算法目标 识别两类振动异常: - 突然出现的高振动或机械冲击峰; - 相对历史正常水平持续升高的振动。 核心思想: ```text 工程报警阈值 + 历史稳健基线 + 均值偏离 + 峰值偏离 + 时间段合并 ``` ### 5.2 历史基线 对联轴器端和链轮端分别计算历史基线,使用当前小时之前最多 168 个有效运行小时: ```text 168 小时约等于 7 天 ``` 至少需要 24 个历史有效运行小时,才开始进行振动异常判断。 基线采用稳健统计方法: ```text 中心 = 中位数 波动尺度 = max(1.4826 × MAD, |中心| × 5%, 极小值) ``` 其中 MAD 是中位绝对偏差,可以降低异常峰值对基线的影响。 振动均值和振动最大值分别建立基线,并计算当前值相对基线的偏离程度。 ### 5.3 振动分级 #### 严重信号 任一条件满足即可: ```text 高高报警样本比例 >= 1% 或振动峰值 >= 高高报警阈值 或峰值相对基线偏离 >= 8 个稳健尺度 ``` 当前高高报警阈值示例: ```text 8.5 mm/s ``` #### 异常信号 任一条件满足即可: ```text 高报警样本比例 >= 1% 或振动峰值 >= 高报警阈值 或峰值相对基线偏离 >= 5 个稳健尺度 或振动均值相对基线偏离 >= 4 个稳健尺度 ``` 当前高报警阈值示例: ```text 7.1 mm/s ``` #### 轻微信号 满足任一条件: ```text 峰值相对基线偏离 >= 4 个稳健尺度 或均值相对基线偏离 >= 3 个稳健尺度 ``` ### 5.4 两侧振动综合判断 联轴器端和链轮端分别判断后: - 取两侧中较高的振动等级作为该小时等级; - 取异常更明显的一侧作为主要振动侧; - 同时保留两侧的峰值、均值和报警信息。 这样可以识别单侧机械异常,也可以识别两侧同步升高的情况。 ### 5.5 异常段合并 相邻触发小时之间间隔不超过 6 小时,会合并为同一个振动异常段。 异常段保留条件: ```text 至少有 1 个严重信号小时 或至少有 2 个触发小时 ``` 因此: - 单个严重振动峰不会被过滤; - 普通振动需要至少两次触发才形成异常段; - 当前实际合并逻辑不是严格要求连续 3 小时。 ### 5.6 变化形态 振动异常段会进一步标记变化形态: - **间歇冲击型**:峰值明显升高,但均值变化不大; - **持续抬升型**:均值持续升高并且多次触发; - **混合型**:同时存在峰值冲击和均值变化,但不满足前两类条件。 对活塞、机械部件等故障,重点关注: ```text 链轮端峰值突然增加、在不同运行时段重复出现,但平均振动不一定持续升高 ``` 对气阀相关异常,重点关注: ```text 某侧振动整体抬高,随后出现高峰 ``` ## 6. 运行方法 重构后振动算法不依赖压力代码,公共逻辑在 `models/common/`。 ### 6.1 复用小时中间表(推荐) ```bash python models/vibration/vibration_algorithm.py \ --hourly-csv models/datas/hourly/pks_hourly_full.csv \ --output-dir models/results/vibration ``` ### 6.2 从数据库全量重跑(同时缓存小时中间表) ```bash python models/scan_all.py --save-hourly ``` `models/scan_all.py` 会一次生成压力与振动全部结果,并写入 `models/datas/hourly/pks_hourly_full.csv`。 ### 6.3 只分析指定批次/机组 ```bash python models/vibration/vibration_algorithm.py \ --batch 31 \ --hourly-csv models/datas/hourly/pks_hourly_full.csv \ --output-dir models/results/vibration_batch31 ``` 参数含义与默认值: | 参数 | 含义 | 默认值 | |---|---|---| | `--batch` | 批次,可多选 | `compressor_data_import` 中全部 PKS 批次 | | `--start` | 开始时间(连库模式) | `2025-01-01 00:00:00` | | `--end` | 结束时间(连库模式) | `2026-09-01 00:00:00` | | `--chunk-days` | 每个查询块的天数 | `14` | | `--hourly-csv` | 复用小时中间表,不查库 | 无 | | `--output-dir` | 输出目录 | `models/results/vibration` | ## 7. 结果解读建议(振动) ### 振动 优先看以下字段: - `振动阶段`; - `阶段综合评分`及各项分项得分; - `最强异常侧`; - `阶段最大振动值`; - `最强侧近期峰值基线`和`最强侧近期稳健尺度`; - `阶段最大峰值/基线比例`; - `阶段最大连续异常有效小时数`。 判断重点: ```text 峰值是否真实发生在完整运行小时内,是否重复出现,均值是否同步抬升 ``` ### 7.1 振动阶段综合评分 振动阶段使用持续时间、平均振动抬升、阶段最大振动值和峰值稳健偏离进行综合评分,总分 0~100 分: ```text 持续时间 40 分 + 平均振动 20 分 + 最大振动值 20 分 + 峰值稳健偏离 20 分 ``` 评分分级: - 0~29 分:轻微; - 30~59 分:异常; - 60~100 分:严重异常。 达到以下任一条件时直接判定为严重异常:峰值达到高高报警阈值、存在高高报警小时,或峰值达到 8 个稳健尺度且阶段至少包含 2 个有效运行小时。 其中: ```text 近期峰值基线 = 前 168 个有效运行小时的峰值中位数 稳健尺度 = max(1.4826 × MAD, |近期峰值基线| × 5%, 极小值) 峰值稳健偏离 = (当前峰值 - 近期峰值基线) / 稳健尺度 峰值/基线比例 = 当前峰值 / 近期峰值基线 ``` 例如峰值稳健偏离 19.43,表示当前峰值高于近期基线 19.43 个稳健尺度;如果峰值/基线比例为 2.41,则表示当前峰值约为基线的 2.41 倍。两者含义不同。 ## 8. 重要限制 ## 8. 重要限制 1. 算法输出的是异常候选和演化阶段,不是最终故障诊断。 2. 停机、启动和停机过渡期间的低值或峰值不能直接作为故障证据。 3. 油压长期下降更适合判断润滑系统风险,不能单独确定具体损坏部件。 4. 振动异常可以提示气阀、活塞或机械冲击风险,但具体归因仍需结合功图、高频波形和维修记录。 5. 当前振动结果重点是异常段识别,不等同于严格的三小时连续确认。 6. 报警阈值来自数据库的点位配置,应定期检查配置是否正确。 7. 建议结合 `运行样本数 / 720` 一起查看,避免低覆盖率小时造成误判。