---
title: "OPC UA Connector"
description: "Der LumiScan OPC UA Connector - LumiScan Keryx als OPC-UA-Adressraum für SPS und SCADA-Systeme: Endpunkt, Knotenabbildung, Optionen, Sicherheit, Typen, Aufruf der drei Muster, Subscriptions und Statuscodes."
product: "LumiScan Keryx"
component: "lumiscan-keryx-de"
version: "1.0.0"
display_version: "1.0.0.7"
latest_version: true
language: "de"
url: "https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/opc-ua.html"
---

# OPC UA Connector – LumiScan Keryx

> [!NOTE]
> Auf ctrlX OS wird dieser Connector nicht verwendet: Eine ctrlX PLC auf demselben Gerät nutzt die Knoten direkt, siehe [Eine SPS anbinden](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/ctrlx-data-layer.html#connecting-a-plc).

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 {#endpoint}

|   |   |
| --- | --- |
| Endpunkt | `opc.tcp://<pc>:4840`, auf jeder Netzwerkschnittstelle des PCs |
| Sicherheit | Security Policy **None**, **anonyme** Anmeldung, siehe [Sicherheit](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/opc-ua.html#security) |
| Namespace-URI | `urn:hdvisionsystems:keryx` |
| NodeId | die Data-Layer-Adresse als String-Identifier in diesem Namespace: `ns=<n>;s=hdvisionsystems/lumiscan-cam-driver/camera1/control/status/code` |
| BrowseName | das letzte Segment der Adresse, zum Beispiel `code` |
| Wurzel | ein Objekt unter `Objects` namens `Keryx`, das `hdvisionsystems` und die anderen Ordner der obersten Ebene enthält. Mit `--root hdvisionsystems` gestartet, ist es `hdvisionsystems`; die NodeIds bleiben dieselben |

**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 `Result`, zugehörig zum Objekt ihrer übergeordneten Adresse |

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 {#starting}

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](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/index.html).

| Option | Bedeutung |
| --- | --- |
| `-p`, `--port <n>` | OPC-UA-Port, Standard 4840 |
| `-r`, `--root <address>` | nur diesen Teilbaum anzeigen, zum Beispiel `hdvisionsystems` |
| `--read-only` | Schreibvorgänge (`BadNotWritable`) und Methodenaufrufe (`BadNotExecutable`) ablehnen |
| `--keryx-url <url>` | der Broker, Standard `tcp://127.0.0.1:5555` |
| `--request-timeout-ms <ms>` | wie lange ein Lese- oder Schreibvorgang dauern darf, Standard 2000 |
| `--method-timeout-ms <ms>` | wie lange ein Methodenaufruf dauern darf, Standard 60000 |
| `--method-workers <n>` | Methodenaufrufe, die gleichzeitig laufen, Standard 4 |
| `--min-publishing-ms <ms>` | wie schnell eine Subscription höchstens Benachrichtigungen sendet, Standard 10 |
| `--resync-ms <ms>` | wie oft der Baum erneut durchlaufen wird, Standard 2000 |
| `--sampling-ms <ms>` | Sampling-Modus statt Event-Modus; nicht empfohlen |

`lumiscan_opcua_connector --help` listet alle Optionen auf.

## Sicherheit {#security}

**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 {#types}

**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 | `BOOL` |
| int32 | Int32 | `DINT` |
| uint32 | UInt32 | `UDINT` |
| uint64 | UInt64 | `ULINT` |
| float32 | Float | `REAL` |
| float64 | Double | `LREAL` |
| string | String | `STRING` |
| Arrays dieser Typen | derselbe Typ, eindimensional | `ARRAY [..] OF …` |
| 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 `NumericRange` wird 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 {#calls}

**Handshake**: nur Lese- und Schreibvorgänge, wie in [Handshake](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/handshake.html) 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](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/status-codes.html#method-results). Lesen Sie danach `control/status/code` und die Ausgaben.

**Stream**: Abonnieren Sie den Ergebnisknoten, siehe [Subscriptions](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/opc-ua.html#subscriptions).

## 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 | `StatusValueTimestamp` | 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/frame` oder `…/stream/result` nur, wenn Sie sie dekodieren. Für Koordinaten überwachen Sie `plain-points` von 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 {#status}

Über die Ergebnisse eines Methodenaufrufs hinaus:

| Status | Bedeutung |
| --- | --- |
| `BadNodeIdUnknown` | falsche Adresse, Groß-/Kleinschreibung oder falscher Namespace-Index; die App läuft nicht; das Modul fehlt |
| `BadNoCommunication` | die App ist gestoppt oder hängt |
| `BadTimeout` | die App hat nicht innerhalb von 2 s (Lesen, Schreiben) bzw. 60 s (Aufruf) geantwortet |
| `BadTypeMismatch` | der Wert hat nicht den Typ des Knotens |
| `BadWriteNotSupported` | ein Schreibvorgang mit einer `NumericRange` |
| `BadNotWritable` | eine Ausgabe, oder der Connector ist schreibgeschützt |
| `BadNotExecutable` | der Connector ist schreibgeschützt |
| `BadMethodInvalid` | 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.
