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

opc.tcp://<pc>:4840, auf jeder Netzwerkschnittstelle des PCs

Sicherheit

Security Policy None, anonyme Anmeldung, siehe Sicherheit

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

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

-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

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

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

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

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

Ü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.