Commit Graph

52 Commits

Author SHA1 Message Date
windpacer
3506a67c28 feat(report): P1b 연속집계 history_1min — 1초 버퍼 60초 롤업(장기 무손실)
온라인 히스토리안 2계층: history_1s(최근 14일, 고해상) + history_1min(장기, 60초).

- history_1min 연속집계(timescaledb.continuous): time_bucket('1 min') + last(value)/last(controller_id).
  refresh 정책(start 3h, end 10min, 5분마다) → 집계 lag ≪ 보존윈도(14일)이라 1초 raw evict 전 materialize.
- Hc900FastHistoryService.EnsureSchemaAsync에 cagg 생성+정책 멱등 추가. SQL 파일 동기화.

검증: 2계층 값 일치(1s last == 1min cagg), 정책 활성, 무손실 불변식 충족.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 07:13:12 +09:00
windpacer
7f67f0e54d feat(report): P1a 1초 링버퍼 히스토리안 (history_1s)
온라인 히스토리안 1계층 — 디스크 상한 고정 1초 버퍼.

- history_1s Timescale 하이퍼테이블(1h 청크) + 압축(6h) + 보존 14일(청크DROP, 디스크 상한 고정).
- Hc900FastHistoryService: 매 1초 realtime_table 큐레이션 태그 → history_1s append.
  기동 시 스키마/정책 멱등 생성. Hc900HistoryService(60s) 패턴.
- ReportColumnMap.HistorianTags(): 메트릭/마스크가 읽는 태그를 기존 config에서 유도(~105개,
  중복정의 없음) — 유량 .PV/.QV, 진공, 민감단 TC, 하부루프 .PV/.SP/.OP.
- Report:Historian config(Enabled/IntervalSeconds/RetentionDays).

검증: 라이브 초당 ~38행 append, 샘플 간격 ~1.004s, 보존/압축 정책 활성.
주의(데모): realtime 폴링이 areas 61/62/81만 커버 → 1s 버퍼도 해당 컬럼만(배포 시 전 컨트롤러).
1s 버퍼 주 가치는 .PV/.OP 동특성; .QV 적산은 60s로도 정확.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 04:56:15 +09:00
windpacer
e2b1b8f6e0 docs(report): P1 온라인 히스토리안 스펙 — 1초 링버퍼·연속집계·실시간 KPI/알람
P0 결정론 메트릭(마스크·적산·리셋)의 온라인 확장 스펙. 핵심: 로직이 causal이라
온라인 결과(T) ≡ 배치(시작~T), 로직 변경 없이 스트리밍 가능.

- A. history_1s 1초 링버퍼: Timescale 하이퍼테이블 + 보존정책(14일, 청크DROP) + 압축.
  디스크 = 태그수×윈도×행크기로 상한 고정. 큐레이션 태그(~200) 1초 append.
- B. history_1min 연속집계: evict 전 롤업(집계lag ≪ 보존윈도) → 무손실 장기보존. 2계층.
- C. Hc900LiveKpiService 온라인 누적기: 러닝 상태로 P0와 동일 마스크/양증분/리셋,
  live_kpi 적재, 인과성 동치검증, 버퍼 리플레이 복구.
- D. kpi_alert 실시간 알람: cleaning/drawdown 진입·폐합 베이스라인 이탈(계량드리프트/이송)·생산정지.

큐레이션 태그셋·P0 연계(source 추가)·단계(P1a~d)·수용기준 포함. MVP 문서에 링크.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 18:40:33 +09:00
windpacer
c64bf08aa5 feat(report): cleaning/drawdown 마스크 + 폐합 7컬럼 — 적산 메트릭 비정상운전 제외
적산(.QV) 메트릭이 비정상 운전 분을 포함해 풀기간/월간 집계가 틀어지던 문제 해결.

- 3신호 마스크: (진공 PICA-*.PV>300) OR (제품 FICQ-*18.PV<10) OR (원료 FICQ-*01.PV<10).
  = cleaning(진공깨짐/제품~0) + drawdown(feed~0, 인벤토리 인출/컬럼간 이송) 제외.
- QvDeltaAsync 재작성: 비정상분 제외 후 정상구간 양(+)증분만 합산(cap 5e4).
  리셋 3종 자동처리(999999 wrap·cleaning 리셋·운전조건변경 리셋). excluded_min 메타.
- appsettings Report:Cleaning(컬럼별 진공태그+임계) + Closure 7컬럼 전체 등록.

