fix(abcip): final review I4 — a type mismatch is a refusal, not a comms fault
A native TypeMismatch (read status, write gate, or CIP 0xFF/0x2107) used to evict the runtime and degrade health on every poll; for a sole lease holder that meant Forward Close + Forward Open per poll, and an all- mismatched driver tripped the comms-loss watchdog. It now reports BadTypeMismatch, keeps the handle, leaves health alone and warns once per tag per instance — reads, whole-UDT reads and writes, plus the libplctag width check. Tests (red against the pre-fix driver): single create over N polls, unchanged health, one warning, and one Forward Open / zero Forward Close over the real native runtime against FakeCipTarget. AbLegacy has no TypeMismatch path (its native runtime has no type check). Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -123,7 +123,8 @@ The driver has two interchangeable wire transports, selected by one `DriverConfi
|
||||
`Native`; libplctag remains available as the fallback.
|
||||
- ⚠️ **Client-visible:** native reports **`BadTypeMismatch`** for a mis-authored same-width type (for example a
|
||||
tag authored `DINT` where the controller holds a `REAL`), where libplctag returned Good garbage. Correct the
|
||||
authored type; see [Native transport behaviour](#native-transport-behaviour).
|
||||
authored type; see [Native transport behaviour](#native-transport-behaviour). It does not degrade driver
|
||||
health or churn the connection; one Warning per tag names it.
|
||||
- **To fall back** one driver, set `"transport": "Libplctag"` in its driver config (or pick "libplctag
|
||||
(fallback)" in the AdminUI dropdown). To fall back a whole node, set `Drivers:AbCip:DefaultTransport` to
|
||||
`Libplctag` (below).
|
||||
@@ -176,7 +177,10 @@ The driver has two interchangeable wire transports, selected by one `DriverConfi
|
||||
holds a `REAL` returns the REAL's bits as an integer with a Good status under libplctag, and
|
||||
`BadTypeMismatch` natively. That is the fix working, but a consumer will see Bad quality on tags that
|
||||
previously looked healthy: correct the authored type. Same-width signed/unsigned pairs are exempt, and
|
||||
writes are gated on a mismatch too.
|
||||
writes are gated on a mismatch too. A mismatch is a **deterministic configuration refusal**, handled like
|
||||
an Unsupported refusal (final review I4): the tag's handle is kept (no re-create, no reconnect), driver
|
||||
health is unchanged (no `Degraded`, nothing fed to the comms-loss watchdog), and the Warning is logged
|
||||
**once per tag** per driver instance, not every poll. The same applies to the libplctag-path width check.
|
||||
- Malformed tag names put the device into backoff, as under libplctag (#570). STRING capacity includes the
|
||||
alignment pad (84, not 82) (#570).
|
||||
- **A refused operation is not a comms fault.** Any operation a runtime refuses as Unsupported (in AbCip, e.g.
|
||||
|
||||
Reference in New Issue
Block a user