6.1 KiB
Deployment record — wonder-app-vd03 · Makino Pro 5 (Z-34184) FOCAS
Date configured: 2026-06-25
Host: wonder-app-vd03.zmr.zimmer.com (OtOpcUaHost Windows service, single fused admin+driver node)
Status: Configured + deployed + served. Live values blocked by the FOCAS PDU-v3 driver gap —
see docs/plans/2026-06-25-focas-pdu-v3-30i-b-support.md.
Equipment
| Field | Value |
|---|---|
| Machine | Makino Pro 5 (FANUC 30i-B control) |
| IP / FOCAS endpoint | 10.201.31.5:8193 (FOCAS Ethernet, TCP) — reachable from the host (and from VPN clients) |
| ZTag | Z-34184 |
| Manufacturer / Model | Makino / Pro 5 |
| CNC series (driver) | Thirty_i (30i) |
OtOpcUa host endpoints
- AdminUI:
http://wonder-app-vd03.zmr.zimmer.com:9000(login disabled —Security__Auth__DisableLogin=true) - OPC UA:
opc.tcp://wonder-app-vd03.zmr.zimmer.com:4840/OtOpcUa - Akka cluster:
:4053· ConfigDb: SQLOtOpcUaConfigon:1433
Deployed configuration (cluster DEV, Enterprise zb / Site wonder-app-vd03)
First config ever deployed on this node. All authored via the AdminUI.
| Object | Value |
|---|---|
| Namespace | dev-equipment (Equipment), URI urn:zb:wonder-app-vd03:equipment |
| UNS path | zb / wonder-app-vd03 / machining / makino |
| FOCAS driver instance | focas-z-34184 ("Makino Pro 5 Z-34184 (FOCAS)"), backend wire, FixedTree enabled |
| Device | 10.201.31.5:8193, series Thirty_i |
| Equipment | z-34184 → EquipmentId = EQ-3686c0272279, MachineCode Z-34184, ZTag Z-34184 |
| Tags | parts-count → MACRO:3901 (Float64/Double, Read); parts-required → MACRO:3902 (Float64/Double, Read) |
| Deployment | 0c2db588 (rev 924b59097eba…) — Sealed / "In sync" |
OPC UA node IDs (verified served via the OtOpcUa CLI client):
- Equipment:
ns=2;s=EQ-3686c0272279 ns=2;s=EQ-3686c0272279/parts-countns=2;s=EQ-3686c0272279/parts-required
Host change required to deploy at all (Akka cluster roles)
This node was joining the Akka cluster role-less, so no deployment could ever complete
("a task was canceled"; Fleet status: "no driver-role nodes are Up"). Root cause: OTOPCUA_ROLES
(set to admin,driver) drives Program.cs actor wiring but does not populate the Akka member roles —
those come from config Cluster:Roles, which was unset (no Cluster__Roles env var; no Cluster
section in any appsettings). No code bridges OTOPCUA_ROLES → AkkaClusterOptions.Roles.
Fix applied to the host service (HKLM\SYSTEM\CurrentControlSet\Services\OtOpcUaHost → Environment):
added Cluster__Roles__0=admin and Cluster__Roles__1=driver, then restarted the service. The member
now joins UP with roles ADMIN+DRIVER and deployments seal. Prior env backed up on the host at
E:\ApiInstall\OtOpcUa\_envbak-20260625T145303.txt.
Product follow-up: either wire
OTOPCUA_ROLES→AkkaClusterOptions.Roles, or bakeCluster:Rolesinto the deploy template, so a node redeploy doesn't regress to role-less.
Live verification (OtOpcUa CLI client → server)
connect + browse confirm the equipment + both tags are served at the node IDs above.
Driver fix shipped (2026-06-25): the wire client now accepts PDU v3 (see the linked plan). Validated
directly against 10.201.31.5 — MACRO:3901/3902 read Good from the live 30i-B. However, the
OtOpcUaHost on this box is still running the pre-v3 driver binary, so the live OPC UA tags will keep
returning Bad_WaitingForInitialData until the rebuilt ZB.MOM.WW.OtOpcUa.Driver.FOCAS.dll (or a fresh
self-contained host publish) is deployed to E:\ApiInstall\OtOpcUa\ and OtOpcUaHost is restarted. Once
redeployed, parts-count/parts-required should go Good (FixedTree + PMC/Parameter still pending the
follow-on v3 command work).
FixedTree under the Equipment node (feature built 2026-06-26)
The FOCAS FixedTree (Identity / Axes / Spindle / Program / Timers) now surfaces under the equipment as
read-only value nodes, via a generic post-connect ITagDiscovery injection feature (branch
feat/focas-fixedtree-equipment-injection; design + plan at
docs/plans/2026-06-26-otopcua-fixedtree-equipment-injection-design.md
and …-injection.md). After the driver
connects and its FixedTreeCache populates (~0–2 s), nodes are grafted at e.g.
ns=2;s=EQ-3686c0272279/FOCAS/Identity/SeriesNumber and …/FOCAS/Axes/X/AbsolutePosition, carrying live
values through the same path as the authored parts-count/parts-required tags, and survive redeploys.
✅ LIVE-VALIDATED 2026-06-26. A full self-contained Host overlay built from
feat/focas-fixedtree-equipment-injection @ 37cac5de was deployed to E:\ApiInstall\OtOpcUa
(stop → full backup E:\ApiInstall\OtOpcUa_bak-20260626111416 → robocopy overlay preserving
appsettings*.json + pki\ → restart; /healthz 200 Healthy, member Up ADMIN+DRIVER, OPC :4840
listening). After the FOCAS driver reconnected, the host log recorded
DriverHost …: injected 57 discovered node(s) for driver focas-z-34184 under EQ-3686c0272279 and
AddressSpaceApplier: discovered nodes materialised under EQ-3686c0272279 (folders=14, vars=57) —
no Exception/NotSupportedException. Verified via the OtOpcUa CLI from a remote client:
browse --recursive ns=2;s=EQ-3686c0272279→ newFOCASsubtree (Identity,AxesX/Y/Z/B/C/AAActual,Spindle/S1,Program,OperationMode,Timers), stable + idempotent across repeat browses (no churn); the device-host folder (10.201.31.5:8193) was collapsed as designed.
- Sample reads, all Good (
Status 0x0) with fresh/advancing source times:FOCAS/Identity/SeriesNumber=G431,CncType=31,AxisCount=7,FOCAS/Axes/X/AbsolutePosition=2801574(live),FOCAS/OperationMode/ModeText=TJOG. - Authored
parts-count/parts-requiredstill Good — no regression.
Rollback point retained at E:\ApiInstall\OtOpcUa_bak-20260626111416.