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
windpacer
e0598f5775
docs: 사내 git 서버 클론 주소 추가
...
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-03 20:34:28 +09:00
windpacer
16fc7a2598
Initial commit: HC900 Crawler
...
Honeywell HC900을 Modbus TCP로 직접 폴링 → gRPC → C# 크롤러 → PostgreSQL.
기존 Experion OPC UA 데이터 경로를 HC900 직접 통신으로 대체.
- industrial-comm/cpp: C++ Modbus 게이트웨이 (gRPC 서버)
- src: C# .NET 8 ASP.NET Core 크롤러 + 웹 UI (3-Layer)
- mcp-server: Python FastMCP (RAG/NL2SQL/P&ID)
- 다중 컨트롤러(N-Controller) 지원
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-03 20:28:14 +09:00