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。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...