Created 03-05-2018 02:02 PM
Hello Hortonworks Community!
I'm pretty new to OPC UA in general.
I recently implemeted a minimal test OPC UA Client with the SDK from the Eclipse Milo project. I'm currently doing some vague performance measuring. I'm connecting to a Kepware Server which isn't far away.
I'm getting about 1000000 values per 60 seconds with asynchronous reading and about 1500000 values with publish/subscribe.
Are these normal values? I'm asking because I'm so new to this, maybe I'm missing something critical to performance and I don't even know it.
If someone's interested, here's my code:
Publish/Subscribe (1.500.000 per 60 secs)
public class SubscriptionClient { private final AtomicLong clientHandles = new AtomicLong(1L); private static int counter = 0; private OpcUaClient createClient() throws Exception { EndpointDescription[] endpoints; endpoints = UaTcpStackClient .getEndpoints("theServerAdress") .get(); EndpointDescription endpoint = endpoints[0]; OpcUaClientConfig config = OpcUaClientConfig.builder() .setApplicationName(LocalizedText.english("MinimalClient")) .setApplicationUri("theURI") .setCertificate(null) .setKeyPair(null) .setEndpoint(endpoint) .setMaxResponseMessageSize(uint(50000)) .setIdentityProvider(new AnonymousProvider()) .setRequestTimeout(uint(5000)) .build(); return new OpcUaClient(config); } private void createSubscription(OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception { UaSubscription sub = client.getSubscriptionManager().createSubscription(10.0).get(); UInteger clientHandle = uint(clientHandles.getAndIncrement()); MonitoringParameters parameters = new MonitoringParameters( clientHandle, 10.0, null, uint(10), true ); BiConsumer<UaMonitoredItem, Integer> onItemCreated = (item, id) -> item.setValueConsumer(this::onSubscriptionValue); List<UaMonitoredItem> items = sub.createMonitoredItems( TimestampsToReturn.Both, createMonitoredItemCreateRequests(parameters), onItemCreated).get(); for (UaMonitoredItem item: items) { if(item.getStatusCode().isGood()) { System.out.println("Item created for NodeId: " + item.getReadValueId().getNodeId()); } else { System.out.println("Failed to create item for NodeId: " + item.getReadValueId().getNodeId() + item.getStatusCode()); } } Thread.sleep(60000); //Runs for 60 seconds future.complete(client); } private void onSubscriptionValue(UaMonitoredItem item, DataValue value) { System.out.println("Subscription value recieved:"); System.out.println("Item: " + item); System.out.println("Value: " + value); counter++; System.out.println("Counter is: " + counter); } public List<MonitoredItemCreateRequest> createMonitoredItemCreateRequests(MonitoringParameters parameters) throws IOException { List<String> ids = Files.readAllLines(Paths.get("C:\\Users\\user\\Downloads\\MiloTest\\src\\com\\company\\NodeIDs.txt")); List<ReadValueId> rvIDs = new ArrayList<>(); for (String line: ids) { rvIDs.add(new ReadValueId(new NodeId(2, line.substring(7)), AttributeId.Value.uid(), null, QualifiedName.NULL_VALUE)); } List<MonitoredItemCreateRequest> MICR = new ArrayList<>(); for (ReadValueId ID: rvIDs) { MICR.add(new MonitoredItemCreateRequest(ID, MonitoringMode.Reporting, parameters)); } return MICR; } public static void main(String[] args) throws Exception { CompletableFuture<OpcUaClient> future = new CompletableFuture<>(); SubscriptionClient c = new SubscriptionClient(); OpcUaClient client = c.createClient(); client.connect().get(); c.createSubscription(client, future); } }
Async Read (1.000.000 per 60 secs)
public class MinimalClient { static int counter = 0; private OpcUaClient createClient() throws Exception { EndpointDescription[] endpoints; endpoints = UaTcpStackClient .getEndpoints("theServerAdress") .get(); EndpointDescription endpoint = endpoints[0]; OpcUaClientConfig config = OpcUaClientConfig.builder() .setApplicationName(LocalizedText.english("MinimalClient")) .setApplicationUri("theURI") .setCertificate(null) .setKeyPair(null) .setEndpoint(endpoint) .setMaxResponseMessageSize(uint(50000)) .setIdentityProvider(new AnonymousProvider()) .setRequestTimeout(uint(5000)) .build(); return new OpcUaClient(config); } public CompletableFuture<List<DataValue>> readValuesAsync (List<NodeId> nodes, OpcUaClient client) { return client.readValues(10, TimestampsToReturn.Neither, nodes); } public static void main(String[] args) throws Exception { CompletableFuture<OpcUaClient> future = new CompletableFuture<>(); MinimalClient c = new MinimalClient(); OpcUaClient client = c.createClient(); List<String> ids = Files.readAllLines(Paths.get("C:\\Users\\user\\Downloads\\MiloTest\\src\\com\\company\\NodeIDs.txt")); List<NodeId> nodes = new ArrayList<NodeId>(); for (String line: ids) { nodes.add(new NodeId(2, line.substring(7))); } client.connect().get(); client.getAddressSpace(); while (counter<=1000000) { //I know this is a weird way of measuring performance, this takes 60 seconds long startTime = System.currentTimeMillis(); c.readValuesAsync(nodes, client).thenAccept( dataValues -> { System.out.println(dataValues.get(4000)); counter += 20000; //I'm reading 20000 tags per read future.complete(client); }).get(); long endTime = System.currentTimeMillis(); long elapsedTime = endTime - startTime; System.out.println("ASYNCHRONOUS: " + elapsedTime); } } }
I'm excited to hear from you!
Created 07-27-2018 01:00 PM
when am using Publish/Subscribe since am having multiple tags am not able to makeout which data belongs to which tag.also the time stamp sent is which format.
Value: DataValue{value=Variant{value=6}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131771547482760936, javaDate=Fri Jul 27 14:15:48 IST 2018}, serverTime=DateTime{utcTime=131771547482760936, javaDate=Fri Jul 27 14:15:48 IST 2018}}
while using the Async read code.Am able to make out to which tag data belongs to but am not getting the timestamp.
[DataValue{value=Variant{value=2}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601},
serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}},
DataValue{value=Variant{value=15}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601},
serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}},
DataValue{value=Variant{value=9}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601},
serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}}]
Any idea on why am facing this issue!!
,I am trying to run the above code am getting data successfully but in Publish/Subscribe code i have defined multiple node id but when the data comes am not able to make out to which node id the data belongs to.
Value: DataValue{value=Variant{value=1}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=131771534829970042, javaDate=Fri Jul 27 13:54:42 IST 2018}, serverTime=DateTime{utcTime=131771534829970042, javaDate=Fri Jul 27 13:54:42 IST 2018}}
for the Async Read am not getting the timestamp
[DataValue{value=Variant{value=5}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601},
serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}}, DataValue{value=Variant{value=13}, status=StatusCode{name=Good, value=0x00000000, quality=good},
sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}, serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}},
DataValue{value=Variant{value=10}, status=StatusCode{name=Good, value=0x00000000, quality=good}, sourceTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601},
serverTime=DateTime{utcTime=0, javaDate=Mon Jan 01 05:30:00 IST 1601}}]
Any idea why am facing this issue?