Add Heidenhain LSV2 read-only driver #803
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request
Add a native read-only Heidenhain LSV2 driver to lmxopcua, using the existing Java implementation in ignitionoee as the protocol and behavior reference. Integrate it with the existing .NET driver, configuration, discovery, health, and OPC UA infrastructure.
Java reference
Scope
Read-only boundary
Expose no writable OPC nodes. Enforce a payload-aware outbound command allowlist for the required logins and read requests. Exclude program/PLC/parameter/file writes, arbitrary commands, keyboard or motion control, privilege changes, and security/license bypasses.
Acceptance criteria
The Java v0.20.3 artifact was validated on 2026-11-03 against four real iTNC 530 controls. DATA reads worked on three; raw R_MB reads remained permission-denied on all four. Other controller families, successful raw-memory decoding, physical units/HMI comparisons, experimental timer semantics, and sustained fleet/load operation remain separate validation gates.
Implemented on master (merge
7af9c40e+ fix5bbe1e3c): native read-only Heidenhain LSV2 driver (Driver.Heidenhain+ Contracts), no Java/Python/vendor SDK, all registration seams (factory,DriverTypeNames.Heidenhain, admin-node probe, deploy gates, /raw driver+device modals, typed tag editor, CSV, browse-commit), docs indocs/drivers/Heidenhain.md.Read-only: no
IWritable; deploy gateHeidenhainTagWritable+ authoring refusals; a payload-aware outbound allowlist in the only frame builder (A_LG INSPECT/DNC/DATA; R_VR/R_PR empty; R_RI selectors 22–28, 30–34, 51; R_MB bounded/no wrap; R_DP zero-prefix + terminated path) — refused requests send zero bytes. Credentials: onlysecret:heidenhain/<name>orenv:OTOPCUA_HEIDENHAIN_<NAME>, enforced in parser, save path, deploy gate, probe and at resolve time (closes a Test-Connect exfiltration path the review found; same class for other drivers → #815). Quality per refusal/unsupported/malformed/mismatch, all values BadNoCommunication on comms loss, bounded backoff. Experimental timer selectors off by default.Independent review: read-only boundary and protocol port verified against the Java reference; 8 findings (2 medium credential issues) fixed. Tests: driver 194 (+2 live-hardware skips, golden vectors from the Java iTNC 530 captures), AdminUI 2023, Configuration 252, Core.Abstractions 565.
docker-dev live gate: first run found that the probe's eager
ISecretResolverresolution crash-looped every central node at boot (Akka AuditWriterActorKey ordering) — fixed in5bbe1e3cwith a regression test. Re-run on5bbe1e3c: all 6 items PASS (modals round-trip with string-named JSON; literal/out-of-namespace passwords refused and not persisted; Test Connect fails cleanly and fail-closed; tag access locked to Read with data type from the address; CSV ReadWrite/mismatch rows refused at commit; deploy sealed, nodes BadNoCommunication and BadNotWritable on write; /hosts DEGRADED with the right reason; no console errors or 500s).Hardware-gated remainder → #829. Follow-ups: #830, #831.