diff --git a/.claude/skills/sister-project-history/otopcua.md b/.claude/skills/sister-project-history/otopcua.md index 246c0c8..ff68168 100644 --- a/.claude/skills/sister-project-history/otopcua.md +++ b/.claude/skills/sister-project-history/otopcua.md @@ -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`.