监控多个 OPC UA 节点时出现问题

问题描述 投票:0回答:1

当前行为

在客户端中,使用

forEach
循环监控多个节点时,在版本 2.30.0 上仅监控两个节点,在 2.72.2 中仅监控一个节点,而生成循环的数组包含 5 个项目。

2.30.0 中的行为

image

2.72.2 中的行为

image

UA专家截图供参考 ua_expert screenshot

预期行为

预期的行为是所有项目节点都得到处理。

问题重现的代码来源

const idsToMonitor = ["ns=4;i=16", "ns=4;i=17", "ns=4;i=11", "ns=4;i=12", "ns=4;i=18"]
const monitoringParamaters = {
        samplingInterval: 100,
        discardOldest: true,
        queueSize: 10,
    };
    idsToMonitor.forEach((nodeId) => {
        opc_subscription.monitor({
            nodeId: resolveNodeId(nodeId),
            attributeId: AttributeIds.Value,
        },
        monitoringParamaters,
        TimestampsToReturn.Both,
        (err, monitoredItem) => {
            monitoredItem.on("changed", function (dataValue) {
            var Node = {nodeId: nodeId, nodeName: "111" , nodeValue: dataValue.value.value , nodeTimestamp: dataValue.sourceTimestamp.toISOString()};
            console.log(JSON.stringify(Node));
        });
    });
});

请告诉我们您的环境:

  • [X] 我的请求与充当 OPCUA 客户端的 node-opcua 相关

  • [X] 我已将 node-opcua 作为软件包安装(使用 npm install )

  • 操作系统版本:Windows 10

  • 节点:
    node --version
    = 16.16.0
javascript node.js opc-ua opc node-opcua
1个回答
0
投票

乍一看,我没有发现您的代码有问题。 但我也遇到了

.monitor()
函数的问题。

还有一些选项可以创建对我有用的 MonitoredItem。

  1. ClientMonitoredItem.create()
    功能。

const itemToMonitor: ReadValueIdOptions = {
  nodeId: nodeId,
  attributeId: AttributeIds.Value,
};

const parameters = {
  samplingInterval: 100,
  discardOldest: true,
  queueSize: 10,
};

const monitoredItem = ClientMonitoredItem.create(
  this.clientSubscription, // Add your ClientSubscription here
  itemToMonitor,
  parameters,
  TimestampsToReturn.Both,
);
  1. const itemToMonitor: ReadValueIdOptions = {
      nodeId: nodeId,
      attributeId: AttributeIds.Value,
    };
    
    const parameters = {
      samplingInterval: 100,
      discardOldest: true,
      queueSize: 10,
    };
    
    const monitoredItem = ClientMonitoredItem.create(
      this.clientSubscription, // Add your ClientSubscription here
      itemToMonitor,
      parameters,
      TimestampsToReturn.Both,
    );
    
    功能。
    我建议使用这个,因为您监控多个项目。
ClientSubscription.monitorItems()

这样您就可以像这样收听受监控的项目:


const itemsToMonitor: ReadValueIdOptions[] = [];

idsToMonitor.forEach((nodeId) => {
  const itemToMonitor: ReadValueIdOptions = {
    nodeId: nodeId,
    attributeId: AttributeIds.Value,
  };

  itemsToMonitor.push(itemToMonitor);
});

if (!parameters) {
  parameters = {
    samplingInterval: 100,
    discardOldest: true,
    queueSize: 10,
  };
}

// this.clientSubscription is your created ClientSubscription
const monitoredItems = this.clientSubscription.monitorItems(
  itemsToMonitor,
  parameters,
  TimestampsToReturn.Both,
);

如果它们仍然没有出现,则说明节点或服务器有问题,因为无法监视它们。

© www.soinside.com 2019 - 2024. All rights reserved.