Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
            }
        }