DNP3 (Distributed Network Protocol 3) is a communication protocol widely used in utility and industrial SCADA systems. EnvisionSCADA acts as a DNP3 master and connects to outstations over TCP/IP. Each DNP3 device represents one outstation connection. Variables map individual DNP3 data points from that outstation into the project variable space.
Configure the device first, then add variables to it. Variables are accessed at runtime by their full variable name. A name that starts with the {Device}. replacer resolves it to the device name, so {Device}.Feeder1_Current on the device RTU1 is accessed as RTU1.Feeder1_Current.
Variables reference points by their DNP3 object type and index number. The object type determines the data class and encoding used to read or write the point on the outstation.
After the connection is established, EnvisionSCADA applies the Enable Unsolicited setting on the outstation, clears its restart indication and, when Integrity Poll is enabled, runs an integrity poll so the variables show the current state of every point. From then on the outstation reports changes through the event class polls and, when Enable Unsolicited is enabled, through unsolicited responses. The integrity poll repeats at the Integrity Poll Timespan.
The device state is available as the variable DeviceName.ChannelState with the values Connecting, Connected, Offline, Disabled and Simulation. Connected is set when the outstation answers its first request, not when the TCP connection opens: a gateway or an outstation with another address can accept the connection without answering, and the device then stays Connecting until the request times out and goes Offline. DeviceName.ExecutionTime holds the duration of the last integrity poll in milliseconds.
Device Settings
Each DNP3 device defines a connection to a DNP3 outstation. Configure the connection endpoint, addressing, and polling options.
Create a new device with the Add button in the toolbar. The Add device dialog contains all device settings organized in the sections General, Connection, Scanning, and Diagnostics, with default values already filled in. Enter at least the Name and IP Address and press Create.
The device row shows Enable, Name, IP Address, Port, Outstation Address, Master Address, Template, and Description directly and these values can be edited in place. Press the Settings icon on a device row to open the Edit device dialog, which contains the same sections and all settings of the device. Press Save to apply the changes.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this DNP3 device. | true | Boolean |
| Simulation | Runs the device in simulation mode. The device does not open its real connection; its variables stay available and become read and write in memory like Local variables, with a Good status and a Channel State of Simulation, so the project can be tested without hardware. Written values are held in memory only and reset when the application restarts. | false | Boolean |
| Name | Unique name for this DNP3 device. Variable names that start with the {Device}. replacer resolve it to this name. | Outstation1 | Text |
| IP Address | IP address of the remote DNP3 outstation. | 192.168.1.20 | IP Address |
| Port | TCP port used for the DNP3 connection. | 20000 | Integer |
| Outstation Address | DNP3 link-layer address of the remote outstation, 0 to 65519. Must match the outstation configuration. | 1 | Integer |
| Master Address | DNP3 link-layer address used by this master, 0 to 65519. Must match the value expected by the outstation. | 2 | Integer |
| Template | Optional device template name. When set, this device uses a shared variable list from the named template device. | DNP3Template | Text |
| Description | Free text description for documentation purposes. | Substation feeder RTU | Text |
No rows match the filter.
Device Advanced Settings
The following settings are available in the Connection, Scanning, and Diagnostics sections of the Add device and Edit device dialogs.
| Setting | Description | Default | Units / Format |
|---|---|---|---|
| Enable Unsolicited | When enabled, EnvisionSCADA enables unsolicited responses for event classes 1, 2 and 3 after the first integrity poll, and the outstation reports changes without being polled. When disabled, EnvisionSCADA disables unsolicited responses on the outstation when the connection starts and receives events through the class polls only. An outstation without unsolicited support keeps working through the polls; the System Log reports it once. | true | Boolean |
| Channel Retry Min | Delay after the first failed connection attempt. The delay doubles with every further failed attempt, up to Channel Retry Max. The smallest value used is 1 second. | 5 | Seconds |
| Channel Retry Max | Longest delay between two connection attempts. | 5 | Seconds |
| Channel Retry Reconnect Delay | Delay before reconnecting after a connection on which the outstation answered has ended. The smallest value used is 1 second. A connection that the outstation accepted without answering counts as a failed attempt: the next attempt waits for the longer of this delay and the current retry delay, and the retry delay doubles. | 10 | Seconds |
| Integrity Poll | Enables the integrity poll: a read of event classes 1, 2 and 3 followed by class 0, the current value of every point. The first integrity poll runs as soon as the connection is established. | true | Boolean |
| Integrity Poll Timespan | Interval between integrity polls. 0 runs the integrity poll once per connection. | 300 | Seconds |
| Class1 Poll | Enables periodic polling of class 1 event data. The first poll runs as soon as the connection is established. | false | Boolean |
| Class1 Poll Timespan | Interval between class 1 event polls. 0 runs the class 1 poll once per connection. | 30 | Seconds |
| Class2 Poll | Enables periodic polling of class 2 event data. The first poll runs as soon as the connection is established. | false | Boolean |
| Class2 Poll Timespan | Interval between class 2 event polls. 0 runs the class 2 poll once per connection. | 30 | Seconds |
| Class3 Poll | Enables periodic polling of class 3 event data. The first poll runs as soon as the connection is established. | false | Boolean |
| Class3 Poll Timespan | Interval between class 3 event polls. 0 runs the class 3 poll once per connection. | 30 | Seconds |
| Verbose | Logging level. 0 logs connection changes and errors. 1 and higher also logs every request and response with its data in hexadecimal, every received value and every command. | 0 | Integer |
No rows match the filter.
Variable Settings
Variables are added per device. Each DNP3 variable maps one DNP3 data point from the outstation to a named variable in the project variable space.
Create a new variable with the Add button in the toolbar. The Add variable dialog organizes all variable settings in the tabs General, Scaling, Historian, DNP3, and Gateway, with default values already filled in. Enter at least the Name on the General tab, select the Object Type and Index on the DNP3 tab, and press Create. When the variable is created on a template device, it is also created on all instance devices that use the template. On a template device, start the Name with the {Device} replacer, so that each instance device gets its own variable. The Name must resolve to a different variable on each device; this is checked for every instance device before anything is saved, when a variable is created and when it is renamed.
The variable row shows Enable, Name, Asset, Object Type, Index, and Description directly and these values can be edited in place. Press the Settings icon on a variable row to open the Edit variable dialog, which contains the same tabs and all settings of the variable. Press Save to apply the changes. Changes made on a template device are also applied to the matching variable on all instance devices, while each instance keeps its own Modbus Address value. The Gateway tab settings Modbus Address, OPC UA, Writeable, MQTT Publisher, Kafka Device, Kafka Remap Device, and Kafka Remap Variable are also available as table columns, which are shown with Columns as described in the Configuration Tables article.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this variable. A disabled variable keeps the Disabled status, receives no values from the outstation and is not written. | true | Boolean |
| Name | Full variable name. The {Device}. replacer prefix is optional: {Device} resolves to the device name when the device loads, so the variable follows a device rename automatically, while a literal name is used exactly as written and keeps working across device renames. The resolved name must be unique across the whole project. | {Device}.Feeder1_Current | Text |
| Asset | Asset tag used to group and filter this variable. | Substation1 | Text |
| Object Type | DNP3 object group and variation defining the data type and class of this point. Select from the supported object types. | Analogue input all variations(30-0) | Enum |
| Index | DNP3 point index number on the outstation, 0 to 65535. | 5 | Integer |
| Description | Free text description for documentation purposes. | Feeder 1 current measurement | Text |
| Pulse | Writes this binary output point with PULSE_ON and PULSE_OFF instead of LATCH_ON and LATCH_OFF. | false | Boolean |
| User Groups | Comma-separated list of user groups that have access to this variable at runtime. | Operators,Supervisors | Text |
| Signature Required | Requires an electronic signature for each write to this variable from a page object, the Live Manager, the Runtime API or MCP while Part 11 compliance mode is enabled and Write variables marked Signature Required is selected under Signature Required Actions on the Parameters page. The write rights of the user and the value range are checked first, so a refused write does not open the Electronic Signature dialog. A variable created while Part 11 compliance mode is enabled starts with Signature Required selected. Writes by alarm, event and schedule actions, Python scripts and the gateways run without a signature. See the Electronic Signatures article. | true | Boolean |
| Recipe Targets | Recipe type name (target) this variable belongs to. Supports the {Device} placeholder, which resolves to the owning device name so one naming rule can spread a set of variables across several devices. | Line1 | Text |
| Recipe Parameter Name | Explicit name of the parameter this variable represents inside a recipe. Variables that fill the same role across different targets share the same Recipe Parameter Name, which is how values are matched on Apply and Snapshot. A variable takes part in recipes only when both Recipe Targets and Recipe Parameter Name are set. | Setpoint | Text |
| Trend Groups | Comma-separated list of trend group names this variable belongs to. A variable can be in several groups. The groups are the filter the Trend Analyst offers when picking variables. The names accept the {Device}, {DeviceName} and {VariableName} placeholders, so one UDT definition gives every instance its own group. | Pumps,{Device} | Text |
| Units | Engineering unit label displayed alongside the value. | A | Text |
| Format | Display format of the value on screens and in the Trend Analyst: the value of a Label or Input (unless the object uses its own Floating Point and Decimals), the value text of a Knob and a Slider, the Trend tooltip, a Data Grid Variable column, the right-click menu, Quick Trend, the current value in the Recipe Manager, variable tokens in alarm and event messages, and the Trend Analyst tooltip, summary and pen Format. An Input shows the plain value while it is being edited. 0 shows no decimals, 0.00 always shows two decimals, 0.0## shows one to three decimals and #,##0.00 adds a thousands separator, with up to 15 decimals. Values are rounded half away from zero for display only; alarms and expressions keep the full value, and so does the historian unless Round to Format is on. ReadVariable in the runtime API and MCP returns the Format beside the full value. Leave empty to show the value as received. | 0.00 | Text |
| Min Raw | Minimum raw value from the outstation, used for scaling. Scaling and the Converter apply to received values and in reverse to written values. | 0 | Number |
| Max Raw | Maximum raw value from the outstation, used for scaling. | 32767 | Number |
| Min Scaled | Minimum engineering value corresponding to Min Raw. | 0 | Number |
| Max Scaled | Maximum engineering value corresponding to Max Raw. | 1000 | Number |
| Converter | Name of a Converter defined in the Converters configuration to apply a custom read/write expression. | RawToPressure | Text |
| Historian | Enables logging of this variable's values to the historian database. | true | Boolean |
| Round to Format | Stores the historian samples of this variable rounded to the decimals of its Format, as a plain number: with Format 0.00 the value 34.30487 is stored as 34.3. The deadband compares the rounded values, so with Deadband 0 a sample is written only when the rounded value changes. On a variable without scaling the Raw value is stored empty, since it equals the value. The live value, alarms, expressions and all interfaces keep the full value. Applies to new samples only; samples already stored keep their values. Requires a Format. | false | Boolean |
| Deadband | Minimum change in value required before a new historian record is written. | 0.5 | Number |
| Minimum Time (s) | Minimum time in seconds between historian records for this variable. | 0 | Seconds |
| Sample Group | Name of the Sample Group that controls the historian sampling rate for this variable. | Text | |
| History Source | Where the trends read the history of this variable: Project default (the History Source with Project default enabled on the History Sources page, or the EnvisionSCADA Historian when no source has it), EnvisionSCADA Historian (the samples recorded while Historian is on) or a History Source of the History Sources page (a query on a Database Connection or the fetch() function of a Python Module script). In the table, an empty History Source is Project default and Historian is the EnvisionSCADA Historian. Live values always come from the variable itself. Test reads the last 24 hours with the settings in the dialog. See the History Sources article. | Project default | Enum |
| History Reference | What the History Source reads for this variable: the reference passed to fetch(), or @Variable of the History Query. When empty, the History Reference of the source is used, by default the full name of the variable; the field shows it in italics. {Name} is replaced by the full name of the variable. Browse lists the references that a Script source offers. | CDT158 | Text |
| History Parameters | Shown for a Script source: optional key=value pairs separated by ;, added to the History Parameters of the source. A key set here replaces the same key of the source. The field shows the History Parameters of the source in italics. | scale=0.1 | Text |
| Modbus Address | Optional address on the built-in Modbus TCP and Modbus RTU servers where this variable is exposed. The servers are enabled in the Gateways section of the Parameters page. Each instance device keeps its own value. | %MW0 | See Modbus TCP Addressing |
| OPC UA | Exposes this variable as an OPC UA node. When Historize is also ticked, the Historian data of the variable is readable through OPC UA Historical Access. | true | Boolean |
| Writeable | Allows external systems to write this variable through the gateways: the OPC UA Server, the Modbus TCP and Modbus RTU servers, the MQTT publisher when Subscribe is enabled on the publisher, and Kafka when Consumer is enabled on the Kafka device. Writes from pages, actions, scripts and the API are independent of this setting. | false | Boolean |
| MQTT Publisher | Name of the MQTT publisher that publishes this variable, typed or chosen with the ... button. A variable is published by one publisher, and the name must match a publisher on the MQTT Publishers page. Leave empty to keep the variable unpublished. Writes from the broker need Subscribe on the publisher and Writeable on the variable. See the MQTT Publishers article. | CloudIoT | Text |
| Kafka Device | Name of the Kafka device this variable is linked to, typed or chosen with the ... button. Every value change of a linked variable is produced to the Producer Topic of the Kafka device while the device is enabled. Writes from the Consumer Topic need Consumer on the Kafka device and Writeable on the variable. Leave empty to keep the variable unlinked. See the Kafka Devices article. | KafkaBroker1 | Text |
| Kafka Remap Device | Device name used for this variable in Kafka messages instead of the name of the device that owns the variable. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the device name. | RemotePLC1 | Text |
| Kafka Remap Variable | Variable name used for this variable in Kafka messages instead of its own name. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the variable name without the device name, for example Pump1_Speed for PLC1.Pump1_Speed on device PLC1. | Speed | Text |
No rows match the filter.
Supported Object Types
The Object Type selects the point collection a variable belongs to: binary input, binary output, analog input or analog output. The Index selects the point within that collection. EnvisionSCADA accepts every static and event variation the outstation sends for that collection, so a variable of type Analogue input all variations(30-0) receives 16-bit, 32-bit, single-precision and double-precision values as well as analog input events.
Two enabled variables of the same collection with the same Index share one point: only one of them receives the values and the System Log names both. A disabled variable does not take the point from an enabled one. The outstation may also report counters, frozen counters and double-bit inputs; EnvisionSCADA reads past these objects.
Writing uses two object types: Single bit binary output all variations(10-0) and 16 bit Analogue output status(40-2). See Notes.
| Object Type | Group-Variation | Point | Access |
|---|---|---|---|
| Single bit binary input all variations | 1-0 | Binary input | Read |
| Single bit binary input | 1-1 | Binary input | Read |
| Single bit binary input with status | 1-2 | Binary input | Read |
| Single bit binary input event all variations | 2-0 | Binary input | Read |
| Single bit binary input event without time | 2-1 | Binary input | Read |
| Single bit binary input event with time | 2-2 | Binary input | Read |
| Single bit binary input event with relative time | 2-3 | Binary input | Read |
| Single bit binary output all variations | 10-0 | Binary output | Read and write |
| Single bit binary output status | 10-2 | Binary output | Read |
| Analogue input all variations | 30-0 | Analog input | Read |
| 32 bit Analogue input | 30-1 | Analog input | Read |
| 16 bit Analogue input | 30-2 | Analog input | Read |
| 32 bit Analogue input without status | 30-3 | Analog input | Read |
| 16 bit Analogue input without status | 30-4 | Analog input | Read |
| Float analogue input without status | 30-5 | Analog input | Read |
| Double Analogue input without status | 30-6 | Analog input | Read |
| Analogue input event all variations | 32-0 | Analog input | Read |
| 32 bit Analogue input event without time | 32-1 | Analog input | Read |
| 16 bit Analogue input event without time | 32-2 | Analog input | Read |
| 32 bit Analogue input event with time | 32-3 | Analog input | Read |
| 16 bit Analogue input event with time | 32-4 | Analog input | Read |
| Float Analogue input event without time | 32-5 | Analog input | Read |
| Double Analogue input event without time | 32-6 | Analog input | Read |
| Float Analogue input event with time | 32-7 | Analog input | Read |
| Double Analogue input event with time | 32-8 | Analog input | Read |
| Analogue output all variations | 40-0 | Analog output | Read |
| 32 bit Analogue output status | 40-1 | Analog output | Read |
| 16 bit Analogue output status | 40-2 | Analog output | Read and write |
No rows match the filter.
Variable Arrays
A variable can expand into an array by setting the Array size field to a value between 2 and 512. The variable itself is the first element and its Name must end in the first index, for example Temps[0]. The remaining elements are created automatically as Temps[1], Temps[2] and so on. Each element advances the Index by one, so the elements map onto consecutive point indexes on the outstation. The Index of the last element must not exceed 65535.
The element rows are managed by the first element: they follow its settings, appear locked in the variable list, and are edited by editing the first element. Changing the Array size adds or removes elements at the end. Renaming the first element or changing its address renames and re-addresses all elements. Setting Array size back to 0 while elements exist removes the elements.
To turn the elements into ordinary independent variables, use the Ungroup array action on the first element's row in the variable list, or the Configuration API (POST /API/Config/VariableArrays/Ungroup). All rows are kept and only the grouping is removed. This is one-way. The element count badge next to the first element's name folds and unfolds the element rows in the list.
Notes
EnvisionSCADA operates as a DNP3 master only. Outstation Address and Master Address must match the configuration of the remote device exactly. Frames with other addresses are ignored; the System Log reports the first one per connection with the addresses it carried, which shows an address mismatch directly.
Enable Integrity Poll to synchronize all point states after a connection is established or re-established. Adjust poll timespans to match the outstation capabilities and network conditions.
Class 1, 2, and 3 event polls are used when the outstation buffers event data. If unsolicited responses are enabled and the outstation supports them, event polls may not be required.
Every request must be answered within 10 seconds. When the outstation does not answer, or a link status check after 60 seconds without traffic stays unanswered, EnvisionSCADA closes the connection, sets the Channel State to Offline and the variables of the device to ConnectionLost, and reconnects after the Channel Retry Reconnect Delay with a new integrity poll.
Values that the outstation flags as not online, restarting or with lost communication are stored with the ConnectionLost status. Values flagged over range or forced keep the Good status.
Events that carry a time stamp are stored with the time of the outstation. Static values and events without a time stamp are stored with the time they are received. An event time before the year 2000 means the outstation clock is not set. An event time more than one minute ahead of the EnvisionSCADA server means the outstation clock runs ahead, usually because it is set to local time while DNP3 time is UTC. In both cases the receive time is used and the System Log reports it once. Event times in the past are kept, so events buffered during a communication outage keep their original time. EnvisionSCADA does not set the outstation clock; an outstation that requests time synchronization is reported once in the System Log.
When the outstation reports a restart during the connection, EnvisionSCADA clears the restart indication, applies the Enable Unsolicited setting again and runs an integrity poll. When the outstation reports an event buffer overflow, EnvisionSCADA runs an integrity poll to read the current state of every point.
Variables of type Single bit binary output all variations(10-0) are written with a control relay output block using select before operate: writing 1 sends LATCH_ON and writing 0 sends LATCH_OFF, with an on-time and off-time of 500 ms. With Pulse enabled, PULSE_ON and PULSE_OFF are sent instead. The Momentary On action sends PULSE_ON. The Toggle action inverts the last binary output state read from the outstation.
Variables of type 16 bit Analogue output status(40-2) are written with direct operate of a 16-bit analog output block. The written value passes the Converter and the scaling in reverse, is rounded to a whole number and must be between -32768 and 32767.
A written value is shown once the outstation accepts the command. When the outstation refuses the command or does not answer, the variable receives the FormatError status and keeps its previous value, and the System Log shows the reason with the status code returned by the outstation. When no answer arrives, the System Log states whether the command may have been executed (the OPERATE or direct operate was sent) or was not operated (only the SELECT was sent). A write while the outstation is not connected is not sent and is reported in the System Log. Writes to disabled variables are ignored. Writes to other object types are reported in the System Log and are not sent.
Enable Verbose only during commissioning or diagnostics. It increases log volume significantly.