검증(풀기간 폐합): 마스크 후 6/7 컬럼 99~100% (C-6211 216.8→100.0, C-9111 133.2→99.9,
C-9211 97.8→99.9, C-10211 121.9→99.1). C-10111 91.4%는 C-9111↔C-10111 연결라인
시운전 중 홀드업 축적(정상 비정상상태, KPI가 표시). 라이브: C-9111 일일(04-10) 99.46%,
C-6111 일일(05-15) 99.04% 확인.

현장사실: C-9111↔C-10111 잇는 라인 추가·시운전 중 — C-9111 drawdown 시 인출물이
C-10111 feed로 유입(FICQ-10101 0→~1090, 진공 750→45). 개별 수지 불성립 주원인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 18:04:13 +09:00
windpacer
30a3286d35 feat(report): 적산(.QV) 정확 메트릭 + 물질수지 폐합 + 웹 대시보드
PV-중앙값 근사 대신 유량 적산(.QV)으로 정확한 적분 메트릭 추가, 웹에서 바로 보기.

- QV 메트릭 4종: production_total·yield_qv·energy_intensity_qv·mass_balance_closure.
  적산 Δ 헬퍼(QvDeltaAsync)는 값 급감(reset/wrap)으로 구간분할 후 구간별 (마지막-처음)
  합산 → gap·양자화 강건, DCS 일일적산과 동일 의미(노이즈 과대계상 없음).
- 매핑은 appsettings SteamAdvisor:Columns 재사용(.QV 치환, 7컬럼). 폐합 스트림은
  Report:Closure:C-6111(Feed + Outputs[제품·경비물·중비물]).
- 웹 대시보드: GET /api/report/columns, /api/report/summary →
  리포트 탭에서 컬럼·날짜 선택 시 물질수지 신뢰블록(IN/OUT/폐합%, 98~101% 색상)
  + 메트릭 표를 즉시 렌더. 엑셀 export와 병존.
- 물리적 타당성 게이트: 수율>1.5·에너지원단위>5·≤0 → no_data+사유(garbage 차단).

검증(2026-05-15 C-6111): 생산 8455kg·수율 0.8739·에너지 0.7791·폐합 99.04%
(feed 9675/out 9582), 17주 폐합 99.1~99.8%. C-9111 garbage 수율 → no_data 처리 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 07:54:34 +09:00
windpacer
37a464ab96 feat(report): P0 셀프서비스 결정론 리포트 — 메트릭 3종·엑셀 토큰 채움·fastRecord 소스
운전원이 올린 엑셀 템플릿의 {{ metric=...; column=... }} 토큰을, 선택한 날짜의
결정론 계산값으로 채워 다운로드하는 셀프서비스 리포트 레이어(P0).

- 메트릭 3종: energy_efficiency·yield·control_residual (분 버킷 피벗, 클린필터,
  KST→UTC 경계). history_table(60s)·fast_record(s/min) 동일 long 포맷이라 source만 교체.
- 컬럼→태그 매핑은 기존 appsettings SteamAdvisor:Columns 재사용(7컬럼 무료).
- EPPlus 토큰 치환 + 셀 주석에 해상도 메타(source/sampling/n/keep) 부착.
- report_template/report_run 테이블 + cells_json 감사 박제.
- 리포트 탭(웹 UI) + 샘플 템플릿.

검증: 빌드 0에러. E2E 라운드트립 실동작(2026-05-15 C-6111 효율 0.778·수율 0.872·
잔차 mean 0.746 — 오프라인 검증값과 일치). 결정론 검증 게이트 준수(표본0=N/A, 0 날조 금지).

⚠️ EPPlus는 NonCommercial 컨텍스트 — 상용 출시 전 라이선스 정리 필요.

설계: docs/작업플랜-셀프서비스-분석리포트-MVP-P0-상세설계.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 00:14:35 +09:00
windpacer
aa2174118a docs: 작업지시서(PascalCase 통일)·AI운전원 제어 논의메모·HC900 IO 데이터시트 추가
- 작업지시서-API-필드-PascalCase-통일.md: PascalCase 통일 작업 지시서.
- 논의-AI운전원-제어-아이디어.md: AI 운전원 제어 아이디어 논의 메모.
- ControlEdge HC900 IO Modules Specifications.pdf: RTD/AI 모듈 스펙(레인지·정확도)
  데이터시트 — PT100 양자화 분석 근거 자료.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:33:32 +09:00
windpacer
7124b222c3 chore: gateway-config에 HCX 컨트롤러 항목 추가 + plant_context sub_area 도구호출 설명 정리
- gateway-config.json: HCX 컨트롤러 슬롯(grpcPort 50055) 추가.
- plant_context.md: active_alarms/find_tags/query_events 등 sub_area 인자 전달
  방식 설명을 prose로 정리.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:31:24 +09:00
