a7dd2f59d0
v2-ci / build (push) Failing after 39s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
100 lines
6.1 KiB
Markdown
100 lines
6.1 KiB
Markdown
# 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`](../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: SQL `OtOpcUaConfig` on `: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-count`
|
||
- `ns=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 bake `Cluster:Roles`
|
||
> into 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`](../plans/2026-06-26-otopcua-fixedtree-equipment-injection-design.md)
|
||
and [`…-injection.md`](../plans/2026-06-26-otopcua-fixedtree-equipment-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` → new `FOCAS` subtree (`Identity`, `Axes` X/Y/Z/B/C/AA
|
||
+ `Actual`, `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-required` still Good — no regression.
|
||
|
||
Rollback point retained at `E:\ApiInstall\OtOpcUa_bak-20260626111416`.
|