OPC UA Connector
| Auf ctrlX OS wird dieser Connector nicht verwendet: Eine ctrlX PLC auf demselben Gerät nutzt die Knoten direkt, siehe Eine SPS anbinden. |
Der LumiScan OPC UA Connector (lumiscan_opcua_connector) stellt den Baum von LumiScan Keryx als OPC-UA-Adressraum
dar. Eine SPS, ein SCADA-System oder ein beliebiger OPC-UA-Client liest, schreibt, ruft auf und abonniert die
Knoten der Apps, ohne einen eigenen Data-Layer-Client. Der Connector leitet jede Anfrage beim Eintreffen an den
Data Layer weiter; er speichert keine eigenen Werte.
Der Adressraum ist der eigene Baum des Data Layers, keine OPC UA Companion Specification wie OPC 40100 (Machine Vision).
Endpunkt und Adressraum
Endpunkt |
|
Sicherheit |
Security Policy None, anonyme Anmeldung, siehe Sicherheit |
Namespace-URI |
|
NodeId |
die Data-Layer-Adresse als String-Identifier in diesem Namespace:
|
BrowseName |
das letzte Segment der Adresse, zum Beispiel |
Wurzel |
ein Objekt unter |
Ermitteln Sie den Namespace-Index n anhand der URI im NamespaceArray des Servers. Schreiben Sie keinen festen
Index in Ihr Programm: Bei einem anderen Start kann er anders nummeriert sein.
| Data Layer | OPC-UA-Knoten |
|---|---|
Ordner |
Object (FolderType) |
Wert |
Variable (BaseDataVariableType), mit dem Zugriff, den der Knoten erlaubt |
Methode |
Method ohne Eingangsargumente und mit einem Ausgangsargument |
Der Connector durchläuft den Baum beim Start und danach alle 2 Sekunden erneut. Eine App, die später startet, ein
hinzugefügtes Modul und ein verschwundener Knoten zeigen sich innerhalb von etwa 2 Sekunden. Es gibt keine
Model-Change-Events: Ein Client, der sein Browse-Ergebnis zwischengespeichert hat, muss erneut browsen. Eine App,
die stoppt, behält ihre Knoten im Baum; Lesezugriffe darauf liefern BadTimeout, dann BadNoCommunication,
bis sich die App wieder registriert.
Den Connector starten
Das Installationsprogramm legt eine Verknüpfung im Startmenü an, die den Connector ohne Optionen startet: Port 4840, der gesamte Data Layer, anonym, Lesen und Schreiben.
Starten Sie ihn nach den Apps. Der Connector startet nie einen Broker: Ohne Broker protokolliert er den Grund, beendet sich mit Exit-Code 1, und sein Fenster schließt sich. Stoppen Sie ihn mit Strg+C. Wie die Apps ist er mit CodeMeter geschützt, siehe LumiScan Lizenzierung.
| Option | Bedeutung |
|---|---|
|
OPC-UA-Port, Standard 4840 |
|
nur diesen Teilbaum anzeigen, zum Beispiel |
|
Schreibvorgänge ( |
|
der Broker, Standard |
|
wie lange ein Lese- oder Schreibvorgang dauern darf, Standard 2000 |
|
wie lange ein Methodenaufruf dauern darf, Standard 60000 |
|
Methodenaufrufe, die gleichzeitig laufen, Standard 4 |
|
wie schnell eine Subscription höchstens Benachrichtigungen sendet, Standard 10 |
|
wie oft der Baum erneut durchlaufen wird, Standard 2000 |
|
Sampling-Modus statt Event-Modus; nicht empfohlen |
lumiscan_opcua_connector --help listet alle Optionen auf.
Sicherheit
Es gibt keine. Der Connector akzeptiert jeden Client, anonym und unverschlüsselt, und der Client kann jeden
beschreibbaren Knoten schreiben und jede Methode aufrufen - einschließlich Starten und Stoppen der Kamera und
Ändern von Einstellungen über system/settings. Behandeln Sie ihn wie einen ungeschützten Feldbus-Port:
-
Betreiben Sie ihn in einem Netz, dem Sie vertrauen, etwa dem Maschinennetz zwischen PC und SPS;
-
öffnen Sie TCP 4840 in der Firewall des PCs nur für die Adresse der SPS;
-
für einen Client, der nur beobachtet, betreiben Sie eine zweite Instanz schreibgeschützt auf einem eigenen Port:
lumiscan_opcua_connector --root hdvisionsystems --port 4841 --read-only.
Zertifikate, Benutzernamen und Verschlüsselung werden nicht unterstützt; ein Client, der auf einem sicheren Kanal besteht, kann sich nicht verbinden.
Lesen, Schreiben und Typen
Der Typ muss exakt dem des Knotens entsprechen. Der Connector konvertiert nicht: Ein Boolean-Knoten nimmt
einen Boolean an, nicht 0 oder 1; ein UInt32-Knoten nimmt UInt32 an, nicht Int32. Die meisten Probleme bei
einer ersten Verbindung gehen auf einen Typ zurück, der um eine Größe abweicht.
| Knotentyp | OPC-UA-Typ | IEC 61131-3 |
|---|---|---|
bool |
Boolean |
|
int32 |
Int32 |
|
uint32 |
UInt32 |
|
uint64 |
UInt64 |
|
float32 |
Float |
|
float64 |
Double |
|
string |
String |
|
Arrays dieser Typen |
derselbe Typ, eindimensional |
|
FlatBuffers-Ergebnis, Bild |
ByteString |
ohne Decoder nicht verwendbar |
-
Ein Lesevorgang wartet bis zu 2 Sekunden. Ein Knoten, der nicht geantwortet hat, ist für die nächsten 5 Sekunden
BadNoCommunication. -
Ein Schreibvorgang ersetzt den gesamten Wert und wird nie wiederholt. Ein Schreibvorgang mit einer
NumericRangewird abgelehnt (BadWriteNotSupported). -
Die Zeitstempel eines Werts stammen vom Connector: Der Data Layer führt keine eigene Zeit mit.
-
Bauen Sie keine SPS-Logik auf FlatBuffers-Werten auf. Verwenden Sie die einfachen Knoten daneben.
Die drei Muster aufrufen
Handshake: nur Lese- und Schreibvorgänge, wie in Handshake beschrieben. Pollen Sie im Abstand von 50 bis 100 ms.
Execute: Schreiben Sie die Eingaben der Methode - eine Methode hat keine Argumente, ihre Eingaben sind separate
Knoten - und verwenden Sie dann den Call-Service mit objectId = der übergeordneten Adresse (zum Beispiel
…/camera1/control/trigger) und methodId = der Methode (…/camera1/control/trigger/execute).
Der Aufruf antwortet, wenn die Methode abgeschlossen ist, nach bis zu 60 Sekunden; setzen Sie das Call-Timeout
Ihres Clients höher als Ihre langsamste Methode. Der Status des Aufrufs gibt an, ob die Operation ausgeführt werden
konnte, siehe Ergebnisse eines Methodenaufrufs. Lesen Sie danach
control/status/code und die Ausgaben.
Stream: Abonnieren Sie den Ergebnisknoten, siehe Subscriptions.
Subscriptions
Legen Sie eine Subscription an und fügen Sie für den Knoten ein Monitored Item hinzu:
| Einstellung | Wert | Warum |
|---|---|---|
Publishing Interval |
10 ms oder mehr |
das schnellste des Servers |
Sampling Interval |
0 |
meldet jeden Push beim Eintreffen (Event-Modus) |
Queue Size |
10 bis 100 |
mit 1 kommt nur der neueste Push an |
DataChange Trigger |
|
sonst zählen zwei identische Ergebnisse als eines |
DiscardOldest |
true |
-
Ein Knoten meldet eine Änderung, wenn die App ihn pusht; Streams tun das. Ein Wert, der zu groß ist, um gepusht zu werden, meldet sich im Event-Modus nie: Verwenden Sie dafür ein positives Sampling Interval.
-
Große Werte kosten: Ein Kamerabild von 1,5 MB, alle 10 ms abgetastet, ergibt 150 MB/s für ein einziges Item. Überwachen Sie
output/image,…/stream/frameoder…/stream/resultnur, wenn Sie sie dekodieren. Für Koordinaten überwachen Sieplain-pointsvon Calibration. -
Beim Start prüft der Connector, ob der Event-Modus funktioniert. Falls nicht, protokolliert er das und tastet jedes Item per Timer ab (Sampling-Modus). Erhält Ihr Client weniger Benachrichtigungen als Pushes, lesen Sie zuerst das Log des Connectors.
OPC-UA-Statuscodes
Über die Ergebnisse eines Methodenaufrufs hinaus:
| Status | Bedeutung |
|---|---|
|
falsche Adresse, Groß-/Kleinschreibung oder falscher Namespace-Index; die App läuft nicht; das Modul fehlt |
|
die App ist gestoppt oder hängt |
|
die App hat nicht innerhalb von 2 s (Lesen, Schreiben) bzw. 60 s (Aufruf) geantwortet |
|
der Wert hat nicht den Typ des Knotens |
|
ein Schreibvorgang mit einer |
|
eine Ausgabe, oder der Connector ist schreibgeschützt |
|
der Connector ist schreibgeschützt |
|
der Knoten ist keine Methode des Baums mehr: Browsen Sie erneut |
Nachdem eine App neu gestartet wurde, führen Sie Ihre Startsequenz erneut aus: Die Kamera ist nicht verbunden und der Stream des Cam Driver ist aus. Meldet sich ein Monitored Item nicht wieder, löschen Sie es und legen Sie es neu an.