windpacer
f97be981a4 style(api): JSON 응답 필드 PascalCase 통일 (컨트롤러·DTO·JS)
C# 익명객체 응답 속성을 camelCase→PascalCase로 통일(key→Key, success→Success,
error→Error 등)하고, 프런트 JS의 응답 접근도 맞춰 변경(ramp.jobs→ramp.Jobs,
data.columns→data.Columns 등). Kb/Pid/Steam/Feedforward/Ollama/PointBuilder 등
전 컨트롤러와 대응 JS, ExperionDtos·TrendDtos, McpService 반영.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:31:14 +09:00
windpacer
cfef06c21e fix(nl2sql): query_with_nl 프롬프트 단일화 + 극값 CTE(전체반환·앵커) + 결정론 태그 검증 게이트
- server.py: inline _DB_SCHEMA 제거, worker/sql_prompt.SQL_SYSTEM_PROMPT로 단일화.
  query_pv_history/query_with_nl description 보강(집계·극값은 query_with_nl 유도).
- 결정론 태그 검증 게이트(_verify_sql_tags)+피드백 재시도(최대3회): 환각 태그는
  실행 거부·교정, 끝내 미존재면 빈 결과 대신 명시적 에러(날조 차단). 대소문자 교정.
- sql_prompt.py: 극값→관련태그 CTE를 'value=MAX(...) 모든 시각 반환 + max_occurrences
  + 앵커(극값기준 태그) 포함'으로 교체. 태그 대문자 규칙.
- 피벗 시 max_occurrences 등 스칼라 컬럼 보존.
- curate/golden: 극값 CTE(전체반환·앵커≠요청) 학습예제·eval 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:22:31 +09:00
windpacer
fc197465d4 docs: PT100 RTD 온도값 양자화 원인분석 — RTD 레인지(high/low) 설정 문제
TI-6111C/TI-9211C가 소수점 5자리까지 반복되는 현상의 원인 규명.
field_hist 원본 대조로 데이터·이관·OPC·하드웨어 기각, P2(low+F0) 대조군
실측으로 RTD 레인지 설정(high 1000°C스팬 vs low 500°C스팬)이 분해능·정확도
2배 차이의 단독 원인임을 확정. 해법=레인지를 low로 변경.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:21:31 +09:00
windpacer
dbad4a54cf fix: T2S vLLM URL, first()/last() compatibility, PascalCase unification, event date parsing
- Fix vLLM base URL from port 8001 to 8000 (server.py)
- Replace TimeScaleDB first()/last() with array_agg(ORDER BY) for standard PostgreSQL compatibility (TextToSqlService.cs)
- Unify all backend response fields to PascalCase (TextToSqlController.cs)
- Update frontend to match PascalCase response fields (t2s.js)
- Change T2S date inputs to calendar popup (same as hist.html) (t2s.html)
- Fix evt.js date parsing: empty string causes Invalid Date error (evt.js)
2026-06-11 06:11:28 +09:00
windpacer
f1c11931fe feat: learned-control 브랜치 main 머지
Point Builder, SteamAdvisor, Feedforward 제어, MCP RAG/NL2SQL,
multi-controller 지원 등 28커밋 분량 기능 통합.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 04:41:57 +09:00
windpacer
cb749568d0 chore: 완료된 작업지시서·계획 문서 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 04:41:40 +09:00
windpacer
0057bd3a44 fix(ui): history query - match PascalCase JSON property names
API 응답이 PascalCase(RecordedAt, Values)인데 프론트엔드가
camelCase(recordedAt, values)로 접근해 데이터 미표시 현상 수정.
- hist.js: recordedAt→RecordedAt, values→Values
- trend.js: consistency fix
- index.html: cache busting 버전 갱신 (20260604→20260611)
2026-06-11 04:39:19 +09:00
windpacer
8c7b25e667 feat: Point Builder 실시간 추가/제거(선택분만) + 미리보기 닫기
- 전체 태그 목록 체크박스 + 버튼을 realtime_table 기준으로 전환
  · + 실시간 추가: 선택 태그만 is_active+realtime_enabled 켜고 realtime_table 직접 등록(즉시 라이브)
  · - 실시간 제거: realtime_enabled 끄고 realtime_table 행 직접 삭제
  · full-Sync 미사용(전체 추가 사고 방지) → 선택 id만 insert/delete
  · 신규 API: POST /api/pointbuilder/realtime-add, realtime-remove
  · 레거시 pbBulkActivate(is_active만 토글) 제거
