如何在OPC UA Foundation开源服务器中自定义添加节点?
在OPC UA .NETStandard服务器中添加自定义节点的正确方法
自定义节点的创建完全在服务器端完成,无需客户端介入,之前调用添加函数失败,大概率是节点创建时机不对,或是未正确绑定服务器地址空间。以下是具体实现步骤:
1. 选对节点创建时机
必须在服务器初始化完成、地址空间加载后再创建节点,推荐在服务器启动回调中执行。如果继承StandardServer基类,可重写OnServerStarted方法:
protected override void OnServerStarted(IServerInternal server) { base.OnServerStarted(server); // 在这里添加自定义节点 AddCustomNodes(server); }
2. 构建自定义节点实例
以添加字符串类型的"Hello World"节点为例,需定义节点的核心属性:
private void AddCustomNodes(IServerInternal server) { // 获取地址空间管理器 INodeManager nodeManager = server.ServerManager.NodeManager; IUaNodeFactory nodeFactory = nodeManager as IUaNodeFactory; // 注册自定义命名空间(若未提前配置) string customNamespace = "http://your-custom-namespace.com"; int namespaceIndex = server.Configuration.Namespaces.IndexOf(customNamespace); if (namespaceIndex == -1) { server.Configuration.Namespaces.Add(customNamespace); namespaceIndex = server.Configuration.Namespaces.Count - 1; } // 创建节点ID、浏览名、显示名 NodeId nodeId = new NodeId("HelloWorldNode", namespaceIndex); QualifiedName browseName = new QualifiedName("HelloWorldNode", namespaceIndex); LocalizedText displayName = new LocalizedText("en-US", "Hello World"); // 初始化字符串变量节点 BaseDataVariableState variableNode = new BaseDataVariableState(null); variableNode.NodeId = nodeId; variableNode.BrowseName = browseName; variableNode.DisplayName = displayName; variableNode.DataType = DataTypeIds.String; variableNode.ValueRank = ValueRanks.Scalar; variableNode.AccessLevel = AccessLevels.CurrentRead | AccessLevels.CurrentWrite; variableNode.UserAccessLevel = AccessLevels.CurrentRead | AccessLevels.CurrentWrite; variableNode.Value = "Hello World"; // 设置初始值 }
3. 将节点挂载到地址空间
把创建好的节点添加到地址空间,并关联到标准父节点(比如Objects文件夹):
// 接上面的AddCustomNodes方法 // 获取OPC UA标准Objects根节点 NodeId objectsFolderId = ObjectIds.ObjectsFolder; IUaNode objectsFolder = nodeManager.FindNode(objectsFolderId); // 添加节点到地址空间 nodeFactory.AddNode(variableNode); // 建立父节点与子节点的组织引用 nodeManager.AddReference( objectsFolder.NodeId, ReferenceTypes.Organizes, false, variableNode.NodeId, true );
常见错误排查
- 时机错误:在服务器未完成初始化时调用添加函数,此时地址空间未就绪
- 命名空间不匹配:NodeId中的命名空间索引需与服务器注册的一致
- 节点ID重复:确保自定义NodeId在服务器地址空间中唯一
- 权限配置缺失:未设置正确的
AccessLevel会导致客户端无法读写,但不影响服务器端添加节点
内容的提问来源于stack exchange,提问作者Choi0310
相关产品推荐
相关产品推荐

