feat: 운전판정 고도화 — realtime stall 수정 + 교차검증 + 단위/레인지
- ExperionRealtimeService를 단일 SuperviseAsync supervisor로 재설계: 비블로킹 부팅, PublishingStopped/KeepAliveStopped 워치독으로 silent stall 감지, 30초 주기 무한 재연결, flush 루프 단일화 - RealtimeServiceStatus에 LastDataAgeSeconds/Stalled 추가, History는 Stalled 시 스냅샷 skip - v_plant_running_state에 진공펌프(vp-) 포함 + 교차검증 4객체 (pump_corroboration_manual, v_pump_signal_map, v_plant_running_state_corroborated, v_plant_running_state_agg) + v_instrument_range 뷰 (boot DDL) - MetadataLoaderService에 euhi/eulo/units 메타속성 추가 - generate_status_report에 agg 조회 연동 + sample/focus 버그 수정 - plant_context.md에 펌프 prefix(p-/vp-) + 교차검증 뷰 사용법 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -128,10 +128,15 @@ WHERE livevalue ~ '\|\s*[LR]-TRIP\s*\|'
|
||||
WHERE livevalue ~ '\|\s*(L-STOP|R-STOP|STOP|OFF)\s*\|'
|
||||
```
|
||||
|
||||
### ⚠️ p-prefix 주의사항
|
||||
### ⚠️ 펌프 prefix 주의사항 (p- / vp-)
|
||||
|
||||
`p-NNNN` prefix는 펌프 전용이 아닙니다. panel point, alarm point 등 다른 디지털 포인트도 같은 prefix를 공유합니다.
|
||||
- 운전 판정 시 enum이 위 6종(L-STOP/L-RUN/L-TRIP/R-STOP/R-RUN/R-TRIP) 중 하나인 태그만 펌프로 취급.
|
||||
펌프 prefix는 **두 종류**입니다:
|
||||
- `p-NNNN` = 공정 펌프 (원료/리플럭스/제품 이송 등)
|
||||
- `vp-NNNN` = **진공 펌프** (Vacuum Pump, 감압 컬럼용). 예: `vp-6117`(C-6111 진공), `vp-3204`, `vp-5117`, `vp-6217`, `vp-8117`
|
||||
|
||||
`p-NNNN` prefix는 펌프 전용이 아닙니다. panel point, alarm point 등 다른 디지털 포인트(`p-201_hs`, `p-2202_run` 등)도 같은 prefix를 공유합니다.
|
||||
- 운전 판정 시 enum이 위 6종(L-STOP/L-RUN/L-TRIP/R-STOP/R-RUN/R-TRIP) 중 하나인 태그만 펌프로 취급. 패널/피드백 포인트는 단순 `STOP`/`OFF` enum이라 자동 제외됨.
|
||||
- `v_plant_running_state` 뷰는 `p-`와 `vp-`를 **모두** 펌프로 집계하므로 진공 펌프도 `running_pumps`/`running_pump_tags`에 포함됨.
|
||||
- 또는 `node_map_master.description` / `v_tag_summary.description`으로 펌프 여부 추가 확인.
|
||||
|
||||
### "운전 중인 플랜트" 판정 — `v_plant_running_state` 뷰 사용 (1순위)
|
||||
@@ -173,6 +178,24 @@ ORDER BY area_code;
|
||||
- "P6 펌프 어떤 게 돌아가?" → `SELECT running_pump_tags FROM v_plant_running_state WHERE area_code='P6'`
|
||||
- "트립 펌프 있어?" → `SELECT area_code, tripped_pumps FROM v_plant_running_state WHERE tripped_pumps > 0`
|
||||
|
||||
### 실질 운전 판정 — 교차검증 뷰 (정밀, 선택)
|
||||
|
||||
펌프 상태 워드(RUN)만으로는 deadhead·센서오류·수집 stall(frozen 데이터) 등 **허위 운전**을 못 거른다. 연결된 유량계(kg/hr)·진공압(torr)을 **신선도 게이트(120초)** 와 함께 교차검증한 뷰:
|
||||
|
||||
- `v_plant_running_state_corroborated` — 펌프별 상세: `corroborated_status`, `flow_kg_hr`, `vacuum_torr`
|
||||
- `v_plant_running_state_agg` — area별 집계: `confirmed_running`/`suspicious_running`/`stale_running`/`indeterminate_running` + `status`
|
||||
|
||||
| corroborated_status | 의미 |
|
||||
|---|---|
|
||||
| `CONFIRMED_RUNNING` | RUN + 신선한 유량 > 0.5 kg/hr (진공펌프: 진공압 < 300 torr) — **실질 운전** |
|
||||
| `SUSPICIOUS_RUNNING` | RUN + 신선한데 유량 없음 / 진공 안 잡힘 — deadhead·센서오류·standby 의심 |
|
||||
| `STALE` | RUN + 유량/진공 값이 **stale·frozen**(수집 지연/중단) — **판정 보류, 운전 단정 금지** |
|
||||
| `INDETERMINATE_RUNNING` | RUN + 신호 매핑/데이터 없음 |
|
||||
| `STOPPED` / `TRIPPED` | enum 기준 |
|
||||
|
||||
- "지금 6차 진짜 돌아가?" → `SELECT base_tag, corroborated_status, flow_kg_hr FROM v_plant_running_state_corroborated WHERE area_code='P6'`
|
||||
- `STALE`가 많으면 "실시간 수집이 지연/중단된 상태"로 안내(운전 여부 단정 금지). 펌프-신호 매핑 보강은 `pump_corroboration_manual`(수동)·`v_pump_signal_map`(토폴로지).
|
||||
|
||||
## 시간대 및 날짜 처리
|
||||
|
||||
- DB 저장은 **UTC** 입니다 (`recorded_at`, `event_time` 모두 TIMESTAMPTZ).
|
||||
|
||||
Reference in New Issue
Block a user