- 미리보기 ✕ 닫기 버튼 추가(설정 화면 복귀)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 21:27:47 +09:00
windpacer
56df27c85f refactor: Point Builder 행별 is_active 램프 제거 + 등록/상태 컬럼 확장
- 🟢/🔴 is_active 토글 램프 삭제 (등록/상태 색상과 중복, is_active 전역 TRUE라 무의미)
- 미사용 pbToggleOne 함수 제거
- 등록/상태 75→120px(긴 라벨 대응), 관리 110→80px(삭제만 남음)
- 개별 활성/비활성은 상단 일괄 버튼으로 일원화

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 19:40:38 +09:00
windpacer
61ca8a8c78 feat: Point Builder 컨트롤러 스코핑 + realtime_table 기준 필터/표시
- 컨트롤러 선택 드롭다운 추가, 요약/목록/일괄작업을 선택 컨트롤러로 스코프
- 요약 카드 재정의: 카탈로그/등록(realtime)/라이브/비실시간/미등록
- 목록 필터를 is_active → realtime_table 멤버십(rt: 전체/실시간/실시간 제외)으로 교체
  → 미등록 태그를 골라 실시간으로 보내는 워크플로 지원
- 목록 정렬을 controller_id → tagname 순으로(다중 컨트롤러 대비)
- liveDict 조인을 (controller_id, tagname) 복합키로 정정
- Apply/Append/Sync에 controllerId 스코프 적용(타 컨트롤러 오염/손상 방지)
- 전체 태그 목록을 2단 레이아웃 밖 하단 전체폭으로 이동, 컬럼폭 조정
- Steam Advisor TC 태그 .PV 접미사 정정
- 작업지시서 문서 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 19:22:50 +09:00
windpacer
0a7ba93cc8 docs: 진공압력 끓는점 계산법(Antoine 식·상수 A/B/C) 문서 추가
- Antoine 식 log10P=A-B/(C+T)와 A/B/C 의미·단위 주의점 정리
- MSDS만으로 가능한 Clausius–Clapeyron 2-점 근사 방법
- PMA/PGMEA/EL 물성 발췌 + Antoine 상수 자리표시자(외부 DB 필요)
- 온도프로파일 기준밴드와의 교차검증 활용 연결

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 17:01:13 +09:00
windpacer
18963455f2 feat: Steam 온도프로파일 제품명 사용자정의 + 자동매칭 폐지
- 제품 라벨(P0/P1)에 MSDS 화학물질명(PMA/PGMEA/EL) 매핑 레이어 추가
  (product_labels.json, 플랜트=컬럼별). 통계 기준밴드는 데이터 산출 유지
