OPC UA Subscriber Adapter
Dieser Adapter stellt eine Verbindung zu einem OPC UA Server her und abonniert oder storniert Datenänderungen oder Ereignisse.
Eigenschaften (Properties)
Operation | Vom Adapter ausgeführte Operation Mögliche Werte:
|
Parameter
Adapter | Adapter-Hauptklasse (nicht verändern!) Mögliche Werte: de.softproject.integration.adapter.opcua.OpcUaSubscriberAdapter: Hauptklasse (Standard) |
clientAlias | Alias zur Kennzeichnung der Verbindungseinstellungen Mögliche Werte: Beliebige Zeichenkette mit dem Client Alias |
process | X4DB-Pfad zu einem Technical Process, der nach jedem Abonnentenempfang ausgeführt wird Mögliche Werte: Beliebiger gültiger X4DB-Pfad, z. B. |
url | Server-URL Mögliche Werte: Beliebige gültige URL, z. B. |
user | Benutzername, um eine Verbindung zum Server aufzubauen Mögliche Werte: Beliebige Zeichenkette mit dem Benutzernamen, z. B. |
password | Passwort, um eine Verbindung zum Server aufzubauen Mögliche Werte: Beliebige Zeichenkette mit dem Passwort, z. B. |
security mode | Sicherheits-Modus und Server-Richtlinien Mögliche Werte:
|
autoReconnect | Angabe, ob sich der Client automatisch wieder mit dem Server verbinden soll oder nicht. |
Statuswerte
1 | Die Adapter-Operation wurde erfolgreich ausgeführt |
-1 | Bei der Ausführung des Adapters kam es zu einem Fehler |
Input
Operation Subscribe
Vollständiges Beispiel mit verschiedenen Abonnement-Typen:
Input für die Operation Subscribe
XML<?xml version="1.0" encoding="UTF-8"?> <Subscriptions> <!-- Subscription to a data value change --> <Subscription type="DATA_CHANGE" nodeIndex="3" nodeIdentifier="Counter" nodeIdentifierType="String"></Subscription> <!-- Subscription to an event, specifying a condition --> <Subscription type="EVENT" nodeIndex="5" nodeIdentifier="MyLevel.Alarm" nodeIdentifierType="String"> <Field name="SourceName"> <Literal>LIKE</Literal> <Operand>Server</Operand> </Field> </Subscription> <!-- Subscription to an event, specifying more than one condition --> <Subscription type="EVENT" nodeIndex="5" nodeIdentifier="MyLevel.Alarm" nodeIdentifierType="String"> <Field name="ActiveState" attributeId="13"> <Operand>EQUALS</Operand> <Literal>Active</Literal> </Field> <Field name="AckedState" attributeId="13"> <Operand>EQUALS</Operand> <Literal>Unacknowledged</Literal> </Field> <Field name="Comment" attributeId="13"></Field> <Field name="EnabledState" attributeId="13"></Field> <Field name="EventType" attributeId="1"> <Operand>EQUALS</Operand> <Literal>i=9482</Literal> </Field> <Field name="Quality"> <Operand>EQUALS</Operand> <Literal>GOOD (0x00000000) ""</Literal> </Field> <Field name="Severity"> <Operand>LESS_THAN</Operand> <Literal>600</Literal> </Field> <Field name="SourceName"></Field> <Field name="Time"></Field> </Subscription> <!-- Configuring --> <OnAfterCreate>x4db://1/TestingOPCUA/Processes/OnAfterCreate.wrf</OnAfterCreate> <OnAlive>x4db://1/TestingOPCUA/Processes/OnAlive.wrf</OnAlive> </Subscriptions>
Datenwertänderung abonnieren:
Um eine Datenwertänderung zu abonnieren, muss ein
Subscription
-Knoten mit folgenden Pflichtattributen angelegt werden:type
, um die Art des Abonnements festzulegennodeIndex
,nodeIdentifier
, um den OPC UA-Knoten zu identifizieren, von dem die Änderungen abonniert werdennodeIdentifierType
, um den Datentyp des Knotenbezeichners zu spezifizieren
Der
Subscription
-Knoten kann folgende optionale Attribute enthalten:samplingInterval
: Wert in Millisekunden, mit dem der OPC UA Server, die Datenquelle (SPS) abtastet.publishingInterval
Wert in Millisekunden, mit dem der OPC UA Server, die Daten an den Client (z.B. X4) sendet.
XML<?xml version="1.0" encoding="UTF-8"?> <Subscriptions> <Subscription type="DATA_CHANGE" nodeIndex="3" nodeIdentifier="Counter" nodeIdentifierType="String" samplingInterval="1000" publishingInterval="1000"> </Subscription> </Subscriptions>
Events abonnieren, ohne Felder zu spezifizieren:
XML<?xml version="1.0" encoding="UTF-8"?> <Subscriptions> <!-- We will receive an empty event --> <Subscription type="EVENT" nodeIndex="5" nodeIdentifier="MyLevel.Alarm" nodeIdentifierType="String"> </Subscription> </Subscriptions
Events abonnieren und Felder spezifizieren:
XML<?xml version="1.0" encoding="UTF-8"?> <Subscriptions> <!-- In the Field node, we define the field we want to retrieve on each event reception. --> <Subscription type="EVENT" nodeIndex="5" nodeIdentifier="MyLevel.Alarm" nodeIdentifierType="String"> <Field name="SourceName"></Field> <Field name="Time"></Field> </Subscription> <!-- Any number of Field nodes possible. --> </Subscriptions>
Events abonnieren und Filter für die spezifizierten Felder definieren:
Es ist möglich, Bedingungen für die Attribute zu definieren, die bei jedem Ereignisempfang erhalten werden. Dazu müssen entsprechend vieleField
-Knoten angelegt werden. JederField
-Knoten enthält dabei die ElementeLiteral
undOperand
.Event mit Filtern abonnieren
XML<?xml version="1.0" encoding="UTF-8"?> <Subscriptions> <!-- In the Field node, we define the field we want to retrieve on each event reception. Inside this node Operand and Literal are defined in order to create the condition over the field. --> <Subscription type="EVENT" nodeIndex="5" nodeIdentifier="MyLevel.Alarm" nodeIdentifierType="String"> <!-- Severity less than 600 --> <Field name="Severity"> <Operand>LESS_THAN</Operand> <Literal>600</Literal> </Field> </Subscription> <!-- Any number of Field nodes possible. If there is more than one Field node containing conditions, the logical operator applied between fields will be 'OR' --> </Subscriptions>
Beachten Sie:
- Das
name
-Attribut innerhalb vonField
ist erforderlich. Operand
kann folgende Werte haben:LESS_THAN
LESS_THAN_OR_EQUALS
GREATER_THAN
GREATER_THAN_OR_EQUALS
EQUALS
NOT
LIKE
Literal
enthält die verschiedenen literalen Werte, die innerhalb des Ausdrucks berücksichtigt werden sollen.
- Das
Operation Unsubscribe
Die Operation UnS
ubscribe
benötigt keinen Input, da eine Stornierung des Abonnements erfolgt. Daher muss im Parameter clientAlias
lediglich der Alias des Mandanten angegeben werden.
Output
Operation Subscribe
Die Ausgabestruktur hängt vom Typ der Empfangsnachricht ab.
Wird ein Event mit Feldern empfangen (mit oder ohne Bedingungen), die im Abonnement konfiguriert wurden, ähnelt die Antwort-Struktur folgender Beispielausgabe:
Output für Event-Antworten
XML<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Message type="EVENT"> <Node description="ns=5;s=MyLevel.Alarm"/> <Fields> <Field fieldName="ActiveState">Active</Field> <Field fieldName="AckedState">Unacknowledged</Field> <Field fieldName="Comment">EMPTY</Field> <Field fieldName="EnabledState">Enabled</Field> <Field fieldName="EventType">i=9482</Field> <Field fieldName="Quality">GOOD</Field> <Field fieldName="Severity">500</Field> <Field fieldName="SourceName">MyLevel</Field> <Field fieldName="Time">1576741128000</Field> </Fields> </Message>
Die Angabe von Bedingungen führt dazu, dass mehr oder weniger Events empfangen werden. Sobald jedoch ein Event empfangen wird, enthält die Antwort die Felder, die im Abonnement angegeben wurden.
Wird ein Event ohne Feld-Spezifikationen empfangen, ähnelt die Antwort-Struktur folgender Beispielausgabe:
Output für Event-Antworten
XML<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Message type="EVENT"/>
Wird eine Datenwertänderung empfangen, ähnelt die Antwort-Struktur folgender Beispielausgabe:
Output für Datenwertänderungen
XML<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Message type="DATA_CHANGE"> <Node description="ns=3;s=Counter"/> <OldValue> <!-- 0 means null timestamp --> <sourceTimestamp>0</sourceTimestamp> <!-- No value and statusCode present in 'OldValue' node happens only just after subscribing on the first reception --> </OldValue> <NewValue> <sourceTimestamp>13221214634996</sourceTimestamp> <statusCode>GOOD</statusCode> <value>2312.11</value> </NewValue> </Message>
Operation UnSubscribe
Die Operation UnSubscribe
hat keine Ausgabe, da der Status 1
bedeutet, dass die Operation erfolgreich ausgeführt wurde.
Alive Listener Konfiguration
Es gibt einen Alive Listener, der es ermöglicht, Aktionen für jede Live-Benachrichtigung eines Abonnements zu konfigurieren.
Dabei lassen sich Prozesse für folgende Situationen definieren:
After create
: Das Abonnement wurde auf dem Server (neu) erstellt. Dies ist der Fall, wenn die Abonnierung aufgrund einer Kommunikationsunterbrechung in einen Timeout geriet und nach der Wiederverbindung neu erstellt werden muss.Alive
: Der Server bestätigte, dass die Verbindung aktiv ist, obwohl es keine Änderungen zu senden gab.Life timeout
: Der Server hat nicht bestätigt, dass die Verbindung aktiv ist, und der Life-Timeout wurde überschritten.Timeout
: Der Server hat nicht bestätigt, dass die Verbindung aktiv ist, und die maximale Keepalive-Anzahl wurde überschritten.
Die Aktionen werden als Teil des Input-XML-Dokuments wie folgt definiert:
Input for Subscribe operation
<?xml version="1.0" encoding="UTF-8"?>
<Subscriptions>
<Subscription ...></Subscription>
<Subscription ...></Subscription>
<!-- Alive listener actions -->
<!-- We can define some of them or none, they are not required -->
<OnAfterCreate>x4db://1/TestingOPCUA/Processes/OnAfterCreate.wrf</OnAfterCreate>
<OnAlive>x4db://1/TestingOPCUA/Processes/OnAlive.wrf</OnAlive>
<onLifetimeTimeout>x4db://1/TestingOPCUA/Processes/onLifetimeTimeout.wrf</onLifetimeTimeout>
<onTimeout>x4db://1/TestingOPCUA/Processes/onTimeout.wrf</onTimeout>
</Subscriptions>