DNP3 Qualifier and Range Field Explained
Inside every DNP3 object header, after the group and variation, sits a small pair of fields that decides exactly which points the message is about: the qualifier and the range. Miss what they mean and a capture looks like noise; understand them and you can read precisely which indexes a poll or response is carrying. This page explains the qualifier code and the range field, and the two common ways DNP3 names a set of points.
DNP3 Qualifier and Range in one line: A DNP3 qualifier is a byte in an object header that tells the receiver how the following range field is formatted, and the range field names which point indexes the message covers. The two common forms are a start-stop range, which names a contiguous block of indexes by first and last, and a count-of-index list, which names a specific set of indexes explicitly. The qualifier decides which form and the width of the index numbers.
What the Qualifier Byte Selects
An object header always carries three things: the object group and variation, then the qualifier, then the range. The qualifier is a single byte whose bits select how the range is expressed - whether indexes are 8-bit or 16-bit, and whether the range is a contiguous span or an explicit list. It is the key that tells the receiver how to read the bytes that follow.
This matters because the same group and variation can address points many ways. A qualifier that means start-stop, 16-bit tells the receiver the next four bytes are a first index and a last index; a qualifier that means count-of-index, 8-bit says the next byte is a count followed by that many one-byte index numbers. Reading the qualifier first is the only way to parse the rest of the header correctly, which is why it pairs so tightly with the object group and variation that precede it.
Start-Stop Ranges Versus Index Lists
A start-stop range is the compact way to ask for a block of contiguous points: read analog inputs from index 0 through 49, for example. It is efficient when the points you want are numbered consecutively, which they usually are in a well-organized point map. The receiver returns each index in the span in order.
A count-of-index list is used when the points are scattered or when a device reports events, because an event report names exactly which point changed rather than a whole block. Events therefore travel with their own index attached, which is how the master knows which of the DNP3 point indexes moved. Understanding both forms is what lets you look at an object header and say precisely which points a message touches, rather than guessing from the group alone.
Common Qualifier Codes at a Glance
A handful of qualifier values cover almost everything seen in real traffic, and because they are fixed by the standard they are worth recognizing on sight:
| Qualifier | Range format | Typical use |
|---|---|---|
| 0x00 | 8-bit start and stop indexes | Small contiguous block reads |
| 0x01 | 16-bit start and stop indexes | Contiguous blocks beyond index 255 |
| 0x06 | No range field - all points | Class polls and integrity polls |
| 0x07 | 8-bit count, no indexes | Limited-quantity requests |
| 0x17 | 8-bit count with 8-bit index prefixes | Events and controls on specific points |
| 0x28 | 16-bit count with 16-bit index prefixes | Events and controls on larger point maps |
The split between the 8-bit and 16-bit forms is purely about index width: a device with fewer than 256 points of a type can be addressed with the short forms, while bigger maps need the wide ones. Outstations generally choose the narrowest form that fits when they respond, which is why the same read can come back with different qualifiers from different devices carrying identical data.
Qualifier 0x06: Asking for Everything
The most common request qualifier in a healthy system carries no range at all. Qualifier 0x06 means all points of the requested object, so the master does not need to know the point count in advance. This is how class-based polling works: a request for event objects with qualifier 0x06 says give me whatever you have, and the outstation answers with index-prefixed qualifiers naming exactly which points changed. The same form drives the periodic full refresh - an integrity poll uses it to sweep every static point without enumerating a single index.
That asymmetry is worth noticing: requests are often index-free while responses are index-heavy. The master asks broadly with 0x06; the outstation replies precisely with 0x17 or 0x28 for events, or with start-stop forms for static blocks. Reading a capture with that pattern in mind makes the conversation legible - broad question, specific answer.
A Worked Header Walkthrough
Suppose a capture shows a response header whose group and variation identify analog input events, followed by qualifier 0x28, then a two-byte count of N, then N repetitions of a two-byte index and the event object itself. Reading it is mechanical: 0x28 announces a 16-bit count and a 16-bit index before each object, so the parser takes the count, then loops N times reading index-then-object. Each index maps directly to a tag in the master's point map, so the whole payload can be attributed point by point.
Now suppose the next header carries qualifier 0x01 with a start index of A and a stop index of B: the payload is one object for every index from A through B inclusive, in order and with no per-object indexes, so position within the block is what identifies each point. Practicing this on live traffic is fastest with a protocol-aware tool - capturing DNP3 traffic in Wireshark decodes the qualifier and range for you, which makes checking your manual reading painless.
When a Qualifier Is Rejected
Not every outstation supports every qualifier for every object group. When a request arrives in a form the device cannot honor, it responds with internal indication bits set - typically the parameter-error or unknown-object flags - and no data, which from the master side looks like a poll that returns nothing while the link is clearly alive. The fix is configuration, not retries: consult the outstation's device profile, which documents the qualifiers it accepts for each group, and align the master's request forms with it.
Frequently Asked Questions
What is the DNP3 qualifier code?
It is a byte in the object header that specifies how the range field is formatted - the index width and whether the range is a contiguous start-stop span or an explicit count-of-index list. The receiver reads it before it can parse the range.
When does DNP3 use a start-stop range versus an index list?
Start-stop is used to address a contiguous block of points efficiently, typical of a static-data read. Count-of-index lists are used for scattered points and for event reports, where each event names the specific index that changed.
Why do DNP3 events use index qualifiers?
Because an event is about one specific point, not a block. The count-of-index form lets the outstation attach the exact index to each event it reports, so the master can map the change back to the right point without reading everything.
Which qualifiers do control commands use?
Controls address specific points, so they use the index-prefixed forms - a count followed by explicit indexes, 0x17 or 0x28 depending on index width. A select or operate names exactly the binary or analog output it targets; a start-stop span would make little sense for commanding an individual relay or setpoint.
Does the qualifier affect the format of each data object?
No. Each object's format is fixed by its group and variation. The qualifier only governs the addressing wrapper - how many objects follow and how their indexes are conveyed. Two responses can carry identical measurement objects under completely different qualifiers depending on whether the points involved were contiguous or scattered.
Sources and verification
This page references the protocol specifications published by the organizations below. Editions, product capabilities, and documentation change over time - confirm current requirements and specifications directly with the source.
- Overview of DNP3 (IEEE Std 1815) - DNP Users Group
Merobix is not affiliated with, endorsed by, or sponsored by these organizations; their names are used only to identify the standards and products discussed.
Automation services
Need help turning this into a working system?
Merobix integrates SCADA, programs Allen-Bradley and Siemens PLCs, and designs and fabricates industrial control panels.
Meeting requests are reviewed before confirmation.