From 9c111765dc8f9836cff51e2f461efe883ad71cdb Mon Sep 17 00:00:00 2001 From: Archie Date: Mon, 12 Jan 2026 13:47:01 -0700 Subject: [PATCH 1/2] Found more effective way to get parent node id using reverse references. --- NodeSetToAML.cs | 50 +++++++++---------------------------------------- 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/NodeSetToAML.cs b/NodeSetToAML.cs index b411f35..39ed46f 100644 --- a/NodeSetToAML.cs +++ b/NodeSetToAML.cs @@ -2438,19 +2438,6 @@ private string GetExistingCreatedPathName(UANode node) return createdPathName; } - private string EqualizeParentNodeId(UAInstance node, string parentNodeId) - { - string[] parentSplit = parentNodeId.Split(";"); - if ( parentSplit.Length > 1) - { - ModelInfo modelInfo = m_modelManager.FindModel(node.DecodedNodeId); - parentNodeId = String.Format("ns={0};{1}", - modelInfo.NamespaceIndex, parentSplit[1]); - } - - return parentNodeId; - } - private string GetCreatedPathName(UANode node) { string pathName = GetExistingCreatedPathName(node); @@ -2460,40 +2447,21 @@ private string GetCreatedPathName(UANode node) UAInstance uaInstance = node as UAInstance; if (uaInstance != null ) { - string parentNodeIdString = string.Empty; - - if ( uaInstance.ParentNodeId != null ) - { - parentNodeIdString = uaInstance.ParentNodeId; - } - else + var refList = m_modelManager.FindReferences( node.DecodedNodeId ); + foreach( var reference in refList ) { - var refList = m_modelManager.FindReferences( node.DecodedNodeId ); - int reversePropertyCount = 0; - foreach( var reference in refList ) + if( reference.IsForward == false && + ( reference.ReferenceTypeId.Equals(HasPropertyNodeId) || + reference.ReferenceTypeId.Equals( Opc.Ua.ReferenceTypeIds.HasComponent ) ) ) { - if( reference.IsForward == false && - ( reference.ReferenceTypeId.Equals(HasPropertyNodeId) || - reference.ReferenceTypeId.Equals( Opc.Ua.ReferenceTypeIds.HasComponent ) ) ) + UANode parentNodeId = m_modelManager.FindNode( reference.TargetId ); + if ( parentNodeId != null ) { - UANode parentNodeId = m_modelManager.FindNode( reference.TargetId ); - if ( parentNodeId != null ) - { - parentNodeIdString = parentNodeId.NodeId; - break; - } - - reversePropertyCount++; + pathName = GetCreatedPathName(parentNodeId); + break; } } } - - if ( parentNodeIdString.Length > 0) - { - string parentNodeId = EqualizeParentNodeId(uaInstance, parentNodeIdString); - UANode parentNode = FindNode(new NodeId(parentNodeId)); - pathName = GetCreatedPathName(parentNode); - } } if (pathName.Length > 0) From c06cb1509200f8e9eac61d87fd40478f4efe191b Mon Sep 17 00:00:00 2001 From: Archie Date: Tue, 13 Jan 2026 08:01:06 -0700 Subject: [PATCH 2/2] Testing for issue 139 --- SystemTest/TestNonHierarchical.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SystemTest/TestNonHierarchical.cs b/SystemTest/TestNonHierarchical.cs index 169aca3..cb4eca2 100644 --- a/SystemTest/TestNonHierarchical.cs +++ b/SystemTest/TestNonHierarchical.cs @@ -67,6 +67,12 @@ public class TestNonHierarchical TestHelper.Uris.AmlFxTest, 5008u, DisplayName = "Instance Hosts")] + [DataRow("", TestHelper.Uris.Root, 14156u, + "HasCondition", + TestHelper.Uris.Root, Opc.Ua.ObjectTypes.CertificateExpirationAlarmType, + DisplayName = "DefaultApplication Group to Audit Event Issue 139")] + + public void TestReference(string prefix, TestHelper.Uris testUri, uint testNodeId, string referenceName, TestHelper.Uris targetUri, uint targetNodeId) {