# PKS 润滑油压力算法说明 > 重构位置:`models/generalized/pressure_algorithm.py`(压力算法)+ `models/common/`(公共查询、报警配置、稳健统计、CSV 输出)。 > 原合并脚本 `backend/scan_pks_fault_evolution.py` 保留不动,本文件只描述压力一侧。 > > 当前 v2:压力标签 61 条(7号 0、8号 61、9号 0)。在 100% 方案的 0 点/部分掉点过滤上, > 新增“开机恢复瞬态”剔除规则;0 点、部分掉点和开机瞬态小时均不进入正常训练样本。 ## 1. 适用脚本 - 压力算法:`models/generalized/pressure_algorithm.py` - 公共层:`models/common/` - 压力+振动组合扫描:`models/scan_all.py` - 输出: - `models/results/pressure/润滑油压力小时等级.csv` - `models/results/pressure/润滑油压力小时阶段段.csv` - `models/results/pressure/润滑油压力演化周期.csv` - `models/results/pressure/压力开机恢复剔除标签.csv` - `models/results/pressure/压力开机恢复剔除小时.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 秒采样数据,每个小时计算: - 总样本数; - 运行样本数; - 运行覆盖率; - 油压均值、最小值、最大值; - 油压 0 值样本数 `oil_zero_count` 及 0 值比例 `oil_zero_ratio`; - 两个振动点位的均值和最大值; - 各点位超过报警阈值的样本数。 每小时理论样本数为: ```text 720 个样本(5 秒一个样本) ``` 运行覆盖率计算方式: ```text 运行覆盖率 = 运行样本数 / 720 ``` ### 3.2 有效小时 只有满足以下条件的小时,才参与长期趋势或振动基线分析: ```text 运行覆盖率 >= 0.80 ``` 同时,以下小时不参与压力周期、趋势、标签和正常样本: ```text oil_avg <= 0 → 0 MPa 无效小时 oil_zero_ratio >= 5% 且相邻小时 oil_zero_ratio >= 50% → 部分掉点无效小时 ``` 这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。 ## 4. 润滑油压力算法 ### 4.1 算法目标 识别润滑油压力是否出现真实的长期恶化,而不是把单个采样点或短时掉点误判为长期故障。 核心思想: ```text 周期基线 + 下降百分比 + 持续下降趋势 + 工程报警阈值 + 连续确认 ``` ### 4.2 周期和基线 对每台机组的有效运行小时建立油压周期: - 第一个有效小时开始一个周期; - 有效小时之间间隔超过 12 小时,开始新的周期; - 周期内的有效小时用于分析油压演化; - `oil_avg <= 0` 和部分掉点小时先被剔除,再划分周期。 周期基线取周期开始阶段前 24 个有效运行小时油压均值的中位数: ```text 周期基线 = 前 24 个有效小时油压均值的中位数 ``` 同时计算近期 24 个有效小时基线,用于辅助判断当前油压是否偏离近期水平。 ### 4.3 趋势判断 对最近 6 个**连续 1 小时步长**的有效运行小时计算油压线性斜率,并统计连续下降的有效小时数。 跨掉点、缺失或停机缺口的小时不能参与斜率,连续点少于 3 个时斜率为空。 认为油压处于下降趋势的条件为: ```text 连续下降有效小时数 >= 3 或最近 6 个连续有效小时斜率 < -0.0005 ``` 相对周期基线变化计算方式: ```text 相对变化 = (当前油压 - 周期基线) / 周期基线 ``` 例如结果为 `-16.7%`,表示当前油压比周期基线下降约 16.7%。 ### 4.4 油压分级规则 #### 轻微 同时满足: ```text 相对周期基线下降 >= 5% 且处于下降趋势 ``` #### 异常 满足任一条件: ```text 相对周期基线下降 >= 10%,且处于下降趋势 或油压 <= 低报警阈值 ``` #### 严重异常 满足任一条件: ```text 相对周期基线下降 >= 20%,且处于下降趋势 或油压 <= 低低报警阈值 ``` 当前实际阈值示例: ```text 低报警阈值:0.34 MPa 低低报警阈值:0.31 MPa ``` 报警阈值从数据库中的 `site_point` 和对应 `AlarmType` 配置读取,不固定写死某一个报警配置编号。 ### 4.5 报警样本比例 一个小时内,只有当达到报警阈值的运行样本占比至少达到 20% 时,才将该小时标记为对应的低报警小时: ```text 报警样本比例 = 报警运行样本数 / 运行样本数 报警样本比例 >= 20% ``` ### 4.6 连续确认 为减少短时异常误报,油压阶段采用连续有效小时确认: - 连续至少 3 个有效小时:确认当前等级; - 普通异常或轻微异常不足 3 小时:长期阶段按轻微处理; - 严重异常不足 3 小时:不形成长期严重阶段; - 低低报警的一两小时仍保留原始严重报警和立即报警信息。 因此,短时间低压掉点不会直接形成长期严重故障阶段,但原始报警不会丢失。 ### 4.7 前置下降与开机恢复瞬态 前置下降: ```text 连续下降 >= 6 个连续有效小时 且 6 小时斜率 < -0.001 且相对周期基线下降不足 5% → 该小时并入后面的轻微阶段,阶段起点前移 ``` 开机恢复瞬态(v2 新增): - 只检查开机后 24 小时内出现的候选阶段; - 候选阶段结束后,要求连续至少 12 个有效小时恢复到周期基线 95% 以上,且无低报警; - 满足则删除该标签,并把开机到稳定恢复前的小时排除出正常训练样本; - 不满足则保留标签。 该规则不使用“开机后固定剔除 N 小时”的方式;必须观察到稳定恢复才删除。 ### 4.8 输出结果 油压结果分为三层: 1. **小时等级**:每个有效小时的压力等级、趋势、基线和报警信息; 2. **小时阶段段**:将连续或相近的同等级小时合并; 3. **演化周期**:汇总周期内是否经历轻微、异常、严重异常,以及等级演化顺序。 阶段合并时,同一机组、同一周期、同一等级且间隔不超过 6 小时的小时会合并。 典型演化结果: ```text 轻微 -> 异常 -> 严重异常 ``` v2 额外输出: - `压力开机恢复剔除标签.csv`:被删除的开机恢复瞬态标签、稳定恢复开始小时和连续稳定小时数; - `压力开机恢复剔除小时.csv`:从开机到稳定恢复前被排除出正常训练的小时。 ### 4.9 当前结果 - 压力标签:61 条(轻微 56、异常 4、严重异常 1) - 7号机 0、8号机 61、9号机 0 - 开机恢复瞬态剔除:3 条标签 / 14 小时 ## 5. 运行方法 压力算法不依赖振动代码,公共逻辑在 `models/common/`。设备号输入、全量/实时模式与告警 落库统一见 `全量与实时运行及告警落库.md`。 ### 5.1 全量扫描(推荐) ```bash # 按设备号,自动查询起止时间,先清理旧中间/结果再生成,结果写本地 python models/scan_all.py --device 7# 8# 9# --store local # 本地结果照常生成,并额外写入 compressor_alarm python models/scan_all.py --device 7# 8# 9# --store db # 同时写入模型异常概率参考(viewer 告警详情显示) python models/scan_all.py --device 7# 8# 9# --store db --with-model ``` ### 5.2 单独运行压力算法 ```bash # 复用小时中间表 python models/generalized/pressure_algorithm.py \ --device 7# 8# 9# \ --hourly-csv models/datas/hourly/pks_hourly_full.csv \ --output-dir models/results/pressure # 连库扫描 python models/generalized/pressure_algorithm.py --device 7# 8# 9# ``` ### 5.3 只分析指定设备 ```bash python models/generalized/pressure_algorithm.py \ --device 8# \ --hourly-csv models/datas/hourly/pks_hourly_full.csv \ --output-dir models/results/pressure_8 ``` 参数含义与默认值: | 参数 | 含义 | 默认值 | |---|---|---| | `--device` | 压缩机编号,可多选,如 `7# 8# 9#` | `7# 8# 9#` | | `--start` / `--end` | 扫描起止(连库模式) | 自动:`floor(最小)..floor(最大)+1h` | | `--chunk-days` | 每个查询块的天数 | `14` | | `--hourly-csv` | 复用小时中间表,不查库 | 无 | | `--output-dir` | 输出目录 | `models/results/pressure` | 说明:设备经 `compressor_data_import.directory_path` 解析到 PKS 批次;算法内部仍按批次 划分周期,因此本地结果的基础列与历史 CSV 对应;v2 以当前 reference 为准。 ## 6. 结果解读建议(润滑油压力) ### 润滑油压力 优先看以下字段: - `相对周期基线变化`; - `近6有效小时油压斜率`; - `连续下降有效小时数`; - `压力等级`; - `是否形成确认等级`; - `低报警小时数`、`低低报警小时数`。 判断重点: ```text 是否在完整运行小时内持续下降,并且连续达到确认时长 ``` ## 7. 重要限制 1. 算法输出的是异常候选和演化阶段,不是最终故障诊断。 2. 停机、启动和停机过渡期间的低值或峰值不能直接作为故障证据。 3. 油压长期下降更适合判断润滑系统风险,不能单独确定具体损坏部件。 4. 振动异常可以提示气阀、活塞或机械冲击风险,但具体归因仍需结合功图、高频波形和维修记录。 5. 当前振动结果重点是异常段识别,不等同于严格的三小时连续确认。 6. 报警阈值来自数据库的点位配置,应定期检查配置是否正确。 7. 建议结合 `运行样本数 / 720` 一起查看,避免低覆盖率小时造成误判。 8. v2 中 7 号机、9 号机压力标签均为 0,不能评估这两台机组的压力异常召回。 9. 压力异常测试窗口全部来自 8 号机,分机组结果只能作为参考。 10. 标签来自规则扫描阶段,未经维修记录或人工确认,不等同于物理故障诊断。