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
相关产品推荐
相关产品推荐

