test(s7): codec live tests use the documented byte-anchored DBB form (#632)

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 16:55:10 -04:00
parent 2aae3c094f
commit bbea38483f
@@ -8,7 +8,7 @@ namespace ZB.MOM.WW.OtOpcUa.Driver.S7.IntegrationTests.S7_1500;
/// Gitea #632 / #638 live coverage: the S7 STRING / WSTRING / CHAR / WCHAR / DTL / DATE / TOD / TIME /
/// S5TIME codecs against the python-snap7 S7-1500 profile, over real ISO-on-TCP + S7comm, plus the
/// TSAP override keys (<c>LocalTsap</c> / <c>RemoteTsap</c> / <c>ConnectionType</c>) and the negotiated
/// PDU size. Read seeds live at DB1 800..960 in <c>Docker/profiles/s7_1500.json</c> and are all
/// PDU size. Wide/date-time types are byte-anchored (DBB) by driver rule. Read seeds live at DB1 800..960 in <c>Docker/profiles/s7_1500.json</c> and are all
/// distinct and non-zero, so a decode that returned zero/default cannot pass. Write tests use the
/// unseeded DB1 1100..1199 scratch area and additionally need <c>S7_SIM_ALLOW_WRITES=1</c>. Everything
/// skips cleanly when <c>S7_SIM_ENDPOINT</c> (default the shared Docker host) is unreachable.
@@ -63,13 +63,13 @@ public sealed class S7_1500CodecTests(Snap7ServerFixture sim)
new S7TagDefinition("Chr", "DB1.DBB870", S7DataType.Char),
new S7TagDefinition("WChr", "DB1.DBB872", S7DataType.WChar),
new S7TagDefinition("Dtl", "DB1.DBB880", S7DataType.Dtl),
new S7TagDefinition("Date", "DB1.DBW900", S7DataType.Date),
new S7TagDefinition("Tod", "DB1.DBD904", S7DataType.Tod),
new S7TagDefinition("TimePos", "DB1.DBD910", S7DataType.Time),
new S7TagDefinition("TimeNeg", "DB1.DBD914", S7DataType.Time),
new S7TagDefinition("S5Sec", "DB1.DBW920", S7DataType.S5Time),
new S7TagDefinition("S5Cs", "DB1.DBW922", S7DataType.S5Time),
new S7TagDefinition("DateMax", "DB1.DBW960", S7DataType.Date));
new S7TagDefinition("Date", "DB1.DBB900", S7DataType.Date),
new S7TagDefinition("Tod", "DB1.DBB904", S7DataType.Tod),
new S7TagDefinition("TimePos", "DB1.DBB910", S7DataType.Time),
new S7TagDefinition("TimeNeg", "DB1.DBB914", S7DataType.Time),
new S7TagDefinition("S5Sec", "DB1.DBB920", S7DataType.S5Time),
new S7TagDefinition("S5Cs", "DB1.DBB922", S7DataType.S5Time),
new S7TagDefinition("DateMax", "DB1.DBB960", S7DataType.Date));
await using var drv = new S7Driver(o, "s7-codec-read");
await drv.InitializeAsync("{}", TestContext.Current.CancellationToken);
@@ -100,10 +100,10 @@ public sealed class S7_1500CodecTests(Snap7ServerFixture sim)
RequireSim();
var o = Options(sim.Host, sim.Port,
new S7TagDefinition("DtlUninit", "DB1.DBB930", S7DataType.Dtl),
new S7TagDefinition("S5NonBcd", "DB1.DBW940", S7DataType.S5Time),
new S7TagDefinition("TodPastMidnight", "DB1.DBD944", S7DataType.Tod),
new S7TagDefinition("S5NonBcd", "DB1.DBB940", S7DataType.S5Time),
new S7TagDefinition("TodPastMidnight", "DB1.DBB944", S7DataType.Tod),
new S7TagDefinition("WStrCurOverMax", "DB1.DBB950", S7DataType.WString, StringLength: 3),
new S7TagDefinition("Good", "DB1.DBD904", S7DataType.Tod));
new S7TagDefinition("Good", "DB1.DBB904", S7DataType.Tod));
await using var drv = new S7Driver(o, "s7-codec-bad");
await drv.InitializeAsync("{}", TestContext.Current.CancellationToken);
@@ -125,10 +125,10 @@ public sealed class S7_1500CodecTests(Snap7ServerFixture sim)
new("Chr", "DB1.DBB1150", S7DataType.Char),
new("WChr", "DB1.DBB1152", S7DataType.WChar),
new("Dtl", "DB1.DBB1160", S7DataType.Dtl),
new("Date", "DB1.DBW1180", S7DataType.Date),
new("Tod", "DB1.DBD1184", S7DataType.Tod),
new("Time", "DB1.DBD1188", S7DataType.Time),
new("S5", "DB1.DBW1192", S7DataType.S5Time),
new("Date", "DB1.DBB1180", S7DataType.Date),
new("Tod", "DB1.DBB1184", S7DataType.Tod),
new("Time", "DB1.DBB1188", S7DataType.Time),
new("S5", "DB1.DBB1192", S7DataType.S5Time),
];
/// <summary>Write each codec's value, read it back through the driver (distinct non-zero values).</summary>