Files
HC900-Crawler/docs/작업지시서-민감단제어-UI추가.md
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

6.3 KiB

작업지시서 — 민감단(T_C) 전환·복귀 제어 UI 추가 (2026-06-06)

⚠️ 진단 결과 (diagnosis-checklist.md 기준, 2026-06-06)

1. MapConfig에서 TcReturnTcTarget/TcReturnTcBand 누락 (MED)

문제: MapConfig API 응답 매핑(FeedforwardController.cs:199-233)에서 tcReturnTcTarget, tcReturnTcBand 2개 누락. 나머지 5개는 매핑됨. 근거: FeedforwardController.cs:219-223tcReturnRebTarget/Band, tcReturnDeltaAdRef/Band, tempLowLimit은 포함되지만 tcReturnTcTarget/Band 없음. 영향: UI 설정 폼 재로드 시 이 2개 필드의 값이 손실. (엔진 게이트는 ConfigStore→ColumnConfig에서 직접 읽으므로 게이트 동작에는 영향 없음.) 수정: MapConfig 객체에 tcReturnTcTarget, tcReturnTcBand 2줄 추가.

2. 작업2 — Mode/ModeReason 이미 존재 (진단 오류 수정)

AdvisoryResultMode(FeedforwardModels.cs:131)와 ModeReason(:132)가 이미 존재하며 MapColumn에서 mode, modeReason으로 노출됨. 모드 배지(Normal/Recovering/Returning) + 사유 표시는 지금 당장 구현 가능. 실제로 없는 것은 EnteredByTcLow와 게이트 개별 진척(rebInBand 등)뿐이며, 이는 체크리스트(부가기능)에만 필요. 작업지시서가 이미 "advisory 응답에 Mode/사유 필드 있는지 확인, 없으면 확장 선행"이라 명시한 조건부 항목.

3. 작업3 — StartFeedRamp 업램프 전용 체크 (MED, 타당)

문제: FeedRampCalculator는 하강을 완전 지원하지만, StartFeedRamp 핸들러(FeedforwardController.cs:267-268)가 if (body.targetFeed <= adv.CurrentFeed) return BadRequest("업램프만 지원")로 하강 차단. 영향: 운전원이 하강 램프 시작 시 400 Bad Request. 수정: 체크 제거 + ff.js 방향 자동 판정 + 확인 문구 방향별 변경.

요약

작업 실제 상태 수정 필요
작업1 (설정 폼) MapConfig에서 TcReturnTcTarget/Band 2줄 누락 FeedforwardController.cs 2줄 추가
작업2 (상태 감시) Mode/ModeReason 이미 존재 → 모드 배지 즉시 구현 가능 게이트 체크리스트용 EnteredByTcLow 등 추가는 선택
작업3 (하강 램프) StartFeedRamp 업램프 전용 체크 존재 FeedforwardController.cs:267-268 체크 제거

백엔드 완료(작업플랜-민감단온도-전환복귀제어.md): 엔진 상태기계·복귀 게이트 3버그 수정 + config 풀스택(DB/ConfigStore) 연결됨. 남은 것 = 운전원이 파라미터를 설정/감시하는 UI. 대상 wwwroot/panes/ff.html · wwwroot/js/ff.js.

0. 현 상태

  • 백엔드: ColumnConfigTempLowLimit·TcReturnRebTarget/Band·TcReturnDeltaAdRef/Band·TcReturnTcTarget/Band 존재. DB 왕복(ff_column_config 컬럼 + ConfigStore SELECT/INSERT/UPDATE) 완료.
  • 엔진: sigTLow(T_C 하한 전환류 트리거) + 복귀 게이트(reb in-band & ΔT(A-D) 안정 & T_C in-band) + EnteredByTcLow 진입원인 분기 동작.
  • UI: ff-cfg-list(설정 폼, ff.js 동적 렌더) + advisory 화면 존재. 새 필드·상태표시 미반영.

작업 1 — 설정 폼에 민감단 파라미터 추가 [우선순위 1]

대상: ff.jsffLoadConfig/config 렌더(ff-cfg-list) + config 저장 API 바디. 추가 입력 필드(컬럼별):

  • TempLowLimit(T_C 하한 트리거, ℃ raw. 비활성 -1e9)
  • TcReturnTcTarget(T_C 목표온도 ℃, reb-A와 다름) · TcReturnTcBand(±폭, 기본 1.0)
  • TcReturnRebTarget(reb-A 복귀목표) · TcReturnRebBand(기본 0.5)
  • TcReturnDeltaAdRef(ΔT(A-D) 기준) · TcReturnDeltaAdBand(기본 0.4) 검증: 저장→재로드 시 값 유지(DB 왕복). NaN 필드는 빈칸 표시(비활성). 주의: ★TcReturnTcTarget은 T_C(민감단) 목표 — reb-A 목표와 혼동 금지(별 입력란·라벨 명확히). 미설정 시 T_C in-band 게이트 비활성(안전). 제안 보조: 온도프로파일 c{prefix}_tempref.json의 매칭제품 median을 target 기본값으로 자동제안 버튼(/api/steam/tempprofile/{col} 재활용).

작업 2 — 상태기계(ColumnMode) 감시 표시 [우선순위 2]

대상: ff advisory 화면 + /api/ff/advisory 응답(AdvisoryResult.Mode 등). 표시:

  • 현재 모드 배지: Normal / Recovering(전환류) / Returning(복귀램프) — 색상 구분(정상 녹색·전환류 주황·복귀 파랑).
  • 전환류 진입 시 사유(SeverityText: 온도LOW/온도HIGH/ΔP플러딩 등) + 진입원인이 T_C 하한인지(EnteredByTcLow) 노출.
  • 복귀 게이트 진척: reb in-band·ΔT(A-D) 안정·T_C in-band 각 충족 여부 체크리스트(운전원이 "왜 아직 복귀 안 하나" 파악). 검증: 모드 전이 시 배지·사유 실시간 갱신. (Mode/ModeReason 이미 advisory 응답에 존재.)

작업 3 — 하강 램프 UI [우선순위 3]

대상: ff-ramp(램프 계산기) + /api/ff/feed-ramp. 현 상태: FeedRampCalculator가 상승/하강 양방향 구현됨. StartFeedRamp 업램프 전용 체크 제거됨. UI는 상승 전제. 추가: targetFeed < currentFeed 입력 시 하강 램프로 자동 인식, 방향 배지(↑상승/↓하강) + 하강 rate 표시. 확인 다이얼로그 문구 "올립니다"→방향별("내립니다"). 검증: 하강 타겟 입력 시 하강 시간/rate 산출, 방향 표기 정확.

작업 4 (선택) — T_C 유지 advisory 표시

대상: STEAM advisory(steam.js) 또는 ff 화면. 표시: 현재 T_C vs target 편차, 모듈1 제안 steam OP(디커플링), 편차 추세. (모듈1 백엔드 구현 후.)

권장순서 / 의존

작업1(설정) → 작업2(상태감시) → 작업3(하강램프) → 작업4(선택, 모듈1 의존). 작업2는 Mode/ModeReason이 이미 advisory 응답에 존재 → 모드 배지·사유 표시 즉시 구현 가능. 게이트 개별 진척 체크리스트는 AdvisoryResultEnteredByTcLow/RebInBand/DeltaAdStable/TcInBand 필드 추가 후 구현.

주의(공통)

  • advisory-only·개별 follow 존중(자동 write 강제 금지).
  • 9·10차(C4 미연결)는 설정·백테스트만, 라이브 상태표시는 6차(C3) 우선.
  • T_C target은 제품전환(bimodal) 시 재설정 필요 — tempref 제품 선택과 연동.