- 운전원용 ⚙제품명 설정 모달: GET/POST /api/steam/productlabels/{col}
- 온도기반 자동매칭 폐지 → 운전원이 고른 제품만 기준밴드로 비교, 미선택 시작
- 드롭다운: 탭 진입/컬럼변경 시 즉시 채움, 선택은 플랜트별 localStorage 유지
- 중복 '제품(수동)' 배지 제거(헤더 줄바꿈 해소)
- 설계·검수 문서 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:56:50 +09:00
windpacer
a193d9b364 chore: Sinam 업로드 산출물 보관
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:12:01 +09:00
windpacer
d88784635e docs: 작업지시·진단·아키텍처 설계 문서 추가
온도프로파일/PV일관성/PointBuilder/history 작업지시, 신호태그·스팀유량 진단, 베이직아키텍처 재설계, MSDS, LLM채팅 구조 등.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:12:01 +09:00
windpacer
442313076e chore: 코어 엔티티/DB컨텍스트/설정/UI 셸 갱신
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:12:01 +09:00
windpacer
f12290fc2b chore: 레지스터맵 생성 스크립트 정리 + field_hist import
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:12:01 +09:00
windpacer
19c8c2e95c feat: MCP server RAG/NL2SQL/PID 개선
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:44 +09:00
windpacer
c850948630 feat: PointBuilder (Sinam 파싱 UI 통합)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:44 +09:00
windpacer
ea73097da6 feat: SteamAdvisor 컨트롤러 + UI
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:44 +09:00
windpacer
d040388557 feat: Feedforward 제어 + shadow store
FF 엔진/슈퍼바이저/FeedRamp 개선, shadow store(IFfShadowStore/FfShadowStore) 추가, FF 컨트롤러·UI(ff.js/ff.css).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:44 +09:00
windpacer
961e819d3c docs: 현황보고 정보분산 진단 + plant_context 문서우선 절차
- 진단: 경로형 현황보고가 4소스+3규칙을 LLM이 수작업 종합 → 결함(FT/FCV 값 누락) 분석, 문서우선 채택.
- plant_context: '유닛 KB 문서 먼저 검색 → 제어기 실시간값 조회 → 필드계기 루프매핑' 0순위 절차 + 필드계기 PV/OP 매핑 규칙 명시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:03 +09:00
windpacer
0b623e6fce feat: 플랜트 공정 마스터 KB 문서 (P6-1~P10-2)
- 유닛별 단일 기준서: 연결관계·제어루프·필드계기 매핑·검증경로를 1문서로 통합(문서우선 전략).
- P6-1/P6-2(연결O,실시간O), P8(EL,연결X,실시간O), P9-1/P9-2/P10-1/P10-2(연결△,C4 미가동).
- DB 검증 계층(태그·루프)과 사람보완 계층(🖊 토폴로지) 분리 명시.
- 구 P6-1_경비물_제거_공정.md 제거(마스터에 흡수, XV-6121/6122 P6-1 오기재 정정).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:03 +09:00
windpacer
f9a601e077 fix: 레지스터맵 dedup 흡수 정정 + PICA-9111A/9211A 컨트롤러 오기 수정
- dedup _pfx_num 정규식을 (\d+[A-Za-z]?)로: 단일 trailing letter(TI-6111A 등)를 번호키에 포함해 TICA-xxxxA로 흡수. 인터록/복합 suffix는 fullmatch로 보호.
- TI-6111A/5111A/6211A/8111A, PI-8111A, LI-2113A 등 중복 indicator 흡수 누수 해소.
- Experion 소스 오기 정정: PICA-9111A/9211A 알람SP가 C1 LOOP로 잘못 참조 → C4로 수정(xlsx) 후 C1·C4 맵 재생성.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 08:11:03 +09:00
windpacer
919e637f9c feat: 온도 프로파일 과거 이력 time scrubber + 날짜 선택
- z-score 추세 미니차트 제거 → time scrubber(슬라이더) 방식으로 전환
- 5초 폴링은 stTempLive만 갱신, 렌더링은 유저 액션(슬라이더/실시간버튼)으로만
- 실시간(thick blue) / 과거(thick amber + thin dashed live) 모드 분리
- 날짜 선택(date input) 추가 — 과거일 선택 시 00:00~23:59 전일 조회
- 실시간 버튼 클릭 시 오늘로 리셋 + 조회 재실행
- 타임스탬프 KST(UTC+9) 표시
- time_bucket → date_trunc('second', recorded_at) (TimescaleDB 의존성 제거)
- 히스토리 조회 제한 4h→24h, 500→2000행
2026-06-07 18:10:58 +09:00
windpacer
1f989bd861 feat: FF 온도계 위젯 + 민감단 모듈1 T_C 유지 SP 제안
위젯: AdvisoryResult에 config 시각화 필드 추가, ffThermometer() 세로 온도계 위젯 구현 (4단 마커+sweet spot 밴드+하한선+C편차 화살표+옵션 푸터)

모듈1: FeedforwardEngine SteamAdvisor DI + ResolveTcTemp, Normal 모드에서 T_C 유지 Steam OP 제안 (SteamAdvisor Predict + FB trim gain-0.6/dwell20분)
2026-06-07 08:22:43 +09:00
windpacer
a32ec18580 fix: FF 추종 ON/OFF에서 RAG 로그인 인증 제거 2026-06-07 06:44:54 +09:00
windpacer
7409fabc58 컬럼명칭 통일 C-xxxxx + SIGPIPE 대응 + SteamAdvisor/FF 개선
=== 컬럼명칭 통일 (c{prefix} → C-{prefix}11) ===
Python 분석스크립트: data pkl 경로  →
gen_temp_profiles: tempref 파일명  →
SteamAdvisorController: TagsFor() 숫자서픽스 → 풀컬럼키(C-6111), ToSuffix() 변환
steam.js: ST_TEMP_COLS ['61',...] → ['C-6111',...], selectbox defaultColumn
appsettings.json: Columns 키 c61/c62/... → C-6111/C-6211/..., DefaultColumn c6111→C-6111
run_column.py: 추출/분석시 col_key = f"C-{{prefix}}11"
C-{x}11_{model,tempref}.json: 신규 명칭 기준 기준프로파일/모델 7컬럼분

=== SteamAdvisor 수정 ===
SteamModel: [JsonPropertyName] 매핑(snake_case → PascalCase 역직렬화)
예외처리: LinearCoeffs.Count < 3 방어코드
steam.js: catch(_) {} → 에러메시지 표시, missing_tags 응답처리

=== Feedforward Controller 개선 ===
ff.js: 상승/하강 양방향 램프 confirm, 방향뱃지(↑↓), Normal 모드 표시
FeedforwardController: 업램프 단독제한 제거(양방향), tcReturnTcTarget/Band 노출

