将 ModelCompiler 的编译输出获取到 .NET OPC-UA Server

Get compilation output by ModelCompiler into .NET OPC-UA Server

我使用 [1] 中的 ModelCompiler 来编译我的信息模型。现在,我正在寻找一种方法将信息模型导入我的 .NET 服务器(基于 [2] 中的 .NET Core 服务器示例),包括作为 NuGet 包的 .NET OPC-UA 堆栈 [3].

Boiler、MemoryBuffer 和 TestData 示例使用专用节点管理器(继承自 SampleNodeManager)。我的第一个想法是为我的信息模型编写这样一个专用的节点管理器(继承自CustomNodeManager2),但这似乎很复杂。

似乎有比编写节点管理器更简单的方法(参见[4] node.js 服务器)。 .NET 实现提供了一些方法来将包含预定义节点 [5] 或 NodeSet2 文件 [6] 的文件解析为 NodeStateCollection。 解析后的 NodeStateCollection 需要执行哪些步骤才能使节点为 .NET 服务器所知?

[1] https://github.com/OPCFoundation/UA-ModelCompiler
[2] https://github.com/OPCFoundation/UA-.NETStandard
[3] https://www.nuget.org/packages/OPCFoundation.NetStandard.Opc.Ua/
[4] 
[5] 
[6] 

你是对的,你必须写一个自己的Server(继承自StandardServer)和一个自己的NodeManager(继承自CustomNodeManager2),但这并不费力...

  • 将 Opc.Ua.ModelCompiler.exe 的所有输出文件添加到您的解决方案中,作为 class 文件或嵌入资源
  • 实施服务器以通过反射加载您的类型
server.Factory.AddEncodeableTypes(this.GetType().Assembly);
  • 实施 NodeManager
SetNamespaces(MyNamespace.Namespaces.DataTypes);
//...
NodeStateCollection predefinedNodes = new NodeStateCollection();
predefinedNodes.LoadFromBinaryResource(context,"MyNamespace.DataTypes.Types.PredefinedNodes.uanodes", this.GetType().Assemly, true);

完整示例,请查看: