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

OPC-UA启动后如何从NodeJS客户端侧动态添加新变量

需求可行性结论

这个需求可以实现,核心依赖OPC UA标准定义的AddNodes服务,仅需要满足两个前提:

  • 你使用的OPC UA服务器开启了节点管理(NodeManagement)功能
  • 当前连接会话使用的账号拥有新增节点的操作权限

具体实现步骤

你需要在原来代码的do something区域,先调用会话的addNodes方法新增目标变量节点,再执行写入操作即可,示例代码如下:

// 先定义要新增的变量节点配置
const newVariableParams = {
  parentNodeId: "ns=0;i=85", // 父节点,这里用OPC UA标准的Objects文件夹节点ID
  referenceTypeId: "ns=0;i=47", // 引用类型,这里用Organizes(组织关系),如果是作为对象的子变量可改为ns=0;i=46(HasComponent)
  browseName: {
    namespaceIndex: 1, // 替换为你实际使用的命名空间索引
    name: "MyDynamicVariable" // 变量的浏览名
  },
  nodeClass: 2, // 2对应变量类型节点
  nodeAttributes: {
    // 变量节点的属性配置
    dataType: "ns=0;i=1", // 数据类型为Boolean
    valueRank: -1, // 标量类型
    accessLevel: 1 | 2, // 可读可写
    userAccessLevel: 1 | 2,
    displayName: { text: "我的动态变量" },
    value: {
      value: {
        dataType: 1,
        value: false // 初始值
      }
    }
  },
  // 可选:指定新节点的NodeId,不填则由服务器自动生成
  requestedNewNodeId: {
    namespaceIndex: 1,
    identifierType: 1, // 数值类型ID
    value: 10086 // 自定义ID值,确保不会和同命名空间下已有节点重复
  }
};

// 调用addNodes方法新增节点
session.addNodes([newVariableParams], (err, results) => {
  if (err) {
    console.error("新增节点失败:", err);
    return;
  }
  const addResult = results[0];
  if (addResult.statusCode.isGood()) {
    console.log("节点新增成功,新节点ID:", addResult.addedNodeId.toString());
    // 新增成功后再执行写入操作,此时NodeId已经存在
    const nodesToWrite = [{
      nodeId: addResult.addedNodeId, // 直接用返回的新节点ID,避免自定义ID出错
      attributeId: AttributeIds.Value,
      value: {
        value: {
          dataType: 1,
          value: true // 要写入的新值
        }
      }
    }];
    session.write(nodesToWrite, (writeErr, statusCodes) => {
      if (writeErr) {
        console.error("写入值失败:", writeErr);
        return;
      }
      console.log("写入成功,状态码:", statusCodes[0].toString());
    });
  } else {
    console.error("新增节点失败,状态码:", addResult.statusCode.toString());
  }
});

注意事项

  • 多数默认配置的OPC UA服务器会关闭节点新增权限,你需要先进入服务器的管理后台,开启对应端点的节点管理功能,同时给登录用户分配新增节点的权限,否则会返回权限不足的错误。
  • 如果你自定义requestedNewNodeId,需要确保对应的命名空间索引在服务器上存在,且自定义的ID没有被同命名空间下的其他节点占用,否则会新增失败。
  • 如果不需要指定固定NodeId,可以删除requestedNewNodeId配置项,由服务器自动生成唯一的NodeId,直接通过返回结果里的addedNodeId获取即可。

内容的提问来源于stack exchange,提问作者Mayank Pathela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:18:05