opc ua milo - How to monitor an attribute under a node and return all the attributes of the node?

253 Views Asked by At

1、I need to monitor an attribute (eg: totalWp) in a node. If this attribute changes, I need to get all other attributes (PT...) under this node. My code cannot get the expected result, please tell Me, what should I do?

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, AttributeId.Value.uid(), null, 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, MonitoringMode.Reporting, 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;
    }

The above code only returns the monitored attributes, other attributes are not returned.

1

There are 1 best solutions below

0
On

You are only creating 1 MonitoredItem:

CompletableFuture<List<UaMonitoredItem>> future =
        subscription.createMonitoredItems(
                TimestampsToReturn.Both,
                newArrayList(requestTotalWp),
                (item, id) -> onValueChanged(deviceId, item, id)
        );

If you want to receive changes for other Nodes then you need to create MonitoredItems for them as well.