我正在用Eclipse Milo OPC-UA项目(https://github.com/eclipse/milo)的SubscriptionExample测试一些东西,发现了一个我不确定是有意为之的行为。我为Milo测试服务器上的两个不同节点创建了两个MonitoredItemCreateRequests (opc.tcp://milo.digitalpetri.com:62541/milo/),并将它们传递给订阅的createMonitoredItems()方法。两个项目的状态代码都正常。由于我希望一次获得两个受监视项目的所有收集的值,因此我向订阅中添加了一个NotificationListener。
NodeId dynNodeId = NodeId.parse("ns=2;s=Dynamic/RandomInt32");
NodeId statNodeId = NodeId.parse("ns=2;s=Dynamic/RandomDouble");以下是接收数据值的回调方法:
@Override
public void onDataChangeNotification(UaSubscription subscription, List<UaMonitoredItem> monitoredItems, List<DataValue> dataValues, DateTime publishTime) {
Iterator<UaMonitoredItem> itemIterator = monitoredItems.iterator();
Iterator<DataValue> dataValueIterator = dataValues.iterator();
while(itemIterator.hasNext() && dataValueIterator.hasNext()) {
logger.info("subscription value received: item={}, value={}",
itemIterator.next().getReadValueId().getNodeId(), dataValueIterator.next().getValue());
}
}我期望monitoredItems列表按照与dataValues列表相对应的顺序包含具有OPC-UA节点ID的项。通过调试,可以看到两个集合的大小是相等的--这很好。但是回调中所有被监控的项都有相同的节点ID吗?记录的双精度值的节点ID应为: ns=2;s=Dynamic/RandomDouble。
15:32:01.221 [milo-shared-thread-pool-0] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.19167566173987927}
15:32:01.221 [milo-shared-thread-pool-0] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.17914743791503218}
15:32:01.221 [milo-shared-thread-pool-0] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=-1911450762}
15:32:01.221 [milo-shared-thread-pool-0] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=-238565139}
15:32:02.172 [milo-shared-thread-pool-1] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.004420353528696297}
15:32:02.173 [milo-shared-thread-pool-1] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=1391780361}
15:32:03.171 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.5815483661983246}
15:32:03.172 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=560950904}
15:32:04.245 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.18123040450226635}
15:32:04.246 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=521198031}
15:32:05.258 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=0.42193483414925215}
15:32:05.258 [milo-shared-thread-pool-2] INFO o.e.m.e.client.SubscriptionExample - subscription value received: item=NodeId{ns=2, id=Dynamic/RandomInt32}, value=Variant{value=680732464}我意识到为每个节点使用单独回调的可能性,但我希望一次性处理所有这些回调。
这种行为是有意为之,还是可能是服务器实现中的一个bug?
编辑:
在调试过程中,我发现回调中的monitoredItems集合包含x倍于相同对象(相同内存地址)的值,但x个dataValues有所不同。
如果我在milo示例中的本地OPC服务器上尝试,行为也是一样的。
发布于 2020-01-23 06:04:16
在创建项目MonitoringParameters时,您可能在这两个项目中使用了相同的clientHandle值。
如果没有,你可以发布你的整个示例代码吗?
https://stackoverflow.com/questions/59862342
复制相似问题