fix(twincat): review fixes for sum-read and diagnostics (#645)

Strict width+kind eligibility for sum-batched scalars (others read singly); latch only on ADS
1793/1794, split 1792/1797/1798 without latching; 32 KiB per-command budget and 500-item ceiling;
short sum response handled per item. Diagnostics: opt-in diagnosticsEnabled (default off), reuse the
probe's ReadState, sample after the host-state transition, JitterMs renamed HeadroomMs, compact
per-device line so many devices fit the 16-entry cap, unavailable-symbol latch cleared on reconnect.
AdminUI: min/max on sum-read max, diagnostics checkbox. Pure planner extracted and unit-tested.

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 19:29:35 -04:00
parent af19db4ed1
commit fbcb521d1b
16 changed files with 470 additions and 138 deletions
@@ -74,6 +74,7 @@ public sealed class TwinCATDriverPageFormSerializationTests
NotificationMaxDelayMs = 100,
UseSumRead = true,
SumReadMaxItems = 64,
DiagnosticsEnabled = true,
Probe = new TwinCATProbeOptions
{
Enabled = true,
@@ -92,6 +93,7 @@ public sealed class TwinCATDriverPageFormSerializationTests
roundTripped.NotificationMaxDelayMs.ShouldBe(100);
roundTripped.UseSumRead.ShouldBeTrue();
roundTripped.SumReadMaxItems.ShouldBe(64);
roundTripped.DiagnosticsEnabled.ShouldBeTrue();
roundTripped.Probe.Enabled.ShouldBeTrue();
roundTripped.Probe.Interval.ShouldBe(TimeSpan.FromSeconds(6));
roundTripped.Probe.Timeout.ShouldBe(TimeSpan.FromSeconds(2));