/// <summary> /// Finds the child with the specified browse name. /// </summary> protected override BaseInstanceState FindChild( ISystemContext context, QualifiedName browseName, bool createOrReplace, BaseInstanceState replacement) { if (QualifiedName.IsNull(browseName)) { return null; } BaseInstanceState instance = null; switch (browseName.Name) { case Opc.Ua.Fdi7.BrowseNames.SubDevices: { if (createOrReplace) { if (SubDevices == null) { if (replacement == null) { SubDevices = new FolderState(this); } else { SubDevices = (FolderState)replacement; } } } instance = SubDevices; break; } } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); }
/// <summary> /// Does any initialization required before the address space can be used. /// </summary> /// <remarks> /// The externalReferences is an out parameter that allows the node manager to link to nodes /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and /// should have a reference to the root folder node(s) exposed by this node manager. /// </remarks> public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences) { lock (Lock) { base.CreateAddressSpace(externalReferences); if (m_ownsTypeModel) { LoadPredefinedNodes(SystemContext, externalReferences); } string rootName = "Root"; if (m_endpoint.Description != null && m_endpoint.Description.Server != null && m_endpoint.Description.Server.ApplicationName != null) { rootName = m_endpoint.Description.Server.ApplicationName.Text; } FolderState root = m_root = new FolderState(null); root.NodeId = GenerateNodeId(); root.BrowseName = new QualifiedName(rootName, NamespaceIndex); root.DisplayName = root.BrowseName.Name; root.TypeDefinitionId = Opc.Ua.ObjectTypeIds.FolderType; root.EventNotifier = EventNotifiers.SubscribeToEvents; root.OnCreateBrowser = OnCreateBrowser; AddPredefinedNode(SystemContext, root); // link root to objects folder. IList<IReference> references = null; if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out references)) { externalReferences[ObjectIds.ObjectsFolder] = references = new List<IReference>(); } references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, root.NodeId)); root.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder); // link root to server object. if (!externalReferences.TryGetValue(ObjectIds.Server, out references)) { externalReferences[ObjectIds.Server] = references = new List<IReference>(); } references.Add(new NodeStateReference(ReferenceTypeIds.HasNotifier, false, root.NodeId)); root.AddReference(Opc.Ua.ReferenceTypeIds.HasNotifier, true, ObjectIds.Server); // create status object. AggregationModel.AggregatedServerStatusState status = m_status = new AggregationModel.AggregatedServerStatusState(null); status.Create( SystemContext, GenerateNodeId(), new QualifiedName("Status", NamespaceIndex), null, true); status.EndpointUrl.Value = m_endpoint.EndpointUrl.ToString(); status.Status.Value = StatusCodes.BadNotConnected; status.ConnectTime.Value = DateTime.MinValue; status.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, true, root.NodeId); root.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, false, status.NodeId); AddPredefinedNode(SystemContext, status); StartMetadataUpdates(DoMetadataUpdate, null, 5000, 30000); } }
/// <summary> /// Creates a new area. /// </summary> private BaseObjectState CreateArea(SystemContext context, BaseObjectState platforms, string areaName) { FolderState area = new FolderState(null); area.NodeId = new NodeId(areaName, NamespaceIndex); area.BrowseName = new QualifiedName(areaName, NamespaceIndex); area.DisplayName = area.BrowseName.Name; area.EventNotifier = EventNotifiers.SubscribeToEvents | EventNotifiers.HistoryRead | EventNotifiers.HistoryWrite; area.TypeDefinitionId = Opc.Ua.ObjectTypeIds.FolderType; platforms.AddNotifier(SystemContext, Opc.Ua.ReferenceTypeIds.HasNotifier, false, area); area.AddNotifier(SystemContext, Opc.Ua.ReferenceTypeIds.HasNotifier, true, platforms); AddPredefinedNode(SystemContext, area); return area; }
/// <summary> /// Finds the child with the specified browse name. /// </summary> protected override BaseInstanceState FindChild( ISystemContext context, QualifiedName browseName, bool createOrReplace, BaseInstanceState replacement) { if (QualifiedName.IsNull(browseName)) { return null; } BaseInstanceState instance = null; switch (browseName.Name) { case DsatsDemo.BrowseNames.Enabled: { if (createOrReplace) { if (Enabled == null) { if (replacement == null) { Enabled = new PropertyState<bool>(this); } else { Enabled = (PropertyState<bool>)replacement; } } } instance = Enabled; break; } case DsatsDemo.BrowseNames.DeviceReady: { if (createOrReplace) { if (DeviceReady == null) { if (replacement == null) { DeviceReady = new PropertyState<bool>(this); } else { DeviceReady = (PropertyState<bool>)replacement; } } } instance = DeviceReady; break; } case DsatsDemo.BrowseNames.LocalControl: { if (createOrReplace) { if (LocalControl == null) { if (replacement == null) { LocalControl = new PropertyState<bool>(this); } else { LocalControl = (PropertyState<bool>)replacement; } } } instance = LocalControl; break; } case DsatsDemo.BrowseNames.WatchdogCounter: { if (createOrReplace) { if (WatchdogCounter == null) { if (replacement == null) { WatchdogCounter = new PropertyState<uint>(this); } else { WatchdogCounter = (PropertyState<uint>)replacement; } } } instance = WatchdogCounter; break; } case DsatsDemo.BrowseNames.ActiveLockId: { if (createOrReplace) { if (ActiveLockId == null) { if (replacement == null) { ActiveLockId = new PropertyState<string>(this); } else { ActiveLockId = (PropertyState<string>)replacement; } } } instance = ActiveLockId; break; } case DsatsDemo.BrowseNames.AssetInfo: { if (createOrReplace) { if (AssetInfo == null) { if (replacement == null) { AssetInfo = new AssetInfoFolderState(this); } else { AssetInfo = (AssetInfoFolderState)replacement; } } } instance = AssetInfo; break; } case DsatsDemo.BrowseNames.Measurements: { if (createOrReplace) { if (Measurements == null) { if (replacement == null) { Measurements = new FolderState(this); } else { Measurements = (FolderState)replacement; } } } instance = Measurements; break; } case DsatsDemo.BrowseNames.SetPoints: { if (createOrReplace) { if (SetPoints == null) { if (replacement == null) { SetPoints = new FolderState(this); } else { SetPoints = (FolderState)replacement; } } } instance = SetPoints; break; } case DsatsDemo.BrowseNames.Limits: { if (createOrReplace) { if (Limits == null) { if (replacement == null) { Limits = new FolderState(this); } else { Limits = (FolderState)replacement; } } } instance = Limits; break; } case DsatsDemo.BrowseNames.OperationalLimits: { if (createOrReplace) { if (OperationalLimits == null) { if (replacement == null) { OperationalLimits = new FolderState(this); } else { OperationalLimits = (FolderState)replacement; } } } instance = OperationalLimits; break; } case DsatsDemo.BrowseNames.AccessRules: { if (createOrReplace) { if (AccessRules == null) { if (replacement == null) { AccessRules = new FolderState(this); } else { AccessRules = (FolderState)replacement; } } } instance = AccessRules; break; } } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); }
/// <summary> /// Finds the child with the specified browse name. /// </summary> protected override BaseInstanceState FindChild( ISystemContext context, QualifiedName browseName, bool createOrReplace, BaseInstanceState replacement) { if (QualifiedName.IsNull(browseName)) { return null; } BaseInstanceState instance = null; switch (browseName.Name) { case DsatsDemo.BrowseNames.ChangePhase: { if (createOrReplace) { if (ChangePhase == null) { if (replacement == null) { ChangePhase = new ChangePhaseMethodState(this); } else { ChangePhase = (ChangePhaseMethodState)replacement; } } } instance = ChangePhase; break; } case DsatsDemo.BrowseNames.ChangePhaseWithString: { if (createOrReplace) { if (ChangePhaseWithString == null) { if (replacement == null) { ChangePhaseWithString = new PropertyState<string>(this); } else { ChangePhaseWithString = (PropertyState<string>)replacement; } } } instance = ChangePhaseWithString; break; } case DsatsDemo.BrowseNames.CurrentPhase: { if (createOrReplace) { if (CurrentPhase == null) { if (replacement == null) { CurrentPhase = new BaseDataVariableState<NodeId>(this); } else { CurrentPhase = (BaseDataVariableState<NodeId>)replacement; } } } instance = CurrentPhase; break; } case DsatsDemo.BrowseNames.Phases: { if (createOrReplace) { if (Phases == null) { if (replacement == null) { Phases = new FolderState(this); } else { Phases = (FolderState)replacement; } } } instance = Phases; break; } case DsatsDemo.BrowseNames.Locks: { if (createOrReplace) { if (Locks == null) { if (replacement == null) { Locks = new FolderState(this); } else { Locks = (FolderState)replacement; } } } instance = Locks; break; } case DsatsDemo.BrowseNames.TopDrive: { if (createOrReplace) { if (TopDrive == null) { if (replacement == null) { TopDrive = new TopDriveState(this); } else { TopDrive = (TopDriveState)replacement; } } } instance = TopDrive; break; } case DsatsDemo.BrowseNames.MudPumps: { if (createOrReplace) { if (MudPumps == null) { if (replacement == null) { MudPumps = new FolderState(this); } else { MudPumps = (FolderState)replacement; } } } instance = MudPumps; break; } } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); }
/// <summary> /// Creates a new folder. /// </summary> private FolderState CreateFolder(NodeState parent, string path, string name) { FolderState folder = new FolderState(parent); folder.SymbolicName = name; folder.ReferenceTypeId = ReferenceTypes.Organizes; folder.TypeDefinitionId = ObjectTypeIds.FolderType; folder.NodeId = new NodeId(path, NamespaceIndex); folder.BrowseName = new QualifiedName(path, NamespaceIndex); folder.DisplayName = new LocalizedText("en", name); folder.WriteMask = AttributeWriteMask.None; folder.UserWriteMask = AttributeWriteMask.None; folder.EventNotifier = EventNotifiers.None; if (parent != null) { parent.AddChild(folder); } return folder; }
/// <summary> /// Does any initialization required before the address space can be used. /// </summary> /// <remarks> /// The externalReferences is an out parameter that allows the node manager to link to nodes /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and /// should have a reference to the root folder node(s) exposed by this node manager. /// </remarks> public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences) { lock (Lock) { base.CreateAddressSpace(externalReferences); #region Task #A1 - Create Root Folder // create the root folder. FolderState root = new FolderState(null); root.NodeId = GenerateNodeId(); root.BrowseName = new QualifiedName("Root", NamespaceIndex); root.DisplayName = root.BrowseName.Name; root.TypeDefinitionId = ObjectTypeIds.FolderType; // ensure root can be found via the server object. IList<IReference> references = null; if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out references)) { externalReferences[ObjectIds.ObjectsFolder] = references = new List<IReference>(); } root.AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder); references.Add(new NodeStateReference(ReferenceTypeIds.Organizes, false, root.NodeId)); // save the node for later lookup. AddPredefinedNode(SystemContext, root); #endregion #region Task #A2 - Create Object Instance with a Property // create the folder object. BaseObjectState instance = new BaseObjectState(null); instance.NodeId = GenerateNodeId(); instance.BrowseName = new QualifiedName("Object", NamespaceIndex); instance.DisplayName = instance.BrowseName.Name; instance.TypeDefinitionId = ObjectTypeIds.BaseObjectType; // create a losely coupled relationship with the root object. root.AddReference(ReferenceTypeIds.Organizes, false, instance.NodeId); instance.AddReference(ReferenceTypeIds.Organizes, true, root.NodeId); // create a property. PropertyState<int> property = new PropertyState<int>(instance); property.NodeId = GenerateNodeId(); property.BrowseName = new QualifiedName("Property", NamespaceIndex); property.DisplayName = property.BrowseName.Name; property.TypeDefinitionId = VariableTypeIds.PropertyType; property.DataType = DataTypeIds.Int32; property.ValueRank = ValueRanks.Scalar; property.MinimumSamplingInterval = MinimumSamplingIntervals.Continuous; property.AccessLevel = AccessLevels.CurrentReadOrWrite; property.UserAccessLevel = AccessLevels.CurrentReadOrWrite; property.Historizing = false; property.ReferenceTypeId = ReferenceTypeIds.HasProperty; // create a property that is tightly coupled. instance.AddChild(property); // save the node for later lookup (all tightly coupled children are added with this call). AddPredefinedNode(SystemContext, instance); #endregion #region Task #A3 - Create a Variable using the Built-in Type Model // create the variable. AnalogItemState<double> variable = new AnalogItemState<double>(instance); // add optional properties. variable.InstrumentRange = new PropertyState<Range>(variable); // instantiate based on the type model. assigns ids automatically using SystemContext.NodeIdFactory variable.Create( SystemContext, GenerateNodeId(), new QualifiedName("Variable", NamespaceIndex), null, true); // set default values. variable.EURange.Value = new Range(90, 10); variable.InstrumentRange.Value = new Range(100, 0); // tightly coupled. instance.AddChild(variable); // need to add it manually since its parent was already added. AddPredefinedNode(SystemContext, variable); #endregion #region Task #A4 - Add Dynamic Behavoir by Updating In-Memory Nodes m_property = property; m_simulationTimer = new Timer(DoSimulation, null, 1000, 1000); #endregion #region Task #A5 - Add Support for External Nodes // External nodes are nodes that reference an entity which stored elsewhere. // These nodes use no memory in the server unless they are accessed. // The NodeId is a string that is used to create the external node on demand. root.AddReference(ReferenceTypeIds.Organizes, false, CreateNodeId("Alpha")); root.AddReference(ReferenceTypeIds.Organizes, false, CreateNodeId("Omega")); #endregion #region Task #A7 - Add Support for Method MethodState method = new MethodState(instance); method.NodeId = GenerateNodeId(); method.BrowseName = new QualifiedName("Method", NamespaceIndex); method.DisplayName = method.BrowseName.Name; method.Executable = true; method.UserExecutable = true; method.ReferenceTypeId = ReferenceTypeIds.HasComponent; instance.AddChild(method); // create the input arguments. PropertyState<Argument[]> inputArguments = new PropertyState<Argument[]>(method); inputArguments.NodeId = GenerateNodeId(); inputArguments.BrowseName = new QualifiedName(BrowseNames.InputArguments); inputArguments.DisplayName = inputArguments.BrowseName.Name; inputArguments.TypeDefinitionId = VariableTypeIds.PropertyType; inputArguments.DataType = DataTypeIds.Argument; inputArguments.ValueRank = ValueRanks.OneDimension; inputArguments.MinimumSamplingInterval = MinimumSamplingIntervals.Continuous; inputArguments.AccessLevel = AccessLevels.CurrentRead; inputArguments.UserAccessLevel = AccessLevels.CurrentRead; inputArguments.Historizing = false; inputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty; inputArguments.Value = new Argument[] { new Argument() { Name = "CurrentCount", Description = "The current count.", DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar } }; method.InputArguments = inputArguments; // create the output arguments. PropertyState<Argument[]> outputArguments = new PropertyState<Argument[]>(method); outputArguments.NodeId = GenerateNodeId(); outputArguments.BrowseName = new QualifiedName(BrowseNames.OutputArguments); outputArguments.DisplayName = outputArguments.BrowseName.Name; outputArguments.TypeDefinitionId = VariableTypeIds.PropertyType; outputArguments.DataType = DataTypeIds.Argument; outputArguments.ValueRank = ValueRanks.OneDimension; outputArguments.MinimumSamplingInterval = MinimumSamplingIntervals.Continuous; outputArguments.AccessLevel = AccessLevels.CurrentRead; outputArguments.UserAccessLevel = AccessLevels.CurrentRead; outputArguments.Historizing = false; outputArguments.ReferenceTypeId = ReferenceTypeIds.HasProperty; outputArguments.Value = new Argument[] { new Argument() { Name = "NewCount", Description = "The new count.", DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar } }; method.OutputArguments = outputArguments; // save the node for later lookup (all tightly coupled children are added with this call). AddPredefinedNode(SystemContext, instance); // register handler. method.OnCallMethod = new GenericMethodCalledEventHandler(DoMethodCall); #endregion #region Task #D6 - Add Support for Notifiers // enable subscriptions. root.EventNotifier = EventNotifiers.SubscribeToEvents; // creating notifier ensures events propogate up the hierarchy when the are produced. AddRootNotifier(root); // add link to server object. if (!externalReferences.TryGetValue(ObjectIds.Server, out references)) { externalReferences[ObjectIds.Server] = references = new List<IReference>(); } references.Add(new NodeStateReference(ReferenceTypeIds.HasNotifier, false, root.NodeId)); // add sub-notifiers. instance.EventNotifier = EventNotifiers.SubscribeToEvents; instance.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, true, root); root.AddNotifier(SystemContext, ReferenceTypeIds.HasNotifier, false, instance); #endregion } }
/// <summary> /// Creates items from embedded resources. /// </summary> private void CreateFolderFromResources(NodeState root, string folderName) { FolderState dataFolder = new FolderState(root); dataFolder.ReferenceTypeId = ReferenceTypeIds.Organizes; dataFolder.TypeDefinitionId = ObjectTypeIds.FolderType; dataFolder.NodeId = new NodeId(folderName, NamespaceIndex); dataFolder.BrowseName = new QualifiedName(folderName, NamespaceIndex); dataFolder.DisplayName = dataFolder.BrowseName.Name; dataFolder.WriteMask = AttributeWriteMask.None; dataFolder.UserWriteMask = AttributeWriteMask.None; dataFolder.EventNotifier = EventNotifiers.None; root.AddChild(dataFolder); AddPredefinedNode(SystemContext, root); foreach (string resourcePath in Assembly.GetExecutingAssembly().GetManifestResourceNames()) { if (!resourcePath.StartsWith("Quickstarts.HistoricalAccessServer.Data." + folderName)) { continue; } ArchiveItem item = new ArchiveItem(resourcePath, Assembly.GetExecutingAssembly(), resourcePath); ArchiveItemState node = new ArchiveItemState(SystemContext, item, NamespaceIndex); node.ReloadFromSource(SystemContext); dataFolder.AddReference(ReferenceTypeIds.Organizes, false, node.NodeId); node.AddReference(ReferenceTypeIds.Organizes, true, dataFolder.NodeId); AddPredefinedNode(SystemContext, node); } }
/// <summary> /// Gets the item configuration node. /// </summary> /// <param name="itemId">The item id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns></returns> public static BaseInstanceState GetItemConfigurationNode(string itemId, ushort namespaceIndex) { if (itemId == null) { return null; } FolderState component = new FolderState(null); component.NodeId = HdaParsedNodeId.Construct(HdaModelUtils.HdaItemConfiguration, itemId, null, namespaceIndex); component.SymbolicName = Opc.Ua.BrowseNames.HAConfiguration; component.BrowseName = new QualifiedName(component.SymbolicName); component.DisplayName = component.BrowseName.Name; component.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasComponent; component.TypeDefinitionId = Opc.Ua.ObjectTypeIds.HistoricalDataConfigurationType; component.EventNotifier = EventNotifiers.None; component.AddReference(ReferenceTypeIds.HasHistoricalConfiguration, true, HdaModelUtils.ConstructIdForHdaItem(itemId, namespaceIndex)); component.AddReference(ReferenceTypeIds.HasComponent, false, HdaModelUtils.ConstructIdForInternalNode(Opc.Ua.BrowseNames.AggregateConfiguration, namespaceIndex)); return component; }
private BaseObjectState CreateFolderNode(string path) { DirectoryInfo info = new DirectoryInfo(path); if (!info.Exists) { return null; } ParsedNodeId nodeId = new ParsedNodeId(); nodeId.RootType = 0; nodeId.RootId = path; nodeId.NamespaceIndex = NamespaceIndex; FolderState node = new FolderState(null); node.NodeId = nodeId.Construct(); node.BrowseName = new QualifiedName(info.Name, NamespaceIndex); node.DisplayName = node.BrowseName.Name; node.TypeDefinitionId = ObjectTypeIds.FolderType; node.OnPopulateBrowser = OnPopulateBrowser; return node; }
/// <summary> /// Finds the child with the specified browse name. /// </summary> protected override BaseInstanceState FindChild( ISystemContext context, QualifiedName browseName, bool createOrReplace, BaseInstanceState replacement) { if (QualifiedName.IsNull(browseName)) { return null; } BaseInstanceState instance = null; switch (browseName.Name) { case Opc.Ua.Di.BrowseNames.SerialNumber: { if (createOrReplace) { if (SerialNumber == null) { if (replacement == null) { SerialNumber = new PropertyState<string>(this); } else { SerialNumber = (PropertyState<string>)replacement; } } } instance = SerialNumber; break; } case Opc.Ua.Di.BrowseNames.RevisionCounter: { if (createOrReplace) { if (RevisionCounter == null) { if (replacement == null) { RevisionCounter = new PropertyState<int>(this); } else { RevisionCounter = (PropertyState<int>)replacement; } } } instance = RevisionCounter; break; } case Opc.Ua.Di.BrowseNames.Manufacturer: { if (createOrReplace) { if (Manufacturer == null) { if (replacement == null) { Manufacturer = new PropertyState<LocalizedText>(this); } else { Manufacturer = (PropertyState<LocalizedText>)replacement; } } } instance = Manufacturer; break; } case Opc.Ua.Di.BrowseNames.Model: { if (createOrReplace) { if (Model == null) { if (replacement == null) { Model = new PropertyState<LocalizedText>(this); } else { Model = (PropertyState<LocalizedText>)replacement; } } } instance = Model; break; } case Opc.Ua.Di.BrowseNames.DeviceManual: { if (createOrReplace) { if (DeviceManual == null) { if (replacement == null) { DeviceManual = new PropertyState<string>(this); } else { DeviceManual = (PropertyState<string>)replacement; } } } instance = DeviceManual; break; } case Opc.Ua.Di.BrowseNames.DeviceRevision: { if (createOrReplace) { if (DeviceRevision == null) { if (replacement == null) { DeviceRevision = new PropertyState<string>(this); } else { DeviceRevision = (PropertyState<string>)replacement; } } } instance = DeviceRevision; break; } case Opc.Ua.Di.BrowseNames.SoftwareRevision: { if (createOrReplace) { if (SoftwareRevision == null) { if (replacement == null) { SoftwareRevision = new PropertyState<string>(this); } else { SoftwareRevision = (PropertyState<string>)replacement; } } } instance = SoftwareRevision; break; } case Opc.Ua.Di.BrowseNames.HardwareRevision: { if (createOrReplace) { if (HardwareRevision == null) { if (replacement == null) { HardwareRevision = new PropertyState<string>(this); } else { HardwareRevision = (PropertyState<string>)replacement; } } } instance = HardwareRevision; break; } case Opc.Ua.Di.BrowseNames.DeviceClass: { if (createOrReplace) { if (DeviceClass == null) { if (replacement == null) { DeviceClass = new PropertyState<string>(this); } else { DeviceClass = (PropertyState<string>)replacement; } } } instance = DeviceClass; break; } case Opc.Ua.Di.BrowseNames.DeviceHealth: { if (createOrReplace) { if (DeviceHealth == null) { if (replacement == null) { DeviceHealth = new PropertyState<DeviceHealthEnumeration>(this); } else { DeviceHealth = (PropertyState<DeviceHealthEnumeration>)replacement; } } } instance = DeviceHealth; break; } case Opc.Ua.Di.BrowseNames.DeviceTypeImage: { if (createOrReplace) { if (DeviceTypeImage == null) { if (replacement == null) { DeviceTypeImage = new FolderState(this); } else { DeviceTypeImage = (FolderState)replacement; } } } instance = DeviceTypeImage; break; } case Opc.Ua.Di.BrowseNames.Documentation: { if (createOrReplace) { if (Documentation == null) { if (replacement == null) { Documentation = new FolderState(this); } else { Documentation = (FolderState)replacement; } } } instance = Documentation; break; } case Opc.Ua.Di.BrowseNames.ProtocolSupport: { if (createOrReplace) { if (ProtocolSupport == null) { if (replacement == null) { ProtocolSupport = new FolderState(this); } else { ProtocolSupport = (FolderState)replacement; } } } instance = ProtocolSupport; break; } case Opc.Ua.Di.BrowseNames.ImageSet: { if (createOrReplace) { if (ImageSet == null) { if (replacement == null) { ImageSet = new FolderState(this); } else { ImageSet = (FolderState)replacement; } } } instance = ImageSet; break; } } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); }
/// <summary> /// Finds the child with the specified browse name. /// </summary> protected override BaseInstanceState FindChild( ISystemContext context, QualifiedName browseName, bool createOrReplace, BaseInstanceState replacement) { if (QualifiedName.IsNull(browseName)) { return null; } BaseInstanceState instance = null; switch (browseName.Name) { case Opc.Ua.Gds.BrowseNames.Applications: { if (createOrReplace) { if (Applications == null) { if (replacement == null) { Applications = new FolderState(this); } else { Applications = (FolderState)replacement; } } } instance = Applications; break; } case Opc.Ua.Gds.BrowseNames.FindApplications: { if (createOrReplace) { if (FindApplications == null) { if (replacement == null) { FindApplications = new FindApplicationsMethodState(this); } else { FindApplications = (FindApplicationsMethodState)replacement; } } } instance = FindApplications; break; } case Opc.Ua.Gds.BrowseNames.RegisterApplication: { if (createOrReplace) { if (RegisterApplication == null) { if (replacement == null) { RegisterApplication = new RegisterApplicationMethodState(this); } else { RegisterApplication = (RegisterApplicationMethodState)replacement; } } } instance = RegisterApplication; break; } case Opc.Ua.Gds.BrowseNames.UpdateApplication: { if (createOrReplace) { if (UpdateApplication == null) { if (replacement == null) { UpdateApplication = new UpdateApplicationMethodState(this); } else { UpdateApplication = (UpdateApplicationMethodState)replacement; } } } instance = UpdateApplication; break; } case Opc.Ua.Gds.BrowseNames.UnregisterApplication: { if (createOrReplace) { if (UnregisterApplication == null) { if (replacement == null) { UnregisterApplication = new UnregisterApplicationMethodState(this); } else { UnregisterApplication = (UnregisterApplicationMethodState)replacement; } } } instance = UnregisterApplication; break; } case Opc.Ua.Gds.BrowseNames.GetApplication: { if (createOrReplace) { if (GetApplication == null) { if (replacement == null) { GetApplication = new GetApplicationMethodState(this); } else { GetApplication = (GetApplicationMethodState)replacement; } } } instance = GetApplication; break; } case Opc.Ua.Gds.BrowseNames.QueryServers: { if (createOrReplace) { if (QueryServers == null) { if (replacement == null) { QueryServers = new QueryServersMethodState(this); } else { QueryServers = (QueryServersMethodState)replacement; } } } instance = QueryServers; break; } } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); }