=== DB ===
Hc900DbContext: realtime_table_tagname_key 레거시 UNIQUE 제약/인덱스 DROP 로직
Hc900Controllers: ToDictionaryAsync → GroupBy 변환 (중복 tagname 대응)

=== SIGPIPE 대응 ===
gateway.cpp: signal(SIGPIPE, SIG_IGN) 메인스레드 설치
modbus_tcp.cpp: send() flags 0 → MSG_NOSIGNAL (EPIPE 복구)
sigpipe_ignore.c: LD_PRELOAD 우회 공유라이브러리
Hc900GatewayProcessService: LD_PRELOAD 환경변수 설정
2026-06-07 00:29:47 +09:00
windpacer
7b21c35af6 feat: 민감단온도 전환복귀제어 + SteamAdvisor + FeedRamp 전면 구현
=== 민감단온도(T_C) 전환복귀제어 (작업플랜 구현) ===
- FeedforwardModels: TempLowLimit, TcReturnRebTarget/Band, TcReturnDeltaAdRef/Band 추가
- FeedforwardEngine: sigTLow (T_C 하한 트리거, -1e9=비활성) + 온도기반 복귀게이트(tcRecovered)
  -> Recovering→Returning 전이: mbRecovered(물질수지) OR tcRecovered(reb-A+ΔT+T_C)
- FeedRampCalculator: 하강 램프 전면 구현 (RateUpPerMin/RateDnPerMin 분리, θ_up/θ_dn 분기, floor clamp)
- FeedRampExecutorService: 하강 램프 step 방향 지원
- FeedforwardConfigStore: 신규 6개 컬럼 SELECT/INSERT/UPDATE
- Hc900DbContext: temp_low_limit, tc_return_reb_target/band, tc_return_delta_ad_ref/band
- FeedforwardController: API 노출 + feed-ramp start/cancel/status

=== SteamAdvisor ===
- SteamAdvisorController: steam map 로드/시각화/제품매칭/온도프로파일
- steam.js, steam.html: SteamAdvisor 전용 UI 패널

=== Feed Ramp 실행 ===
- FeedRampExecutorService: BG service (BackgroundService)
- FeedRampJobStore: in-memory job store
- FfTrackingStore: ramp tracking DB
- FeedforwardSupervisor/WriteGuard: SP 쓰기 advisory + rate-limit

=== 분석 스크립트 ===
- gen_temp_profiles.py: 컬럼 온도 프로파일 기준 산출 → c{prefix}_tempref.json
- export_plotdata.py: analysis 결과 plot data export
- gen_instrument_ranges.py: 계기 범위 생성
- c6111_extract.py: C-6111 추출/운전모드 분류
- run_column.py: 전체 분석 파이프라인

=== Web UI ===
- ff.js/ff.html/ff.css: 전환류 상태기계 UI, TagBrowser, config save
- fast.js: Fast 조작 패널
- trend.js, pb.js, llmchat.js: 각 패널 확장
2026-06-06 18:33:56 +09:00
windpacer
447ccfa2b8 docs: 데이터 신뢰도·품질 게이트 + 제품별 분리 (§17)
6-2 분석 중 발견한 데이터 선별 방법론 정리:
- §17 온도 프로파일 불변성: 같은 제품·일정 진공이면 부하 무관 온도 일정.
  9-1 load-invariant(신뢰高), 6-2 드리프트.
- §17.1 제품별 분리 선결: 플랜트가 PM/PGMEA/EL 다품종 → 온도=제품 식별자.
  스팀맵·게이트·startup을 제품별로 학습(단일모델 금지).
- §17.2 SP-PV 괴리 = SP방치(MANUAL 캠페인) 탐지. 6-1<5℃ 항상, 6-2 5~6월 최대28℃.
  세척≠(풀피드 888) — 피드/제품으로 세척 vs 제품전환 구분.
- §17.3 현장정보: 품질이슈로 생산조건 변경중 → 5~6월 6-2=트러블슈팅(실험).
  ★학습=안정구간만, 신뢰도게이트를 "학습 데이터 선별기"로 격상. closed-loop 금물.

내일 "안정구간 자동 추출(데이터 선별기)" 구현 예정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 22:48:11 +09:00
windpacer
23a9202b91 feat: 일별 리포트 스크립트 + 10차 시운전 caveat
- daily_report.py: 지정 기간 일별 운전값(피드·스팀·비율·온도) + 생산맵 예측품질
  (predOP_MAE·within2%·OOD) 표. --prefix/--asset/--start/--end/--train-end.
  6-2차 4~5월 검증: 신뢰구간 OP MAE 0.89%, 고부하(OOD) 외삽으로 최대 -10%.
