OPC UA Java Client Tutorial V 1.0.2 Tutorial zur Erstellung eines OPC UA Java Clients. Das SDK beinhaltet ein Testbeispiel (ClientTutorialExample), mit dem eine einfache Client Applikation erstellt wird und die wichtigsten Services erklärt werden. Thomas Zöchbauer 29.11.2011 2 OPC UA Java Client Tutorial Inhalt 1. Unterstütze OPC UA Profile .................................................................................................................. 3 1. 2. OPC UA Client Profile........................................................................................................................ 3 Generic Client Object ........................................................................................................................... 7 1. Applikation Konfiguration ................................................................................................................ 7 2. Client Konfiguration.......................................................................................................................... 8 3. Server Connection ................................................................................................................................ 9 4. Security ............................................................................................................................................... 10 5. Connect / Disconnect ......................................................................................................................... 11 1. Verbindung herstellen .................................................................................................................... 11 Endpoints mit Discovery ..................................................................................................................... 11 Endpoints ohne Discovery .................................................................................................................. 12 2. Endpoints filtern ............................................................................................................................. 13 4. Aktivierung einer Session am Server .............................................................................................. 14 Login Identität .................................................................................................................................... 14 5. Verbindung mit einem Server trennen .......................................................................................... 15 6. Browse ................................................................................................................................................ 17 7. Read Values ........................................................................................................................................ 18 8. Write Values ....................................................................................................................................... 19 9. Subscription / Publish ......................................................................................................................... 20 1. Monitor Data Changes.................................................................................................................... 21 2. Monitor Events ............................................................................................................................... 22 10. Calling Methods .............................................................................................................................. 24 11. Register / Unregister Nodes ........................................................................................................... 25 12. History Access................................................................................................................................. 26 1. History Read ................................................................................................................................... 26 2. History Update ............................................................................................................................... 26 3. Client History Archive ..................................................................................................................... 28 3 OPC UA Java Client Tutorial 1. Unterstütze OPC UA Profile 1. OPC UA Client Profile Profil Beschreibung Unterstützt A & C Address Space Instance Client Facet This Client Facet indicates that the Client make use of Alarm and Condition instances in the address space. Ja A & C Dialog Client Facet This Client Facet indicates that the Client uses the Alarm and Condition Dialog model. This includes Event subscriptions and methods. Nein Base Client Behaviour Facet This Client Facet indicates that the Client supports behaviour that Clients shall follow for best use by operators and administrators. They include allowing configuration of an endpoint for a server withhout using the discovery service set; Support for manual security setting configuration and behaviour with regard to security issues; support for Automatic reconnection to a disconected server. These behaviours can only be tested in a test lab. They are best practice guidelines. Ja Event Subscriber Client Facet This Client Facet includes ConformanceUnits needed when subscribing for Event Notifications. This includes basic Address space concept and the browsing of it, adding events and event filters as monitored items and adding subscriptions. Ja AddressSpace Lookup Client Facet This Client Facet includes all ConformanceUnits Ja needed to navigate through the AddressSpace. This includes basic Address space concepts, view and browse functionality and simple attribute read functionality. Node Management Client Facet This Client Facet includes the ConformanceUnits that Clients will have to use to configure the Ja 4 OPC UA Java Client Tutorial AddressSpace of an OPC UA Server through OPC UA Node Management Service Set. A & E Proxy Facet This Client Facet describe the functionality used by a default A & E Client proxy. Exposing of this Facet can be used by a server to better understand command that are being issued by the Client, since it indicate that the client is an A&E Com Client. Nein Core Client Facet This Facet defines core functionality for Clients. This facet includes the core functions for Security and Session handling. Ja Redundancy Switch Client Facet Nein DataAccess Client Facet This Client Facet defines ConformanceUnits needed for utilizing the DataAccess Information Model. Ja A & C Enable Client Facet This Client Facet indicates that the client makes uses of enabling and disabling of alarms, including browsing for disabled alarms. Ja Method Client Facet This Client Facet indicates that the client makes uses of Method calls. Ja Redundant Client Facet This Client Facet indicates that the client can make uses of the redundancy feature available for redundant Client. Nein Discovery Client Facet This Client Facet indicates that the client makes uses of discovery of Servers and their Endpoints. Ja A & C Previous Instances Client Facet This Client Facet indicates that the client makes uses of the Alarm and Condition model including support for maintaining the previous instance of alarms. This include the ability to understand branchIds. Nein DataChange Subscriber Client This Client Facet indicates that the client makes uses of monitoring Attribute values for data Ja 5 OPC UA Java Client Tutorial Facet change. Advanced Type Programming Client Facet This Client Facet indicates the behaviour of Clients when processing instances based on Type Definitions in that a client that expose this Facet makes use of the type model and can process the instance address space based on the type model. For example a client may contain generic displays that are based on a type, in that they contain a relative path from some main type. On call up this main type is matched to an instance and all of display items are resolved based on the provided type model. Ja A & C Non-Exclusive Alarming Client Facet This Client Facet indicates that the client makes uses of the non-exclusive Alarm model. This includes understanding the various subtypes such as RateOfChange, Limit and Deviation. Nein Auditing Client Facet This Client Facet indicates that the Client makes uses of the Auditing features available in OPC UA. Nein A & C Simple Client Facet This Client Facet indicates that the Client makes uses of the Alarm and Condition basic model. This includes the ability to subscribe for Events and to initiate a Refresh method. Ja A & C Alarm Client Facet This Client Facet indicates that the Client makes uses of the Alarm and Condition alarming model including acknowledgement with optional confirm, discrete alarms and shelving of alarms. Ja Attribute Write Client Facet This Client Facet indicates that the Client makes uses of writing to Attribute values of Nodes. Ja A & C Exclusive Alarming Client Facet This Client Facet indicates that the Client makes uses of the Exclusive Alarm model. This includes understanding the various subtypes such as RateofChange, Limit and Deviation Nein Attribute Read This Client Facet indicates that the Client makes Ja 6 OPC UA Java Client Tutorial Client Facet uses of reading Attribute values of Nodes. (https://www.opcfoundation.org/profilereporting/, Client, 08.11.2011) 7 OPC UA Java Client Tutorial 2. Generische Client Objekt Die UAClient Klasse ist die Haupt-Instance die benutzt wird um Services an einen OPCUA Server mittels des OPC Java Stacks zu senden. Das Client SDK ist eine übergeordnete Schicht der Kommunikation und dient zum Senden von OPC UA Services. Die Erstellung einer OPC UA Client Applikation beginnt mit dem Erstellen einer UAClient Instanz. Beispiel: /** Erstellen der Client Instanz */ UAClient client = new UAClient(); 1. Applikation Konfiguration Um die Konfiguration einer Client - Applikation anzugeben, wird eine ClientConfiguration Klasse erstellt. Diese Klasse beinhaltet den Pfad der Client Konfiguration, den Pfad des Zertifikates und den Pfad des Privaten Schlüssels. Beispiel: /** Setzen der default ClientConfiguration */ client.setClientConfiguration(); /** Setzen einer ClientConfiguration*/ client.setClientConfiguration(configurationFile, certFile, privKeyFile); 8 OPC UA Java Client Tutorial 2. Client Konfiguration Einstellungen des OPC UA Clients: Tag Beschreibung <ApplicationName> <ApplicationUri> <ProductUri> <ApplicationType> <SecurityConfiguration> <TransportQuotas> <ClientConfiguration> <Extensions> <TraceConfiguration> Name der Applikation Uri der Applikation Uri des Server Produkts Typ der Applikation (Client,- Server) Zertifikatseinstellungen Verbindungseinstellungen Clienteinstellungen Zusätzliche Typen Loggingeinstellungen 9 OPC UA Java Client Tutorial 3. Server Connection Um eine Verbindung mit einem Server aufzubauen, wird eine ServerUri benötigt. /** Syntax einer ServerUri */ <Protokoll>://<Hostname>:<Port><ServerName> Beispiele von ServerUris: URI SERVER opc.tcp://<hostname>:62541/Quickstarts/DataAccessServer OPC UA DataAccess Server opc.tcp://<hostname>:4841 Some Discovery Servers <hostname> ist der Hostname des Computers auf dem der Server läuft. 10 OPC UA Java Client Tutorial 4. Security Der Java Stack unterstützt Transport-Security in der Kommunikation von Server und Client. In einer Client-Applikation kann man sich die Security-Konfiguration, je nachdem welche Einstellungen der Server implementiert hat, auswählen. Alle Clients müssen ein Applikations Zertifikat besitzen, die für die Validierung der „Vertrauenswürdigen Clients“ benötigt werden. Die Verbindung wird nur dann aufgebaut, wenn die Security Einstellungen richtig gesetzt werden. Die Security Prinzipien OPC UA sind die einer PKI (Public Key Infrastructure). (weiteres Specification OPC UA Part 2 - Security Model) 11 OPC UA Java Client Tutorial 5. Connect / Disconnect 1. Verbindung herstellen Um sich mit dem UA Client auf einen OPC Server zu verbinden wird ein Server Endpoint benötigt. Ein Endpoint beinhaltet Informationen die zur Erzeugung der Verbindung und Session benötigt werden. Es gibt 2 Möglichkeiten Server Endpoints abzufragen, mittels Discovery oder der GetServerEndpoints Methode des UAClients. Endpoints mit Discovery Mittels eines Discovery Clients werden Server Applikationen oder Endpoints abgefragt und es besteht die Möglichkeit, diese nach dem SECURITYMODE zu filtern. ApplicationDescription[] findServer(String discoveryUri) throws ServiceResultException Sendet ein FindServer-Service an einem Discovery-Server und liefert Informationen über die verfügbaren Server zurück. EndpointDescription[] getEndpoints(String serverUri) throws ServiceResultException Sendet ein GetEndpoint-Service an die angegebene Server Uri und liefert Informationen über die zu verbindenden Server Endpoints zurück. Beispiel: /** Variablen */ String discoveryUri = “opc.tcp://localhost:4841”; String serverUri = “opc.tcp://localhost:4841”; /** Discovery Client Instanz erstellen */ UADiscoveryClient discoveryClient = new UADiscoveryClient(); 12 OPC UA Java Client Tutorial /** Discover all ServerApplications */ ApplicationDescription[] findServerResults = discoveryClient. findServer(discoveryUri); /** Discover all Endpoints from a DiscoveryServer */ EndpointDescription[] endpoints = discoveryClient. getEndpoints(serverUri); Endpoints ohne Discovery Der generische UA Client besitzt die Funktionalität um Endpoints von einem Server ohne die Verwendung von Discovery – Services herauszufinden. EndpointDescription[] getServerEndpoints(String serverUri, boolean async) throws ServiceResultException Liefert die Endpoints von der ServerUri zurück ohne der Verwendung von Discovery Services. Beispiel: /** Variablen */ String serverUri = “opc.tcp://localhost:4841”; Boolean async = false; /** Endpoints */ EndpointDescription[] serverEndpoints = client. getServerEndpoints(serverUri, async); 13 OPC UA Java Client Tutorial 2. Endpoints filtern Es wird für das Filtern der Endpoints eine Discovery Client Instanz benötigt. Nach dem Erstellen des Discovery Clients, kann man folgende Methoden zum Filtern der Security Modes verwenden. EndpointDescription[] filterEndpoints(EndpointDescription[] endpoints, SecurityMode securityMode) throws IllegalArgumentException Filtert die Endpoints nach dem gewünschten Security Mode. EndpointDescription selectEndpointWithHighestSecurity(EndpointDescription[] endpoints) Liefert den Endpoint mit der besten Sicherheit zurück. EndpointDescription selectEndpointNone(EndpointDescription[] endpoints) Liefert den Endpoint ohne Sicherheit zurück. Beispiel: /** Variablen */ String serverUri = opc.tcp://localhost:4841 /** Discovery Client Instanz erstellen */ UADiscoveryClient discoveryClient = new UADiscoveryClient(); EndpointDescription[]endpoints = discoveryClient.getEndpoints(serverUri); /** Filter Endpoints */ EndpointDescription[] filteredEndpoints = discoveryClient .filterEndpoints(endpoints, SecurityMode.BASIC128RSA15_SIGN_ENCRYPT); EndpointDescription endpointHIGH = discoveryClient. selectEndpointWithHighestSecurity(endpoints); EndpointDescription endpointLOW = discoveryClient.selectEndpointNone(endpoints); 14 OPC UA Java Client Tutorial 3. Erstellen einer Session Um eine Client Session zu erstellen wird das CreateSession - Service verwendet. Der Endpoint wird verwendet um eine Verbindung zu einem Server herzustellen. ClientSession createSession(EndpointDescription endpoint, String sessionName, boolean async) throws ServiceResultException Erzeugt eine Session. Beispiel: /** Erstellt eine Session */ ClientSession session = client.createSession(endpoint, “Session1”, false); 4. Aktivierung einer Session am Server Um eine Session am Server zu aktivieren, wird ein ActivateSession - Service verwendet. Dieses Service aktiviert die erstellte Session mit einer Login Identität und ermöglicht ab sofort die Verwendung von OPC UA Services auf dem Server. Ohne die Session auf einem Server zu aktivieren, ist es nicht möglich UA Services auf einen Server zu senden. Login Identität Das Aktivieren der Session kann in 3. verschiedenen Authentifizierungsmöglichkeiten erfolgen. ActivateSessionResponse activateSession(ClientSession session, boolean async) throws ServiceResultException Aktiviert eine Session mit einem Anonymen-Token. 15 OPC UA Java Client Tutorial ActivateSessionResponse activateSession(ClientSession session, String username, String password, boolean async) throws ServiceResultException Aktiviert eine Session mit einem Benutzername/Passwort-Token. ActivateSessionResponse activateSession(ClientSession session, Cert certificate, boolean async) throws ServiceResultException Aktiviert eine Session mit einem Zertifikats-Token. Beispiel: /**Anonym, Ohne Benutzerinformationen */ client.activateSession(session, false); /** Benutzername/Passwort – Authentifizierung */ client.activateSession(session, “username”, “password”, false); /** Zertifikat - Authentifizierung */ client.activateSession(session, cert, false); 5. Verbindung mit einem Server trennen Um sich von einem Server zu trennen, wird ein CloseSession - Service verwendet. Dieses Service löscht eine Session am Server und es ist möglich mittels Parameter, alle Subscriptions zu entfernen. CloseSessionResponse closeSession(ClientSession session, boolean deleteSubscriptions, boolean async) throws ServiceResultException Schließt eine Session und erlaubt es alle dazugehörigen Subscriptions mit zu löschen. 16 OPC UA Java Client Tutorial Beispiel: /** Trennt eine Session von einem Server */ client.closeSession(session, true, false); 17 OPC UA Java Client Tutorial 6. Browse Um den AddressSpace am Server zu durchsuchen, werden Browse- Services verwendet. Das Model befindet sich in einem oder mehreren AddressSpaces auf einem oder mehreren Servern. Bei einem hierarchischen Browse wird vom Root Folder ausgegangen und dessen Referenzen laut restlicher Parameter zwischen den Knoten verfolgt. ReferenceDescription[] browse(ClientSession session, NodeId nodeToBrowse, BrowseDirection browseDirection, boolean includeSubtype, UnsignedInteger nodeClassMask, NodeId referenceTypeId, UnsignedInteger resultMask, UnsignedInteger maxReferences, ViewDescription view, boolean async) throws ServiceResultException Sendet ein Browse Service mit dem gewählten Filter Parameter. Beispiel: /** Startknoten */ NodeId serverObjectId = Identifiers.Server; /** Referenz Typ zum durchsuchen */ NodeId referenceTypes = Identifiers.References; ReferenceDescription[] browseresult = client.browse(serverObjectId, BrowseDirection.Forward, true, NodeClass.getMask(NodeClass.ALL), referenceTypesToBrowse, BrowseResultMask. getMask(BrowseResultMask.ALL), new UnsignedInteger(1000), null, true); 18 OPC UA Java Client Tutorial 7. Read Values Attribute von UA Knoten werden mittels eines Read Services gelesen. DataValue read1(ClientSession session, NodeId nodeToRead, UnsignedInteger attributeId, String indexRange, QualifiedName dataEncoding, double maxAge, TimestampsToReturn timestampToReturn, boolean async) throws ServiceResultException Liest ein oder mehrere Attribute von einem oder mehreren Knoten. Beispiel: /** Variablen */ NodeId nodeToReadValue = Identifiers.Server_NamespaceArray; UnsignedInteger attributeId = Attributes.Value; Double maxAge = 0.0; String indexRange= ""; QualifiedName dataEncoding = QualifiedName.NULL; /** Lesen eines Wertes */ DataValue value = client.read1(nodeToReadValue, attributeId, null, null, maxAge, TimestampsToReturn.Both, false); 19 OPC UA Java Client Tutorial 8. Write Values Auf Attribute von UA Knoten wird mittels eines Write Services geschrieben. Boolean write1(ClientSession session, NodeId nodeToWrite, UnsignedInteger attributeId, String indexRange, DataValue value, boolean async) throws ServiceResultException Schreibt ein oder mehrere Attribute auf einen oder mehreren Knoten. Liefert bei erfolgreichen schreiben TRUE zurück und bei einem aufgetrettenen Fehler FALSE. Als Antwort bekommt man einen Status, ob das Schreiben erfolgreich war, oder nicht. Beispiel: /** Variablen */ NodeId nodeToWriteValue = Identifiers.Server_NamespaceArray; UnsignedInteger attributeId = Attributes.Value; Double maxAge = 0.0; String indexRange= ""; QualifiedName dataEncoding = QualifiedName.NULL; /** Schreibt einen Wert */ client.write1(session, nodeToWriteValue, attributeId, indexRange, value, true); 20 OPC UA Java Client Tutorial 9. Subscription / Publish Wenn man Wertänderungen, Events oder Alarme am Server beobachten will, werden Subscriptions erstellt. Diese beinhalten MonitoredItems um diese Notifications aufzuzeichnen. Zum Erstellen einer Subscription wird ein CreateSubscription - Service verwendet. Subscription createSubscription(ClientSession session, boolean async) throws ServiceResultException Erstellt eine Subscription zum Sammeln von Monitored Items. Subscriptions senden über das Publish-Service die Nachrichten um die Monitored Items mit deren Werte zu aktualisieren. Dies ist das einfache Erstellen einer Subscription, da die Default-Werte zum Erzeugen der Subscription vom Server genommen werden. Um alle Monitored Items auf der Subscription mitzubekommen, kann man SubscriptionListener auf der Subscription registrieren. Beispiel: /** Erstellt eine Default Subscription */ Subscription subscription = client.createSubscription(session, false); subscription.addSubscriptionListener(new SubscriptionListener() { @Override public void receiveNotificationMessage(Subscription subscription, monitoredItem, DataValue notification) { // Code } @Override MonitoredItem 21 OPC UA Java Client Tutorial public void receiveNotificationMessage(Subscription subscription, monitoredItem, EventFieldList eventFields) { MonitoredItem // Code }); 1. Monitor Data Changes Um Wertänderungen mit zu bekommen, beobachtet ein Monitored Item einen Variable Knoten. MonitoredItem createMonitoredItem(ClientSession session,UnsignedInteger subscriptionId, NodeId nodeId,UnsignedInteger attributeId, String indexRange,QualifiedName dataEncoding, double samplingInterval, ExtensionObject filter, UnsignedInteger queueSize,boolean discardOldest, MonitoringMode monitoringMode,TimestampsToReturn timestampToReturn, boolean async) throws ServiceResultException Erstellt ein Monitored Item um Wertänderungen, Events oder Alarme am AddressSpace zu überwachen. Mittels der SubscriptionId wird angegeben, in welche Subscription das Monitored Item hinzugefügt wird. Beispiel: /** Knoten */ NodeId publish = Identifiers.Server_NamespaceArray /** Erstellt das Monitored Item */ MonitoredItem item = client.createMonitoredItem( subscription.getSubscriptionId(), publish, Attributes.Value, null, null, 1000.0, null, new UnsignedInteger(1), true, MonitoringMode.Reporting, TimestampsToReturn.Both, true); 22 OPC UA Java Client Tutorial item.addMonitorListener(new DataChangeMonitorListener () { @Override public void monitorDataChange (MonitoredItem item, DataValue newValue, DataValue oldValue) { // Code } }); 2. Monitor Events Um Events mit zu bekommen, beobachtet ein Monitored Item einen Objekt Knoten. Mittels der SubscriptionId wird angegeben, in welche Subscription das Monitored Item hinzugefügt wird. Der EventFilter gibt an, welche Felder des Events über das Service geschickt wird. Beispiel: /** WhereClause */ ContentFilter whereClause = new ContentFilter(); /** Erstellt die SelectClause für den Filter */ List<SimpleAttributeOperand> selectClause = new ArrayList<SimpleAttributeOperand>(); QualifiedName[] eventFields = { new QualifiedName("EventId"), new QualifiedName("Message"), new QualifiedName("Severity"), new QualifiedName("SourceName"), new QualifiedName("BranchId"), new QualifiedName("Time"), new QualifiedName("ConditionName") }; /** Setzt die Attribute */ for (QualifiedName eventField : eventFields) { SimpleAttributeOperand attributeOperand = new SimpleAttributeOperand(); attributeOperand.setAttributeId(Attributes.Value); 23 OPC UA Java Client Tutorial attributeOperand }); .setBrowsePath(new QualifiedName[] { eventField attributeOperand.setIndexRange(null); attributeOperand.setTypeDefinitionId(Identifiers.BaseEventType); selectClause.add(attributeOperand); } /** EventFilter Objecc */ EventFilter filter = new EventFilter(); filter.setSelectClauses(selectClause.toArray(new SimpleAttributeOperand[selectClause.size()])); filter.setWhereClause(whereClause); /** Encode the Filter */ ExtensionObject eventFilter = null; try { eventFilter = ExtensionObject.binaryEncode(filter); } catch (EncodingException e) { // } /** Erstellt das Monitored Item */ MonitoredItem eventMonitoredItem = client.createMonitoredItem(subscription.getSubscriptionId(), Identifiers.Server, Attributes.EventNotifier, null, null, 500, eventFilter, UnsignedInteger.MAX_VALUE, true, MonitoringMode.Reporting, TimestampsToReturn.Both, false); item.addMonitorListener(new EventMonitorListener () { @Override public void monitorEvent(MonitoredItem monitoredItem, EventFieldList newevent) { // Code } }); 24 OPC UA Java Client Tutorial 10. Calling Methods Methoden sind definierbare Funktionen eines Objekt-Knotens im Informationsmodel. Solche Methoden werden mit einem Call-Service aufgerufen. Dieses Service sendet Eingabe/Ausgabe Argumente von einer Methode. Argumente sind in den Properties Knoten der Methode definiert. CallMethodResult callMethod(ClientSession session, NodeId objectId, NodeId methodId, Variant[] inputArguments, boolean async) throws ServiceResultException Ruft eine Methode eines Objekt Knotens auf. Benötigt wird die ID des Objekt-Knoten und dessen dazugehörige ID für die Methode mit den Argumenten mit der diese aufgerufen wird. Beispiel: /** Aufruf */ client.callMethod(session, objectId, methodId, inputArguments, false); 25 OPC UA Java Client Tutorial 11. Register / Unregister Nodes Mit den Register/Unregister Service können Knoten die im AddressSpace häufiger verwendet werden performanter abgelegt werden, um deren Zugriff zu verbessern. NodeId registerNode(ClientSession session, NodeId nodeToRegister, boolean async) Registriert einen Knoten am Server. Dieses Service dient zur Verbesserung der Zugriffe auf Knoten. Beispiel: /** Variablen */ NodeId nodeToRegister = Identifiers.Server_NamespaceArray /** Registrieren des Knotens */ client.registerNode(session, nodeToRegister, false)); /** Freigeben des Registrierten Knoten */ client.unregisterNode(session, nodeToRegister, false)); 26 OPC UA Java Client Tutorial 12. History Access Das History Access Service bietet die Möglichkeit, historische Daten Schreiben, Lesen und zu Löschen. 1. History Read Das History Read Service besitzt den HistoryReadDetails Parameter um ein historisches Lesen genauer festzulegen. HistoryReadResult historyRead(ClientSession session, NodeId nodeId, byte[] continuationPoint, String indexRange, QualifiedName dataEncoding, boolean releaseContinuation, TimestampsToReturn timestampToReturn, HistoryReadDetails details, boolean asyncOperation) throws ServiceResultException Generelles History Read Service. Dieser Aufruf des History Read Services bietet eine komplette Parametrisierung der Funktion. Der HistoryReadDetails Parameter liefert die Information des Lesevorgangs. Dieser kann folgende Form annehmen: ReadRawModifiedDetails Lesen in einem Zeitbereich mit den Parametern Start-, Endzeit und ein Maximum an zu returnierenden Werte. Es sind mindestens 2 der Parameter nötig um ein gültiges Lesen abzusenden. ReadAtTimeDetails Liest Werte an genauen Zeitpunkten. 2. History Update Das History Update Service besitzt den HistoryUpdateDetails Parameter um ein historisches Update genauer festzulegen, da dieses ein Einfügen, Modifizieren oder Löschen sein kann. 27 OPC UA Java Client Tutorial HistoryUpdateResult historyUpdate(ClientSession session, NodeId nodeId, HistoryUpdateDetails historyUpdateDetails, boolean asyncOperation) throws ServiceResultException Generelles History Update Service. Dieser Aufruf des History Update Services bietet die komplette Parametrisierung der Funktion. Der HistoryUpdateParameter liefert die Information des Updatevorganges. Dieser kann folgende Form annehmen: UpdateDataDetails Einfügen und/oder Ändern von historischen Werten. DeleteRawModifiedDetails Löschen von historischen Werten in einem Zeitbereich. DeleteAtTimeDetails Löschen von historischen Werten an einem genauen Zeitpunkt. Beispiel: /** History Read */ HistoryReadDetails details = new ReadAtTimeDetails(new DateTime[]{someDateTimes}); client.historyRead(null, id, null, null, null, true, TimestampsToReturn.Both, details, false); /** History Update */ HistoryUpdateDetails details = new UpdateDataDetails(id, HistoryUpdateMode.Insert, new HistoryData(new DataValue[]{new DataValue()})); client.historyUpdate(session, id, details , false); 28 OPC UA Java Client Tutorial 3. Client History Archive Das Client SDK bietet zu diesen beiden Methoden noch eine alternative Lösung um auf historische Werte zugreifen zu können, das HistoryArchive. Beispiel: /** HistoryArchive */ HistoryArchive archive = client.historyArchive(session); /** History Read */ HistoryReadResult result = archive.readHistoryAtTime(id, timestamp, false); HistoryReadResult result = archive.readHistoryRaw(id, start, end, 1000, false); /** History Update */ HistoryUpdateResult updateResult = archive.updateHistory(id,datavalues, false); HistoryUpdateResult updateResult = archive.updateOrInsertHistory(id, datavalues, false); HistoryUpdateResult updateResult = archive.deleteHistory(id, timestamp, false); HistoryUpdateResult updateResult = archive.deleteHistory(id, start, end, false);