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:
52
CLAUDE.md
52
CLAUDE.md
@@ -7,6 +7,58 @@
|
||||
|
||||
## 완료된 작업
|
||||
|
||||
### 운전판정 고도화 — realtime writer stall 수정 + 교차검증(corroboration) + 단위/레인지 (2026-05-24)
|
||||
|
||||
#### 배경
|
||||
"6-1차 펌프 4대 vs 5대" 질문에서 출발 → ① v_plant_running_state가 `p-%`만 집계해 진공펌프(`vp-`) 누락, ② 펌프 enum(RUN)만으론 허위 운전(deadhead·센서이상·frozen) 미검출, ③ 진단 중 realtime_table이 09:58 KST에 **silent stall**(수집 멈춤)된 운영 장애 발견.
|
||||
|
||||
#### 구현 내역
|
||||
|
||||
| # | 항목 | 핵심 |
|
||||
|---|------|------|
|
||||
| 1 | 진공펌프 포함 | `v_plant_running_state` 필터 `p-%` → `(p-% OR vp-%)`. VP-6117 등 진공펌프도 운전 집계 |
|
||||
| 2 | **realtime writer stall 수정** | `ExperionRealtimeService`를 단일 `SuperviseAsync` supervisor로 통일: 부팅 비블로킹(`StartAsync(ct)` 즉시 반환), `GetLinkFault()`가 `Subscription.PublishingStopped`/`Session.KeepAliveStopped`/`Connected`로 silent stall 감지 → 30초 주기 무한 재연결(3회-후-포기 제거), flush 루프 1회만 기동. `RealtimeServiceStatus`에 `LastDataAgeSeconds`/`Stalled` 추가, History는 Stalled 시 스냅샷 skip |
|
||||
| 3 | 교차검증 뷰 | `pump_corroboration_manual`(수동 매핑) + `v_pump_signal_map`(토폴로지 `FT.from_tag=펌프`→FICQ 1:N + 수동) + `v_plant_running_state_corroborated`(신선도 게이트 120s + STALE + 유량·진공 임계) + `v_plant_running_state_agg`(CONFIRMED 기준 RUNNING, suspicious/stale 부가 카운트) |
|
||||
| 4 | 단위/레인지 메타데이터 | 별도 테이블 없이 `tag_metadata` 재사용 — `MetadataLoaderService.MetaAttributes`에 `euhi/eulo/units` 추가(메타갱신 트리거 자동 편승). 타입 접근 `v_instrument_range` 뷰 |
|
||||
| 5 | 유량 임계 보정 | FS 5%가 과대사이징 계기(FS 2000, 운전 ~11~57)엔 부적합(정상→SUSPICIOUS 오판) 발견 → `GREATEST(1.0, LEAST(eu_hi*0.05, 5.0))`로 [1~5 kg/hr] deadhead 밴드 캡 |
|
||||
| 6 | MCP 연동 | `generate_status_report`에 `v_plant_running_state_agg` 조회 추가(응답 `pump_corroboration` + LLM 프롬프트). 기존 `sample`/`focus` NameError 버그도 수정 |
|
||||
|
||||
#### 수정 파일
|
||||
|
||||
| 파일 | 변경 |
|
||||
|------|------|
|
||||
| `src/Infrastructure/OpcUa/ExperionRealtimeService.cs` | supervisor 재설계(비블로킹·워치독·무한재시도·flush 단일화) |
|
||||
| `src/Infrastructure/OpcUa/ExperionHistoryService.cs` | Stalled 시 스냅샷 skip |
|
||||
| `src/Infrastructure/OpcUa/MetadataLoaderService.cs` | MetaAttributes에 euhi/eulo/units |
|
||||
| `src/Core/Application/Interfaces/IExperionServices.cs` | RealtimeServiceStatus에 LastDataAgeSeconds·Stalled |
|
||||
| `src/Infrastructure/Database/ExperionDbContext.cs` | v_plant_running_state(vp- 포함) + 교차검증 4객체 + v_instrument_range (boot DDL) |
|
||||
| `mcp-server/server.py` | generate_status_report agg 연동 + 버그수정 |
|
||||
| `prompts/plant_context.md` | 펌프 prefix(p-/vp-) + 교차검증 뷰 사용법 |
|
||||
| `plans/운전판정-고도화-플랜.md` | §0 감리 진단 결과(초안 정정·구현현황) |
|
||||
|
||||
#### 설계 결정
|
||||
|
||||
| 항목 | 결정 |
|
||||
|------|------|
|
||||
| stall 진단 신호 | realtime.timestamp frozen + history(realtime 복사본)는 신선·값 frozen → 수집기 정지. UTC/KST 무관 |
|
||||
| 생존 판정 | `_session.Connected` 단독 → SDK `PublishingStopped`/`KeepAliveStopped` 추가(silent stall 감지) |
|
||||
| 단위/레인지 저장 | 별도 테이블 X — `euhi/eulo/units`가 OPC 자식노드라 `tag_metadata` EAV에 적합. 트리거 배선 0 |
|
||||
| 진공 의미 | pica-6111 = mmHg(≈torr), 0~760(760=대기압). 깊은진공=저압 → `< 300` CONFIRMED |
|
||||
| 유량 임계 | %FS 부적합(계기 과대사이징) → deadhead 절대 밴드 캡 |
|
||||
| MCP 재적용 | MCP 서버 재시작 필요(미반영) |
|
||||
|
||||
#### 검증 (라이브 :5000, Web 재기동 2회)
|
||||
- `dotnet build` 경고 0/에러 0, `py_compile` OK
|
||||
- 재기동 후 supervisor 자동재개(929 포인트), realtime stall 복구(lag 1:13→<2s, fresh 0→929)
|
||||
- 메타갱신 2946건 적재(euhi/eulo/units), `v_instrument_range` 채워짐(ficq-6113 0~2000 kg/hr, pica-6111 0~760 mmHg)
|
||||
- P6 운전 5대(진공 vp-6117 포함) 전부 **CONFIRMED_RUNNING**(유량 43 kg/hr, 진공 43 mmHg), agg confirmed=5/suspicious=0
|
||||
|
||||
#### 잔여
|
||||
- MCP 서버 재시작해야 `generate_status_report` 변경 반영
|
||||
- 신버전 Web 앱은 백그라운드 `dotnet run`으로 기동 중 — 영속화는 운전원 터미널/`deploy.sh`(systemd) 권장
|
||||
- 진공 임계(300)·유량 deadhead 밴드는 운전 데이터로 추가 튜닝 여지
|
||||
- `active_alarms`에 SUSPICIOUS 주입은 운전원 검증 후(보류)
|
||||
|
||||
### 문서 탐색기 (Tab 16) 구현 (2026-05-24)
|
||||
|
||||
#### 배경
|
||||
|
||||
Reference in New Issue
Block a user