diff --git a/NodeSetToAML.cs b/NodeSetToAML.cs index e9e33c1..f32a0ed 100644 --- a/NodeSetToAML.cs +++ b/NodeSetToAML.cs @@ -75,6 +75,7 @@ public class NodeSetToAML private const string ReversePrefix = "r"; private const string RoleClassPrefix = "rc"; private const string Enumeration = "Enumeration"; + private const string KeepExternalInterfaceAttribute = "KeepExternalInterface"; private ModelManager m_modelManager; private CAEXDocument m_cAEXDocument; private AttributeTypeLibType m_atl_temp; @@ -148,6 +149,9 @@ public class NodeSetToAML private bool _runningInstances = false; private NonHierarchicalReferences _nonHierarchicalReferences = null; + Dictionary> m_multipleReferences = new Dictionary>(); + Dictionary m_instances = new Dictionary(); + public NodeSetToAML(ModelManager modelManager) { m_modelManager = modelManager; @@ -2133,8 +2137,12 @@ private void CompareLinksToExternaInterfaces(SystemUnitClassType child, SystemUn if (!found) { - checkIt.ExternalInterface.RemoveElement(externalInterface); - deleted = true; + AttributeType theAttribute = externalInterface.Attribute[KeepExternalInterfaceAttribute]; + if ( theAttribute == null ) + { + checkIt.ExternalInterface.RemoveElement(externalInterface); + deleted = true; + } } } } @@ -2333,33 +2341,39 @@ private void RebuildExternalInterfaces( Dictionary oldIdToNewName = new Dictionary(); DictionaryoldToNewName = new Dictionary(); Dictionary newTypes = new Dictionary(); + List reInsert = new List(); foreach ( ExternalInterfaceType externalInterface in systemUnitClass.ExternalInterface ) { AttributeType sourceType = externalInterface.Attribute["IsSource"]; - if ( sourceType != null ) + if ( sourceType != null && sourceType.Value != null && sourceType.Value.Equals("true")) { - if(sourceType.Value.Equals("true")) + string[] splitName = externalInterface.Name.Split(":"); + if (splitName.Length > 0) { - string[] splitName = externalInterface.Name.Split(":"); - if ( splitName.Length > 0 ) + string newName = splitName[0]; + if (!oldToNewName.ContainsKey(externalInterface.Name)) { - string newName = splitName[0]; - if (!oldToNewName.ContainsKey(externalInterface.Name) ) + oldIdToNewName.Add(externalInterface.ID, newName); + oldToNewName.Add(externalInterface.Name, newName); + if (!newTypes.ContainsKey(newName)) { - oldIdToNewName.Add(externalInterface.ID, newName); - oldToNewName.Add(externalInterface.Name, newName); - if (!newTypes.ContainsKey(newName)) - { - ExternalInterfaceType replace = (ExternalInterfaceType)externalInterface.Copy(deepCopy: true); - replace.Name = newName; - replace.ID = WebUtility.UrlEncode(newName + named); - newTypes.Add(newName, replace); - } + ExternalInterfaceType replace = (ExternalInterfaceType)externalInterface.Copy(deepCopy: true); + replace.Name = newName; + replace.ID = WebUtility.UrlEncode(newName + named); + newTypes.Add(newName, replace); } } } } + else + { + AttributeType keepAttribute = externalInterface.Attribute[KeepExternalInterfaceAttribute]; + if (keepAttribute != null) + { + reInsert.Add(externalInterface); + } + } } foreach( InternalLinkType internalLink in systemUnitClass.InternalLink) @@ -2381,6 +2395,10 @@ private void RebuildExternalInterfaces( { systemUnitClass.ExternalInterface.Insert( externalInterface, asFirst: false, asIs: true ); } + foreach (ExternalInterfaceType externalInterface in reInsert) + { + systemUnitClass.ExternalInterface.Insert(externalInterface, asFirst: false, asIs: true); + } } private void UpdateIsAbstract( UANode targetNode, SystemUnitClassType systemUnitClass ) @@ -3708,12 +3726,59 @@ private Variant LocalizedTextArrayAsVariant(NodeSet.LocalizedText[] array ) private void CreateInstances() { // add an InstanceHierarchy to the ROOT CAEXFile element - var myIH = m_cAEXDocument.CAEXFile.New_InstanceHierarchy("OPC UA Instance Hierarchy"); + InstanceHierarchyType myIH = m_cAEXDocument.CAEXFile.New_InstanceHierarchy("OPC UA Instance Hierarchy"); AddLibraryHeaderInfo(myIH); - var RootNode = FindNode(RootNodeId); + UANode RootNode = FindNode(RootNodeId); + + Dictionary> instanceReferences = + new Dictionary>(); + + // Issue 143. Need to go through and find multiple Target NodeIds, and respect + // those in the instance creation routine + BuildInstanceReferences(instanceReferences, RootNode); + MinimizeInstanceReferences(instanceReferences); + RecursiveAddModifyInstance(ref myIH, RootNode, false); + } + + private void BuildInstanceReferences(Dictionary> instanceReferences, + UANode toAdd ) + { + List references = m_modelManager.FindReferences(toAdd.DecodedNodeId); + + foreach (ReferenceInfo reference in references) + { + if (reference.IsForward == true) + { + if (m_modelManager.IsTypeOf(reference.ReferenceTypeId, HierarchicalNodeId) == true) + { + UANode targetNode = FindNode(reference.TargetId); + if (reference.TargetId != TypesFolderNodeId) + { + if (!instanceReferences.ContainsKey(reference.TargetId)) + { + instanceReferences[reference.TargetId] = new List(); + } + + instanceReferences[reference.TargetId].Add(reference); + + BuildInstanceReferences(instanceReferences, targetNode); + } + } + } + } + } + private void MinimizeInstanceReferences(Dictionary> instanceReferences ) + { + foreach (KeyValuePair> pair in instanceReferences) + { + if (pair.Value.Count > 1) + { + m_multipleReferences.Add(pair.Key, pair.Value); + } + } } InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bool serverDiagnostics) where T : IInternalElementContainer @@ -3726,7 +3791,7 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo Utils.LogTrace( "Add Instance {0} [{1}] Start", prefix, decodedNodeId ); //first see if node already exists - var ie = parent.InternalElement[toAdd.DecodedBrowseName.Name]; + InternalElementType ie = parent.InternalElement[toAdd.DecodedBrowseName.Name]; if (ie == null) { SystemUnitFamilyType suc; @@ -3745,12 +3810,10 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo } Debug.Assert(suc != null); - // check if instance already exists before adding a new one #11 - ie = (InternalElementType)m_cAEXDocument.FindByID(amlId); - if( ie != null ) + InternalElementType existingInternalElement = FindInstanceInternalElement(toAdd); + if (existingInternalElement != null) { - Utils.LogTrace( "Add Instance {0} [{1}] Already Added", prefix, decodedNodeId ); - return ie; + return existingInternalElement; } if ( prefix.StartsWith("http://")) @@ -3761,7 +3824,19 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo ie = CreateClassInstanceWithIDReplacement(prefix + "_", suc); parent.Insert(ie); - + m_instances.Add( toAdd.DecodedNodeId, ie); + } + else + { + if (ie.ID != amlId) + { + InternalElementType existingInternalElement = FindInstanceInternalElement(toAdd); + if (existingInternalElement != null) + { + parent.InternalElement.RemoveElement(ie); + ie = existingInternalElement; + } + } } Debug.Assert(ie != null); @@ -3833,7 +3908,6 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo if (reference.TargetId != TypesFolderNodeId) { - var childIE = RecursiveAddModifyInstance(ref ie, targetNode, serverDiagnostics); foundInternalElements.Add(childIE.Name); @@ -3843,6 +3917,21 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo ReferenceTypeNode.DecodedBrowseName.Name + "]/[" + sourceInterface.Attribute["InverseName"].Value, targetNode.DecodedNodeId); + if ( m_multipleReferences.TryGetValue(targetNode.DecodedNodeId, + out List multipleReferences)) + { + foreach (ReferenceInfo saveReference in multipleReferences) + { + if ( saveReference.Equals(reference)) + { + OverrideBooleanAttribute(destInterface.Attribute, + KeepExternalInterfaceAttribute, + value: true, typeOnly: true); + break; + } + } + } + FindOrAddInternalLink(ref ie, sourceInterface.ID, destInterface.ID, targetNode.DecodedBrowseName.Name); } } @@ -3914,6 +4003,29 @@ InternalElementType RecursiveAddModifyInstance(ref T parent, UANode toAdd, bo return ie; } + InternalElementType FindInstanceInternalElement(UANode node) + { + InternalElementType internalElement = null; + + /* + * Previously, this was accomplished by using the document.FindById method. + * However due to Issue 143 - a duplication issue, this added a substantial performance hit + * Adding a LookupService actual increments the performance hit to an unusable level. + * Adding a ServiceLocater.QueryService and using ILookupUpTable to load the table does + * improve the performance to an acceptable level, but it is optimized for ReadOnly document + * access. This converter needs Read/Write access, which makes using the ILookUpTable not feasible. + * A local dictionary is used instead. + */ + + if (m_instances.TryGetValue(node.DecodedNodeId, out internalElement)) + { + Utils.LogTrace("Add Instance {0} [{1}] Previously Added", + node.DecodedBrowseName.Name, node.DecodedNodeId); + } + + return internalElement; + } + // add an internal link if it does not already exist InternalLinkType FindOrAddInternalLink(ref InternalElementType ie, string sourceID, string destinationID, string linkName) { diff --git a/SystemTest/NodeSetFiles/Opc.Ua.Fx.IOPModel.xml b/SystemTest/NodeSetFiles/Opc.Ua.Fx.IOPModel.xml new file mode 100644 index 0000000..845e489 --- /dev/null +++ b/SystemTest/NodeSetFiles/Opc.Ua.Fx.IOPModel.xml @@ -0,0 +1,2905 @@ + + + + http://opcfoundation.org/UA/FX/IOPModel/ + http://opcfoundation.org/UA/FX/AC/ + http://opcfoundation.org/UA/FX/Data/ + http://opcfoundation.org/UA/DI/ + + + + + + + + + + + i=1 + i=5 + i=6 + i=7 + i=10 + i=11 + i=12 + i=13 + i=35 + i=38 + i=40 + i=41 + i=45 + i=46 + i=47 + i=256 + i=291 + i=296 + ns=2;i=43 + ns=2;i=1056 + ns=2;i=1058 + ns=2;i=3003 + ns=2;i=3005 + ns=2;i=3008 + ns=2;i=3010 + ns=2;i=3011 + ns=2;i=3012 + ns=2;i=4002 + ns=1;i=3003 + ns=1;i=3004 + + + + + + + + TestStructure + + i=22 + ns=1;i=5001 + ns=1;i=5025 + + + + + + + + + TestStructureNested + + i=22 + ns=1;i=5045 + ns=1;i=5046 + + + + + + + + TestAC + + ns=2;i=2 + ns=1;i=6001 + ns=1;i=5004 + ns=1;i=7001 + ns=1;i=5005 + ns=1;i=5006 + ns=1;i=7002 + ns=1;i=5007 + ns=1;i=5011 + ns=1;i=5012 + ns=3;i=71 + + + + AggregatedHealth + + ns=2;i=2001 + ns=1;i=5003 + ns=1;i=6002 + ns=1;i=6003 + + + + + ns=2;i=5005 + + + + 0 + 0 + + + + + + + AggregatedDeviceHealth + + i=63 + ns=1;i=6001 + + + + AggregatedOperationalHealth + + i=63 + ns=1;i=6001 + + + + Assets + + i=61 + ns=1;i=5003 + ns=1;i=5008 + + + + TestAsset + + ns=2;i=3 + ns=1;i=5004 + ns=1;i=6064 + ns=1;i=7004 + + + + SerialNumber + + i=68 + ns=1;i=5008 + + + + VerifyAsset + + ns=1;i=5008 + ns=1;i=6065 + ns=1;i=6066 + + + + InputArguments + + i=68 + ns=1;i=7004 + + + + + + i=297 + + + + VerificationMode + + ns=3;i=1029 + + -1 + + + + + + + + i=297 + + + + ExpectedVerificationVariables + + i=14533 + + 1 + + 0 + + + + + + + + i=297 + + + + ExpectedAdditionalVerificationVariables + + ns=3;i=1028 + + 1 + + 0 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7004 + + + + + + i=297 + + + + VerificationResult + + ns=3;i=1037 + + -1 + + + + + + + + i=297 + + + + VerificationVariablesErrors + + i=19 + + 1 + + 0 + + + + + + + + i=297 + + + + VerificationAdditionalVariablesErrors + + i=19 + + 1 + + 0 + + + + + + + + + + CloseConnections + + ns=1;i=5003 + ns=3;i=1025 + ns=1;i=6004 + ns=1;i=6005 + + + + InputArguments + + i=68 + ns=1;i=7001 + + + + + + i=297 + + + + ConnectionEndpoints + + i=17 + + 1 + + 0 + + + + + + + + i=297 + + + + Remove + + i=1 + + -1 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7001 + + + + + + i=297 + + + + Results + + i=19 + + 1 + + 0 + + + + + + + + + + ComponentCapabilities + + ns=2;i=1001 + ns=1;i=5003 + ns=1;i=6025 + ns=1;i=6026 + + + + MaxConnections + + i=63 + ns=1;i=5005 + + + + SupportsPersistence + + i=63 + ns=1;i=5005 + + + + Descriptors + + i=61 + ns=1;i=5003 + + + + EstablishConnections + + ns=1;i=5003 + ns=3;i=1025 + ns=1;i=6006 + ns=1;i=6007 + + + + InputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + CommandMask + + ns=3;i=1024 + + -1 + + + + + + + + i=297 + + + + AssetVerifications + + ns=3;i=1048 + + 1 + + 0 + + + + + + + + i=297 + + + + ConnectionEndpointConfigurations + + ns=3;i=1044 + + 1 + + 0 + + + + + + + + i=297 + + + + ReserveCommunicationIds + + ns=3;i=3017 + + 1 + + 0 + + + + + + + + i=297 + + + + CommunicationConfigurations + + ns=3;i=1046 + + 1 + + 0 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + AssetVerificationResults + + ns=3;i=1038 + + 1 + + 0 + + + + + + + + i=297 + + + + ConnectionEndpointConfigurationResults + + ns=3;i=3008 + + 1 + + 0 + + + + + + + + i=297 + + + + ReserveCommunicationIdsResults + + ns=3;i=3019 + + 1 + + 0 + + + + + + + + i=297 + + + + CommunicationConfigurationResults + + ns=3;i=1033 + + 1 + + 0 + + + + + + + + + + FunctionalEntities + + i=61 + ns=1;i=5003 + ns=1;i=5055 + ns=1;i=5063 + ns=1;i=5047 + ns=1;i=5030 + ns=1;i=5010 + ns=1;i=5060 + + + + SimpleAndStringScalarsFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5048 + ns=1;i=5057 + ns=1;i=5058 + ns=1;i=5027 + ns=1;i=5031 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5055 + + + + InputData + + ns=2;i=1000 + ns=1;i=5055 + ns=1;i=6170 + ns=1;i=6172 + ns=1;i=6174 + ns=1;i=6048 + + + + InBoolScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5057 + + + + InFloatScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5057 + + + + InIntScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5057 + + + + InStringScalar + + i=63 + ns=1;i=5024 + ns=1;i=5028 + ns=1;i=5057 + ns=1;i=5062 + ns=1;i=6158 + + + + MaxStringLength + + i=68 + ns=1;i=6048 + + + 20 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5055 + ns=1;i=6176 + ns=1;i=6180 + ns=1;i=6178 + ns=1;i=6051 + + + + OutBoolScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5058 + + + + OutFloatScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5058 + + + + OutIntScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5058 + + + + OutStringScalar + + i=63 + ns=1;i=5024 + ns=1;i=5039 + ns=1;i=5058 + ns=1;i=5066 + ns=1;i=6157 + + + + + + + MaxStringLength + + i=68 + ns=1;i=6051 + + + 20 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6117 + ns=1;i=6118 + ns=1;i=6119 + ns=1;i=6120 + ns=1;i=5055 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5027 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5027 + + + + SimpleAndStringScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5027 + + + + SupportedQos + + i=63 + ns=1;i=5027 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6121 + ns=1;i=6122 + ns=1;i=6123 + ns=1;i=6124 + ns=1;i=6125 + ns=1;i=5055 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5031 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5031 + + + + SimpleAndStringScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5031 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5031 + + + + SupportedQos + + i=63 + ns=1;i=5031 + + + + SimpleAndStructureScalarsFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5051 + ns=1;i=5064 + ns=1;i=5065 + ns=1;i=5021 + ns=1;i=5026 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5063 + + + + InputData + + ns=2;i=1000 + ns=1;i=5063 + ns=1;i=6171 + ns=1;i=6173 + ns=1;i=6175 + ns=1;i=6160 + ns=1;i=6043 + + + + InBoolScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5064 + + + + InFloatScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5064 + + + + InIntScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5064 + + + + InStructureNested + + i=63 + ns=1;i=5024 + ns=1;i=5064 + + + + InStructureScalar + + i=63 + ns=1;i=5024 + ns=1;i=5029 + ns=1;i=5064 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5063 + ns=1;i=6177 + ns=1;i=6181 + ns=1;i=6179 + ns=1;i=6159 + ns=1;i=6046 + + + + OutBoolScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5065 + + + + OutFloatScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5065 + + + + OutIntScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5065 + + + + OutStructureNested + + i=63 + ns=1;i=5024 + ns=1;i=5065 + + + + OutStructureScalar + + i=63 + ns=1;i=5024 + ns=1;i=5032 + ns=1;i=5065 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6108 + ns=1;i=6109 + ns=1;i=6110 + ns=1;i=6111 + ns=1;i=5063 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5021 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5021 + + + + SimpleAndStructureScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5021 + + + + SupportedQos + + i=63 + ns=1;i=5021 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6112 + ns=1;i=6113 + ns=1;i=6114 + ns=1;i=6115 + ns=1;i=6116 + ns=1;i=5063 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5026 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5026 + + + + SimpleAndStructureScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5026 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5026 + + + + SupportedQos + + i=63 + ns=1;i=5026 + + + + SimpleArraysFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5052 + ns=1;i=5049 + ns=1;i=5050 + ns=1;i=5019 + ns=1;i=5020 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5047 + + + + InputData + + ns=2;i=1000 + ns=1;i=5047 + ns=1;i=6038 + ns=1;i=6080 + ns=1;i=6040 + + + + InBoolArray + + i=63 + ns=1;i=5024 + ns=1;i=5033 + ns=1;i=5049 + + + + InFloatArray + + i=63 + ns=1;i=5024 + ns=1;i=5033 + ns=1;i=5049 + + + + InIntArray + + i=63 + ns=1;i=5024 + ns=1;i=5033 + ns=1;i=5049 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5047 + ns=1;i=6060 + ns=1;i=6083 + ns=1;i=6063 + + + + OutBoolArray + + i=63 + ns=1;i=5024 + ns=1;i=5042 + ns=1;i=5050 + + + + OutFloatArray + + i=63 + ns=1;i=5024 + ns=1;i=5042 + ns=1;i=5050 + + + + OutIntArray + + i=63 + ns=1;i=5024 + ns=1;i=5042 + ns=1;i=5050 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6041 + ns=1;i=6042 + ns=1;i=6044 + ns=1;i=6045 + ns=1;i=5047 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5019 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5019 + + + + SimpleArraysPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5019 + + + + SupportedQos + + i=63 + ns=1;i=5019 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6103 + ns=1;i=6104 + ns=1;i=6105 + ns=1;i=6106 + ns=1;i=6107 + ns=1;i=5047 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5020 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5020 + + + + SimpleArraysSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5020 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5020 + + + + SupportedQos + + i=63 + ns=1;i=5020 + + + + SimpleScalarsFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5053 + ns=1;i=5043 + ns=1;i=5044 + ns=1;i=5017 + ns=1;i=5018 + ns=1;i=5060 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5030 + + + + InputData + + ns=2;i=1000 + ns=1;i=5030 + ns=1;i=6037 + ns=1;i=6074 + ns=1;i=6039 + + + + InBoolScalar + + i=63 + ns=1;i=5023 + ns=1;i=5024 + ns=1;i=5028 + ns=1;i=5029 + ns=1;i=5043 + + + + InFloatScalar + + i=63 + ns=1;i=5023 + ns=1;i=5024 + ns=1;i=5028 + ns=1;i=5029 + ns=1;i=5043 + + + + InIntScalar + + i=63 + ns=1;i=5023 + ns=1;i=5024 + ns=1;i=5028 + ns=1;i=5029 + ns=1;i=5043 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5030 + ns=1;i=6054 + ns=1;i=6077 + ns=1;i=6057 + + + + OutBoolScalar + + i=63 + ns=1;i=5024 + ns=1;i=5032 + ns=1;i=5036 + ns=1;i=5039 + ns=1;i=5044 + + + + OutFloatScalar + + i=63 + ns=1;i=5024 + ns=1;i=5032 + ns=1;i=5036 + ns=1;i=5039 + ns=1;i=5044 + + + + OutIntScalar + + i=63 + ns=1;i=5024 + ns=1;i=5032 + ns=1;i=5036 + ns=1;i=5039 + ns=1;i=5044 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6028 + ns=1;i=6029 + ns=1;i=6030 + ns=1;i=6031 + ns=1;i=5030 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5017 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5017 + + + + SimpleScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5017 + + + + SupportedQos + + i=63 + ns=1;i=5017 + + + + + + ns=2;i=5025 + + + + opc.qos.cat://priority + + + + i=23925 + + + + opc.qos.lbl://green + + + + + + i=23925 + + + + opc.qos.lbl://best effort + + + + + + + + + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6032 + ns=1;i=6033 + ns=1;i=6034 + ns=1;i=6035 + ns=1;i=6036 + ns=1;i=5030 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5018 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5018 + + + + SimpleScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5018 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5018 + + + + + + ns=2;i=5020 + + + + 10 + 0 + 10 + 0 + Nanosecond_0 + + + + + + + + SupportedQos + + i=63 + ns=1;i=5018 + + + + + + ns=2;i=5028 + + + + opc.qos.cat://priority + + + + i=23929 + + + + opc.qos.lbl://green + + + + + + i=23929 + + + + opc.qos.lbl://best effort + + + + + + + + + + + + TestFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5054 + ns=1;i=5015 + ns=1;i=5016 + ns=1;i=5013 + ns=1;i=5014 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5010 + + + + InputData + + ns=2;i=1000 + ns=1;i=5010 + ns=1;i=5028 + ns=1;i=5029 + ns=1;i=5033 + ns=1;i=5023 + + + + SimpleAndStringScalars + + ns=2;i=1000 + ns=1;i=5015 + ns=1;i=6037 + ns=1;i=6074 + ns=1;i=6039 + ns=1;i=6048 + ns=1;i=5035 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5028 + ns=1;i=6079 + ns=1;i=6081 + ns=1;i=6082 + ns=1;i=6084 + ns=1;i=6085 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5035 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5035 + + + + SimpleAndStringScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5035 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5035 + + + + SupportedQos + + i=63 + ns=1;i=5035 + + + + SimpleAndStructureScalars + + ns=2;i=1000 + ns=1;i=5015 + ns=1;i=6037 + ns=1;i=6074 + ns=1;i=6039 + ns=1;i=6043 + ns=1;i=5037 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5029 + ns=1;i=6086 + ns=1;i=6087 + ns=1;i=6088 + ns=1;i=6089 + ns=1;i=6090 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5037 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5037 + + + + SimpleAndStructureScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5037 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5037 + + + + SupportedQos + + i=63 + ns=1;i=5037 + + + + SimpleArrays + + ns=2;i=1000 + ns=1;i=5015 + ns=1;i=6038 + ns=1;i=6080 + ns=1;i=6040 + ns=1;i=5034 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5033 + ns=1;i=6072 + ns=1;i=6073 + ns=1;i=6075 + ns=1;i=6076 + ns=1;i=6078 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5034 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5034 + + + + SimpleArraysSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5034 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5034 + + + + SupportedQos + + i=63 + ns=1;i=5034 + + + + SimpleScalars + + ns=2;i=1000 + ns=1;i=5015 + ns=1;i=6037 + ns=1;i=6126 + ns=1;i=6127 + ns=1;i=6129 + ns=1;i=6130 + ns=1;i=6131 + ns=1;i=6074 + ns=1;i=6039 + ns=1;i=6147 + ns=1;i=6148 + ns=1;i=6149 + ns=1;i=6150 + ns=1;i=6151 + ns=1;i=6137 + ns=1;i=6138 + ns=1;i=6139 + ns=1;i=6140 + ns=1;i=6141 + ns=1;i=5002 + + + + InDoubleScalar1 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InDoubleScalar2 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InDoubleScalar3 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InDoubleScalar4 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InDoubleScalar5 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt16Scalar1 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt16Scalar2 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt16Scalar3 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt16Scalar4 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt16Scalar5 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt32Scalar1 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt32Scalar2 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt32Scalar3 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt32Scalar4 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + InUInt32Scalar5 + + i=63 + ns=1;i=5023 + ns=1;i=5024 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6047 + ns=1;i=6049 + ns=1;i=6050 + ns=1;i=6052 + ns=1;i=6053 + ns=1;i=5023 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5002 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5002 + + + + SimpleScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5002 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5002 + + + + SupportedQos + + i=63 + ns=1;i=5002 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5010 + ns=1;i=5039 + ns=1;i=5032 + ns=1;i=5042 + ns=1;i=5036 + + + + SimpleAndStringScalars + + ns=2;i=1019 + ns=1;i=5016 + ns=1;i=6054 + ns=1;i=6077 + ns=1;i=6057 + ns=1;i=6051 + ns=1;i=5038 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6091 + ns=1;i=6092 + ns=1;i=6093 + ns=1;i=6094 + ns=1;i=5039 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5038 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5038 + + + + SimpleAndStringScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5038 + + + + SupportedQos + + i=63 + ns=1;i=5038 + + + + SimpleAndStructureScalars + + ns=2;i=1019 + ns=1;i=5016 + ns=1;i=6054 + ns=1;i=6077 + ns=1;i=6057 + ns=1;i=6046 + ns=1;i=5040 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5032 + ns=1;i=6095 + ns=1;i=6096 + ns=1;i=6097 + ns=1;i=6098 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5040 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5040 + + + + SimpleAndStructureScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5040 + + + + SupportedQos + + i=63 + ns=1;i=5040 + + + + SimpleArrays + + ns=2;i=1019 + ns=1;i=5016 + ns=1;i=6060 + ns=1;i=6083 + ns=1;i=6063 + ns=1;i=5041 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6099 + ns=1;i=6100 + ns=1;i=6101 + ns=1;i=6102 + ns=1;i=5042 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5041 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5041 + + + + SimpleArraysPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5041 + + + + SupportedQos + + i=63 + ns=1;i=5041 + + + + SimpleScalars + + ns=2;i=1019 + ns=1;i=5016 + ns=1;i=6054 + ns=1;i=6132 + ns=1;i=6133 + ns=1;i=6134 + ns=1;i=6135 + ns=1;i=6136 + ns=1;i=6077 + ns=1;i=6057 + ns=1;i=6152 + ns=1;i=6153 + ns=1;i=6154 + ns=1;i=6155 + ns=1;i=6156 + ns=1;i=6142 + ns=1;i=6143 + ns=1;i=6144 + ns=1;i=6145 + ns=1;i=6146 + ns=1;i=5009 + + + + OutDoubleScalar1 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutDoubleScalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutDoubleScalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutDoubleScalar4 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutDoubleScalar5 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt16Scalar1 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt16Scalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt16Scalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt16Scalar4 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt16Scalar5 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt32Scalar1 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt32Scalar2 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt32Scalar3 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt32Scalar4 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + OutUInt32Scalar5 + + i=63 + ns=1;i=5024 + ns=1;i=5036 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6055 + ns=1;i=6056 + ns=1;i=6058 + ns=1;i=6059 + ns=1;i=5036 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5009 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5009 + + + + SimpleScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5009 + + + + SupportedQos + + i=63 + ns=1;i=5009 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5010 + ns=1;i=6017 + ns=1;i=6018 + ns=1;i=6019 + ns=1;i=6020 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5013 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5013 + + + + SimpleScalarsPDS + SimpleArraysPDS + SimpleAndStructureScalarsPDS + SimpleAndStringScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5013 + + + + SupportedQos + + i=63 + ns=1;i=5013 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5010 + ns=1;i=6021 + ns=1;i=6022 + ns=1;i=6023 + ns=1;i=6024 + ns=1;i=6027 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5014 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5014 + + + + SimpleScalarsSDS + SimpleArraysSDS + SimpleAndStructureScalarsSDS + SimpleAndStringScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5014 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5014 + + + + SupportedQos + + i=63 + ns=1;i=5014 + + + + TopLevelFE + + ns=2;i=4 + ns=1;i=5007 + ns=1;i=5061 + ns=1;i=5062 + ns=1;i=5066 + ns=1;i=5067 + ns=1;i=5030 + ns=1;i=5068 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5060 + + + + InputData + + ns=2;i=1000 + ns=1;i=5060 + ns=1;i=6048 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5060 + ns=1;i=6051 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5060 + ns=1;i=6161 + ns=1;i=6162 + ns=1;i=6163 + ns=1;i=6164 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5067 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5067 + + + + SimpleAndStringScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5067 + + + + SupportedQos + + i=63 + ns=1;i=5067 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5060 + ns=1;i=6165 + ns=1;i=6166 + ns=1;i=6167 + ns=1;i=6168 + ns=1;i=6169 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5068 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5068 + + + + SimpleAndStringScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5068 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5068 + + + + SupportedQos + + i=63 + ns=1;i=5068 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5003 + ns=1;i=6008 + ns=1;i=6009 + ns=1;i=6010 + ns=1;i=6011 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5011 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5011 + + + + SimpleScalarsPDS + SimpleArraysPDS + SimpleAndStructureScalarsPDS + SimpleAndStringScalarsPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5011 + + + + SupportedQos + + i=63 + ns=1;i=5011 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5003 + ns=1;i=6012 + ns=1;i=6013 + ns=1;i=6014 + ns=1;i=6015 + ns=1;i=6016 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5012 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5012 + + + + SimpleScalarsSDS + SimpleArraysSDS + SimpleAndStructureScalarsSDS + SimpleAndStringScalarsSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5012 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5012 + + + + SupportedQos + + i=63 + ns=1;i=5012 + + + + http://opcfoundation.org/UA/FX/IOPModel/ + + i=11616 + ns=1;i=6061 + i=11715 + ns=1;i=6062 + ns=1;i=6067 + ns=1;i=6068 + ns=1;i=6069 + ns=1;i=6070 + ns=1;i=6071 + + + + IsNamespaceSubset + + i=68 + ns=1;i=5022 + + + false + + + + NamespacePublicationDate + + i=68 + ns=1;i=5022 + + + 2023-10-20T11:05:42Z + + + + NamespaceUri + + i=68 + ns=1;i=5022 + + + http://opcfoundation.org/UA/FX/IOPModel/ + + + + NamespaceVersion + + i=68 + ns=1;i=5022 + + + 1.0.0 + + + + StaticNodeIdTypes + + i=68 + ns=1;i=5022 + + + + StaticNumericNodeIdRange + + i=68 + ns=1;i=5022 + + + + StaticStringNodeIdPattern + + i=68 + ns=1;i=5022 + + + + TestVars + + i=58 + ns=1;i=6038 + ns=1;i=6037 + ns=1;i=6170 + ns=1;i=6171 + ns=1;i=6126 + ns=1;i=6127 + ns=1;i=6129 + ns=1;i=6130 + ns=1;i=6131 + ns=1;i=6080 + ns=1;i=6074 + ns=1;i=6172 + ns=1;i=6173 + ns=1;i=6040 + ns=1;i=6039 + ns=1;i=6174 + ns=1;i=6175 + ns=1;i=6048 + ns=1;i=6160 + ns=1;i=6043 + ns=1;i=6147 + ns=1;i=6148 + ns=1;i=6149 + ns=1;i=6150 + ns=1;i=6151 + ns=1;i=6137 + ns=1;i=6138 + ns=1;i=6139 + ns=1;i=6140 + ns=1;i=6141 + ns=1;i=6060 + ns=1;i=6054 + ns=1;i=6176 + ns=1;i=6177 + ns=1;i=6132 + ns=1;i=6133 + ns=1;i=6134 + ns=1;i=6135 + ns=1;i=6136 + ns=1;i=6083 + ns=1;i=6077 + ns=1;i=6180 + ns=1;i=6181 + ns=1;i=6063 + ns=1;i=6057 + ns=1;i=6178 + ns=1;i=6179 + ns=1;i=6051 + ns=1;i=6159 + ns=1;i=6046 + ns=1;i=6152 + ns=1;i=6153 + ns=1;i=6154 + ns=1;i=6155 + ns=1;i=6156 + ns=1;i=6142 + ns=1;i=6143 + ns=1;i=6144 + ns=1;i=6145 + ns=1;i=6146 + ns=1;i=6128 + i=85 + + + + SimulateOutputs + + i=68 + ns=1;i=5024 + + + + Default Binary + + i=76 + ns=1;i=3003 + + + + Default XML + + i=76 + ns=1;i=3003 + + + + Default Binary + + i=76 + ns=1;i=3004 + + + + Default XML + + i=76 + ns=1;i=3004 + + + diff --git a/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.BottleMachine.xml b/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.BottleMachine.xml new file mode 100644 index 0000000..1e939b4 --- /dev/null +++ b/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.BottleMachine.xml @@ -0,0 +1,1815 @@ + + + + http://opcfoundation.org/FxShow/BottleMachine/ + http://opcfoundation.org/UA/FX/AC/ + + + + + + + + + + + i=1 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=12 + i=13 + i=15 + i=21 + i=35 + i=37 + i=40 + i=45 + i=46 + i=47 + i=256 + i=291 + ns=1;i=3008 + + + + + + + + FxDemoMachineType + + i=29 + ns=1;i=6051 + + + + + + + + + + + EnumStrings + + i=68 + ns=1;i=3008 + + + + + NotAssigned + + + Washing + + + Filling + + + Capping + + + Labeling + + + + + + FxShowType1 + Collects the data type descriptions of http://opcfoundation.org/FxShow/BottleMachine/ + + i=72 + i=93 + ns=1;i=6187 + ns=1;i=6037 + + + PG9wYzpUeXBlRGljdGlvbmFyeSB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLyIge + G1sbnM6b3BjPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvQmluYXJ5U2NoZW1hLyIgRGVmY + XVsdEJ5dGVPcmRlcj0iTGl0dGxlRW5kaWFuIiB4bWxuczp0bnM9Imh0dHA6Ly9vcGNmb3VuZ + GF0aW9uLm9yZy9GeFNob3cvQm90dGxlTWFjaGluZS8iIFRhcmdldE5hbWVzcGFjZT0iaHR0c + DovL29wY2ZvdW5kYXRpb24ub3JnL0Z4U2hvdy9Cb3R0bGVNYWNoaW5lLyIgeG1sbnM6eHNpP + SJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CiA8b3BjOkltc + G9ydCBOYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8iLz4KIDxvcGM6R + W51bWVyYXRlZFR5cGUgTGVuZ3RoSW5CaXRzPSIzMiIgTmFtZT0iRnhEZW1vTWFjaGluZVR5c + GUiPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIFZhbHVlPSIwIiBOYW1lPSJOb3RBc3NpZ25lZ + CIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIFZhbHVlPSIxIiBOYW1lPSJXYXNoaW5nIi8+C + iAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgVmFsdWU9IjIiIE5hbWU9IkZpbGxpbmciLz4KICA8b + 3BjOkVudW1lcmF0ZWRWYWx1ZSBWYWx1ZT0iMyIgTmFtZT0iQ2FwcGluZyIvPgogIDxvcGM6R + W51bWVyYXRlZFZhbHVlIFZhbHVlPSI0IiBOYW1lPSJMYWJlbGluZyIvPgogPC9vcGM6RW51b + WVyYXRlZFR5cGU+Cjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pgo= + + + + Deprecated + Indicates that all of the DataType definitions represented by the DataTypeDictionaryType are available through a DataTypeDefinition Attribute. + + i=68 + ns=1;i=6036 + + + true + + + + NamespaceUri + + i=68 + ns=1;i=6036 + + + http://opcfoundation.org/FxShow/BottleMachine/ + + + + FxShowType1 + Collects the data type descriptions of http://opcfoundation.org/FxShow/BottleMachine/ + + i=72 + i=92 + ns=1;i=6188 + ns=1;i=6039 + + + PHhzOnNjaGVtYSB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLzIwMDgvMDIvVHlwZ + XMueHNkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9GeFNob + 3cvQm90dGxlTWFjaGluZS9UeXBlcy54c2QiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZ + y8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvR + nhTaG93L0JvdHRsZU1hY2hpbmUvVHlwZXMueHNkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1Y + WxpZmllZCI+CiA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub + 3JnL1VBLzIwMDgvMDIvVHlwZXMueHNkIi8+CiA8eHM6c2ltcGxlVHlwZSBuYW1lPSJGeERlb + W9NYWNoaW5lVHlwZSI+CiAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CiAgI + Dx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QXNzaWduZWRfMCIvPgogICA8eHM6ZW51bWVyY + XRpb24gdmFsdWU9Ildhc2hpbmdfMSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZpb + GxpbmdfMiIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHBpbmdfMyIvPgogICA8e + HM6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsaW5nXzQiLz4KICA8L3hzOnJlc3RyaWN0aW9uP + gogPC94czpzaW1wbGVUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOkZ4RGVtb01hY2hpb + mVUeXBlIiBuYW1lPSJGeERlbW9NYWNoaW5lVHlwZSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hb + WU9Ikxpc3RPZkZ4RGVtb01hY2hpbmVUeXBlIj4KICA8eHM6c2VxdWVuY2U+CiAgIDx4czplb + GVtZW50IHR5cGU9InRuczpGeERlbW9NYWNoaW5lVHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZ + WQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ4RGVtb01hY2hpbmVUe + XBlIi8+CiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU+CiA8eHM6ZWxlbWVud + CB0eXBlPSJ0bnM6TGlzdE9mRnhEZW1vTWFjaGluZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBuY + W1lPSJMaXN0T2ZGeERlbW9NYWNoaW5lVHlwZSIvPgo8L3hzOnNjaGVtYT4K + + + + Deprecated + Indicates that all of the DataType definitions represented by the DataTypeDictionaryType are available through a DataTypeDefinition Attribute. + + i=68 + ns=1;i=6038 + + + true + + + + NamespaceUri + + i=68 + ns=1;i=6038 + + + http://opcfoundation.org/FxShow/BottleMachine/Types.xsd + + + + FxShowFunctionalEntity + + ns=2;i=4 + ns=1;i=5005 + ns=1;i=5007 + + + + InputData + + i=78 + ns=2;i=1000 + ns=1;i=1001 + ns=1;i=5002 + + + + BottleMachineInputs + + i=78 + ns=2;i=1000 + ns=1;i=6022 + ns=1;i=6024 + ns=1;i=6026 + ns=1;i=6028 + ns=1;i=6008 + ns=1;i=6055 + ns=1;i=6030 + ns=1;i=6040 + ns=1;i=6014 + ns=1;i=5005 + + + + BottleIdIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + BottleMaterialIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + BottleSizeIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + CapColorIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + CapperIdentificationIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + FillerIdentificationIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + LabelDesignIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + LiquidTypeIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + WasherIdentificationIn + + i=63 + ns=1;i=5002 + ns=1;i=5020 + + + + OutputData + + ns=2;i=1019 + i=78 + ns=1;i=1001 + ns=1;i=5009 + + + + BottleMachineOutputs + + ns=2;i=1019 + i=78 + ns=1;i=5007 + ns=1;i=6004 + ns=1;i=6033 + ns=1;i=6032 + ns=1;i=6005 + ns=1;i=6042 + ns=1;i=6048 + ns=1;i=6006 + ns=1;i=6034 + ns=1;i=6046 + + + + BottleId + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + BottleMaterial + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + BottleSize + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + CapColor + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + CapperIdentification + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + FillerIdentification + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + LabelDesign + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + LiquidType + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + WasherIdentification + + i=63 + ns=1;i=5009 + ns=1;i=5020 + + + + FxShowBottleMachineType + + i=58 + ns=1;i=6001 + ns=1;i=6021 + ns=1;i=6052 + ns=1;i=6023 + ns=1;i=6044 + ns=1;i=6025 + ns=1;i=6016 + ns=1;i=6002 + ns=1;i=6027 + ns=1;i=6041 + ns=1;i=6007 + ns=1;i=6047 + ns=1;i=6015 + ns=1;i=6003 + ns=1;i=6029 + ns=1;i=6045 + ns=1;i=6031 + ns=1;i=6049 + ns=1;i=6053 + ns=1;i=7001 + ns=1;i=6043 + ns=1;i=6013 + + + + BottleId + + i=78 + i=63 + ns=1;i=1002 + + + + BottleIdIn + + i=78 + i=63 + ns=1;i=1002 + + + + BottleMaterial + + i=78 + i=63 + ns=1;i=1002 + + + + BottleMaterialIn + + i=78 + i=63 + ns=1;i=1002 + + + + BottleSize + + i=78 + i=63 + ns=1;i=1002 + + + + BottleSizeIn + + i=78 + i=63 + ns=1;i=1002 + + + + BottleSpeed + + i=78 + i=63 + ns=1;i=1002 + + + 0 + + + + CapColor + + i=78 + i=63 + ns=1;i=1002 + + + + CapColorIn + + i=78 + i=63 + ns=1;i=1002 + + + + CapperIdentification + + i=78 + i=63 + ns=1;i=1002 + + + + CapperIdentificationIn + + i=78 + i=63 + ns=1;i=1002 + + + + FillerIdentification + + i=78 + i=63 + ns=1;i=1002 + + + + FillerIdentificationIn + + i=78 + i=63 + ns=1;i=1002 + + + + LabelDesign + + i=78 + i=63 + ns=1;i=1002 + + + + LabelDesignIn + + i=78 + i=63 + ns=1;i=1002 + + + + LiquidType + + i=78 + i=63 + ns=1;i=1002 + + + + LiquidTypeIn + + i=78 + i=63 + ns=1;i=1002 + + + + MachineIdentification + + i=78 + i=63 + ns=1;i=1002 + + + + MachineType + + i=78 + i=63 + ns=1;i=1002 + + + + ResetBottleId + + i=78 + ns=1;i=1002 + + + + WasherIdentification + + i=78 + i=63 + ns=1;i=1002 + + + + WasherIdentificationIn + + i=78 + i=63 + ns=1;i=1002 + + + + In_Boolean_5 + + i=63 + ns=1;i=5004 + + + + In_Boolean_6 + + i=63 + ns=1;i=5004 + + + + In_Boolean_7 + + i=63 + ns=1;i=5004 + + + + In_Boolean_8 + + i=63 + ns=1;i=5004 + + + + In_Boolean_9 + + i=63 + ns=1;i=5004 + + + + In_Float_5 + + i=63 + ns=1;i=5001 + + + + In_Float_6 + + i=63 + ns=1;i=5001 + + + + In_Float_7 + + i=63 + ns=1;i=5001 + + + + In_Float_8 + + i=63 + ns=1;i=5001 + + + + In_Float_9 + + i=63 + ns=1;i=5001 + + + + In_String_5 + + i=63 + ns=1;i=5003 + + + + In_String_6 + + i=63 + ns=1;i=5003 + + + + In_String_7 + + i=63 + ns=1;i=5003 + + + + In_String_8 + + i=63 + ns=1;i=5003 + + + + In_String_9 + + i=63 + ns=1;i=5003 + + + + In_UInt32_5 + + i=63 + ns=1;i=5001 + + + + In_UInt32_6 + + i=63 + ns=1;i=5001 + + + + In_UInt32_7 + + i=63 + ns=1;i=5001 + + + + In_UInt32_8 + + i=63 + ns=1;i=5001 + + + + In_UInt32_9 + + i=63 + ns=1;i=5001 + + + + Out_Boolean_5 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_6 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_7 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_8 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_9 + + i=63 + ns=1;i=5004 + + + + Out_Float_5 + + i=63 + ns=1;i=5001 + + + + Out_Float_6 + + i=63 + ns=1;i=5001 + + + + Out_Float_7 + + i=63 + ns=1;i=5001 + + + + Out_Float_8 + + i=63 + ns=1;i=5001 + + + + Out_Float_9 + + i=63 + ns=1;i=5001 + + + + Out_String_5 + + i=63 + ns=1;i=5003 + + + + Out_String_6 + + i=63 + ns=1;i=5003 + + + + Out_String_7 + + i=63 + ns=1;i=5003 + + + + Out_String_8 + + i=63 + ns=1;i=5003 + + + + Out_String_9 + + i=63 + ns=1;i=5003 + + + + Out_UInt32_5 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_6 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_7 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_8 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_9 + + i=63 + ns=1;i=5001 + + + + In_Double_1 + + i=63 + ns=1;i=5001 + + + + In_Float_1 + + i=63 + ns=1;i=5001 + + + + In_Int16_1 + + i=63 + ns=1;i=5001 + + + + In_Int32_1 + + i=63 + ns=1;i=5001 + + + + In_Int64_1 + + i=63 + ns=1;i=5001 + + + + In_UInt16_1 + + i=63 + ns=1;i=5001 + + + + In_UInt32_1 + + i=63 + ns=1;i=5001 + + + + In_UInt64_1 + + i=63 + ns=1;i=5001 + + + + Out_Double_1 + + i=63 + ns=1;i=5001 + + + + Out_Float_1 + + i=63 + ns=1;i=5001 + + + + Out_Int16_1 + + i=63 + ns=1;i=5001 + + + + Out_Int32_1 + + i=63 + ns=1;i=5001 + + + + Out_Int64_1 + + i=63 + ns=1;i=5001 + + + + Out_UInt16_1 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_1 + + i=63 + ns=1;i=5001 + + + + Out_UInt64_1 + + i=63 + ns=1;i=5001 + + + + FxShowBottleMachine + + ns=1;i=1002 + ns=1;i=6004 + ns=1;i=6022 + ns=1;i=6033 + ns=1;i=6024 + ns=1;i=6032 + ns=1;i=6026 + ns=1;i=6020 + ns=1;i=6005 + ns=1;i=6028 + ns=1;i=6042 + ns=1;i=6008 + ns=1;i=6048 + ns=1;i=6055 + ns=1;i=6006 + ns=1;i=6030 + i=85 + ns=1;i=6034 + ns=1;i=6040 + ns=1;i=6050 + ns=1;i=6054 + ns=1;i=7002 + ns=1;i=6046 + ns=1;i=6014 + + + + BottleSpeed + + i=63 + ns=1;i=5020 + + + 0 + + + + MachineIdentification + + i=63 + ns=1;i=5020 + + + + MachineType + + i=63 + ns=1;i=5020 + + + + ResetBottleId + + ns=1;i=5020 + + + + http://opcfoundation.org/FxShow/BottleMachine/ + + i=11616 + ns=1;i=6009 + i=11715 + ns=1;i=6010 + ns=1;i=6011 + ns=1;i=6012 + ns=1;i=6017 + ns=1;i=6018 + ns=1;i=6019 + + + + IsNamespaceSubset + + i=68 + ns=1;i=5014 + + + false + + + + NamespacePublicationDate + + i=68 + ns=1;i=5014 + + + 2021-08-02T14:09:22Z + + + + NamespaceUri + + i=68 + ns=1;i=5014 + + + http://opcfoundation.org/FxShow/BottleMachine/ + + + + NamespaceVersion + + i=68 + ns=1;i=5014 + + + 2.0.0 + + + + StaticNodeIdTypes + + i=68 + ns=1;i=5014 + + + + StaticNumericNodeIdRange + + i=68 + ns=1;i=5014 + + + + StaticStringNodeIdPattern + + i=68 + ns=1;i=5014 + + + + SimulationData + + i=61 + ns=1;i=5004 + ns=1;i=5001 + i=85 + ns=1;i=5003 + + + + Boolean + + i=61 + ns=1;i=6135 + ns=1;i=6136 + ns=1;i=6137 + ns=1;i=6138 + ns=1;i=6139 + ns=1;i=6179 + ns=1;i=6180 + ns=1;i=6181 + ns=1;i=6182 + ns=1;i=6140 + ns=1;i=6141 + ns=1;i=6142 + ns=1;i=6143 + ns=1;i=6144 + ns=1;i=6183 + ns=1;i=6184 + ns=1;i=6185 + ns=1;i=6186 + ns=1;i=5006 + + + + In_Boolean_1 + + i=63 + ns=1;i=5004 + + + + In_Boolean_2 + + i=63 + ns=1;i=5004 + + + + In_Boolean_3 + + i=63 + ns=1;i=5004 + + + + In_Boolean_4 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_1 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_2 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_3 + + i=63 + ns=1;i=5004 + + + + Out_Boolean_4 + + i=63 + ns=1;i=5004 + + + + NumberDataTypes + + i=61 + ns=1;i=6067 + ns=1;i=6095 + ns=1;i=6096 + ns=1;i=6097 + ns=1;i=6098 + ns=1;i=6069 + ns=1;i=6099 + ns=1;i=6100 + ns=1;i=6101 + ns=1;i=6102 + ns=1;i=6155 + ns=1;i=6156 + ns=1;i=6157 + ns=1;i=6158 + ns=1;i=6056 + ns=1;i=6103 + ns=1;i=6104 + ns=1;i=6105 + ns=1;i=6106 + ns=1;i=6035 + ns=1;i=6107 + ns=1;i=6108 + ns=1;i=6109 + ns=1;i=6110 + ns=1;i=6057 + ns=1;i=6111 + ns=1;i=6112 + ns=1;i=6113 + ns=1;i=6114 + ns=1;i=6059 + ns=1;i=6115 + ns=1;i=6116 + ns=1;i=6117 + ns=1;i=6118 + ns=1;i=6058 + ns=1;i=6119 + ns=1;i=6120 + ns=1;i=6121 + ns=1;i=6122 + ns=1;i=6159 + ns=1;i=6160 + ns=1;i=6161 + ns=1;i=6162 + ns=1;i=6060 + ns=1;i=6123 + ns=1;i=6124 + ns=1;i=6125 + ns=1;i=6126 + ns=1;i=6068 + ns=1;i=6127 + ns=1;i=6128 + ns=1;i=6129 + ns=1;i=6130 + ns=1;i=6070 + ns=1;i=6131 + ns=1;i=6132 + ns=1;i=6133 + ns=1;i=6134 + ns=1;i=6163 + ns=1;i=6164 + ns=1;i=6165 + ns=1;i=6166 + ns=1;i=6062 + ns=1;i=6091 + ns=1;i=6092 + ns=1;i=6093 + ns=1;i=6094 + ns=1;i=6061 + ns=1;i=6087 + ns=1;i=6088 + ns=1;i=6089 + ns=1;i=6090 + ns=1;i=6063 + ns=1;i=6083 + ns=1;i=6084 + ns=1;i=6085 + ns=1;i=6086 + ns=1;i=6064 + ns=1;i=6079 + ns=1;i=6080 + ns=1;i=6081 + ns=1;i=6082 + ns=1;i=6065 + ns=1;i=6075 + ns=1;i=6076 + ns=1;i=6077 + ns=1;i=6078 + ns=1;i=6167 + ns=1;i=6168 + ns=1;i=6169 + ns=1;i=6170 + ns=1;i=6066 + ns=1;i=6071 + ns=1;i=6072 + ns=1;i=6073 + ns=1;i=6074 + ns=1;i=5006 + + + + In_Double_2 + + i=63 + ns=1;i=5001 + + + + In_Double_3 + + i=63 + ns=1;i=5001 + + + + In_Double_4 + + i=63 + ns=1;i=5001 + + + + In_Double_5 + + i=63 + ns=1;i=5001 + + + + In_Float_2 + + i=63 + ns=1;i=5001 + + + + In_Float_3 + + i=63 + ns=1;i=5001 + + + + In_Float_4 + + i=63 + ns=1;i=5001 + + + + In_Int16_2 + + i=63 + ns=1;i=5001 + + + + In_Int16_3 + + i=63 + ns=1;i=5001 + + + + In_Int16_4 + + i=63 + ns=1;i=5001 + + + + In_Int16_5 + + i=63 + ns=1;i=5001 + + + + In_Int32_2 + + i=63 + ns=1;i=5001 + + + + In_Int32_3 + + i=63 + ns=1;i=5001 + + + + In_Int32_4 + + i=63 + ns=1;i=5001 + + + + In_Int32_5 + + i=63 + ns=1;i=5001 + + + + In_Int64_2 + + i=63 + ns=1;i=5001 + + + + In_Int64_3 + + i=63 + ns=1;i=5001 + + + + In_Int64_4 + + i=63 + ns=1;i=5001 + + + + In_Int64_5 + + i=63 + ns=1;i=5001 + + + + In_UInt16_2 + + i=63 + ns=1;i=5001 + + + + In_UInt16_3 + + i=63 + ns=1;i=5001 + + + + In_UInt16_4 + + i=63 + ns=1;i=5001 + + + + In_UInt16_5 + + i=63 + ns=1;i=5001 + + + + In_UInt32_2 + + i=63 + ns=1;i=5001 + + + + In_UInt32_3 + + i=63 + ns=1;i=5001 + + + + In_UInt32_4 + + i=63 + ns=1;i=5001 + + + + In_UInt64_2 + + i=63 + ns=1;i=5001 + + + + In_UInt64_3 + + i=63 + ns=1;i=5001 + + + + In_UInt64_4 + + i=63 + ns=1;i=5001 + + + + In_UInt64_5 + + i=63 + ns=1;i=5001 + + + + Out_Double_2 + + i=63 + ns=1;i=5001 + + + + Out_Double_3 + + i=63 + ns=1;i=5001 + + + + Out_Double_4 + + i=63 + ns=1;i=5001 + + + + Out_Double_5 + + i=63 + ns=1;i=5001 + + + + Out_Float_2 + + i=63 + ns=1;i=5001 + + + + Out_Float_3 + + i=63 + ns=1;i=5001 + + + + Out_Float_4 + + i=63 + ns=1;i=5001 + + + + Out_Int16_2 + + i=63 + ns=1;i=5001 + + + + Out_Int16_3 + + i=63 + ns=1;i=5001 + + + + Out_Int16_4 + + i=63 + ns=1;i=5001 + + + + Out_Int16_5 + + i=63 + ns=1;i=5001 + + + + Out_Int32_2 + + i=63 + ns=1;i=5001 + + + + Out_Int32_3 + + i=63 + ns=1;i=5001 + + + + Out_Int32_4 + + i=63 + ns=1;i=5001 + + + + Out_Int32_5 + + i=63 + ns=1;i=5001 + + + + Out_Int64_2 + + i=63 + ns=1;i=5001 + + + + Out_Int64_3 + + i=63 + ns=1;i=5001 + + + + Out_Int64_4 + + i=63 + ns=1;i=5001 + + + + Out_Int64_5 + + i=63 + ns=1;i=5001 + + + + Out_UInt16_2 + + i=63 + ns=1;i=5001 + + + + Out_UInt16_3 + + i=63 + ns=1;i=5001 + + + + Out_UInt16_4 + + i=63 + ns=1;i=5001 + + + + Out_UInt16_5 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_2 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_3 + + i=63 + ns=1;i=5001 + + + + Out_UInt32_4 + + i=63 + ns=1;i=5001 + + + + Out_UInt64_2 + + i=63 + ns=1;i=5001 + + + + Out_UInt64_3 + + i=63 + ns=1;i=5001 + + + + Out_UInt64_4 + + i=63 + ns=1;i=5001 + + + + Out_UInt64_5 + + i=63 + ns=1;i=5001 + + + + Strings + + i=61 + ns=1;i=6145 + ns=1;i=6146 + ns=1;i=6147 + ns=1;i=6148 + ns=1;i=6149 + ns=1;i=6171 + ns=1;i=6172 + ns=1;i=6173 + ns=1;i=6174 + ns=1;i=6150 + ns=1;i=6151 + ns=1;i=6152 + ns=1;i=6153 + ns=1;i=6154 + ns=1;i=6175 + ns=1;i=6176 + ns=1;i=6177 + ns=1;i=6178 + ns=1;i=5006 + + + + In_String_1 + + i=63 + ns=1;i=5003 + + + + In_String_2 + + i=63 + ns=1;i=5003 + + + + In_String_3 + + i=63 + ns=1;i=5003 + + + + In_String_4 + + i=63 + ns=1;i=5003 + + + + Out_String_1 + + i=63 + ns=1;i=5003 + + + + Out_String_2 + + i=63 + ns=1;i=5003 + + + + Out_String_3 + + i=63 + ns=1;i=5003 + + + + Out_String_4 + + i=63 + ns=1;i=5003 + + + diff --git a/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.Controller.xml b/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.Controller.xml new file mode 100644 index 0000000..84a9836 --- /dev/null +++ b/SystemTest/NodeSetFiles/Opc.Ua.Fx.Show.Controller.xml @@ -0,0 +1,1202 @@ + + + + http://opcfoundation.org/FxShow/Controller/ + http://opcfoundation.org/UA/FX/AC/ + http://opcfoundation.org/UA/FX/Data/ + http://opcfoundation.org/UA/DI/ + http://opcfoundation.org/FxShow/BottleMachine/ + + + + + + + + + + + + i=1 + i=12 + i=13 + i=35 + i=40 + i=46 + i=47 + i=256 + i=291 + i=296 + ns=2;i=3003 + ns=2;i=3005 + ns=2;i=3008 + ns=2;i=3010 + ns=2;i=3011 + ns=2;i=3012 + + + + + + + + BottleController + + ns=2;i=2 + ns=1;i=6020 + ns=1;i=5011 + ns=1;i=7001 + ns=1;i=5001 + ns=1;i=5012 + ns=1;i=7002 + ns=1;i=5013 + ns=3;i=71 + + + + AggregatedHealth + + ns=2;i=2001 + ns=1;i=5018 + ns=1;i=6021 + ns=1;i=6022 + + + + + ns=2;i=5005 + + + + 0 + 0 + + + + + + + AggregatedDeviceHealth + + i=63 + ns=1;i=6020 + + + + AggregatedOperationalHealth + + i=63 + ns=1;i=6020 + + + + Assets + + i=61 + ns=1;i=5008 + ns=1;i=5018 + + + + FxDemoServer + + ns=2;i=3 + ns=1;i=6017 + ns=1;i=6018 + ns=1;i=6019 + ns=1;i=5011 + + + + Manufacturer + + i=68 + ns=1;i=5008 + + + Schneider Electric + + + + ProductInstanceUri + + i=68 + ns=1;i=5008 + + + urn:schneider:industrial automation:demoserver:fxdemo + + + + SoftwareRevision + + i=68 + ns=1;i=5008 + + + 0.1.0 + + + + CloseConnections + + ns=1;i=5018 + ns=1;i=6003 + ns=1;i=6004 + + + + InputArguments + + i=68 + ns=1;i=7001 + + + + + + i=297 + + + + ConnectionEndpoints + + i=17 + + 1 + + 0 + + + + + + + + i=297 + + + + Remove + + i=1 + + -1 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7001 + + + + + + i=297 + + + + Results + + i=19 + + 1 + + 0 + + + + + + + + + + ComponentCapabilities + + ns=2;i=1001 + ns=1;i=5018 + + + + Descriptors + + i=61 + ns=1;i=5018 + + + + EstablishConnections + + ns=1;i=5018 + ns=1;i=6001 + ns=1;i=6002 + + + + InputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + CommandMask + + ns=3;i=1024 + + -1 + + + + + + + + i=297 + + + + AssetVerifications + + ns=3;i=1048 + + 1 + + 0 + + + + + + + + i=297 + + + + ConnectionEndpointConfigurations + + ns=3;i=1044 + + 1 + + 0 + + + + + + + + i=297 + + + + ReserveCommunicationIds + + ns=3;i=3017 + + 1 + + 0 + + + + + + + + i=297 + + + + CommunicationConfigurations + + ns=3;i=1046 + + 1 + + 0 + + + + + + + + + + OutputArguments + + i=68 + ns=1;i=7002 + + + + + + i=297 + + + + AssetVerificationResults + + ns=3;i=1038 + + 1 + + 0 + + + + + + + + i=297 + + + + ConnectionEndpointConfigurationResults + + ns=3;i=3008 + + 1 + + 0 + + + + + + + + i=297 + + + + ReserveCommunicationIdsResults + + ns=3;i=3019 + + 1 + + 0 + + + + + + + + i=297 + + + + CommunicationConfigurationResults + + ns=3;i=1033 + + 1 + + 0 + + + + + + + + + + FunctionalEntities + + i=61 + ns=1;i=5477 + ns=1;i=5019 + ns=1;i=5002 + ns=1;i=5018 + + + + BottleMachine + + ns=2;i=4 + ns=1;i=5013 + ns=1;i=5015 + ns=1;i=5016 + ns=1;i=5017 + ns=1;i=5025 + ns=1;i=5026 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5477 + + + + InputData + + ns=2;i=1000 + ns=5;i=6022 + ns=5;i=6024 + ns=5;i=6026 + ns=5;i=6028 + ns=5;i=6008 + ns=5;i=6055 + ns=5;i=6030 + ns=5;i=6040 + ns=1;i=5009 + ns=5;i=6014 + ns=1;i=5477 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6027 + ns=1;i=6028 + ns=1;i=6029 + ns=1;i=6030 + ns=1;i=6031 + ns=1;i=5016 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5009 + + + true + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5009 + + + + FxShowDataSetReader + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5009 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5009 + + + + SupportedQos + + i=63 + ns=1;i=5009 + + + + OutputData + + ns=2;i=1019 + ns=5;i=6004 + ns=5;i=6033 + ns=5;i=6032 + ns=5;i=6005 + ns=5;i=6042 + ns=5;i=6048 + ns=5;i=6006 + ns=5;i=6034 + ns=1;i=5014 + ns=5;i=6046 + ns=1;i=5477 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6032 + ns=1;i=6033 + ns=1;i=6034 + ns=1;i=6035 + ns=1;i=5017 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5014 + + + true + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5014 + + + + FxShowPublishedDataSet + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5014 + + + + SupportedQos + + i=63 + ns=1;i=5014 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=6036 + ns=1;i=6037 + ns=1;i=6038 + ns=1;i=6039 + ns=1;i=5477 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5025 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5025 + + + + FxShowPublishedDataSet + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5025 + + + + + + ns=2;i=5020 + + + + 10 + 100 + 10 + 1 + Millisecond_2 + + + + + + + + SupportedQos + + i=63 + ns=1;i=5025 + + + + + + ns=2;i=5025 + + + + opc.qos.cat://priority + + + + i=23925 + + + + opc.qos.lbl://green + + + + + + i=23925 + + + + opc.qos.lbl://best effort + + + + + + + + + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=6040 + ns=1;i=6041 + ns=1;i=6042 + ns=1;i=6043 + ns=1;i=6044 + ns=1;i=5477 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5026 + + + true + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5026 + + + + FxShowDataSetReader + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5026 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5026 + + + + + + ns=2;i=5020 + + + + 10 + 100 + 10 + 1 + Millisecond_2 + + + + + + + + SupportedQos + + i=63 + ns=1;i=5026 + + + + + + ns=2;i=5028 + + + + opc.qos.cat://priority + + + + i=23929 + + + + opc.qos.lbl://green + + + + + + i=23929 + + + + opc.qos.lbl://best effort + + + + + + + + + + + + MassTest + + ns=2;i=4 + ns=1;i=5013 + ns=1;i=5020 + ns=1;i=5021 + ns=1;i=5022 + ns=1;i=5023 + ns=1;i=5024 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5019 + + + + InputData + + ns=2;i=1000 + ns=1;i=5019 + ns=5;i=6139 + ns=5;i=6179 + ns=5;i=6180 + ns=5;i=6181 + ns=5;i=6182 + ns=5;i=6102 + ns=5;i=6155 + ns=5;i=6156 + ns=5;i=6157 + ns=5;i=6158 + ns=5;i=6149 + ns=5;i=6171 + ns=5;i=6172 + ns=5;i=6173 + ns=5;i=6174 + ns=5;i=6122 + ns=5;i=6159 + ns=5;i=6160 + ns=5;i=6161 + ns=5;i=6162 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5019 + ns=5;i=6144 + ns=5;i=6183 + ns=5;i=6184 + ns=5;i=6185 + ns=5;i=6186 + ns=5;i=6134 + ns=5;i=6163 + ns=5;i=6164 + ns=5;i=6165 + ns=5;i=6166 + ns=5;i=6154 + ns=5;i=6175 + ns=5;i=6176 + ns=5;i=6177 + ns=5;i=6178 + ns=5;i=6078 + ns=5;i=6167 + ns=5;i=6168 + ns=5;i=6169 + ns=5;i=6170 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5019 + ns=1;i=6052 + ns=1;i=6053 + ns=1;i=6054 + ns=1;i=6055 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5023 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5023 + + + + MassTestPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5023 + + + + SupportedQos + + i=63 + ns=1;i=5023 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5019 + ns=1;i=6056 + ns=1;i=6057 + ns=1;i=6058 + ns=1;i=6059 + ns=1;i=6060 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5024 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5024 + + + + MassTestSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5024 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5024 + + + + SupportedQos + + i=63 + ns=1;i=5024 + + + + NumericValues + + ns=2;i=4 + ns=1;i=5003 + ns=1;i=5005 + ns=1;i=5006 + ns=1;i=5007 + ns=1;i=5010 + ns=1;i=5013 + + + + ConnectionEndpoints + + ns=2;i=20 + ns=1;i=5002 + + + + InputData + + ns=2;i=1000 + ns=1;i=5002 + ns=5;i=6067 + ns=5;i=6069 + ns=5;i=6056 + ns=5;i=6035 + ns=5;i=6057 + ns=5;i=6059 + ns=5;i=6058 + ns=5;i=6060 + + + + OutputData + + ns=2;i=1019 + ns=1;i=5002 + ns=5;i=6068 + ns=5;i=6070 + ns=5;i=6062 + ns=5;i=6061 + ns=5;i=6063 + ns=5;i=6064 + ns=5;i=6065 + ns=5;i=6066 + + + + PublisherCapabilities + + ns=2;i=1003 + ns=1;i=5002 + ns=1;i=6005 + ns=1;i=6006 + ns=1;i=6007 + ns=1;i=6011 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5007 + + + false + + + + PreconfiguredPublishedDataSets + + i=63 + ns=1;i=5007 + + + + NumericValuesPDS + + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5007 + + + + SupportedQos + + i=63 + ns=1;i=5007 + + + + SubscriberCapabilities + + ns=2;i=1004 + ns=1;i=5002 + ns=1;i=6012 + ns=1;i=6023 + ns=1;i=6024 + ns=1;i=6025 + ns=1;i=6026 + + + + PreconfiguredDataSetOnly + + i=63 + ns=1;i=5010 + + + false + + + + PreconfiguredSubscribedDataSets + + i=63 + ns=1;i=5010 + + + + NumericValuesSDS + + + + + SupportedMessageReceiveTimeouts + + i=63 + ns=1;i=5010 + + + + SupportedPublishingIntervals + + i=63 + ns=1;i=5010 + + + + SupportedQos + + i=63 + ns=1;i=5010 + + + + http://opcfoundation.org/FxShow/Controller/ + + i=11616 + ns=1;i=6008 + ns=1;i=6009 + ns=1;i=6010 + ns=1;i=6013 + ns=1;i=6014 + ns=1;i=6015 + ns=1;i=6016 + i=11715 + + + + IsNamespaceSubset + + i=68 + ns=1;i=5004 + + + false + + + + NamespacePublicationDate + + i=68 + ns=1;i=5004 + + + 2021-09-14T07:21:35Z + + + + NamespaceUri + + i=68 + ns=1;i=5004 + + + http://opcfoundation.org/FxShow/Controller/ + + + + NamespaceVersion + + i=68 + ns=1;i=5004 + + + 1.0.0 + + + + StaticNodeIdTypes + + i=68 + ns=1;i=5004 + + + + StaticNumericNodeIdRange + + i=68 + ns=1;i=5004 + + + + StaticStringNodeIdPattern + + i=68 + ns=1;i=5004 + + + diff --git a/SystemTest/SystemTest.csproj b/SystemTest/SystemTest.csproj index f156f09..e605cab 100644 --- a/SystemTest/SystemTest.csproj +++ b/SystemTest/SystemTest.csproj @@ -48,6 +48,15 @@ Always + + Always + + + Always + + + Always + Always diff --git a/SystemTest/TestDuplicatedInstances.cs b/SystemTest/TestDuplicatedInstances.cs new file mode 100644 index 0000000..1febda6 --- /dev/null +++ b/SystemTest/TestDuplicatedInstances.cs @@ -0,0 +1,319 @@ +using Aml.Engine.CAEX; +using Aml.Engine.CAEX.Extensions; +using Aml.Engine.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Opc.Ua; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Xml; +using System.Xml.Linq; + +namespace SystemTest +{ + [TestClass] + public class TestDuplicatedInstances + { + const string ControllerNodeSetFile = "Opc.Ua.Fx.Show.Controller.xml"; + const string BottleMachineNodeSetFile = "Opc.Ua.Fx.Show.BottleMachine.xml"; + + Dictionary Locations = null; + + + #region Tests + + // The IOP model is validated in the Validate test module. + + [TestMethod, Timeout(TestHelper.UnitTestTimeout)] + [DataRow("Opc.Ua.Fx.IOPModel.xml.amlx")] + [DataRow("Opc.Ua.Fx.Show.BottleMachine.xml.amlx")] + [DataRow("Opc.Ua.Fx.Show.Controller.xml.amlx")] + + public void FindDuplicates(string fileName) + { + CAEXDocument document = GetDocument(fileName); + + HashSet set = new HashSet(); + Dictionary duplicates = new Dictionary(); + + foreach (InstanceHierarchyType type in document.CAEXFile.InstanceHierarchy) + { + foreach (InternalElementType internalElement in type.InternalElement) + { + SystemUnitClassType classType = internalElement as SystemUnitClassType; + if (classType != null) + { + WalkInstance(classType, set, duplicates); + } + } + } + + Console.WriteLine($"Container {fileName} hase {set.Count} instances"); + + if ( duplicates.Count > 0 ) + { + foreach(KeyValuePair pair in duplicates) + { + Console.WriteLine($"Duplicate Id: {pair.Key} found {pair.Value} times."); + } + Assert.AreEqual(0, duplicates.Count, "Found " + duplicates.Count + " Duplicate Ids"); + } + } + + public void WalkInstance( SystemUnitClassType instance, + HashSet set, + Dictionary duplicates ) + { + if ( set.TryGetValue(instance.ID, out _)) + { + if (duplicates.TryGetValue(instance.ID, out int count)) + { + duplicates[instance.ID] = count + 1; + } + else + { + // Strange, but accurate. Just not tracking exactly where. + duplicates[instance.ID] = 2; + } + } + else + { + set.Add(instance.ID); + } + + foreach (InternalElementType child in instance.InternalElement) + { + WalkInstance(child as SystemUnitClassType, set, duplicates); + } + } + + // Look for specifics. + // Problem was discovered in the Controller where the FxShowBottleMachine and + // FxRoot\BottleController\FunctionalEntities\BottleMachine has both InputData + // and OutputData referencing the same instances. + // FxShowBottleMachine should have many HasComponents to the instances + // FxRoot\BottleController\FunctionalEntities\BottleMachine Inputs and Outputs should + // have organizes. + // Ideally that the FxShowBottleMachine should have the actual components + // and the BottleMachine should have references to them. + // This happens because of the way that references are processed in order, from the lowest + // namespace index to the highest. + + // Use the Controller test file for the remainder of the tests + + [TestMethod, Timeout(TestHelper.UnitTestTimeout)] + + public void TestHasComponent() + { + CAEXDocument document = GetDocument("Opc.Ua.Fx.Show.Controller.xml.amlx"); + + Dictionary locations = GetLocations(document); + SystemUnitClassType fxShowBottleMachine = locations["FxShowBottleMachineId"]; + + // Ensure the proper ExternalInterface Exists + ExternalInterfaceType hasComponent = fxShowBottleMachine.ExternalInterface["HasComponent"]; + Assert.IsNotNull(hasComponent); + + DirectoryInfo outputDirectoryInfo = TestHelper.GetOpc2AmlDirectory(); + FileInfo nodeSetFileInfo = new FileInfo(Path.Combine(outputDirectoryInfo.FullName, BottleMachineNodeSetFile)); + Assert.IsTrue(nodeSetFileInfo.Exists); + + // need to check reverses as well + XmlDocument doc = new XmlDocument(); + doc.Load(nodeSetFileInfo.FullName); + + XmlNode node = doc.SelectSingleNode("//*[local-name()='UAObject' and @NodeId='ns=1;i=5020']"); + Assert.IsNotNull(node); + XmlNode references = node["References"]; + Assert.IsNotNull(references); + Assert.IsNotNull(references.ChildNodes); + Assert.AreNotEqual(0, references.ChildNodes.Count); + foreach (XmlNode referenceNode in references.ChildNodes) + { + XmlAttribute typeAttribute = referenceNode.Attributes["ReferenceType"]; + if (typeAttribute != null) + { + if ( typeAttribute.InnerText.Equals("HasComponent")) + { + NodeId nodeId = new NodeId( referenceNode.InnerText ); + string nodeIdIdentifier = nodeId.Identifier.ToString(); + string amlId = TestHelper.BuildAmlId("", TestHelper.Uris.ShowBottleMachine, nodeIdIdentifier ); + CAEXObject caexObject = document.FindByID( amlId ); + Assert.IsNotNull( caexObject); + SystemUnitClassType component = caexObject as SystemUnitClassType; + Assert.IsNotNull( component ); + Console.WriteLine($"Testing {component.Name}"); + + // Ensure the proper external interface to the target + ExternalInterfaceType externalInterface = component.ExternalInterface["ComponentOf"]; + Assert.IsNotNull( externalInterface ); + + // Ensure there is an Internal Link from the parent to the target + InternalLinkType internalLink = fxShowBottleMachine.InternalLink[component.Name]; + Assert.IsNotNull( internalLink ); + + Assert.AreEqual(hasComponent.ID, internalLink.RefPartnerSideA); + Assert.AreEqual(externalInterface.ID, internalLink.RefPartnerSideB); + + // Ensure the parent of the target is as expected + // This is based off current operations, and could change + // if the reference list is sorted in RecursiveAddModifyInstances + SystemUnitClassType parent = locations[component.Name]; + + Assert.IsNotNull( parent ); + + SystemUnitClassType componentParent = component.CAEXParent as SystemUnitClassType; + Assert.IsNotNull(componentParent); + + Assert.AreEqual(parent.ID, componentParent.ID); + } + } + } + } + + [TestMethod, Timeout(TestHelper.UnitTestTimeout)] + [DataRow("OutputData", "5017")] + [DataRow("InputData", "5016")] + + public void TestOrganizes(string organizesName, string organizesId) + { + CAEXDocument document = GetDocument("Opc.Ua.Fx.Show.Controller.xml.amlx"); + + Dictionary locations = GetLocations(document); + SystemUnitClassType organizedElement = locations[organizesName]; + + // Ensure the proper ExternalInterface Exists + ExternalInterfaceType organizesInterface = organizedElement.ExternalInterface["Organizes"]; + Assert.IsNotNull(organizesInterface); + + DirectoryInfo outputDirectoryInfo = TestHelper.GetOpc2AmlDirectory(); + FileInfo nodeSetFileInfo = new FileInfo(Path.Combine(outputDirectoryInfo.FullName, ControllerNodeSetFile)); + Assert.IsTrue(nodeSetFileInfo.Exists); + + // need to check reverses as well + XmlDocument doc = new XmlDocument(); + doc.Load(nodeSetFileInfo.FullName); + + XmlNode node = doc.SelectSingleNode("//*[local-name()='UAObject' and @NodeId='ns=1;i=" + organizesId + "']"); + Assert.IsNotNull(node); + XmlNode references = node["References"]; + Assert.IsNotNull(references); + Assert.IsNotNull(references.ChildNodes); + Assert.AreNotEqual(0, references.ChildNodes.Count); + foreach (XmlNode referenceNode in references.ChildNodes) + { + XmlAttribute typeAttribute = referenceNode.Attributes["ReferenceType"]; + if (typeAttribute.InnerText.Equals("Organizes")) + { + NodeId nodeId = new NodeId(referenceNode.InnerText); + string nodeIdIdentifier = nodeId.Identifier.ToString(); + string amlId = TestHelper.BuildAmlId("", TestHelper.Uris.ShowBottleMachine, nodeIdIdentifier); + CAEXObject caexObject = document.FindByID(amlId); + Assert.IsNotNull(caexObject); + SystemUnitClassType component = caexObject as SystemUnitClassType; + Assert.IsNotNull(component); + Console.WriteLine($"Testing {component.Name}"); + + // Ensure the proper external interface to the target + ExternalInterfaceType externalInterface = component.ExternalInterface["OrganizedBy"]; + Assert.IsNotNull(externalInterface); + + // Ensure there is an Internal Link from the parent to the target + InternalLinkType internalLink = organizedElement.InternalLink[component.Name]; + Assert.IsNotNull(internalLink); + + Assert.AreEqual(organizesInterface.ID, internalLink.RefPartnerSideA); + Assert.AreEqual(externalInterface.ID, internalLink.RefPartnerSideB); + + // Ensure the parent of the target is as expected + // This is based off current operations, and could change + // if the reference list is sorted in RecursiveAddModifyInstances + SystemUnitClassType parent = locations[component.Name]; + + Assert.IsNotNull(parent); + + SystemUnitClassType componentParent = component.CAEXParent as SystemUnitClassType; + Assert.IsNotNull(componentParent); + + Assert.AreEqual(parent.ID, componentParent.ID); + } + + } + + + + } + + public Dictionary GetLocations(CAEXDocument document) + { + if ( Locations == null ) + { + Locations = new Dictionary(); + + SystemUnitClassType fxShowBottleMachine = GetSystemUnitClass( document, + TestHelper.Uris.ShowBottleMachine, "5020"); + Locations.Add("FxShowBottleMachineId", fxShowBottleMachine); + + SystemUnitClassType inputData = GetSystemUnitClass(document, + TestHelper.Uris.ShowController, "5016"); + Locations.Add("InputData", inputData); + + SystemUnitClassType outputData = GetSystemUnitClass(document, + TestHelper.Uris.ShowController, "5017"); + Locations.Add("OutputData", outputData); + + Locations.Add("BottleSpeed", fxShowBottleMachine); + Locations.Add("MachineIdentification", fxShowBottleMachine); + Locations.Add("MachineType", fxShowBottleMachine); + Locations.Add("ResetBottleId", fxShowBottleMachine); + + Locations.Add("BottleIdIn", inputData); + Locations.Add("BottleMaterialIn", inputData); + Locations.Add("BottleSizeIn", inputData); + Locations.Add("CapColorIn", inputData); + Locations.Add("CapperIdentificationIn", inputData); + Locations.Add("FillerIdentificationIn", inputData); + Locations.Add("LabelDesignIn", inputData); + Locations.Add("LiquidTypeIn", inputData); + Locations.Add("WasherIdentificationIn", inputData); + + Locations.Add("BottleId", outputData); + Locations.Add("BottleMaterial", outputData); + Locations.Add("BottleSize", outputData); + Locations.Add("CapColor", outputData); + Locations.Add("CapperIdentification", outputData); + Locations.Add("FillerIdentification", outputData); + Locations.Add("LabelDesign", outputData); + Locations.Add("LiquidType", outputData); + Locations.Add("WasherIdentification", outputData); + } + return Locations; + } + + public SystemUnitClassType GetSystemUnitClass( CAEXDocument document, TestHelper.Uris uri, string idString ) + { + string id = TestHelper.BuildAmlId("", uri, idString); + CAEXObject theObject = document.FindByID(id); + Assert.IsNotNull(theObject); + SystemUnitClassType systemUnitClass = theObject as SystemUnitClassType; + Assert.IsNotNull(systemUnitClass); + return systemUnitClass; + } + + #endregion + + #region Helpers + + private CAEXDocument GetDocument(string fileName) + { + CAEXDocument document = TestHelper.GetReadOnlyDocument( fileName ); + Assert.IsNotNull(document, "Unable to retrieve Document" ); + return document; + } + + #endregion + + } +} diff --git a/SystemTest/TestHelper.cs b/SystemTest/TestHelper.cs index ff15a36..792b850 100644 --- a/SystemTest/TestHelper.cs +++ b/SystemTest/TestHelper.cs @@ -29,7 +29,10 @@ public enum Uris Ac, Test, AmlFxTest, - InstanceLevel + InstanceLevel, + IOPModel, + ShowBottleMachine, + ShowController } public static readonly Dictionary UriMap = new Dictionary() @@ -41,6 +44,9 @@ public enum Uris { Uris.Test, TestHelper.TestAmlUri }, { Uris.AmlFxTest, "http://opcfoundation.org/UA/FX/AML/TESTING/AmlFxTest/" }, { Uris.InstanceLevel, "http://opcfoundation.org/UA/FX/AML/TESTING/InstanceLevel/" }, + { Uris.IOPModel, "http://opcfoundation.org/UA/FX/IOPModel/" }, + { Uris.ShowBottleMachine, "http://opcfoundation.org/FxShow/BottleMachine/" }, + { Uris.ShowController, "http://opcfoundation.org/FxShow/Controller/" }, }; public const int UnitTestTimeout = 480000; diff --git a/SystemTest/Validation.cs b/SystemTest/Validation.cs index e8568be..ea3b8e7 100644 --- a/SystemTest/Validation.cs +++ b/SystemTest/Validation.cs @@ -15,6 +15,9 @@ public class Validation [TestMethod, Timeout( TestHelper.UnitTestTimeout )] [DataRow("TestAml.xml.amlx")] [DataRow("AmlFxTest.xml.amlx")] + [DataRow("Opc.Ua.Fx.IOPModel.xml.amlx")] + [DataRow("Opc.Ua.Fx.Show.BottleMachine.xml.amlx")] + [DataRow("Opc.Ua.Fx.Show.Controller.xml.amlx")] public void ValidationTest( string fileName ) { var lookupService = LookupService.Register();