node-red 通过递归的方式遍历 OPC UA 服务器一个目录下的所有标签组中的标签

在这里插入图片描述
这个方法的思路和主要代码由GPT生成。
需要安装 “node-red-contrib-opcua” 包来使用 OPC UA Browser。
在这个示例流程中,我们使用了以下节点:

  1. Inject 节点(用来触发流程开始):设置为每个流程启动时触发。
  2. OPC UA Browser 节点(用于获取目录信息):配置 OPC UA 服务器连接和目录路径。
  3. Function 节点(用于处理目录信息):用来解析 OPC UA Browser 返回的目录信息,并将标签名存储到一个数组中。
  4. Delay 节点(用于延迟发送标签组名):将标签组名发送到 OPC UA Browser 之前添加一些延迟。
  5. Debug 节点(用于调试输出):将标签名和标签组名输出到调试面板。

根据上边的流程截图创建流程,
Set browse address 按照图片样式设置一个需要办理访问的目录。
在这里插入图片描述

以下是 Function 节点 Decode & filter 的代码(用于解析目录信息并存储标签名):
在这里插入图片描述

//这段代码根据GPT生成的代码修改得到的。
// 定义两个空数组,用于存储不同类型的nodeId
var X_nodeIds = flow.get('X_nodeIds1') || [];
var nodeIds = flow.get('nodeIds1') || [];

// 获取消息中的节点数组
var items = msg.payload;

// 遍历节点数组中的每一个节点
for (var i = 0; i < items.length; i++) {
   
   
    var item = items[i];
    var ref = item.item;
    var nodeClass = ref.nodeClass;
    var typeDef = ref.typeDefinition;
    var bname = ref.browseName;
    var ns = bname.namespaceIndex;
    var name = bname.name;
    var nodeId = ref.nodeId;
    var NodeId_str = nodeId.toString();

    // 检查并跳过不满足条件的nodeId
    if (NodeId_str.includes('._') || NodeId_str.match(/^.*=_/) || NodeId_str.match('.V4') || NodeId_str.match('.@')) {
   
   
        continue;
    }

    // 根据不同的条件创建并发送消息
    if (ns === 2) {
   
   
        if (nodeClass === 1) {
   
    // 条件一:命名空间索引为2且nodeClass为1的节点
            var newmsgX = {
   
    topic: nodeId, payload: "", actiontype: 'browse' };
            // 发送第一个类型的消息
            node.send([null, newmsgX]);
            X_nodeIds.push(nodeId);
        } else if (nodeClass === 2) {
   
    // 条件二:命名空间索引为2且nodeClass为2的节点
            var newmsgY = {
   
    topic: nodeId, payload: "", actiontype: 'browse' };
            // 发送第二个类型的消息
            node.send([newmsgY, null]);
            nodeIds.push(nodeId);
        }
    }
}

// 将更新后的数组存储回flow上下文
flow.set('X_nodeIds1', X_nodeIds);
flow.set('nodeIds1', nodeIds);

// 不返回任何消息,直接通过send方法发送
return null;

请根据实际情况修改 OPC UA Browser 节点和 Delay 节点的配置,部署这个流程后。每次运行流程时,它都会遍历整个目录,将标签名保存在数组中,并将标签组名发送回 OPC UA Browser 节点进行下一次遍历。

以下是 Function 节点 (清除所有 flow 范围内的变量) 的代码(用于清除所有 flow 范围内的变量),这段代码由GPT生成:

// 清除所有 flow 范围内的变量
var keys = flow.keys(); // 获取所有存储的 keys
for (var i = 0; i < keys.length; i++) {
   
    // 遍历所有 keys
    flow.set(keys[i], undefined); // 将每个 key 对应的值设置为 undefined
}

// 验证是否清除成功
var clearedKeys = flow.keys(); // 再次获取所有存储的 keys
if (clearedKeys.length === 0) {
   
   
    node.warn("Flow context successfully cleared."); // 输出成功信息
    msg.payload = "Flow context successfully cleared."; // 设置 msg.payload 为成功信息
} 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值