【问题标题】:How to implement the AddNodes service in OPCUA using the .NET Standard SDK如何使用 .NET Standard SDK 在 OPCUA 中实现 AddNodes 服务
【发布时间】:2021-01-25 05:46:53
【问题描述】:
我对 OPCUA 还很陌生,可以举一个例子来说明如何使用 official .NET Standard SDK 在 C# 中实现 AddNodes 服务。
基本上我想要做的是实现我的自定义服务器并能够从客户端调用 AddNodes 服务以将一些节点添加到文件夹(并设置它们的初始值)。
我看到有各种各样的类可以继承,所以我认为最好从 StandardServer 继承并覆盖 AddNodes 方法。之后,我可以创建自己的自定义节点管理器并在此方法中调用它。但是,示例节点管理器都没有实现 AddNodes 方法(甚至 INodeManager 接口也没有)所以我想知道我是否走在正确的轨道上。
有人已经使用这个 SDK 实现了 AddNodes 服务并且愿意给我一些提示吗?您是否刚刚在自定义节点管理器上创建了自己的 AddNodes 方法并在那里添加节点?一些代码 sn-ps 会很有帮助。谢谢!
【问题讨论】:
标签:
c#
.net
iot
.net-standard
opc-ua
【解决方案1】:
我认为你在正确的轨道上。 SessionServerBase 由 Opc.Ua.Services.wsdl 自动生成。 StandardServer 继承自 SessionServerBase,仅覆盖虚拟方法的 子集。
所以你需要覆盖StandardServer中的AddNodes,下面是添加节点的示例。
public override ResponseHeader AddNodes(
RequestHeader requestHeader,
AddNodesItemCollection nodesToAdd,
out AddNodesResultCollection results,
out DiagnosticInfoCollection diagnosticInfos)
{
results = null;
diagnosticInfos = null;
ValidateRequest(requestHeader);
foreach (var item in nodesToAdd)
{
if (item.NodeClass == NodeClass.Variable)
{
var node = new VariableNode
{
// TODO: Initialization
};
m_serverInternal.CoreNodeManager.AttachNode(node);
}
else if (item.NodeClass == NodeClass.VariableType)
{
var node = new VariableTypeNode
{
// TODO: Initialization
};
m_serverInternal.CoreNodeManager.AttachNode(node);
}
else
{
// TODO
}
}
return CreateResponse(requestHeader, StatusCodes.Good);
}