void LoadDataSourceSources( ISystemContext context, ToolState tool, DsatsDemo.DataSource.DataSource datasource, DsatsDemo.DataSource.DeclarationType declaration) { if (declaration == null || declaration.Sources == null) { return; } // need to ensure the server's tables are not updated when loading this file. ServerSystemContext context2 = new ServerSystemContext(this.Server); context2.NamespaceUris = new NamespaceTable(); context2.ServerUris = new StringTable(); context2.NodeIdFactory = this; context2.NamespaceUris.Append(context.ServerUris.GetString(0)); context2.ServerUris.Append(context.ServerUris.GetString(0)); foreach (DsatsDemo.DataSource.SourceType source in declaration.Sources) { BaseInstanceState child = tool.FindChildBySymbolicName(context, source.Path); if (child == null) { continue; } if (source.DefaultValue != null) { BaseVariableState variable = child as BaseVariableState; if (variable != null) { try { Variant value = datasource.Read(context, source.DefaultValue); variable.WrappedValue = value; } catch (Exception) { Utils.Trace("Could not read Variant in file. {0}", source.DefaultValue.InnerXml); } } } if (source.RemoteId != null) { ExpandedNodeId remoteId = datasource.ReadExpandedNodeId(context2, source.RemoteId); if (m_remoteNodes == null) { m_remoteNodes = new NodeIdDictionary<RemoteNode>(); } RemoteNode remoteNode = new RemoteNode(); remoteNode.Tool = tool; remoteNode.ServerUrl = context2.ServerUris.GetString(remoteId.ServerIndex); remoteNode.LocalNode = child; remoteNode.RemoteId = remoteId; m_remoteNodes.Add(child.NodeId, remoteNode); } } }
void LoadDataSourceAccessRules(ISystemContext context, ToolState tool, DsatsDemo.DataSource.DeclarationType declaration) { if (declaration == null || declaration.AccessRules == null) { return; } BaseInstanceState folder = tool.FindChildBySymbolicName(context, DsatsDemo.BrowseNames.AccessRules); if (folder == null) { return; } foreach (DsatsDemo.DataSource.AccessRuleType rule in declaration.AccessRules) { NodeId phaseId = new NodeId("Phases/" + rule.Phase, NamespaceIndex); NodeId lockId = new NodeId("Locks/" + rule.Lock, NamespaceIndex); AccessRuleState node = new AccessRuleState(null); node.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasComponent; node.Create( context, new NodeId(declaration.Path + "/" + declaration.BrowseName + "/AccessRules/" + rule.Phase, NamespaceIndex), new QualifiedName(rule.Phase, NamespaceIndex), null, true); node.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, true, folder.NodeId); folder.AddReference(Opc.Ua.ReferenceTypeIds.Organizes, false, node.NodeId); AddPredefinedNode(context, node); NodeState target = FindPredefinedNode(phaseId, typeof(NodeState)); if (target != null) { NodeId referenceTypeId = new NodeId(DsatsDemo.ReferenceTypes.HasPhase, NamespaceIndex); node.AddReference(referenceTypeId, false, target.NodeId); target.AddReference(referenceTypeId, true, node.NodeId); } target = (DsatsDemo.LockConditionState)FindPredefinedNode(lockId, typeof(DsatsDemo.LockConditionState)); if (target != null) { NodeId referenceTypeId = new NodeId(DsatsDemo.ReferenceTypes.HasLock, NamespaceIndex); node.AddReference(referenceTypeId, false, target.NodeId); target.AddReference(referenceTypeId, true, node.NodeId); } tool.SetPhaseLock(phaseId, lockId); } }