# [기획/설계] 전류 전용(1-CT, 전압 미연결) 환경의 가상 전력값 계산 및 시스템 적용 방안 ## 개요 현장 여건상 전압선을 결선하지 않고 CT 센서를 1개 채널에만 연결한 설비(`measure: "I_ONLY_1CH"`)의 경우, 전압(`v`)과 전력(`p`, `q`, `s`, `pf`)이 `null`로 수신되어 화면 및 OPC Server, DB에 전력량이 산출되지 않는 문제가 발생합니다. 본 계획은 **기존의 정상적인 3P3W / 3P4W 다채널 전압·전류 계측 방식은 100% 그대로 유지**하면서, 전압이 없고 CT가 1개만 달린 설비에 대해 **공칭 전압(Nominal Voltage)과 기준 역률(Assumed Power Factor)을 기반으로 유효전력(W), 피상전력(VA), 무효전력(Var) 및 누적 전력량(Wh)을 정밀 추정/계산**할 수 있는 아키텍처 및 구현 방안을 제시합니다. --- ## 1. 전력 계산 수식 및 알고리즘 설계 ### 1.1 가상 전력 산출 공식 현장 부하의 성격(단상 부하 vs 3상 평형 부하)에 따라 장비 설정에서 선택할 수 있도록 설계합니다. 1. **단상 부하 (Single Phase Load) 추정 방식**: - $V_{est} = V_{nominal}$ (설정된 공칭 전압, 예: 220V) - $PF_{est} = PF_{assumed}$ (설정된 기준 역률, 예: 0.90) - **유효전력 (Active Power, W)**: $$P = V_{nominal} \times I \times PF_{assumed}$$ - **피상전력 (Apparent Power, VA)**: $$S = V_{nominal} \times I$$ - **무효전력 (Reactive Power, Var)**: $$Q = \sqrt{\max(S^2 - P^2, 0)}$$ 2. **3상 평형 부하 (3-Phase Balanced Load) 추정 방식**: - 3상 모터/히터 등 3상 부하에 CT 1개만 물려있는 경우 (3상 전류가 평형을 이룬다고 가정): - $V_{line} = V_{nominal}$ (설정된 공칭 선간 전압, 예: 380V 또는 220V) - **전체 유효전력 (Total Active Power, W)**: $$P_{total} = \sqrt{3} \times V_{line} \times I \times PF_{assumed} \approx 1.732 \times V_{line} \times I \times PF_{assumed}$$ - **전체 피상전력 (Total Apparent Power, VA)**: $$S_{total} = \sqrt{3} \times V_{line} \times I$$ - **전체 무효전력 (Total Reactive Power, Var)**: $$Q_{total} = \sqrt{\max(S_{total}^2 - P_{total}^2, 0)}$$ --- ## 2. 자동 감지 및 적용 우선순위 흐름도 ```mermaid flowchart TD Start[MQTT 측정 데이터 수신] --> ChkNormal{정상 전압/전력 데이터가 존재하는가?} ChkNormal -- 예 (v > 0 또는 p > 0) --> NormalMode[기존 정상 모드: 3P3W / 3P4W 센서 계측값 그대로 사용] ChkNormal -- 아니오 (v=null, i>0 만 존재) --> ChkConfig{장비 설정에 가상 전력 계산이 활성화되었는가?} ChkConfig -- 활성화 --> CalcVirtual[공칭전압 V 및 기준역률 PF를 적용하여 P/Q/S 계산] ChkConfig -- 비활성화 (기본값) --> AutoFallback[기본 220V, PF 0.90 기반 단상/3상 가상 전력 자동 계산] CalcVirtual --> UpdatePipeline[화면 그리드 표출, OPC Server 태그 쓰기, DB UPSERT 및 수치적분 누적] AutoFallback --> UpdatePipeline NormalMode --> UpdatePipeline ``` --- ## 3. 세부 컴포넌트별 구현 계획 ### 3.1 [uNILMTypes.pas] 데이터 타입 확장 - `TNILMDevice` 레코드에 가상 전력 계산용 파라미터 추가: - `IsEstimatePower: Boolean` (가상 전력 계산 사용 여부, 기본: True) - `NominalVoltage: Double` (공칭 전압, 기본: 220.0 V) - `AssumedPF: Double` (가정 역률, 기본: 0.90) - `EstimateWiring: string` (`'SINGLE'` / `'3PHASE_BALANCED'`) ### 3.2 [uNILMDeviceForm.pas] 장비 설정 UI 확장 - 장비 추가/수정 창에 **[전류 전용 전력 추정 설정]** 그룹박스 추가: - `체크박스`: 전압 미연결 시 가상 전력 자동 계산 사용 - `공칭 전압(V)` 입력: 220V, 380V, 440V 등 (기본 220V) - `기준 역률(PF)` 입력: 0.50 ~ 1.00 (기본 0.90) - `추정 결선 방식`: 단상($V \times I$) vs 3상 평형($\sqrt{3} \times V \times I$) ### 3.3 [uNILMManager.pas] DB 스키마 마이그레이션 - `nilm_device` 테이블에 설정 컬럼 자동 추가: ```sql ALTER TABLE nilm_device ADD COLUMN IF NOT EXISTS is_estimate_power BOOLEAN DEFAULT TRUE; ALTER TABLE nilm_device ADD COLUMN IF NOT EXISTS nominal_voltage DOUBLE PRECISION DEFAULT 220.0; ALTER TABLE nilm_device ADD COLUMN IF NOT EXISTS assumed_pf DOUBLE PRECISION DEFAULT 0.90; ALTER TABLE nilm_device ADD COLUMN IF NOT EXISTS estimate_wiring VARCHAR(20) DEFAULT 'SINGLE'; ``` ### 3.4 [uMain.pas] 실시간 수신 및 OPC/UI 파이프라인 적용 - `NILM_SaveMQTTData` 내 처리 로직: 1. `ch[0..2]` 중 $I > 0$ 이고 $V \le 0$ (또는 null)인 채널을 감지. 2. 해당 채널의 `v`를 `NominalVoltage`, `pf`를 `AssumedPF`로 보정. 3. 설정된 추정 방식(단상 vs 3상 평형)에 따라 `p`, `q`, `s` 및 `total.p/q/s/pf` 연산. 4. 가동 상태(`OpStatus`) 판정: 수신된 유효 전류값($I$)과 설정된 임계치로 정상 판정 (0: 꺼짐, 1: 대기, 2: 가동). 5. OPC Server (`total_p`, `active_power_a`, `vrms_a`, `power_factor_a`, `OpStatus` 등) 및 실시간 그리드에 정상 표출. 6. PostgreSQL DB 및 당일 누적 전력량(`Energy_Day`) 수치적분 쿼리에 정상 반영. --- ## 4. 사용자 검토 및 확인 필요 사항 > [!IMPORTANT] > **기본값 제안**: > 1. 기본 공칭 전압: **220 V** (현장 설비가 380V 계통인 경우 장비 설정창에서 380V로 변경 가능) > 2. 기본 가정 역률: **0.90** (일반 산업용 모터/부하 표준 역률 0.85~0.92) > 3. 추정 결선 방식 기본값: **단상(Single)** 또는 **3상 평형(3-Phase Balanced)** 중 주로 사용하시는 기본 형태를 지정해 주시면 적용하겠습니다. 위 계획대로 구현을 진행해도 좋을지 검토 부탁드립니다. 승인해 주시면 즉시 코드 및 UI 구현을 진행하겠습니다.