SungjuNewPrime/NILM_Agent/AgentNILM_MQTTClient(Delphi13 VCL)/Docs/20260821_1_[기획설계] 전류 전용(1-CT, 전압 미연결) 환경의 가상 전력값 계산 및 시스템 적용 방안.txt
2026-09-04 11:15:47 +09:00

99 lines
5.8 KiB
Plaintext

# [기획/설계] 전류 전용(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 구현을 진행하겠습니다.