Skip to main content

DNP3 — Power / Utility Standard

DNP3 (Distributed Network Protocol v3) is the most widely used protocol in utility SCADA systems such as power companies, water, and gas. It is the communication standard between RTUs / IEDs and the SCADA master, and its key features are time-stamped events and reliable reporting (unsolicited responses).


Registration Form Entries

FieldWhat to enterExample
IP addressIP of the RTU / IED192.168.0.120
PortDNP3 TCP port20000 (standard)
Master address (master-address)The gateway's (master) own address1
Outstation address (outstation-address)DNP address of the peer (slave)10
Response timeout (request-timeout)Response wait time (ms)5000
Unsolicited (enable-unsolicited)Enables spontaneous transmission (push) from the RTU — the driver caches it and returns it first on read()all / 1 / 2 / 3 / 1,2 (empty by default = not used)
Both addresses must match for communication

DNP3 requires that both the master address and the outstation address match. On the RTU side (usually the IED configuration tool from ABB / SEL / GE), verify that "Source Address" and "Destination Address" pair correctly with the gateway's master/outstation values.


PLC Address Notation for Tags

DNP3 identifies data points by Group / Variation / Index. Common groups:

GroupTypeNotes
1Binary Input (BI)Breaker/contact status, etc.
10Binary Output (BO)Output status
20CounterAccumulated counters
30Analog Input (AI)Current, voltage, temperature — most common
40Analog Output (AO)Output setpoint
41Analog Output Block (write target)Setpoint writes

In the gateway, enter it in the g<group>v<variation>.<index> or class<n> format.

NotationMeaning
g30v1.5Analog Input, var 1 (32-bit + flag), index 5
g30v5.5Analog Input, var 5 (Float), index 5
g1v2.0Binary Input, var 2 (with flag), index 0
g20v1.0Counter, 32-bit, index 0
class0Class 0 polling (full scan of static data)
class1Class 1 events (event-driven changes)
Class 0 vs g30v1.x

In the early stages of a project, if you just want to "pull everything and see", it is convenient to fetch it all at once with class0, then pick only the points you need and register them precisely with g30v....


Data Type Mapping

GroupData typeType qualifier
g1 (BI)Boolean(empty)
g30v1 (AI 32-bit signed)IntegerDW
g30v2 (AI 16-bit signed)Integer(empty)
g30v5 (AI float)FloatREAL
g30v6 (AI double)DoubleLREAL
g20v1 (Counter 32-bit)IntegerDW

Write Support

There are generally two kinds of write targets on a DNP3 outstation.

NotationMeaning
g41v1.5Analog Output Block 32-bit signed setpoint, index 5
g41v3.5Analog Output Block float setpoint, index 5
g12v1.0Control Relay Output Block (CROB) — breaker trip/close, etc.
CROB is dangerous

g12 (CROB) directly operates breakers / relays. In production environments, always use it only after following the select-before-operate procedure and verifying permissions.


Common Problems and Solutions

SymptomPossible causeSolution
"No reply"Address mismatchCheck both the master and outstation addresses
All values 0 or staleUnsolicited messages not received, link layer problemTry explicit polling with class0
"Object not found"Wrong group/variationCheck the RTU's "DNP point map" document
Time is far offDNP3 timestamp UTC vs localThe gateway receives UTC. Convert on the display side

More Detailed Group / Variation Table

The DNP3 data model is structured as several "Variations" within a "Group". Even within Group 30 (AI), there are 32-bit / 16-bit / float / double representations, so you must match whichever variation the RTU exposes.

GroupVarMeaningSize / format
11Binary Input — packed format (no flag)1 bit
12Binary Input with status (includes flag bit)1 byte
21Binary Input Change — no timeevent
22Binary Input Change — absolute timeevent + 6-byte time
102Binary Output Status (with flag)1 byte
121CROB (Control Relay Output Block) — write only11 byte struct
201Counter — 32-bit4 byte
202Counter — 16-bit2 byte
301AI 32-bit signed (with flag)5 byte
302AI 16-bit signed (with flag)3 byte
303AI 32-bit signed (no flag)4 byte
305AI single-precision float (with flag)5 byte
306AI double-precision float (with flag)9 byte
321AI Change — no timeevent
327AI Change — single float, abs timeevent
401AO Status 32-bit signed (with flag)5 byte
411AO Block 32-bit signed (write target)5 byte
413AO Block float (write target)5 byte

Common Operational Patterns

Pattern 1. Basic measurements from a substation IED (current, voltage, power)

IEDs such as ABB REC615 / SEL-451 / SEL-735 meters are typically mapped as follows.

Tag nameAddressData typeType qualifier
Phase A currentg30v5.0FloatREAL
Phase B currentg30v5.1FloatREAL
Phase C currentg30v5.2FloatREAL
Total active powerg30v5.10FloatREAL
Frequencyg30v5.20FloatREAL
Breaker 1 positiong1v2.0Boolean(empty)
Breaker 2 positiong1v2.1Boolean(empty)

Pattern 2. Accumulated counters (kWh / gas m³, etc.)

Counters (Group 20) are accumulated values. On the display side, take the difference to convert them into "consumption per hour".

Tag nameAddressData type
Accumulated active energy (kWh)g20v1.0Integer
Accumulated reactive energy (kvarh)g20v1.1Integer

Pattern 3. Breaker control via CROB (write)

g12v1.0 = "Pulse-On / Trip / Close" 명령 코드

CROB 1-byte control code:

ValueMeaning
0x01Pulse-On
0x02Pulse-Off
0x03Latch-On
0x04Latch-Off
0x41Trip (protective operation)
0x81Close
select-before-operate

Many RTUs require the SBO (select → operate) procedure for CROB. Even if PlantPulse issues the command as a single write, the RTU may reject it. In such environments, either enable the non-SBO mode on the RTU side, or perform the two steps with a separate automation script.


References / Next Steps

  • The "DNP3 device profile" PDF from the RTU manufacturer (ABB, SEL, GE, Schneider) contains the full group/variation/index mapping.
  • The IEEE 1815-2012 standard document (DNP3) is the official spec.
  • See the DNP3 automation examples in Advanced — REST API.