Deploy gate: Heidenhain LSV2 driver live commissioning on a real control #829
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?
#803 shipped the read-only LSV2 driver proven against an in-process simulator and replayed iTNC 530 golden vectors only. On real hardware (set
HEIDENHAIN_LSV2_HOST,OTOPCUA_HEIDENHAIN_INSPECT_PASSWORD): run the LiveIntegration tests; browse/read through a deployed server + OPC UA client; confirm write refusal, outage/recovery, traffic under load and retained evidence. Open questions: control families beyond iTNC 530, successfulR_MBPLC memory decoding (denied on all four Java-tested controls), axis/tool units, timer selector (30–34) semantics, DNC/DATA permissions per control.2026-11-11 live gate (read-only, owner-approved) through a deployed server on four production iTNC 530 controls: browse/read PASS, writes refused (56/56, none sent), outage/recovery PASS via a proxy, and load ≈5 req/s per control. #867 (Double tool leaves) is fixed and re-verified live. Still unproven: other control families, R_MB, axis/tool units, timers and DATA. Evidence: docs/drivers/evidence/heidenhain-live-2026-11-11.md (pushed).
Live gate run 2026-11-12/13 — four real iTNC 530 controls (read-only)
Controls from the ignitionoee 0.20.3 validation (
docs/recipes/evidence/heidenhain-final-0.20.3-2026-11-03), reached over the Mac's VPN. INSPECT login with an empty password only; nothing was written to any control; no controller settings touched.1.
Category=LiveIntegration(direct driver), one control at a timeR_PRlayout (WORD base 64, 10000 bytes), driver end-to-end status poll pass.R_RI22/23/24/26 answer on all four; 25 (overrides) refused code 23 → AccessDenied on all four.R_RI 51(tool) answers on 59/70/29 (24 bytes) →Tool/NumberInt64,Tool/Index/AxisCodeInt32 (#867 confirmed on hardware). Hermle49 refuses 51 with code 24 → Unsupported; the driver publishesBadNotSupported. The tool-type test asserted >0 Good and failed there — fixed to skip in0821e27c.2. Deployed server + OPC UA client (docker-dev, SITE-A pair,
opc.tcp://localhost:4842)One
Heidenhaindriver, 4 devices × 18 fixed leaves + oneALARM:*condition, authored straight into ConfigDb and deployed via the headless API. (The deploy gate refused my first attempt —HeidenhainTagDataTypeMismatch, Tag.DataTypeFloat64must beDouble— correct behaviour, authoring error.)ns=2;s=heid/<Control>/<Leaf>tree + theAnyAlarmcondition's Part 9 children, all four controls.ProgramLineadvancing 56506→59207,ToolLength198.1454);Overrides/FeedBadUserAccessDeniedon all four; Hermle49 Tool/*BadNotSupported.Hermle59/ModelandHermle59/ToolNumber→BadNotWritable, value unchanged. (An authenticated encrypted session couldn't be opened — the CLI client cert isn't trusted by the rig; the node AccessLevel refusal applies to every user anyway.)docker pauseproxy): detected at the 5 s transaction deadline; every remote leafBadNoCommunication,Capabilities/Execution=CommunicationLost, alarm condition qualityBadNoCommunication(state kept); other controls stayed Good. Bounded backoff (connect attempts at +6/+7/+9/+10/+16 s); recovered Good 18 s after unpause, alarm list readable again.docker killproxy, name unresolvable): same Bad fan-out within 8 s; recovered 6 s after restart.Cleanup: rows deleted, cleanup deploy sealed on all 6 nodes, driver disposed on both nodes, proxy removed.
Still open
R_MBdecoding (no PLC/DATA bindings exercised here); DATA role; axis/tool units vs the HMI; timer selectors 30–34; per-control DNC/DATA permissions; load with a large binding set; production deploy.Pushed
a4ce417d: best-effort coverage of the non-iTNC items from pyLSV2 (MIT) as the reference, since we have no other control families. Read-only boundary unchanged (no new request, login or selector).Controller/Family(ITnc530/Tnc/Tnc7/Lathe/MillPlus/LegacyTnc/Unknown) classified from R_VR; DATA gated to iTNC 530; simulator profiles per family. Non-iTNC rows are per pyLSV2, hardware-unproven (docs §Control families).Status/ExecutionStateName,Status/ProgramStateName,Tool/AxisName; timers 30–34 documented as lifetime seconds counters per pyLSV2 (still off by default); refusals 52/72/58/56/57 map to specific statuses.INPUT_DWORD/OUTPUT_DWORD, pyLSV2 address correspondence. R_MB answer: pyLSV2 reads PLC memory only after aPLCDEBUGlogin, a write-capable role (also used for machine-parameter writes) → incompatible with this read-only driver; raw R_MB stays refused,DATA:/PLC/memory/...is the read-only path.Real_control_derived_name_leavespassed on Hermle49/59/70/29 (Family ITnc530, Automatic/Idle, axis Z; Hermle49 axis BadNotSupported).Still hardware-gated: anything non-iTNC, units vs HMI, timers on a real control, C_CC buffer negotiation and R_RI 20/21 (both outside the allowlist).
Hardware evidence from the ignitionoee CR capture (2026-11-13), and acceptance.
ignitionoee
6d2aec40(docs/recipes/evidence/heidenhain-runstate-sample-2026-11-13/) took a 7 h read-only OPC UA sample (04:51–11:50Z, every 5 s, 17 leaves) of the 34 Heidenhain controls on CR's production Ignition gateway. That driver is the Java LSV2 implementation this driver was ported from. It has the same read set, refusal mapping and state codes. Findings compared with this driver:ProgramState0 coincides with axis motion in 11,865 of 11,869 sample pairs; 7 = idle, no motionR_RI 26Int32 +ProgramStateNamefrom the pyLSV2 table (0 Started … 7 Idle)BadNotSupported, capabilityUnsupportedBadNotSupported+Unsupported, suppressed until reconnectR_RI 25)BadUserAccessDeniedon every iTNC (INSPECT)BadUserAccessDenied/AccessDeniedExecutionState5 Undefined on idle machinesUndefinednameUnknownuntil the feature's first pollCapabilityStatereturnsUnknownuntil the first attemptBadNoCommunication, recovered on reconnect (Z-18985 dropped and came back during the capture)Accepted per owner decision 2026-11-13: the hardware evidence does not change the driver's code. The remaining items in the description —
R_MB(needs PLCDEBUG, deliberately excluded), axis/tool units, timer 30–34 semantics, other control families and per-control DNC/DATA matrices — stay documented as known limits indocs/drivers/Heidenhain.mdand do not block acceptance. Closing.