IIN2.0 Function Not Supported: a DNP3 master and outstation configured from different documents
A master and an outstation are often configured by different people from different documents: the master from a utility template, the outstation from the vendor's device profile. When the template asks for something the device does not implement, the outstation answers with IIN2.0 NO_FUNC_CODE_SUPPORT, the master logs it at debug level and carries on, and nothing on the SCADA looks broken.
The setup
A legacy RTU-9 with 4 analog inputs, polled for just over two hours. The master template enables unsolicited reporting at startup and writes the time every hour. The RTU supports neither: it rejects ENABLE_UNSOLICITED and any WRITE of group 50.
What the capture shows
| Time | Master request | Outstation answer |
|---|---|---|
| 00:00:00.090 | WRITE g50v1 (time) | IIN2.0 NO_FUNC_CODE_SUPPORT |
| 00:00:00.126 | ENABLE_UNSOLICITED, classes 1-3 | IIN2.0 NO_FUNC_CODE_SUPPORT |
| 01:00:00 | WRITE g50v1 (time) | IIN2.0 NO_FUNC_CODE_SUPPORT |
| 02:00:00 | WRITE g50v1 (time) | IIN2.0 NO_FUNC_CODE_SUPPORT |
- Four rejections in two hours, among more than 3,700 normal READ exchanges. Easy to miss in a packet list, obvious once the rejections are counted.
- The unsolicited rejection means the outstation will never report on its own. The master does not retry, so events only arrive at the next class poll. If the poll plan was sized assuming unsolicited reporting, event latency is now the class poll interval.
- The time rejections mean the clock is never set by DNP3. Every event timestamp depends on whatever else sets the clock, if anything does.
What to do
- Get the outstation's IEEE 1815 device profile document and compare it with the master's profile for that address, function by function. The capture shows you which lines to look at.
- Either turn the feature on in the outstation, if the firmware has it, or turn it off in the master and adjust around it: a faster class poll instead of unsolicited, another time source (NTP, IRIG-B, GPS) instead of DNP3 time sync.
- It is usually a five-minute configuration fix, once you know it is there.
Try it on your own capture
ComputingSphere DNP3 counts every rejected request per outstation, shows each one decoded next to the response that rejected it, and lists them as findings in the report. It only reads what already went over the wire. This capture is among the examples of every free account, to reproduce every number here; or upload your own: the Free plan covers 1,000 messages a month.