docs(history): OtOpcUa native AB transport merged — AbCip native default, AbLegacy opt-in, real-press gate passed

This commit is contained in:
Joseph Doherty
2026-10-07 22:45:47 -04:00
parent c43d7ee1ad
commit 21a95c7f50
@@ -35,14 +35,18 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes
128 KiB (`BadOutOfRange` beyond; poll uncapped). Supersedes the `UseNativeNotifications=false`-for-arrays workaround above. Also fixed:
bit-indexed BOOL notifications register on the parent word (the `WORD.N` path failed the whole subscribe call). Live-gated read-only
on Z33856/Z33733 — native == poll for every array incl. changing, multi-dim, STRING(80) and a 131,072 B array.
- **AbCip / AbLegacy native managed transport (2026-10-07, branch `feat/native-ab-transport`, unmerged).** Both drivers gain a second
wire transport (`Driver.Ab.Transport`: encapsulation, CIP, MSP-coalescing request scheduler, PCCC) beside libplctag, selected by the
driver-config key `transport` = `Libplctag` | `Native` (string; applied when the driver is recreated by a deploy; AdminUI Transport
dropdown; CLIs `--transport`). **Opt-in: the default is still `Libplctag`**, pending the real-press read-only gate (Task 21, not yet
run) and the default flip (Task 22, which excludes PLC-5 and logixpccc). Driver set and wire contract unchanged. Consumer-visible:
native reports `BadTypeMismatch` where libplctag returned Good garbage for a same-width mis-authored type (DINT authored, REAL
returned), so ScadaBridge may see Bad on tags that looked healthy. Evidence is simulator-only (ab_server suites per transport,
differential harness, AdminUI `/run` three-leg gate on docker-dev); native writes have never touched a real controller, and libplctag
deletion is blocked on a bench controller. Also fixed on master: libplctag empty CIP path (`ab://host:44818/`) now sends no path
(Micro800 / unrouted MicroLogix previously `ErrorBadData`). AbCip drivers now receive the host logger. Follow-ups Gitea #564-#577.
Details: OtOpcUa `docs/drivers/AbCip.md` §Transport, `docs/plans/2026-10-07-native-ab-transport-gate-results.md`.
- **AbCip / AbLegacy native managed transport (2026-10-07, merged to `master` 2026-10-08, merge `04b65632`).** Both drivers gain a
second wire transport (`Driver.Ab.Transport`: encapsulation, CIP, MSP-coalescing request scheduler, PCCC) beside libplctag, selected
by the driver-config key `transport` = `Native` | `Libplctag` (string; omitted = default; AdminUI dropdown with a "Default" choice that
omits the key; CLIs `--transport`). **AbCip now defaults to `Native`** — the upgrade restart itself moves every AbCip driver without
a key; node-level `Drivers:AbCip:DefaultTransport` (env `Drivers__AbCip__DefaultTransport`) pins the default back to libplctag
without editing drivers. **AbLegacy stays on `Libplctag`; native is opt-in** (only N-file reads/writes and one F8 read have wire
evidence). Real-press read-only gate on production CompactLogix Z-35162: browse 3162 = 3162 tags, 20 UDT templates identical,
200-tag read parity with 0 unexpected divergences, native p95 ≈ 105 ms vs libplctag 140–197 ms, one Forward Open/Close per native
session, packet capture shows zero write services. Consumer-visible (ScadaBridge): mis-authored same-width AbCip types now read
`BadTypeMismatch` (libplctag returned Good garbage); native refusals (AbLegacy opt-in: PLC-5 non-N reads, all PLC-5 writes,
T/C/R status-bit writes) read `BadNotSupported`; neither degrades driver health. Also fixed: a libplctag.NET 1.5.2
failed-tag-create crash that could kill the server process at stop/restart (#578); the libplctag empty CIP path (Micro800 /
unrouted MicroLogix `ErrorBadData`). Native AbCip writes remain simulator-proven only; libplctag deletion is blocked on a bench
controller. Follow-ups Gitea #564-#585. Details: OtOpcUa `docs/drivers/AbCip.md` §Transport,
`docs/plans/2026-10-07-native-ab-transport-gate-results.md`.