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