- run_column.py: 10차(101/102)는 본 dump 창 대부분 시운전(PROD 2~6%) 주석.
  2026-06 생산 진입 → 데이터 누적/최신 dump 재반입 시 정상 분석 대상.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 21:47:37 +09:00
windpacer
3a7c9d60c3 fix: 10차 reb_level/reflux_drum 매핑 정정 (LIA vs LICA 혼동)
10차는 리보일러 레벨이 LI-10111이 아니라 LIA-10111(10-1)/LIA-10211(10-2).
기존 예외가 이를 reflux_drum으로 잘못 라벨 → 정정:
- reb_level → LIA-10111/LIA-10211 (사용자 확정)
- reflux_drum → base 규칙 LICA-10113/LICA-10213 (실존, 리플럭스 드럼)

검증: 8개 컬럼 전부 16/16 해석(5차는 T_C=TI-5111B 대체로 T_B와 공유).
참고: reb_level·reflux_drum은 현재 FEATURES·startup 미사용(수집만).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 20:49:37 +09:00
windpacer
b45f0e2481 fix: 누락 솔벤트 컬럼 추가 (5차·9-2·10-2) + 5차 T_C 센서 부재 처리
run_column.py 실행목록에 빠졌던 컬럼 보완 — 전체 8개 측류 솔벤트 컬럼 커버:
- 5차(51/P5) 신규 추가: 완전 누락이었음. 민감단 TI-5111C 센서 부재(A/B/D만)
  → COLUMN_EXCEPTIONS["51"]에서 T_C를 TI-5111B로 대체(사용자 확정).
- 9-2(92), 10-2(102) 추가: COLUMN_EXCEPTIONS엔 있었으나 COLUMNS 실행목록 누락.

