The aahClientManaged SDK is now isolated in ZB.MOM.WW.LmxOpcUa.Historian.Aveva and loaded via HistorianPluginLoader from a Historian/ subfolder only when enabled, removing the SDK from Host's compile-time and deploy-time surface. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
202 lines
8.9 KiB
Markdown
202 lines
8.9 KiB
Markdown
# 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
|
|
```
|
|
|
|
**Service logon requirement:** The service must run under a Windows account that has access to the AVEVA Galaxy and Historian. The default `LocalSystem` account can connect to MXAccess and SQL Server but **cannot authenticate with the Historian SDK** (HCAP). Configure the service to "Log on as" a domain or local user that is a recognized ArchestrA platform user. This can be set in `services.msc` or during install with `ZB.MOM.WW.LmxOpcUa.Host.exe install -username DOMAIN\user -password ***`.
|
|
|
|
### 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.
|