209 lines
9.4 KiB
Plaintext
209 lines
9.4 KiB
Plaintext
# AgentNILM MQTT Client 시스템 운영 및 개발 매뉴얼
|
|
|
|
---
|
|
|
|
## 1. 개요 (System Overview)
|
|
|
|
**AgentNILM MQTT Client**는 전력 분해/모니터링(NILM: Non-Intrusive Load Monitoring) 센서 디바이스로부터 MQTT 프로토콜을 통해 실시간 계측 데이터를 수신하고, 이를 파싱하여 **PostgreSQL 데이터베이스 저장**, **OPC 서버 메모리 쓰기(PLC 연동)**, **실시간 화면 모니터링**, **히스토리 이력 관리 및 트렌드 차트 분석**을 수행하는 통합 에이전트 프로그램입니다.
|
|
|
|
### 📌 주요 특징
|
|
- **개발 환경**: Delphi 13 (Athens) VCL Application
|
|
- **통신 프로토콜**: MQTT (Client), OPC DA / UA (Server Writer), PostgreSQL (FireDAC)
|
|
- **전력 결선 방식 지원**: 3상 4선식 (3P4W, 220V 계통), 3상 3선식 (3P3W, 380V 계통), 단상 (Single Phase)
|
|
- **고성능 데이터 처리**: 실시간 UPSERT(`nilm_data`), 시계열 이력 저장(`nilm_data_history`), 누적 전력량(Wh) 수치 적분 계산
|
|
|
|
---
|
|
|
|
## 2. 시스템 아키텍처 및 데이터 흐름
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
A[NILM 센서 디바이스] -->|MQTT Publish| B[MQTT Broker]
|
|
B -->|Subscribe| C[AgentNILM Client]
|
|
|
|
C -->|실시간 갱신 & 누적 연산| D[(PostgreSQL DB)]
|
|
C -->|태그/메모리 쓰기| E[OPC Server / PLC]
|
|
C -->|UI 렌더링| F[VCL 화면 GUI]
|
|
|
|
subgraph UI Features
|
|
F1[실시간 모니터링 그리드]
|
|
F2[디바이스 설정 관리]
|
|
F3[트렌드 차트 분석]
|
|
F4[히스토리 이력 조회]
|
|
end
|
|
F --> UI Features
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 화면별 상세 기능 및 조작 가이드
|
|
|
|
### 3.1 상단 연결 및 전역 제어 바
|
|
- **Broker IP / Port / Client ID**: MQTT 브로커 연결 정보 설정
|
|
- **Auto Start 체크**: 프로그램 실행 시 자동으로 브로커 연결 및 구독 시작
|
|
- **Log View / Log Save 체크**: 로그 리치에디트 표시 및 일자별 텍스트 파일 저장 활성화
|
|
- **DB 자동 저장 (chkAutoSaveDB)**: MQTT 수신 데이터를 PostgreSQL에 실시간/이력 저장할지 여부 제어
|
|
|
|
---
|
|
|
|
### 3.2 탭 1: 모니터링 (실시간 데이터)
|
|
등록된 모든 NILM 디바이스의 최신 계측 상태를 한눈에 모니터링합니다.
|
|
|
|
| 컬럼 번호 | 컬럼명 | 설명 | 비고 |
|
|
| :--- | :--- | :--- | :--- |
|
|
| **0** | No | 행 번호 | 1부터 시작 |
|
|
| **1** | Device ID | 장비 식별 번호 | 고유 ID |
|
|
| **2** | Device Name | 장비명 | 디바이스 별칭 |
|
|
| **3** | Comm Status | 통신 상태 | 0: 정상, 기타: 통신 이상 |
|
|
| **4** | Phase Type | 결선 방식 | 3P4W, 3P3W, SINGLE |
|
|
| **5 ~ 7** | PF (A, B, C) | 역률 (Power Factor) | 각 상별 역률 (-1.000 ~ 1.000) |
|
|
| **8 ~ 10** | Vrms (A, B, C) | 전압 실효값 (V) | 3P4W: 220V급 선간, 3P3W: 380V급 상간 |
|
|
| **11 ~ 13** | Irms (A, B, C) | 전류 실효값 (A) | 각 상별 RMS 전류 |
|
|
| **14 ~ 16** | Active P (A, B, C) | 유효전력 (W) | 각 상별 유효전력 소비량 |
|
|
| **17 ~ 19** | Reactive P (A, B, C) | 무효전력 (Var) | 각 상별 무효전력 |
|
|
| **20 ~ 22** | Apparent P (A, B, C) | 피상전력 (VA) | 각 상별 피상전력 |
|
|
| **23** | Temp (°C) | 내부 온도 | 내부 센서 계측 온도 |
|
|
| **24** | Energy_Day (Wh) | 당일 누적 전력량 | 00:00부터 현재까지의 적분 전력량 |
|
|
| **25** | Last Received | 최종 수신 시각 | YYYY-MM-DD HH:NN:SS |
|
|
|
|
> [!TIP]
|
|
> **핵심 항목 집중 뷰**: 현장 관제 편의성을 위해 고조파(THD), 진동 등 부가 항목을 제외하고 전력 관리에 필수적인 핵심 24개 데이터 필드만을 최적화하여 표시합니다.
|
|
|
|
---
|
|
|
|
### 3.3 탭 2: NILM 디바이스 설정
|
|
NILM 센서 장비의 등록, 수정, 삭제 및 가동 판단 임계값을 관리합니다.
|
|
|
|
#### 주요 설정 항목
|
|
1. **기본 정보**: 장비 ID, 장비명, 설치 위치, MQTT Topic, 활성 여부
|
|
2. **결선 방식 (Phase Type)**:
|
|
- **3상 4선식 (3P4W)**: R, S, T, N 4선 사용. 선간전압(R-N, S-N, T-N) 측정, 공칭 220V RMS 기준
|
|
- **3상 3선식 (3P3W)**: R, S, T 3선 사용. 상간전압(R-S, S-T, T-R) 측정, 공칭 380V RMS 기준
|
|
- **단상 (SINGLE)**: 단상 L-N 측정
|
|
3. **가동 판정 파라미터**:
|
|
- **대상 상 (Target Phase)**: L1, L2, L3, 또는 3상 평균(AVG)
|
|
- **꺼진 기준 전류 (Off Current)**: 설비 정지 상태 판정 기준 전류(A)
|
|
- **가동 기준 전류 (Run Current)**: 설비 가동 상태 판정 기준 전류(A)
|
|
- **가동 기준 PF (Run Power Factor)**: 가동 상태 판정 역률 기준
|
|
|
|
---
|
|
|
|
### 3.4 탭 3: 트렌드 분석 (Trend Chart)
|
|
시간 경과에 따른 전력 파라미터 변화를 시각적인 그래프로 분석합니다.
|
|
|
|
- **조회 대상 장비**: 등록된 디바이스 선택
|
|
- **조회 기간**: 시작 일시 ~ 종료 일시 설정
|
|
- **선택 상 (Phase)**: L1, L2, L3 중 분석할 상 선택
|
|
- **표시 계측 항목 체크박스**:
|
|
- `pf`: 역률 (주황색 선)
|
|
- `voltage`: 전압 실효값 (빨간색 선)
|
|
- `current`: 전류 실효값 (초록색 선)
|
|
- `Var`: 무효전력 (자주색 선)
|
|
- `Va`: 피상전력 (청록색 선)
|
|
- `W`: **유효전력** (파란색 선)
|
|
|
|
---
|
|
|
|
### 3.5 탭 4: 히스토리 로그 검색
|
|
`nilm_data_history`에 적재된 시계열 원시 데이터를 조회하고 CSV 등으로 분석할 수 있습니다.
|
|
- 특정 장비 및 일자 구간 지정 검색
|
|
- 최대 조회 건수(Max Rows) 제한 기능 지원
|
|
|
|
---
|
|
|
|
### 3.6 로그 창 (하단)
|
|
- **MQTT Log**: 브로커 접속, Topic 구독(Subscribe), 메시지 수신 이벤트
|
|
- **DB Log**: PostgreSQL 연결, 실시간 데이터 UPSERT, 일자별 이력 INSERT 오류 로그
|
|
- **OPC Log**: OPC Server 연결 상태, 태그 쓰기 결과 및 타임아웃/통신 실패 로그
|
|
|
|
---
|
|
|
|
## 4. 데이터 통신 및 포맷 규격
|
|
|
|
### 4.1 MQTT JSON 수신 데이터 규격
|
|
NILM 디바이스는 설정된 토픽으로 다음과 같은 JSON 페이로드를 브로드캐스트합니다.
|
|
|
|
```json
|
|
{
|
|
"seq": 1024,
|
|
"pre_seq": 1023,
|
|
"comm_status": 0,
|
|
"vrms_a": 220.5,
|
|
"vrms_b": 221.2,
|
|
"vrms_c": 219.8,
|
|
"irms_a": 15.32,
|
|
"irms_b": 14.85,
|
|
"irms_c": 15.01,
|
|
"active_power_a": 3200.5,
|
|
"active_power_b": 3120.0,
|
|
"active_power_c": 3180.2,
|
|
"reactive_power_a": 450.1,
|
|
"reactive_power_b": 420.3,
|
|
"reactive_power_c": 440.0,
|
|
"apparent_power_a": 3232.0,
|
|
"apparent_power_b": 3148.1,
|
|
"apparent_power_c": 3210.5,
|
|
"power_factor_a": 0.99,
|
|
"power_factor_b": 0.99,
|
|
"power_factor_c": 0.99,
|
|
"temperature": 32.5,
|
|
"tempExt": 0.0,
|
|
"accX": 0.01,
|
|
"accY": 0.02,
|
|
"accZ": 0.98,
|
|
"vibration": 0.05,
|
|
"gyroX": 0.0,
|
|
"gyroY": 0.0,
|
|
"gyroZ": 0.0,
|
|
"tiltAngle": 1.2
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 4.2 OPC Server 연동 규칙
|
|
- NILM에서 수신된 실시간 전력 데이터(`vrms`, `irms`, `active_power`, `reactive_power`, `apparent_power`, `power_factor` 등)를 PLC/OPC 서버 메모리 블록(예: `GW`, `GB` 영역)에 매핑하여 주기적으로 쓰기를 수행합니다.
|
|
- 주소 범위 부족 시 그룹당 32개 주소 이상(예: 34개) 확장 구성 지원.
|
|
|
|
---
|
|
|
|
## 5. 데이터베이스 구조 (PostgreSQL)
|
|
|
|
### 5.1 `nilm_device` (디바이스 메타 테이블)
|
|
| 컬럼명 | 데이터 타입 | 설명 |
|
|
| :--- | :--- | :--- |
|
|
| `device_id` | INTEGER (PK) | 디바이스 고유 ID |
|
|
| `device_name` | VARCHAR(100) | 디바이스 명칭 |
|
|
| `location` | VARCHAR(100) | 설치 위치 |
|
|
| `phase_type` | VARCHAR(20) | `3P4W` / `3P3W` / `SINGLE` |
|
|
| `mqtt_topic` | VARCHAR(255) | 구독 대상 토픽 |
|
|
| `is_active` | BOOLEAN | 사용 여부 |
|
|
| `op_target_phase` | VARCHAR(10) | 판정 기준 상 (`L1`, `L2`, `L3`, `AVG`) |
|
|
| `op_threshold_off_current` | NUMERIC | 꺼짐 기준 전류(A) |
|
|
| `op_threshold_run_current` | NUMERIC | 가동 기준 전류(A) |
|
|
| `op_threshold_pf` | NUMERIC | 가동 기준 역률 |
|
|
|
|
---
|
|
|
|
### 5.2 `nilm_data` (실시간 최신 상태 - 1 Device 당 1 Row)
|
|
`device_id`를 Unique Key로 가지며, 새로운 패킷이 수신될 때마다 `ON CONFLICT (device_id) DO UPDATE`로 실시간 최신값을 갱신합니다.
|
|
|
|
### 5.3 `nilm_data_history` (시계열 이력 테이블)
|
|
초/분 단위 수신 데이터가 지속적으로 누적 저장되는 시계열 이력 데이터입니다.
|
|
- **적분 전력량 계산**: `CalculateEnergyConsumption` 프로시저가 이 테이블의 이전 레코드와의 시각 차이(`LAG(received_at)`)와 유효전력(`active_power_a/b/c`)을 이용해 당일 누적 Wh를 산출합니다.
|
|
|
|
---
|
|
|
|
## 6. 유지보수 및 트러블슈팅 가이드
|
|
|
|
### Q1. `ERROR: column "w_l1" does not exist` 발생 시
|
|
- **원인**: 과거 버전의 쿼리가 구 컬럼명(`w_l1`, `va_l1`, `var_l1`)을 호출할 때 발생.
|
|
- **조치**: `uNILMManager.pas`의 `CalculateEnergyConsumption` 및 `QueryHistoryData`가 신규 스키마(`active_power_a`, `apparent_power_a`, `reactive_power_a`)로 수정되어 있으므로 컴파일 및 재빌드를 수행합니다.
|
|
|
|
### Q2. `Exception EClassNotFound: Class TChart not found` 발생 시
|
|
- **원인**: `uMain.dfm`의 `Chart_Main` 컴포넌트명과 `uMain.pas`의 클래스 선언 변수명이 일치하지 않을 때 발생.
|
|
- **조치**: `uMain.pas` 선언부의 차트 변수명이 `Chart_Main: TChart;`로 등록되어 있는지 확인합니다.
|
|
|
|
### Q3. 3상 3선식(3P3W)과 3상 4선식(3P4W) 전압 표기가 다를 때
|
|
- **설명**: 3상 4선식은 220V RMS 선간전압(R-N, S-N, T-N)을 기준으로 하고, 3상 3선식은 380V RMS 상간전압(R-S, S-T, T-R)을 기준으로 계측하는 것이 정상 동작입니다. 디바이스 설정 폼에서 결선 방식을 올바르게 선택했는지 확인하십시오.
|