How Select-Before-Operate Stops a Bad DNP3 Command From Moving a Breaker
Select-before-operate versus direct operate, CROB trip/close codes, the select timeout that bites on slow links, and verifying feedback not the response.
Controls are where DNP3 mistakes actually hurt
Reading a DNP3 outstation wrong loses you data. Writing to one wrong operates a breaker, starts a pump, or closes a valve that should have stayed put. Control commands deserve their own commissioning discipline because the failure mode is physical, not just a bad trend.
DNP3 controls (IEEE 1815) almost always use a Control Relay Output Block (CROB), object group 12. A CROB is not a simple "write a 1 to this coil" like Modbus. It carries a control code, an on-time, an off-time, and a count, and it can be delivered through two very different mechanisms: select-before-operate or direct operate. Getting the mechanism, the code, and the feedback verification right is the whole job.
Select-before-operate versus direct operate
DNP3 gives you two ways to send a control, and they are not interchangeable.
| Mechanism | Sequence | When to use it |
|---|---|---|
| Select-Before-Operate (SBO) | Master sends Select, outstation echoes it back, master sends Operate | Anything consequential: breakers, valves, motors |
| Direct Operate | Master sends Operate in a single message | Low-risk, high-rate points where a two-pass handshake is wasteful |
The point of SBO is the echo. When the master sends a Select, the outstation replies with exactly what it understood: this point, this control code, these times. The master compares that echo to what it intended. Only if they match does it send the Operate. A corrupted or misaddressed command fails the compare and never operates anything.
Direct operate skips the handshake. It is one message, so it is faster and lighter on a slow link, but there is no confirmation step before the outstation acts. There is also a "direct operate, no acknowledge" variant that does not even return a response — useful for high-rate setpoint-style outputs, dangerous for anything that moves iron.
Field rule: SBO for anything that can hurt a process or a person, direct operate only for benign, frequent points. Write the choice down per point. It is a safety decision, not a performance tuning knob.
The select timeout is real and it bites
SBO has a timer people forget. After the outstation echoes the Select, it holds the selection open for only a limited time. If the Operate does not arrive inside that window, the selection expires and the Operate is rejected.
On a fast wired link this never shows up. On a radio, cellular, or satellite link with seconds of round-trip latency, the Select can echo, the Operate can be sent, and the outstation can still reject it because the window already closed. The symptom is maddening: the command "sometimes works," usually when the link is quiet.
Commissioning checks:
- Find the outstation's select timeout value. It is configurable on most devices and the default is often shorter than a slow link's round trip.
- Measure the real Select-to-Operate round-trip time on the actual link, not a bench.
- If operates intermittently fail with a "not selected" or timeout status, suspect the window before you suspect wiring.
Reading the CROB fields
A CROB carries more than on/off. The fields that matter in the field:
- Control code: what to do. The common ones are Latch On, Latch Off, and the paired Pulse On with a Trip/Close qualifier. Breaker controls almost always use the Trip and Close codes so the outstation drives the correct one of two physical outputs.
- Count: how many times to execute the operation. This should be 1 for almost everything. A stuck or misconfigured count is how a single pulse becomes several.
- On-time / Off-time: the pulse duration in milliseconds. For a momentary output driving a breaker coil or a motor start, the on-time is the pulse width. Too short and the relay does not pick up; too long and you hold a coil energized past its rating.
Trip and Close deserve special care. They are distinct control codes precisely so a breaker "open" and "close" go to separate physical outputs and cannot be confused by a single stuck bit. Verify during commissioning that a Trip command energizes the trip output and only the trip output, and likewise for Close. Do this with the breaker racked out or otherwise safe to operate.
Verify the feedback, not the response
A successful DNP3 Operate response means the outstation accepted and executed the command. It does not mean the field device actually moved. The status code tells you the command was honored at the protocol layer; the process point tells you the equipment responded.
Every consequential control needs a feedback point and a check:
- Send the control.
- Confirm the Operate returned a success status (not "already active," "too many operations," "not selected," or "hardware error").
- Read the corresponding status/feedback point and confirm the device reached the commanded state within an expected time.
- If the status was success but the feedback never changed, you have a wiring, coil, or field-device problem, not a protocol problem.
This is the same command-feedback-timeout discipline you apply on an HMI, pushed down to the protocol. The Operate status and the feedback point answer two different questions, and treating one as the other is how "the command said OK" coexists with "the valve never moved."
Common failure signatures
- "Not selected" on Operate: the select timeout expired, the Select never arrived, or the Operate addressed a different point than the Select. Check link latency and addressing.
- Operate rejected as "too many operations": the count field is wrong, or a control-limit on the outstation is protecting the point.
- Command succeeds but nothing moves: read the feedback point. Protocol is fine; the field is not.
- Device operates twice from one command: count greater than 1, or the master retried an Operate that had already executed. On unreliable links, prefer SBO so a retried Select cannot cause a second operation.
- Pulse output does not pick up: on-time shorter than the relay or coil needs.
Commissioning checklist
- For every controllable point, record the mechanism (SBO or direct operate) and justify direct operate on safety grounds.
- Record the control code, count, on-time, and off-time for each control, and confirm count is 1 unless deliberately otherwise.
- Verify Trip and Close drive separate physical outputs, tested with the device safe to operate.
- Find the outstation select timeout and confirm it comfortably exceeds the measured link round-trip time.
- Test each control end to end: Select echo matches, Operate succeeds, feedback point reaches the commanded state within its expected time.
- Deliberately test a mismatched or expired Select and confirm the outstation refuses to operate.
- Confirm the master surfaces Operate status codes to the operator rather than silently swallowing failures.
- Document per point: mechanism, control code, times, feedback point, and expected response time, alongside the point map.
One test almost nobody runs, and the one I'd insist on: send a Select for one point and an Operate for a different point, and confirm the outstation refuses. If it operates anyway, the echo compare isn't actually happening on your master and every SBO on the system is a direct operate wearing a handshake. That is the whole safety argument for SBO, so prove it works before you sign off — not the day a corrupted frame finds the gap.