Skip to content

3.1r1: one answer for a read of a point type the DUT doesn't have - #70

Merged
jadamcrain merged 1 commit into
mainfrom
missing-type-errors
Oct 15, 2026
Merged

jadamcrain merged 1 commit into
mainfrom
missing-type-errors

Conversation

@jadamcrain

Copy link
Copy Markdown
Member

The contradiction

3.1r1 contradicts itself about how a device answers a read of a point type it has no points of:

  • Table 11-1, and TB2016-001, which 3.1r1 follows: the device answers with an error, IIN2.1 or IIN2.2.
  • Some of its steps: they still expect a Null Response, which has no error bits. Table 11-1 marks the update of those other sections as still to be done.

As printed, the answer therefore depends on the point type. A device without double-bit inputs must answer a read of g3 with an error, but a read of g4 with a plain Null Response (#7).

The resolution

One rule for every point type:

  • No points: a device without the points, or with them uninstalled or disabled for the test, answers with a Null Error Response: no objects, IIN2.1 or IIN2.2 set, and IIN2.0 clear.
  • Points but no events: a device with the points but no events still answers a read of those events with a Null Response, as printed. TB2016-003b's subset parsing tables say the same.
Test As printed, without the points Now
8.3.2 Null Response, IIN2.1/2.2 optional (8.3.1 requires the error) the error
8.13.2b, 8.21b an error response with IIN2.1 or IIN2.2, which may carry data the error, with no data and IIN2.0 clear
8.14.2b, 8.17.2b, 8.19.2b, 8.22b Null Response the error; with the points but no events, a Null Response, as printed
8.22.1 Null Response, IIN2.1/2.2 optional (8.21.1 requires the error) the error
8.23.2.x.1 an error response with any error bit the error, IIN2.0 clear; the level 1/2 exit for a device without range reads is unchanged
8.24.2a–g a, c–e and g read the type; b and f skip it (dnp3c ran none of them) all seven read the type once and require the error
8.25.2c–e the error; 8.25.1 also allows a Null Response the error; with the points but no events, unchanged

A level 1 test of a device that can't read a type (8.13.2a and the like) now runs only for a device that has the type. A device without the type gets the test above. Before, a device with no points and reads switched off could pass with IIN2.0.

Unchanged

2.7 is unchanged. Where 3.1r1 reused 2.7's code, it now has its own:

  • 8.17.2b has its own definition
  • 8.14.2b and 8.22b override NoEvents only for a device without the points
  • 8.19.2b passes AnalogInputChange a parameter whose default is 2.7's isNull

Documentation

  • README: a new section, "Where 3.1 rev 1 contradicts itself", with the table above. It notes that the resolution changes only which IIN bits a 3.1r1 run accepts, not interoperability.
  • CLAUDE.md: where a revision contradicts itself (its steps against its own tables, or against a bulletin it adopts), the conflict is resolved the most consistent way, the same for every point type, and listed in that README section.

Checks

  • Tests: mvn test passes. A new MissingPointsTest runs all 25 affected tests against a device without the points:
    • each passes with IIN2.1 or IIN2.2
    • each fails with a plain Null Response, and with IIN2.0 set
    • 8.14.2b, 8.17.2b, 8.19.2b and 8.22b still want a plain Null Response from a device with the points but no events
  • -describe dump: I compared every procedure's -describe output and the disabled lists, before and after, at each subset level in four configurations:
    • 2.7's are byte-identical
    • 3.1r1's differ only in the tests above and the level 1 "can't read" tests

3.1r1 contradicts itself here. Its Table 11-1, and TB2016-001, which it
follows, have a device without a point type answer a read of it with
IIN2.1 or IIN2.2, but some of its steps still expect a Null Response,
so as printed the answer depends on the point type: a device without
double-bit inputs must answer g3 with an error, and g4 without one.

Now, for every point type, a device without the points, or with them
uninstalled or disabled for the test, answers with a Null Error
Response: no objects, IIN2.1 or IIN2.2 set, and IIN2.0 clear. That
changes 8.3.2, 8.13.2b, 8.14.2b, 8.17.2b, 8.19.2b, 8.21b, 8.22.1, 8.22b,
8.23.2.x.1 and 8.25.2c-e; 8.24's seven tests now read a type the
device doesn't have and require the error, where they didn't run. A
device with the points but no events still answers a read of them with
a Null Response, as printed. A level 1 test of a device that can't read
a type runs only where the device has it.

2.7 is unchanged: where 3.1r1 used its definitions, 3.1r1 has its own,
or passes 2.7's behavior as the default. The README lists each test,
what it prints and what dnp3c accepts, and CLAUDE.md records how a
revision's contradictions with itself are resolved.
@jadamcrain
jadamcrain merged commit 7e87abf into main Oct 15, 2026
5 checks passed
@jadamcrain
jadamcrain deleted the missing-type-errors branch October 15, 2026 02:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant