如何解决opc ua milo-如何监视节点下的属性并返回该节点的所有属性?
1,我需要监视节点中的一个属性(例如:totalWp)。如果此属性更改,则需要获取此节点下的所有其他属性(PT ...)。我的代码无法获得预期的结果,请告诉我,我该怎么办?
protected CompletableFuture<UaSubscription> createValueSubscription(String deviceId) {
final CompletableFuture<UaSubscription> result = new CompletableFuture<>();
try {
Node node = this.getDeviceNode(deviceId);
NodeId parentId = node.getNodeId().get();
UaSubscriptionManager subscriptionManager = this.getOpcUaClient().getSubscriptionManager();
CompletableFuture<UaSubscription> subscriptionFuture = subscriptionManager.createSubscription(5000.0);
subscriptionFuture.whenComplete((subscription,e) -> {
if (e != null) {
result.completeExceptionally(e);
} else {
subscription.addNotificationListener(new UaSubscription.NotificationListener() {
@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= " + itemIterator.next().getReadValueId().getNodeId()
+ ",value=" + dataValueIterator.next().getValue() + " ---");
}
}
});
NodeId valueId = OpcUaClientUtils.createDeviceAttributeId(parentId,"totalWp");
NodeId pt = OpcUaClientUtils.createDeviceAttributeId(parentId,"PT");
ReadValueId readTotalWpId = new ReadValueId(valueId,AttributeId.Value.uid(),null,null);
ReadValueId readPtId = new ReadValueId(pt,null);
UInteger clientHandle = uint(clientHandles.getAndIncrement());
MonitoringParameters parameters = new MonitoringParameters(
clientHandle,1000.0,// sampling interval
null,// filter,null means use default
Unsigned.uint(10),// queue size
true // discard oldest
);
MonitoredItemCreateRequest requestTotalWp = new MonitoredItemCreateRequest(readTotalWpId,MonitoringMode.Reporting,parameters);
MonitoredItemCreateRequest requestPt = new MonitoredItemCreateRequest(readPtId,parameters);
// requests.add(requestPt);
CompletableFuture<List<UaMonitoredItem>> future =
subscription.createMonitoredItems(
TimestampsToReturn.Both,newArrayList(requestTotalWp),(item,id) -> onValueChanged(deviceId,item,id)
);
future.whenComplete((items,ex) -> {
if (ex == null) {
result.complete(subscription);
} else {
result.completeExceptionally(ex);
}
});
} ;
});
} catch (Exception e) {
result.completeExceptionally(e);
}
return result;
}
上面的代码仅返回监视的属性,不返回其他属性。
解决方法
您仅创建1个MonitoredItem:
CompletableFuture<List<UaMonitoredItem>> future =
subscription.createMonitoredItems(
TimestampsToReturn.Both,newArrayList(requestTotalWp),(item,id) -> onValueChanged(deviceId,item,id)
);
如果要接收其他节点的更改,则还需要为其创建MonitoredItems。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。