OPC UA.NET自定义节点管理器创建

时间:2017-03-31 15:04:10

标签: opc-ua

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

例如,我想在里面添加一个包含几个节点的文件夹。

有没有人有一个代码片段来演示如何操作?我不希望任何人为我写这篇文章,只有你告诉我一个正确的方法,我才会感激。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我很确定你要找的片段都包括在内。这是我的测试代码,我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;
    }