|
@@ -0,0 +1,103 @@
|
|
|
|
|
+# 全量与实时运行及告警落库
|
|
|
|
|
+
|
|
|
|
|
+本文档记录压力/振动算法在 `models/` 重构后的运行方式:设备号输入、全量/实时模式、
|
|
|
|
|
+`compressor_alarm` 存储映射与定时服务。对应代码:`models/scan_all.py`、
|
|
|
|
|
+`models/realtime_service.py`、`models/common/devices.py`、`models/common/alarm_store.py`。
|
|
|
|
|
+
|
|
|
|
|
+## 1. 设备号输入
|
|
|
|
|
+
|
|
|
|
|
+- 统一使用 `--device 7# 8# 9#`(默认 `7# 8# 9#`),也兼容 `7`、`7号机`。
|
|
|
|
|
+- 设备通过 `compressor_data_import.directory_path` 解析到 PKS 导入批次:
|
|
|
|
|
+
|
|
|
|
|
+```sql
|
|
|
|
|
+SELECT pls.*
|
|
|
|
|
+FROM pks_long_sample pls
|
|
|
|
|
+INNER JOIN compressor_data_import di ON di.id = pls.import_batch_id
|
|
|
|
|
+WHERE di.data_type = 'PKS' AND di.directory_path = '7#';
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+- `7#/8#/9#` 分别对应 7/8/9 号机;`4#/5#/6#` 暂不纳入本算法。
|
|
|
|
|
+- 算法内部**仍按 `批次` 划分周期**(与历史一致),因此本地全量结果与现有
|
|
|
|
|
+ `润滑油压力小时阶段段.csv`、`振动异常段.csv` 逐字节一致。
|
|
|
|
|
+
|
|
|
|
|
+## 2. 全量运行
|
|
|
|
|
+
|
|
|
|
|
+```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
|
|
|
|
|
+
|
|
|
|
|
+# 显式时间或复用小时中间表
|
|
|
|
|
+python models/scan_all.py --start "2025-01-01 00:00:00" --end "2026-09-01 00:00:00"
|
|
|
|
|
+python models/scan_all.py --hourly-csv models/datas/hourly/pks_hourly_full.csv
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+- **自动时间范围**:`start = floor(最小 sample_time)`,`end = floor(最大 sample_time) + 1h`
|
|
|
|
|
+ (保证最后一个完整整点小时纳入),按设备取范围。
|
|
|
|
|
+- **清理策略**:运行前删除旧的小时中间表与扫描结果(`models/datas/hourly/`、
|
|
|
|
|
+ `models/results/{common,pressure,vibration}` 中的扫描产物),不删除模型测试结果与
|
|
|
|
|
+ `models/datas/reference/`。
|
|
|
|
|
+- `--store db` 会按 `(device_code, alarm_type ∈ {润滑油压力故障, 振动故障})`
|
|
|
|
|
+ **先删除所选设备的旧告警,再插入新段**。
|
|
|
|
|
+
|
|
|
|
|
+## 3. 数据库存储映射(表 `compressor_alarm`)
|
|
|
|
|
+
|
|
|
|
|
+| 结果 | device_code | device_part | device_point | alarm_type | alarm_level |
|
|
|
|
|
+|---|---|---|---|---|---|
|
|
|
|
|
+| 压力段 | `7#` | `润滑油压力` | `YSJ_5` | `润滑油压力故障` | 压力阶段 |
|
|
|
|
|
+| 振动段 | `7#` | `联轴器端振动` / `链轮端振动` | `YSJ_10` / `YSJ_11` | `振动故障` | 振动阶段 |
|
|
|
|
|
+
|
|
|
|
|
+- **每个压力段落 1 行**;**每个振动段也落 1 行**,`device_part/device_point` 由该段
|
|
|
|
|
+ `最强异常侧` 决定(链轮端 → `YSJ_11`,联轴器端 → `YSJ_10`),与
|
|
|
|
|
+ `振动异常段.csv` 一行一段对应。
|
|
|
|
|
+- 其他字段:
|
|
|
|
|
+ - `alarm_des` = `阶段触发依据`(已迁移为 `VARCHAR(4000)`);
|
|
|
|
|
+ - `alarm_time_start` / `alarm_time_end` = `开始小时` / `结束小时`;
|
|
|
|
|
+ - `alarm_info_json` = 对应 CSV 行的 JSON(`阶段/基线/评分/触发依据/最强异常侧` 等全部字段);
|
|
|
|
|
+ - `status = 1`;`scan_start_time` / `scan_end_time` = 本次扫描范围。
|
|
|
|
|
+- 结构迁移:`models/migrations/alter_compressor_alarm_alarm_des_4000.sql`
|
|
|
|
|
+ (`ALTER TABLE compressor_alarm MODIFY alarm_des VARCHAR(4000)`)。
|
|
|
|
|
+
|
|
|
|
|
+## 4. 实时运行与合并规则
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+python models/realtime_service.py --once # 单次
|
|
|
|
|
+python models/realtime_service.py --loop --interval 300 # 每 5 分钟(命令行定时)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+- 每次 tick:`end = min(floor(本机当前时间), floor(最新数据) + 1h)`,
|
|
|
|
|
+ `start = end - lookback`(默认 45 天),按设备跑与全量相同的算法得到段。
|
|
|
|
|
+- **合并写入**:对每段按 `(device_code, alarm_type, alarm_level)` 找时间重叠、或间隔
|
|
|
|
|
+ ≤6 小时的既有行:
|
|
|
|
|
+ - `alarm_time_start = min`、`alarm_time_end = max`,刷新 `alarm_des` / `alarm_info_json`
|
|
|
|
|
+ / `scan_*`;
|
|
|
|
|
+ - 合并键**不含部件/点位**,因此“最强异常侧”在 tick 之间切换也不会把连续段拆开;
|
|
|
|
|
+ 合并时 `device_part/device_point` 更新为最新 `最强异常侧`;
|
|
|
|
|
+ - 同一时刻若新段桥接了两条既有行,会合并为一条(删除多余行);
|
|
|
|
|
+ - 不同等级(轻微/异常/严重异常)保留为不同行,与阶段 CSV 的行语义一致。
|
|
|
|
|
+- 因此“14 点和 15 点属于同一故障段”的场景会持续更新同一行,不会拆开。
|
|
|
|
|
+
|
|
|
|
|
+## 5. 定时服务
|
|
|
|
|
+
|
|
|
|
|
+| 平台 | 安装 | 卸载 |
|
|
|
|
|
+|---|---|---|
|
|
|
|
|
+| macOS | `bash models/service/mac/install.sh` | `bash models/service/mac/uninstall.sh` |
|
|
|
|
|
+| Linux | `sudo bash models/service/linux/install.sh` | `sudo bash models/service/linux/uninstall.sh` |
|
|
|
|
|
+| Windows | `models\service\windows\install_service.bat` | `models\service\windows\uninstall_service.bat` |
|
|
|
|
|
+
|
|
|
|
|
+均为每 5 分钟执行 `python models/realtime_service.py --once`;详见
|
|
|
|
|
+`models/service/README.md`(含 cron 备选与日志位置)。
|
|
|
|
|
+
|
|
|
|
|
+## 6. 冒烟测试与校验
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 顺序模拟多个时刻运行,结束后默认回滚数据库
|
|
|
|
|
+python models/realtime_service.py --simulate "2026-02-03 20:00:00,2026-02-04 00:00:00"
|
|
|
|
|
+
|
|
|
|
|
+# 校验本地结果与 golden 一致、DB 行数与 CSV 对应
|
|
|
|
|
+python models/common/verify.py --with-db
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+`--with-db` 会校验 `compressor_alarm` 行数与参考 CSV 对应:压力 72 行、振动 25 行,共 97 行。
|