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

问题描述:

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

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

有没有人有代码片段演示如何做到这一点?我不想让任何人为我写信,只有当你告诉我一个正确的方法时,我才会感激。

非常感谢。

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

谢谢您的回答!这可能会有帮助,但我的问题是关于一个不同的问题。在这种情况下,我无法理解我如何达到'myFolder'变量。例如,我想将一个新变量添加到Objects文件夹。我使用'new NodeId(Objects.ObjectsFolder)'创建它的NodeId,但是我怎样才能到达它的真正的NodeState? – aanodin

+0

我添加了另一块,用于创建文件夹。我不确定我是否理解“达到”的含义 - 如果我需要嵌套变量的文件夹,我创建自定义文件夹(参见上文),然后添加变量作为父节点传递,刚刚创建的文件夹节点。 – astrowalker

+0

谢谢。 这就是我问的 - 你作为父母传给第一个文件夹的内容是什么? 'createVariable'和'createFolder'只会返回一个新的NodeState对象。我如何让服务器使用这个新对象? – aanodin