diff --git a/ModelManager.cs b/ModelManager.cs index d1ef915..d73547e 100644 --- a/ModelManager.cs +++ b/ModelManager.cs @@ -133,6 +133,12 @@ public string LoadModel(string filePath, string repositoryPath, string baseWebUr { foreach (var jj in ii.RequiredModel) { + if (nodeset.Models.FirstOrDefault(m => m.ModelUri == jj.ModelUri) != null) + { + // RequiredModel is defined in the current document. Will be created later. + continue; + } + if (jj.ModelUri == Opc.Ua.Namespaces.OpcUa) { hasCoreModel = true; diff --git a/NodeSetToAML.cs b/NodeSetToAML.cs index 39ed46f..b8b957e 100644 --- a/NodeSetToAML.cs +++ b/NodeSetToAML.cs @@ -741,7 +741,10 @@ private AttributeType AddModifyAttribute(AttributeSequence seq, string name, str desiredAttribute = seq.Append(name); // not found so create a new one } - RecreateAttributeInstance(sourceAttribute, desiredAttribute); + if (sourceAttribute != null) + { + RecreateAttributeInstance(sourceAttribute, desiredAttribute); + } if (val.TypeInfo != null) { @@ -832,6 +835,12 @@ private AttributeType AddModifyAttribute(AttributeSequence seq, string name, str { Variant elementVariant = new Variant(valueAsList[index]); ExtensionObject extensionObject = elementVariant.Value as ExtensionObject; + + if (extensionObject.Encoding == ExtensionObjectEncoding.None) + { + continue; + } + NodeId typeId = ExpandedNodeId.ToNodeId(extensionObject.TypeId, m_modelManager.NamespaceUris); Type extentionObjectType = extensionObject.Body.GetType(); @@ -2734,6 +2743,10 @@ private void AddNonHierarchicalReferences() UANode targetNode = m_modelManager.FindNode(referenceHolder.Reference.TargetId); SystemUnitClassType targetSystemUnitClass = FindNonHierarchicalReference(referenceHolder, targetNode); + if (targetSystemUnitClass == null) + { + continue; + } string targetPath = GetCreatedPathName(targetNode); string refURI = m_modelManager.FindModelUri(referenceHolder.Reference.ReferenceTypeId); @@ -2743,8 +2756,8 @@ private void AddNonHierarchicalReferences() referenceTypeNode.DecodedBrowseName.Name, sourceSystemUnitClass.Name, sourceSystemUnitClass.ID, - targetSystemUnitClass.Name, - targetSystemUnitClass.ID); + targetSystemUnitClass?.Name, + targetSystemUnitClass?.ID); ExternalInterfaceType sourceInterface = FindOrAddSourceInterface(ref sourceSystemUnitClass, refURI, diff --git a/OrderModelInfo.cs b/OrderModelInfo.cs index 90a6ccf..7e973d9 100644 --- a/OrderModelInfo.cs +++ b/OrderModelInfo.cs @@ -67,7 +67,7 @@ public List GetProcessOrder( List initial ) public void AddCompiled( string uri, HashSet set, Dictionary source ) { - if( source.TryGetValue( uri, out ModelInfo modelInfo ) ) + if( source.TryGetValue( uri, out ModelInfo modelInfo ) && !set.Contains(uri)) { if ( modelInfo.NodeSet != null && modelInfo.NodeSet.Models != null )