← ComputingSphere

Reading room · Case study · 21 October 2026

One silent outstation on a multidrop line: finding it in a DNP3 capture

A multidrop channel, one IP and port with several outstations behind it, is the classic place for a problem to hide. The TCP connection stays up, most outstations answer, and the SCADA shows a few stale values that nobody can pin on a device. This case walks through one: three outstations on 10.0.1.18:20000, one of which stops answering twice for about 90 seconds.

What the master sees

The master polls the line every 5 seconds for outstation 18 and on a slower cycle for 19 and 21, with a 3-second response timeout and 2 retries. When outstation 19 goes quiet, each poll to it expires, is retried twice with the same application sequence number, and the master moves on. TCP has nothing to report: the connection is healthy and the other two outstations keep answering on it in about 21 ms.

That is why a per-connection view misses it. The channel's TCP statistics show zero retransmissions and zero reconnections. The problem only appears when the traffic is split per DNP3 address.

Ranking the outstations

Outstations ranking with outstation 19 on top: 851 requests, 30 unanswered, 20 retries
The Outstations ranking of the capture. Outstation 19 leads with 30 of its 851 requests unanswered and 20 retries; its p50 and p99 response times look normal because they only count the requests that were answered.

Three numbers tell the story:

  • 30 unanswered requests out of 851, about 3.5%. A request counts as unanswered when the master gives up and sends something else before any response arrives.
  • 20 retries: requests sent again with the same sequence and function, the master's own retry logic at work.
  • Events up to 97 seconds late. Events that occurred while the outstation was silent were only collected when it came back, so their timestamps are far older than their arrival time.

The response times (p50 21 ms, p99 24 ms) are a trap: they only describe the requests that were answered. A device that answers quickly or not at all has a perfect p99.

Confirming on the channel

The channel 10.0.1.18:20000 open on outstation 19, with the outstation chips at the top
Opening outstation 19 from the ranking: the workspace switches to its channel and filters the protocol view to it.

Filtering the protocol view to outstation 19 shows the gaps directly: runs of READ requests with no RESPONSE between them, each one repeated, then the startup sequence again (DISABLE_UNSOLICITED, integrity poll) when it starts answering. The master re-runs the startup three times over the capture, once at the beginning and once after each outage, which is a useful fingerprint: a device that keeps "restarting" from the master's point of view without ever setting DEVICE_RESTART is losing communication, not rebooting.

Channel analysis comparing outstations 18, 19 and 21 side by side
The channel analysis compares the three outstations side by side. 19 has the most messages: the retries and repeated startups inflate its traffic.

What to check in the field

  • A serial-to-TCP gateway in front of the line: one port flapping or a device losing power on its own feed.
  • Addressing: two devices configured with the same address answer on top of each other and corrupt frames, which looks different (CRC errors, noise) from clean silence.
  • Timing: if the silences line up with a schedule (every N minutes), look for something periodic on the device, such as a logging task or a radio duty cycle.

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. Multidrop lines are split per DNP3 address automatically. 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