You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:18:19