【问题标题】:OPC UA.NET custom Node Manager creatingOPC UA.NET 自定义节点管理器创建
【发布时间】:2017-08-25 21:59:55
【问题描述】:

我正在尝试使用 OPC Foundation 的 UA-.NETStandardLibrary 创建我自己的 OPC UA 服务器,该服务器将维护一些变量。 我创建了一个继承自 StandardServer 的服务器类和继承自 CustomNodeManager2 的节点管理器。 在他们的examples 中有一些节点管理器,我删除了它们并添加了我自己的。服务器正常启动,不包含除标准节点外的任何节点,按计划。所以,我的问题是如何从代码(而不是从 xml,如示例中)创建我自己的变量节点并能够按需更新其值。

例如,我想添加一个文件夹,里面有几个节点。

有没有人有一个代码 sn-p 来演示如何做到这一点?我不希望任何人为我写它,只有你告诉我一个正确的方法,我才会感激。

非常感谢。

【问题讨论】:

    标签: opc-ua


    【解决方案1】:

    我很确定您正在寻找的 sn-ps 已包含在内。这是我的测试代码,我是 100% 肯定的,我没有写第二段代码。无论如何,如果这对你有帮助...

                    {
                        var ticker_seq = createVariable(myFolder, "MyFolder/Ticker", "Ticker", BuiltInType.UInt64, ValueRanks.Scalar);
                        variables.Add(ticker_seq);
    
                        subscriptions.Add(clock.Ticker.Subscribe(val =>
                        {
                            lock (Lock)
                            {
                                ticker_seq.Value = val;
                                ticker_seq.Timestamp = DateTime.UtcNow;
                                ticker_seq.ClearChangeMasks(SystemContext, false);
                            }
                        }));
                    }
    

    和创造

        private BaseDataVariableState createVariable(NodeState parent, string path, string name, NodeId dataType, int valueRank)
        {
            BaseDataVariableState variable = new BaseDataVariableState(parent);
    
            variable.SymbolicName = name;
            variable.ReferenceTypeId = ReferenceTypes.Organizes;
            variable.TypeDefinitionId = VariableTypeIds.BaseDataVariableType;
            variable.NodeId = new NodeId(path, NamespaceIndex);
            variable.BrowseName = new QualifiedName(path, NamespaceIndex);
            variable.DisplayName = new LocalizedText("en", name);
            variable.WriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description;
            variable.UserWriteMask = AttributeWriteMask.DisplayName | AttributeWriteMask.Description;
            variable.DataType = dataType;
            variable.ValueRank = valueRank;
            variable.AccessLevel = AccessLevels.CurrentReadOrWrite;
            variable.UserAccessLevel = AccessLevels.CurrentReadOrWrite;
            variable.Historizing = false;
            variable.Value = 0;
            variable.StatusCode = StatusCodes.Good;
            variable.Timestamp = DateTime.UtcNow;
    
            if (parent != null)
            {
                parent.AddChild(variable);
            }
    
            return variable;
        }
    

    创建文件夹:

        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;
        }
    

    【讨论】:

    • 感谢您的回答!这可能会有所帮助,但我的问题是关于一个有点不同的问题。在这种情况下,我无法理解如何访问myFolder 变量。例如,我想在 Objects 文件夹中添加一个新变量。我使用new NodeId(Objects.ObjectsFolder).. 创建了它的 NodeId,但我怎样才能达到它真正的 NodeState?
    • 我添加了另一块,用于创建文件夹。我不确定我是否理解“到达”的意思——如果我需要包含变量的嵌套文件夹,我会创建我的自定义文件夹(见上文),然后添加作为父节点传递的变量,即刚刚创建的文件夹节点.
    • 谢谢。这就是我要问的问题-您将 parent 传递给第一个文件夹的内容是什么? createVariablecreateFolder 只会返回一个新的 NodeState 对象。如何让服务器使用这个新对象?
    • 哦.. 我终于找到了带有我正在寻找的代码的 ReferenceNodeManager.cs。谢谢您的帮助!解决了。​​
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2019-01-09
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多