Major project initialization and feature implementation: **Core Features:** - OPC UA client for Honeywell Experion HS R530 integration - Real-time data streaming and history data retrieval - Text-to-SQL query engine with TimeScaleDB - JSON-based node configuration system - SQLite database with migration support **Architecture:** - Clean architecture with Domain, Application, Infrastructure layers - ASP.NET Core Web API frontend - Web UI with real-time visualization - PKI-based OPC UA authentication (TLS) **Infrastructure Components:** - ExperionOpcClient: OPC UA connection management - ExperionRealtimeService: Real-time data streaming - ExperionHistoryService: Historical data queries - TextToSqlService: Natural language to SQL queries - SqlValidator: SQL injection prevention **Database:** - TimescaleDB integration (recommended) or SQLite fallback - Entity Framework Core with Extenstion methods - OPCTag, KeyValue tables for data storage **Security:** - Certificate-based OPC UA endpoint security - SSL/TLS encryption for database connections - Output param binding injection prevention **Testing:** - Unit tests for TextToSqlService and SqlValidator - Integration tests for Korean time range extraction See REVIEW_REQUEST.md for detailed code review information.
4.9 KiB
1. Experion Server에서 데이터를 리얼타임으로 가져와서 저장하는 테이블 만들기
-
1.1 RealtimeTable은 tagname, node_id, livevalue, timestamp 컬럼으로 구성되어야 함.
-
1.2 RealtimeTable node_map_master에서 조합 추출한다. SELECT * FROM node_map_master WHERE name IN ('pv', 'sp', 'op', 'qv', 'qv.value', 'qv.fieldvalue') AND data_type = 'Double'; 을 데이터 베이스 레코드로 삽입
-
1.3 tagname 컬럼은 2.항에서 추출된 레코드의 node_id 에서 오른쪽 끝에서 ':'문자를 만나기 전까지의 문자열로 채운다 (실제로 운전자가 사용하는 태그명이 된다.)
-
1.4 웹페이지 :테이블 만들기 기능은 별도의 웹페이지 '포인트빌더' 대시보드를 추가하여 구현한다. SELECT * FROM node_map_master WHERE name IN ('pv', 'sp', 'op', 'qv', 'qv.value', 'qv.fieldvalue') AND data_type = 'Double';의 항목을 선택하는 드롭다운 메뉴 항목을 name = 8개 data_type = 2개 (data_type 드롭다운 항목은 노드맵대시보드 페이지의 '데이터 타입'항목 참조) 테이블 작성하기 버튼
-
1.5 node_id 를 직접입력하여 수동 추가 하는 항목도 만들어줘
-
1.6 약 2000여개의 데이터 이므로 테이블 구조 설계를 잘해야 함
2. 실시간 opcUA 서버 데이터 를 RealtimeTable 레코드의 livevalue 컬럼에 넣는 로직만들기
- 2.1 opcUA 서버는 값이 변경되지 않으면 값을 주지 않는다, opcUA 통신 규약을 참조하여 실시간 데이터 업데이트 로직만들기
3. HistoryTable 만들기
- 3.1 위의 RealtimeTable의 실시간 값을 정해진 시간마다 시계열 데이터로 저장하는 HistoryTable을 만들어서 레코드 기록하는 로직만들기
4. HistoryTable의 웹페이지 추가
- 4.1 표시 테이블 컬럼은 드롭다운 으로 선택 , 한 테이블에 8개 까지 선택가능하게
- 4.2 시작 시간과 종료 시간 선택 한 범위내에서만 테이블에 표시
5. OPC UA 서버 기능 (Phase 1) — 완료
- 5.1
OPCFoundation.NetStandard.Opc.Ua.Server패키지 추가 - 5.2
ExperionOpcServerNodeManager— CustomNodeManager2 상속, Realtime 폴더에 태그별 변수 노드 생성 - 5.3
ExperionOpcServerService— StandardServer 기반, IHostedService + IExperionOpcServerService - 5.4 FlushLoop 500ms 배치 후 OPC 서버 노드 값 동시 갱신 (DB 폴링 없음)
- 5.5 포인트 NodeId → tagname 캐시 (
_pointCache) 추가 - 5.6 API: POST /api/opcserver/start·stop, GET /api/opcserver/status, POST /api/opcserver/rebuild
- 5.7 웹 UI: 08 OPC UA 서버 탭 (상태 카드, 시작/중지/재구성 버튼, 5초 폴링)
- 5.8 자동 재시작 플래그
opcserver_autostart.json(RealtimeService 패턴 동일) - 5.9 기존 클라이언트 인증서 재사용 (
ApplicationType.ClientAndServer) 포트: 기본 4841 (4840은 Experion HS R530이 사용 가능)
6. OPC UA 서버 기능 (Phase 2)
-
6.1 Historical Access (HA) 구현 -
ExperionOpcServerNodeManager에IHistoricalDataAccess구현 -ReadRaw()→QueryHistoryAsync()→history_table조회 후 반환 - 각 Realtime 노드에Historizing = true설정 - TimescaleDB가 이미 설치되어 있어 대용량 이력도 고성능 처리 가능 -
6.2 포인트빌더 빌드 시 주소 공간 자동 재구성 -
ExperionPointBuilderController의Build엔드포인트에서_opcServer.RebuildAddressSpace(points)자동 호출 - 현재는 UI에서 수동 "↺ 주소공간 재구성" 버튼으로만 동작 -
6.3 Username/Password 인증 추가 -
appsettings.json의AllowedUsernames/AllowedPasswords를 실제 검증 로직에 연결 -ExperionOpcServerService.BuildServerConfig()에 UserNameToken 유효성 검사기 등록 -
6.4 보안 정책 활성화 (Basic256Sha256) -
appsettings.json에서EnableSecurity: true로 설정 시 SignAndEncrypt 엔드포인트 자동 활성화 (코드는 이미 구현됨) - 클라이언트 인증서 신뢰 관리 UI 검토 -
6.5 연결 클라이언트 목록 웹 UI - 접속 중인 클라이언트 IP, 세션 ID, 구독 수를 웹 UI에 표시 -
_server.CurrentInstance.SessionManager.GetSessions()활용
7. Nvidia DGX Spark 로 이전
- 7.1 vscode + roo code + Qwen3.6-32B-A3B로 개발환경 구축
- git clone 후 Text to SQL 기능 추가 — 스키마 수정 완료 (measurements → history_hypertable, time → recorded_at, value 캐스팅 추가)
- Text to SQL 서비스 node_map_master 테이블 참조로 수정
- PostgreSQL + BRIN + B-Tree + TimescalDB 로 시계열 데이터베이스 도커에 설치 아니면 다시 설치
- 기존 iiot-timescaledb 컨테이너에 실행되고 있는애 일단 컨테이너 내려놓고