DNP3 Explorer Documentation

Installation

MacTools DNP3 Explorer is a native macOS app built with Rust and Tauri. It runs natively on Apple Silicon and Intel Macs: no Rosetta, no Parallels, no Java, no .NET runtime. One-time purchase, no subscription.

Download

System Requirements

RequirementMinimum
macOS13 Ventura or newer (Apple Silicon & Intel)
NetworkTCP/IP reachability to the outstation on the configured DNP3 TCP port (default 20000)

First Launch

If you downloaded the direct build outside the App Store, macOS Gatekeeper may block the unsigned binary on first run. Right-click the app, choose Open, then confirm. This is only required once.

DNP3 is layered. A connection that opens but yields no data almost always points to a link-layer or application-layer addressing mismatch, not a network issue. Skim the Troubleshooting section before opening your first outstation.

Quick Start

1. Connect to a DNP3 TCP outstation (5 minutes)

The most common path: reading analog and binary points from an RTU, meter, or protection relay over Ethernet.

  1. Open the app and create a new TCP master connection.
  2. Enter the outstation IP address and port 20000 (the DNP3 default; some vendors use 20001 or 47808).
  3. Set Source Address (master, commonly 1) and Destination Address (outstation, commonly 3 or 1024). These must match the device's config exactly. DNP3 will silently drop frames addressed to anyone else.
  4. Click Connect. The link-layer link comes up; the status pill turns green.
  5. The app polls the point list you defined (an integrity poll, class 0). Values populate the point table. Add points by group, variation and index first; the list is editable.

2. Run event scans

  1. Click Class 1, Class 2 or Class 3 under Class polling to send an event scan.
  2. The communication log records how many events each scan returned, and the point table refreshes afterwards.
  3. The app does not enable or listen for unsolicited responses, so events are only collected when you scan.

3. Operate a control

Click a point row to open the control dialog. Choose Select before operate (the default) or Direct operate. For binary outputs pick latch on, latch off, pulse on or pulse off with a count and on/off times; for analog outputs enter a float32 setpoint.

Configuration

Connection Types

TransportParameters
DNP3 TCPIP, port (default 20000), source (master) and destination (outstation) address

Link & Application Layer

SettingPurpose / Typical Value
Source addressThe master's link-layer address (commonly 1)
Destination addressThe outstation's link-layer address (commonly 3, 10, or 1024)
Application timeoutThe master waits up to 5 seconds for an application-layer response
Class 0/1/2/3 scanIntegrity poll (Class 0) runs with the point list at the poll interval; class 1, 2 and 3 event scans are sent on demand

Object Groups & Variations

DNP3 organizes data into groups (the data type) and variations (the encoding). The most-used groups:

GroupTypeCommon Variations
G20CounterVar 1 (32-bit with flag); freeze command for all counters
G1Binary InputVar 1 (single bit), Var 2 (with flags)
G2Binary Input ChangeEvents that drove a state flip: class 1/2/3
G10Binary OutputControl status: read-back of a relay point
G12Binary Output CommandOperate / Direct Operate with Control Relay Output Block
G30Analog InputVar 1–6: 32/16-bit int or float, with/without flags
G32Analog Input ChangeEvents that exceeded deadband: class 2/3
G40Analog Output StatusRead-back of an analog setpoint
G41Analog Output CommandWrite an analog setpoint

Control operations

Binary controls (Group 12) use a Control Relay Output Block with an operation type, count and on/off time. The control dialog defaults to Select-before-Operate (SBO), which sends a SELECT and then an OPERATE with the same object once the outstation accepts it; Direct Operate issues the command in a single request and should be reserved for trusted local networks. If the SELECT is refused or unanswered, no OPERATE is sent. Analog outputs (Group 41, float32) work the same way.

Key Features

Point list and integrity poll

Define the points you want (group, variation and index) in an editable list and the app polls them at the interval you choose. You need to know the device's point map: the app does not discover points on its own.

Communication log

Every request the app sends and every response it receives is logged with a timestamp, marked TX or RX. Export the log to CSV for troubleshooting.

Class event scans

Class 1, 2 and 3 event scans send the standard class read, log the number of events returned, and refresh the point table.

Device controls

Time sync, cold restart, warm restart and a freeze command for counters are available from the master.

Controls with select before operate

Issue Group 12 binary controls and Group 41 analog controls as SELECT then OPERATE, or as Direct Operate. A refused or timed-out SELECT stops the sequence, and a control the outstation answers with a status other than success is reported as an error.

Troubleshooting

Connection opens but polling returns no data

Symptom: The TCP connection opens, but the integrity poll returns an empty response or never completes.
Fix: Check source/destination addresses. DNP3 silently drops frames whose link-layer destination does not match the device's local address. Confirm source = master (commonly 1), destination = outstation (commonly 3, 10, or 1024), and check that the group, variation and index of each point match the device's point map. The communication log shows what the app sent and what came back.

DNP3 link-layer error codes

Link-layer responses use a function byte. The ones you'll see in practice:

CodeNameLikely Cause
0x01RESET_LINK_STATESSent on initial connect; should be followed by a link reset ACK
0x09REQUEST_LINK_STATUSHealth probe: reply is 0x0B
0x0ENOT_LINKEDLink dropped; usually a link timeout, address mismatch, or device reboot
0x10NOT_SUPPORTEDDevice doesn't support this link function: rare; indicates a misconfigured device

Application-layer IIN (Internal Indicators) bits

Every response carries a 2-byte IIN field. Decode them in the live event log:

Byte.BitMeaning
IIN.1.0BROADCAST: response to a broadcast, not addressed to you
IIN.1.1CLASS_1_EVENTS: class 1 events queued, poll needed
IIN.1.2 / 1.3CLASS_2 / CLASS_3_EVENTS queued
IIN.1.4NEED_TIME: device clock needs setting
IIN.1.5LOCAL: device in local mode; remote control refused
IIN.1.7RESTART: device restarted since last comms; re-read point map and events
IIN.2.0NO_FUNC_CODE_SUPPORT: device doesn't support the function you sent
IIN.2.1OBJECT_UNKNOWN: group/variation not implemented
IIN.2.2PARAMETER_ERROR: qualifier or index out of range

Support

When reporting a comms issue, attach the exported event log (redact any sensitive PSKs or device IP addresses) and include the source/destination addresses, transport (TCP/serial/UDP), and the device vendor and firmware version.