DNP3 — 전력 / Utility 표준
DNP3 (Distributed Network Protocol v3) 는 전력회사 / 수도 / 가스 같은 utility SCADA 에서 가장 널리 쓰이는 프로토콜입니다. RTU / IED 와 SCADA master 사이의 통신 표준이며, 시각 동기 (time-stamped events) 와 신뢰성 있는 보고 (unsolicited responses) 가 핵심 특징입니다.
등록 폼 입력값
| 입력 칸 | 무엇을 적나요 | 예시 |
|---|---|---|
| IP 주소 | RTU / IED 의 IP | 192.168.0.120 |
| 포트 | DNP3 TCP 포트 | 20000 (표준) |
| Master 주소 (master-address) | 게이트웨이 (master) 자기 주소 | 1 |
| Outstation 주소 (outstation-address) | 상대 (slave) 의 DNP 주소 | 10 |
| 응답 타임아웃 (request-timeout) | 응답 대기 (ms) | 5000 |
| Unsolicited (enable-unsolicited) | RTU 의 자발 송신 (push) 활성화 — driver 가 cache 후 read() 시 우선 반환 | all / 1 / 2 / 3 / 1,2 (기본 비움 = 미사용) |
DNP3 는 master 주소 / outstation 주소가 양쪽 다 일치 해야 합니다. RTU 측 설정 (보통 ABB / SEL / GE 의 IED 설정 도구) 에서 “Source Address” 와 “Destination Address” 가 게이트웨이의 master/outstation 과 짝을 이루는지 확인하세요.
태그의 PLC 주소 표기
DNP3 는 Group / Variation / Index 로 데이터 포인트를 식별합니다. 흔한 group:
| Group | 종류 | 비고 |
|---|---|---|
| 1 | Binary Input (BI) | 차단기·접점 상태 등 |
| 10 | Binary Output (BO) | 출력 상태 |
| 20 | Counter | 누적 카운터 |
| 30 | Analog Input (AI) | 전류·전압·온도 — 가장 흔함 |
| 40 | Analog Output (AO) | 출력 setpoint |
| 41 | Analog Output Block (write 대상) | setpoint 쓰기 |
게이트웨이에서는 g<group>v<variation>.<index> 또는 class<n> 형식으로 입력합니다.
| 표기 | 의미 |
|---|---|
g30v1.5 | Analog Input, var 1 (32-bit + flag), index 5 |
g30v5.5 | Analog Input, var 5 (Float), index 5 |
g1v2.0 | Binary Input, var 2 (with flag), index 0 |
g20v1.0 | Counter, 32-bit, index 0 |
class0 | Class 0 polling (정적 데이터 전체 스캔) |
class1 | Class 1 events (이벤트성 변화) |
프로젝트 초기 단계에서 “일단 다 가져와보고 싶다” 면 class0 으로 한 번에 받은 뒤, 필요한 포인트만 골라 g30v... 로 정밀 등록하시는 게 편합니다.
데이터 형식 매칭
| Group | 데이터 형식 | 형식 보조 |
|---|---|---|
| g1 (BI) | Boolean | (비움) |
| g30v1 (AI 32-bit signed) | Integer | DW |
| g30v2 (AI 16-bit signed) | Integer | (비움) |
| g30v5 (AI float) | Float | REAL |
| g30v6 (AI double) | Double | LREAL |
| g20v1 (Counter 32-bit) | Integer | DW |
쓰기 (Write) 지원
DNP3 outstation 의 쓰기 대상은 보통 두 가지입니다.
| 표기 | 의미 |
|---|---|
g41v1.5 | Analog Output Block 32-bit signed setpoint, index 5 |
g41v3.5 | Analog Output Block float setpoint, index 5 |
g12v1.0 | Control Relay Output Block (CROB) — 차단기 trip/close 등 |
g12 (CROB) 는 차단기 / 릴레이를 직접 동작 시킵니다. 운영 환경에서는 반드시 select-before-operate 절차와 권한 확인 후 사용하세요.
흔한 문제와 해결
| 증상 | 가능한 원인 | 해결 |
|---|---|---|
| “No reply” | 주소 mismatch | master / outstation 주소 양쪽 다 확인 |
| 모든 값 0 또는 stale | unsolicited 미수신, link layer 문제 | class0 으로 명시적 polling 시도 |
| “Object not found” | 잘못된 group/variation | RTU 의 “DNP point map” 문서 확인 |
| 시간이 한참 어긋남 | DNP3 timestamp UTC vs 로컬 | 게이트웨이가 UTC 로 받음. 표시단에서 변환 |
Group / Variation 더 자세한 표
DNP3 의 데이터 모델은 “Group” 안에 여러 “Variation” 이 들어있는 구조입니다. 같은 Group 30 (AI) 라도 32-bit / 16-bit / float / double 여러 표현이 있어 RTU 가 어떤 variation 을 노출하는지에 맞춰야 합니다.
| Group | Var | 의미 | 크기 / 형식 |
|---|---|---|---|
| 1 | 1 | Binary Input — packed format (no flag) | 1 bit |
| 1 | 2 | Binary Input with status (flag bit 포함) | 1 byte |
| 2 | 1 | Binary Input Change — no time | event |
| 2 | 2 | Binary Input Change — absolute time | event + 6-byte time |
| 10 | 2 | Binary Output Status (with flag) | 1 byte |
| 12 | 1 | CROB (Control Relay Output Block) — write 전용 | 11 byte struct |
| 20 | 1 | Counter — 32-bit | 4 byte |
| 20 | 2 | Counter — 16-bit | 2 byte |
| 30 | 1 | AI 32-bit signed (with flag) | 5 byte |
| 30 | 2 | AI 16-bit signed (with flag) | 3 byte |
| 30 | 3 | AI 32-bit signed (no flag) | 4 byte |
| 30 | 5 | AI single-precision float (with flag) | 5 byte |
| 30 | 6 | AI double-precision float (with flag) | 9 byte |
| 32 | 1 | AI Change — no time | event |
| 32 | 7 | AI Change — single float, abs time | event |
| 40 | 1 | AO Status 32-bit signed (with flag) | 5 byte |
| 41 | 1 | AO Block 32-bit signed (write 대상) | 5 byte |
| 41 | 3 | AO Block float (write 대상) | 5 byte |
자주 쓰는 운영 패턴
패턴 1. 변전소 IED 의 기본 측정값 (전류·전압·전력)
ABB REC615 / SEL-451 / SEL-735 미터 같은 IED 는 보통 다음과 같은 식으로 매핑됩니다.
| 태그 이름 | 주소 | 데이터 형식 | 형식 보조 |
|---|---|---|---|
| A 상 전류 | g30v5.0 | Float | REAL |
| B 상 전류 | g30v5.1 | Float | REAL |
| C 상 전류 | g30v5.2 | Float | REAL |
| 총 유효전력 | g30v5.10 | Float | REAL |
| 주파수 | g30v5.20 | Float | REAL |
| 차단기 1 위치 | g1v2.0 | Boolean | (비움) |
| 차단기 2 위치 | g1v2.1 | Boolean | (비움) |
패턴 2. 누적 카운터 (kWh / 가스 m³ 등)
Counter (Group 20) 는 누적값입니다. 표시단에서 차이를 구해 “시간당 사용량” 으로 변환합니다.
| 태그 이름 | 주소 | 데이터 형식 |
|---|---|---|
| 적산 유효전력 (kWh) | g20v1.0 | Integer |
| 적산 무효전력 (kvarh) | g20v1.1 | Integer |
패턴 3. CROB 로 차단기 제어 (write)
g12v1.0 = "Pulse-On / Trip / Close" 명령 코드
CROB 1 byte control code:
| 값 | 의미 |
|---|---|
0x01 | Pulse-On |
0x02 | Pulse-Off |
0x03 | Latch-On |
0x04 | Latch-Off |
0x41 | Trip (보호 동작) |
0x81 | Close |
CROB 는 SBO (select → operate) 절차가 필수인 RTU 가 많습니다. PlantPulse 측에서 단발 write 로 명령을 내려도 RTU 가 reject 할 수 있습니다. 이런 환경에서는 RTU 측에서 SBO 미사용 모드를 켜거나, 별도 자동화 스크립트로 두 단계 수행.
참고 / 다음 단계
- RTU 제조사 (ABB, SEL, GE, Schneider) 의 “DNP3 device profile” PDF 에 group/variation/index 매핑이 다 있습니다.
- IEEE 1815-2012 표준 문서 (DNP3) 가 공식 spec.
- 고급 — REST API 의 DNP3 자동화 예제 참고.