Kaynağa Gözat

补充PKS压力与振动算法说明

18922397810 2 hafta önce
ebeveyn
işleme
ef7a94d483
1 değiştirilmiş dosya ile 426 ekleme ve 0 silme
  1. 426 0
      PKS润滑油压力与振动算法说明.md

+ 426 - 0
PKS润滑油压力与振动算法说明.md

@@ -0,0 +1,426 @@
+# PKS 润滑油压力与振动算法说明
+
+## 1. 适用脚本
+
+算法由以下脚本实现:
+
+```text
+backend/scan_pks_fault_evolution.py
+```
+
+脚本为只读扫描器,只查询数据库,不修改数据库。主要输出:
+
+```text
+报警阈值配置.csv
+润滑油压力小时等级.csv
+润滑油压力小时阶段段.csv
+润滑油压力演化周期.csv
+振动异常段.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
+```
+
+这样可以排除停机、启动、停机过渡和采集不完整对结果的影响。
+
+## 4. 润滑油压力算法
+
+### 4.1 算法目标
+
+识别润滑油压力是否出现真实的长期恶化,而不是把单个采样点或短时掉点误判为长期故障。
+
+核心思想:
+
+```text
+周期基线 + 下降百分比 + 持续下降趋势 + 工程报警阈值 + 连续确认
+```
+
+### 4.2 周期和基线
+
+对每台机组的有效运行小时建立油压周期:
+
+- 第一个有效小时开始一个周期;
+- 有效小时之间间隔超过 12 小时,开始新的周期;
+- 周期内的有效小时用于分析油压演化。
+
+周期基线取周期开始阶段前 24 个有效运行小时油压均值的中位数:
+
+```text
+周期基线 = 前 24 个有效小时油压均值的中位数
+```
+
+同时计算近期 24 个有效小时基线,用于辅助判断当前油压是否偏离近期水平。
+
+### 4.3 趋势判断
+
+对最近 6 个有效运行小时计算油压线性斜率,并统计连续下降的有效小时数。
+
+认为油压处于下降趋势的条件为:
+
+```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 输出结果
+
+油压结果分为三层:
+
+1. **小时等级**:每个有效小时的压力等级、趋势、基线和报警信息;
+2. **小时阶段段**:将连续或相近的同等级小时合并;
+3. **演化周期**:汇总周期内是否经历轻微、异常、严重异常,以及等级演化顺序。
+
+阶段合并时,同一机组、同一周期、同一等级且间隔不超过 6 小时的小时会合并。
+
+典型演化结果:
+
+```text
+轻微 -> 异常 -> 严重异常
+```
+
+## 5. 振动算法
+
+### 5.1 算法目标
+
+识别两类振动异常:
+
+- 突然出现的高振动或机械冲击峰;
+- 相对历史正常水平持续升高的振动。
+
+核心思想:
+
+```text
+工程报警阈值 + 历史稳健基线 + 均值偏离 + 峰值偏离 + 时间段合并
+```
+
+### 5.2 历史基线
+
+对联轴器端和链轮端分别计算历史基线,使用当前小时之前最多 336 个有效运行小时:
+
+```text
+336 小时约等于 14 天
+```
+
+至少需要 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. 运行方法
+
+### 6.1 查看帮助
+
+```bash
+python backend/scan_pks_fault_evolution.py --help
+```
+
+### 6.2 参数
+
+| 参数 | 含义 | 默认值 |
+|---|---|---|
+| `--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` |
+
+批次对应关系:
+
+```text
+30 = 7号机
+31 = 8号机
+32 = 9号机
+```
+
+### 6.3 默认运行
+
+```bash
+python backend/scan_pks_fault_evolution.py
+```
+
+### 6.4 生成最终确认结果
+
+```bash
+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
+```
+
+### 6.5 只分析 8 号机
+
+```bash
+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
+```
+
+## 7. 结果解读建议
+
+### 润滑油压力
+
+优先看以下字段:
+
+- `相对周期基线变化`;
+- `近6有效小时油压斜率`;
+- `连续下降有效小时数`;
+- `压力等级`;
+- `是否形成确认等级`;
+- `低报警小时数`、`低低报警小时数`。
+
+判断重点:
+
+```text
+是否在完整运行小时内持续下降,并且连续达到确认时长
+```
+
+### 振动
+
+优先看以下字段:
+
+- `振动等级`;
+- `主要振动侧`;
+- `最大振动值`;
+- `触发小时数`;
+- `严重信号小时数`;
+- `最大峰值相对近期基线偏离`;
+- `变化形态`。
+
+判断重点:
+
+```text
+峰值是否真实发生在完整运行小时内,是否重复出现,均值是否同步抬升
+```
+
+## 8. 重要限制
+
+1. 算法输出的是异常候选和演化阶段,不是最终故障诊断。
+2. 停机、启动和停机过渡期间的低值或峰值不能直接作为故障证据。
+3. 油压长期下降更适合判断润滑系统风险,不能单独确定具体损坏部件。
+4. 振动异常可以提示气阀、活塞或机械冲击风险,但具体归因仍需结合功图、高频波形和维修记录。
+5. 当前振动结果重点是异常段识别,不等同于严格的三小时连续确认。
+6. 报警阈值来自数据库的点位配置,应定期检查配置是否正确。
+7. 建议结合 `运行样本数 / 720` 一起查看,避免低覆盖率小时造成误判。