# LmxOpcUa OPC UA server and cross-platform client tools for AVEVA System Platform (Wonderware) Galaxy. The server exposes Galaxy tags via MXAccess as an OPC UA address space. The client stack provides a shared library, CLI tool, and Avalonia desktop application for browsing, reading/writing, subscriptions, alarms, and historical data. ## Architecture ``` OPC UA Clients (CLI, Desktop UI, 3rd-party) | v +-----------------+ +------------------+ +-----------------+ | Galaxy Repo DB |---->| OPC UA Server |<--->| MXAccess Client | | (SQL Server) | | (address space) | | (STA + COM) | +-----------------+ +------------------+ +-----------------+ | | +-------+--------+ +---------+---------+ | Status Dashboard| | Historian Runtime | | (HTTP/JSON) | | (SQL Server) | +----------------+ +-------------------+ ``` ## Contained Name vs Tag Name | Browse Path (contained names) | Runtime Reference (tag name) | |-------------------------------|------------------------------| | `TestMachine_001/DelmiaReceiver/DownloadPath` | `DelmiaReceiver_001.DownloadPath` | | `TestMachine_001/MESReceiver/MoveInBatchID` | `MESReceiver_001.MoveInBatchID` | --- ## Server The OPC UA server runs on .NET Framework 4.8 (x86) and bridges the Galaxy runtime to OPC UA clients. ### Server Prerequisites - .NET Framework 4.8 SDK - AVEVA System Platform with ArchestrA Framework installed - Galaxy repository database (SQL Server, Windows Auth) - MXAccess COM registered (`LMXProxy.LMXProxyServer`) - Wonderware Historian (optional, for historical data access) - Windows (required for COM interop and MXAccess) ### Build and Run Server ```bash dotnet restore ZB.MOM.WW.LmxOpcUa.slnx dotnet build src/ZB.MOM.WW.LmxOpcUa.Host dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Host ``` The server starts on `opc.tcp://localhost:4840/LmxOpcUa` with the `None` security profile by default. Configure `Security.Profiles` in `appsettings.json` to enable `Basic256Sha256-Sign` or `Basic256Sha256-SignAndEncrypt` for transport security. See [Security Guide](docs/security.md). ### Install as Windows Service ```bash cd src/ZB.MOM.WW.LmxOpcUa.Host/bin/Debug/net48 ZB.MOM.WW.LmxOpcUa.Host.exe install ZB.MOM.WW.LmxOpcUa.Host.exe start ``` ### Run Server Tests ```bash dotnet test tests/ZB.MOM.WW.LmxOpcUa.Tests dotnet test tests/ZB.MOM.WW.LmxOpcUa.IntegrationTests ``` --- ## Client Stack The client stack is cross-platform (.NET 10) and consists of three projects sharing a common `IOpcUaClientService` abstraction. No AVEVA software or COM is required — the clients connect to any OPC UA server. ### Client Prerequisites - .NET 10 SDK - No platform-specific dependencies (runs on Windows, macOS, Linux) ### Build All Clients ```bash dotnet build src/ZB.MOM.WW.LmxOpcUa.Client.Shared dotnet build src/ZB.MOM.WW.LmxOpcUa.Client.CLI dotnet build src/ZB.MOM.WW.LmxOpcUa.Client.UI ``` ### Run Client Tests ```bash dotnet test tests/ZB.MOM.WW.LmxOpcUa.Client.Shared.Tests dotnet test tests/ZB.MOM.WW.LmxOpcUa.Client.CLI.Tests dotnet test tests/ZB.MOM.WW.LmxOpcUa.Client.UI.Tests ``` ### Client CLI ```bash # Connect dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- connect -u opc.tcp://localhost:4840/LmxOpcUa # Browse Galaxy hierarchy dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- browse -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=ZB" -r -d 5 # Read a tag dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- read -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=TestMachine_001.MachineID" # Write a tag dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- write -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=TestChildObject.TestString" -v "Hello" # Subscribe to changes dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- subscribe -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=TestChildObject.TestInt" -i 500 # Read historical data dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- historyread -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=TestMachine_001.TestHistoryValue" --start "2026-03-25" --end "2026-03-30" # Subscribe to alarm events dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- alarms -u opc.tcp://localhost:4840/LmxOpcUa -n "ns=3;s=TestMachine_001" --refresh # Query redundancy state dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.CLI -- redundancy -u opc.tcp://localhost:4840/LmxOpcUa ``` ### Client UI ```bash dotnet run --project src/ZB.MOM.WW.LmxOpcUa.Client.UI ``` The desktop application provides browse tree, subscriptions, alarm monitoring, history reads, and write dialogs. See [Client UI Documentation](docs/Client.UI.md) for details. --- ## Project Structure ``` src/ ZB.MOM.WW.LmxOpcUa.Host/ OPC UA server (.NET Framework 4.8, x86) Configuration/ Config binding and validation Domain/ Interfaces, DTOs, enums, mappers Historian/ Wonderware Historian data source Metrics/ Performance tracking (rolling P95) MxAccess/ STA thread, COM interop, subscriptions GalaxyRepository/ SQL queries, change detection OpcUa/ Server, node manager, address space, alarms, diff Status/ HTTP dashboard, health checks ZB.MOM.WW.LmxOpcUa.Client.Shared/ Shared OPC UA client library (.NET 10) ZB.MOM.WW.LmxOpcUa.Client.CLI/ Command-line client (.NET 10) ZB.MOM.WW.LmxOpcUa.Client.UI/ Avalonia desktop client (.NET 10) tests/ ZB.MOM.WW.LmxOpcUa.Tests/ Server unit + integration tests ZB.MOM.WW.LmxOpcUa.IntegrationTests/ Server integration tests (live DB) ZB.MOM.WW.LmxOpcUa.Client.Shared.Tests/ Shared library tests ZB.MOM.WW.LmxOpcUa.Client.CLI.Tests/ CLI command tests ZB.MOM.WW.LmxOpcUa.Client.UI.Tests/ UI ViewModel + headless tests gr/ Galaxy repository docs, SQL queries, schema ``` ## Documentation ### Server | Component | Description | |---|---| | [OPC UA Server](docs/OpcUaServer.md) | Endpoint, sessions, security policy, server lifecycle | | [Address Space](docs/AddressSpace.md) | Hierarchy nodes, variable nodes, primitive grouping, NodeId scheme | | [Galaxy Repository](docs/GalaxyRepository.md) | SQL queries, deployed package chain, change detection | | [MXAccess Bridge](docs/MxAccessBridge.md) | STA thread, COM interop, subscriptions, reconnection | | [Data Type Mapping](docs/DataTypeMapping.md) | Galaxy to OPC UA types, arrays, security classification | | [Read/Write Operations](docs/ReadWriteOperations.md) | Value reads, writes, access level enforcement, array element writes | | [Subscriptions](docs/Subscriptions.md) | Ref-counted MXAccess subscriptions, data change dispatch | | [Alarm Tracking](docs/AlarmTracking.md) | AlarmConditionState nodes, InAlarm monitoring, event reporting | | [Historical Data Access](docs/HistoricalDataAccess.md) | Historian data source, HistoryReadRaw, HistoryReadProcessed | | [Incremental Sync](docs/IncrementalSync.md) | Diff computation, subtree teardown/rebuild, subscription preservation | | [Configuration](docs/Configuration.md) | appsettings.json binding, feature flags, validation | | [Status Dashboard](docs/StatusDashboard.md) | HTTP server, health checks, metrics reporting | | [Service Hosting](docs/ServiceHosting.md) | TopShelf, startup/shutdown sequence, error handling | | [Security](docs/security.md) | Transport security profiles, certificate trust, production hardening | | [Redundancy](docs/Redundancy.md) | Non-transparent warm/hot redundancy, ServiceLevel, paired deployment | ### Client | Component | Description | |---|---| | [Client CLI](docs/Client.CLI.md) | Connect, browse, read, write, subscribe, historyread, alarms, redundancy commands | | [Client UI](docs/Client.UI.md) | Avalonia desktop client: browse, subscribe, alarms, history, write values | ### Reference - [Galaxy Repository Queries](gr/CLAUDE.md) — SQL queries for hierarchy, attributes, and change detection - [Data Type Mapping](gr/data_type_mapping.md) — Galaxy to OPC UA type mapping with security classification ## License Internal use only.