OPC UA Milo - 在回调 onDataChangeNotification 中收集监控项
OPC UA Milo - Collection of Monitored Items in Callback onDataChangeNotification
我正在使用 Eclipse Milo OPC-UA 项目 (https://github.com/eclipse/milo) 的 SubscriptionExample 测试一些东西,发现了一个我不确定它是否有意的行为。我为 Milo 测试服务器 (opc.tcp://milo.digitalpetri.com:62541/milo/) 上的两个不同节点中的每一个创建了两个 MonitoredItemCreateRequests,并将它们传递给订阅的 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 列表包含具有 OPC-UA 节点 ID 的项目,顺序与 dataValues 列表相对应。通过调试,可以看到两个集合的大小相等——这很好。但是回调中的所有监控项都有相同的节点ID?记录的 Double 值的节点 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}
我知道可以为每个节点使用单独的回调,但我想一次处理它们。
此行为是故意的还是服务器实现中的错误?
编辑:
在调试过程中,我发现回调中的 monitoredItems 集合包含 x 次相同的对象(相同的内存地址),但 x 个数据值不同。
如果我使用 milo 示例中的本地 OPC 服务器尝试相同的行为。
您可能在创建两个项目 MonitoringParameters
时使用了相同的 clientHandle
值。
如果不能,您可以 post 您的整个示例代码吗?
我正在使用 Eclipse Milo OPC-UA 项目 (https://github.com/eclipse/milo) 的 SubscriptionExample 测试一些东西,发现了一个我不确定它是否有意的行为。我为 Milo 测试服务器 (opc.tcp://milo.digitalpetri.com:62541/milo/) 上的两个不同节点中的每一个创建了两个 MonitoredItemCreateRequests,并将它们传递给订阅的 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 列表包含具有 OPC-UA 节点 ID 的项目,顺序与 dataValues 列表相对应。通过调试,可以看到两个集合的大小相等——这很好。但是回调中的所有监控项都有相同的节点ID?记录的 Double 值的节点 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}
我知道可以为每个节点使用单独的回调,但我想一次处理它们。
此行为是故意的还是服务器实现中的错误?
编辑:
在调试过程中,我发现回调中的 monitoredItems 集合包含 x 次相同的对象(相同的内存地址),但 x 个数据值不同。
如果我使用 milo 示例中的本地 OPC 服务器尝试相同的行为。
您可能在创建两个项目 MonitoringParameters
时使用了相同的 clientHandle
值。
如果不能,您可以 post 您的整个示例代码吗?