Implement LmxOpcUa server — all 6 phases complete
Full OPC UA server on .NET Framework 4.8 (x86) exposing AVEVA System Platform Galaxy tags via MXAccess. Mirrors Galaxy object hierarchy as OPC UA address space, translating contained-name browse paths to tag-name runtime references. Components implemented: - Configuration: AppConfiguration with 4 sections, validator - Domain: ConnectionState, Quality, Vtq, MxDataTypeMapper, error codes - MxAccess: StaComThread, MxAccessClient (partial classes), MxProxyAdapter using strongly-typed ArchestrA.MxAccess COM interop - Galaxy Repository: SQL queries (hierarchy, attributes, change detection), ChangeDetectionService with auto-rebuild on deploy - OPC UA Server: LmxNodeManager (CustomNodeManager2), LmxOpcUaServer, OpcUaServerHost with programmatic config, SecurityPolicy None - Status Dashboard: HTTP server with HTML/JSON/health endpoints - Integration: Full 14-step startup, graceful shutdown, component wiring 175 tests (174 unit + 1 integration), all passing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
43
gr/queries/hierarchy.sql
Normal file
43
gr/queries/hierarchy.sql
Normal file
@@ -0,0 +1,43 @@
|
||||
-- Galaxy Object Hierarchy for OPC UA Server
|
||||
-- Returns the parent-child hierarchy with both browse names (contained_name) and tag names.
|
||||
-- Use browse_name for OPC UA browse tree display.
|
||||
-- Use tag_name for runtime read/write tag references.
|
||||
--
|
||||
-- Derived from internal_automation_object_model_hierarchy_view2 logic:
|
||||
-- - gobject: provides hierarchy (contained_by_gobject_id, area_gobject_id) and names
|
||||
-- - template_definition: category_id filters to automation-relevant objects
|
||||
--
|
||||
-- Category IDs:
|
||||
-- 1 = $WinPlatform (platform objects)
|
||||
-- 3 = $AppEngine (application engines)
|
||||
-- 4 = $InTouchViewApp (InTouch view apps)
|
||||
-- 10 = $UserDefined (user-defined automation objects)
|
||||
-- 11 = $FieldReference (field reference objects)
|
||||
-- 13 = $Area (areas / folders)
|
||||
-- 17 = $DIObject (DI objects)
|
||||
-- 24 = $DDESuiteLinkClient
|
||||
-- 26 = $OPCClient
|
||||
|
||||
SELECT DISTINCT
|
||||
g.gobject_id,
|
||||
g.tag_name,
|
||||
g.contained_name,
|
||||
CASE WHEN g.contained_name IS NULL OR g.contained_name = ''
|
||||
THEN g.tag_name
|
||||
ELSE g.contained_name
|
||||
END AS browse_name,
|
||||
CASE WHEN g.contained_by_gobject_id = 0
|
||||
THEN g.area_gobject_id
|
||||
ELSE g.contained_by_gobject_id
|
||||
END AS parent_gobject_id,
|
||||
CASE WHEN td.category_id = 13
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END AS is_area
|
||||
FROM gobject g
|
||||
INNER JOIN template_definition td
|
||||
ON g.template_definition_id = td.template_definition_id
|
||||
WHERE td.category_id IN (1, 3, 4, 10, 11, 13, 17, 24, 26)
|
||||
AND g.is_template = 0
|
||||
AND g.deployed_package_id <> 0
|
||||
ORDER BY parent_gobject_id, g.tag_name;
|
||||
Reference in New Issue
Block a user