검증: 8개 컬럼 핵심 FEATURES 전부 해석 OK, 5차·9-2 추출 스모크 정상(336519행).
(플랜트8은 단일 train=81, 8-2 없음 확인.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 20:45:04 +09:00
windpacer
4306f76ddb feat: 형제 컬럼(6-2~10차) 분석 + SHUTDOWN + operator-assist + C# SteamAdvisor 포팅
- c6111_extract: roles_for() 동적 생성, COLUMN_EXCEPTIONS per-prefix
- c6111_prodmap/shadow/startup/rolling: --data/--prefix CLI 인자 지원
- run_column.py: 5개 컬럼 전 파이프라인 실행 래퍼
- c6111_shutdown.py: detect_cutoffs + shutdown_milestones (lookback 1200)
- c6111_operator_assist.py: OOD 게이트 + shadow 리플레이
- c6111_export_model.py: 선형근사 JSON export
- SteamAdvisor.cs: Predict+ClassifyMode+InEnvelope (NaN guard, Ood fix)
- SteamAdvisorController: GET/POST /api/steam/predict
- appsettings.json/Program.cs: DI 등록
- docs: 작업지시서 현황 갱신, 진단보고서 작성 (3 MED/8 LOW, 100% 정확도)
2026-06-05 19:46:57 +09:00
windpacer
1bc46b1eb0 feat: 6-1차 컬럼 학습형 제어 오프라인 분석 (생산맵·shadow·startup)
신암정유 6-1차 측류 솔벤트 컬럼(C-6111) 실데이터로 오퍼레이터 모방 제어 분석:

- 데이터 추출기 tag_frame() (field_hist WIDE 포맷 디코드) + 운전모드 분류
- ① 생산맵: 스팀유량=f(피드,제품,목표T_C) 운전점 GBM R²0.99 (steam/feed≈0.73)
- shadow 백테스트: in-envelope 오퍼레이터 OP 94% 모방, OOD 게이트→폴백
- 롤링 재학습: 새 로드레짐 적응 (5월 OP MAE 3.9→1.2%)
- 캠페인내 트림: 컬럼 자기제어, 피드백 미미 → 전향 맵이 제어 지배
- ② START-UP 절차: 레시피 + 제품컷인 트리거(reb-A 84.5℃, ΔT 2℃, 조건기반)

문서: 설계·진행 플랜 + 남은 작업(형제확장·shutdown·assist·live포팅) 작업지시서.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 17:33:17 +09:00
windpacer
62a9631fe6 feat: 컨트롤러 설정 생성 스크립트 + map_master 로더 + 스캔시간 측정
- build_controllers_config.py: gateway-config.json 생성
- load_map_master.py: hc900_map_master 테이블 적재
- measure_scan_time.py: HC900 스캔 시간 측정 유틸
2026-06-04 09:44:45 +09:00
windpacer
b4606fd91d docs: HC900 작업 문서 추가
- Controller.csv: 컨트롤러 설정 정보
- HC900-PID.txt: PID 파라미터 참조
- HW_Universal_Modbus/: HC900 Modbus 통신 매뉴얼
- 작업지시서-대소문자-DB정합성: 대소문자 DB 정합성 작업 지시
- WARNING-문제점: 프로젝트 이슈 트래킹
2026-06-04 09:44:42 +09:00
windpacer
5a49f12e71 feat: C1-C4 컨트롤러별 register-map 추가
Sinam_xlsx 기반 빌드 스크립트로 생성된 각 컨트롤러의 Modbus 레지스터 맵
2026-06-04 09:44:39 +09:00
windpacer
0d0a58923d docs: 컨트롤러별 태그매핑 규칙 문서 업데이트
- Sinam_Tag_all.xlsx + HC Designer CSV + build_register_map_from_sinam.py
  연계 설명 추가
- controller_id = xlsx Indexed Address prefix (C3/C4)
2026-06-04 09:43:57 +09:00
windpacer
78a532ae41 fix: hc900_map_master UNIQUE 인덱스 변경 + FF/Stream 컬럼 마이그레이션
- hc900_map_master: UNIQUE(tagname) → UNIQUE(controller_id, tagname)
  - 동일 태그명이 여러 컨트롤러에 존재 가능 (peer comms)
- ff_column_config: ALTER TABLE ADD COLUMN IF NOT EXISTS 10개 누락 컬럼
  (feed_tag, pressure_tag, level_tags, feed_filter_tau_sec 등)
- ff_stream_config: stream_key → key RENAME COLUMN + 12개 컬럼 추가
  (flow_tag, role, target_coeff, theta_up_sec, theta_dn_sec, tau_sec,
   sp_min, sp_max, rate_up_per_min, rate_dn_per_min, reflux_from_product, grade)
- EF Core HasIndex(tagname).IsUnique() → HasIndex(controller_id, tagname).IsUnique()
- GetSubArea/UpdateSubArea/DeletePoint: ToLowerInvariant 제거
  → OrdinalIgnoreCase 비교로 대체
2026-06-04 09:43:48 +09:00
windpacer
daeb5316a2 refactor: 태그 대소문자 register-map 기준 대문자로 전역 통일
- FeedforwardSupervisor: PvTag() ToUpperInvariant + empty FeedTag 가드
- FeedforwardConfigStore: 모든 ToLowerInvariant() 제거
- FeedRampAdvisorService: ToLowerInvariant 제거 + StringComparison.OrdinalIgnoreCase
- SimOverrideStore: ToLowerInvariant 제거
- Hc900RealtimeService: HealthCheck SERVING 판정, mapping 없는 태그 대소문자 유지
- PidExtractorService: ToLowerInvariant → OrdinalIgnoreCase 비교
- Hc900Entities: 주석 업데이트 (대문자 표준)
- load_state_labels.py: 소문자 변환 금지, controller_id 파라미터 추가
- Hc900Controllers: 대소문자 무시 정렬
- write.js: .MODE → AutoManState/RemLocSPState/SP_SelectState/TuneSetState
- setup.js/html: 중복 함수 제거, C5 컨트롤러 placeholder
2026-06-04 09:43:37 +09:00
windpacer
4348fb49f8 feat: C++ 게이트웨이 write_addr 지원 + 헬스체크 기반 연결 상태 판정
- RegisterEntry에 write_addr 필드 추가 (기본값=addr)
  - .MD 태그: LOOPSTAT(읽기) ↔ MODEIN(쓰기) 분리
- ReadRegister() 개별 호출 제거 (batch ReadAllRegisters로 대체 완료)
- ListTags 대소문자 무시 검색
- 소멸자/Stop null 체크 추가
- HealthCheck: SERVING 상태 반환
2026-06-04 09:43:18 +09:00
windpacer
f9f6a04054 feat: Sinam_xlsx 기반 register-map 재생성 + C1-C4 컨트롤러 추가
- register-map.json 재생성 (C3: 328→1974 registers)
  - .PV/.SP/.OP 등 suffix 추가, write_addr 필드 도입
  - LOOP_LAYOUT 기반 고정 레이아웃 전개 + 명명되지 않은 레지스터 보존
  - FC16 쓰기를 위한 write_addr 분리 (.MD는 LOOPSTAT 읽기/MODEIN 쓰기)
- build_register_map_from_sinam.py 리팩터
  - --controller 인자 추가 (C3/C4/C5 복수 컨트롤러 지원)
  - --validate-csv 옵션 추가 (HC Designer CSV 교차검증)
  - tag명 대문자 유지 (ToLower 금지)
  - 출력 경로 Path 객체 사용
- gateway-config.json: C1-C4 컨트롤러 설정 추가
2026-06-04 09:43:14 +09:00