Why a DNP3 SELECT/OPERATE fails: timeout, unsupported point and local control
Select-before-operate (SBO) is DNP3's two-step control: the master SELECTs a point, the outstation echoes the request with a status,
and the master sends an identical OPERATE within the select timeout. When a command "does not work", the reason is almost always in
the status byte of the echo. This case follows twelve commands to outstation 70 on 10.0.7.70:20000, three of which fail.
Finding the commands

Each control here is a Control Relay Output Block (group 12 variation 1) for breaker CB-70, a double-bit input that follows the breaker after 120 ms of travel. Two closes and a trip go through cleanly: SELECT, echo with status SUCCESS, OPERATE, echo with SUCCESS, then the double-bit input changes in the next event poll.
Failure 1: OPERATE after the select timeout
The outstation keeps a selection for 5 seconds. One OPERATE leaves the master 8 seconds after the SELECT's echo. The outstation answers the OPERATE with status TIMEOUT (1) and nothing moves. On site this is usually an operator confirmation dialog in the SCADA, or a master that queues the OPERATE behind slow polls on the same channel.
Failure 2: a point that does not exist
A CLOSE is sent to CROB index 9; the outstation has two. The echo carries NOT_SUPPORTED (4). A point list copied from another device, or an index offset between the SCADA database and the outstation's profile, are the usual causes.
Failure 3: local control

For three minutes someone has the device in local. Every response carries IIN1.5 LOCAL_CONTROL (110 of them over the capture) and the command's echo carries status LOCAL (7). This one is not a configuration problem at all: it is a switch on the panel, and the IIN bit is the remote evidence of it.

Quick reference: CROB status codes
| Code | Status | Usual cause |
|---|---|---|
| 0 | SUCCESS | Accepted. |
| 1 | TIMEOUT | OPERATE arrived after the select timeout. |
| 2 | NO_SELECT | OPERATE without a matching SELECT (different index, code or count). |
| 3 | FORMAT_ERROR | Malformed request or unsupported control code combination. |
| 4 | NOT_SUPPORTED | The point or the operation does not exist on this device. |
| 5 | ALREADY_ACTIVE | An operation on that point is still in progress. |
| 6 | HARDWARE_ERROR | The output hardware reported a fault. |
| 7 | LOCAL | The device is in local control. |
Try it on your own capture
ComputingSphere DNP3 decodes a pcap once, splits it per channel and per outstation, and ranks the outstations worst first with the same numbers used here. It only reads what already went over the wire. Command and SBO attempts and failures are counted per outstation. This capture is among the examples of every free account, to reproduce every number in this post; or upload your own: the Free plan covers 1,000 messages a month.
More cases from the same capture
- One silent outstation on a multidrop line: finding it in a DNP3 capture
- NEED_TIME on 904 responses: a DNP3 outstation the master never syncs
- DNP3 event buffer overflow: losing events between polls
- Tuning a chatter filter from a DNP3 capture: 26 updates down to 6
- 204 SYN retransmissions and no DNP3: an unreachable outstation in a capture
- Self-healing on stale data: three DNP3 problems a FLISR scheme should not meet
- The substation GPS that overwrote the master: DNP3 events an hour in the future