Werkspur Docs Zur Website

OPC UA

Was ist das

Ein OPC-UA-Ziel ist ein benannter Messpunkt oder Stellwert an einer Maschinensteuerung: Endpunkt, Knoten, Datentyp und Richtung. Sie legen das Ziel einmal an. Kommando-Schritte und separate Telemetriebindungen referenzieren es danach über seinen Namen.

Aktionen greifen über zwei Kommandos darauf zu. opcua.read liest einen Wert, ohne etwas zu verändern. opcua.write schreibt einen Wert auf die Steuerung; dieser Schritt ist unumkehrbar, denn ein einmal geschriebener Sollwert lässt sich nicht softwareseitig zurückholen. Zusätzlich kann eine separate Telemetriebindung Werte eines OPC-UA-Ziels für das telemetry-Widget bereitstellen, ohne dass eine Aktion dazwischenläuft. Das Widget selbst bindet nur eine Maschine, nicht den Zielnamen.

Ein OPC-UA-Ziel legen Sie in der Verwaltung unter „OPC-UA-Ziele“ an, entweder manuell oder über den Assistenten. Beide Wege prüfen die Definition vor dem Speichern nach denselben Regeln.

Daneben existieren zwei getrennte OPC-UA-Telemetriepfade. Eine OPC-UA-Konfiguration in der Maschinenbindung enthält selbst Endpunkt, Intervall und numerische Knoten. Sie leitet Messpunkte wie MQTT in den Zeitreihen- und Zustandsregelpfad. Sie verwendet kein benanntes OPC-UA-Ziel und befüllt nicht die aktuellen Zeilen des Live-Widgets.

Für das Live-Widget braucht die beim Start aus der gebündelten Konfiguration geladene telemetry.Binding dagegen eine Maschine und den Namen eines OPC-UA-Ziels. Der Telemetrie-Runner löst dieses Ziel auf, abonniert seinen Knoten und aktualisiert die aktuellen Anzeigezeilen der Maschine. Nur wenn telemetry.Binding.Kind den Wert counter trägt und der gelesene Wert numerisch ist, schreibt dieser Pfad den Wert zusätzlich in die historische Zeitreihentabelle für den Zählerabgleich. Die vollständige Abgrenzung zeigt MQTT & Telemetrie.

Die vier Pfade bleiben technisch getrennt: Aktionen lesen oder schreiben über ein benanntes Ziel, eine Maschinenbindung speist den Telemetry Ingest, und eine Telemetriebindung speist die Live-Anzeige.

flowchart LR
    Action["Aktion"] --> Read["opcua.read"]
    Action --> Write["opcua.write"]
    Read --> Target["Benanntes OPC-UA-Ziel"]
    Write --> Target
    Target --> Controller["Maschinensteuerung"]
    Controller -->|"Wert"| Read
    Read --> Result["Ergebnis für weiteren Schritt"]
    Write -->|"Sollwert"| Controller

    MachineBinding["OPC-UA-Maschinenbindung"] --> Polling["Polling"]
    Polling --> Ingest["Telemetry Ingest<br/>Zeitreihe und Zustandsregeln"]

    TelemetryBinding["Telemetriebindung"] --> Target
    TelemetryBinding --> Subscription["Live-Abonnement"]
    Controller --> Subscription
    Subscription --> Current["Aktuelle Anzeigezeilen"]
    Current --> SSE["SSE"]
    SSE --> Widget["Maschinendaten-Widget"]
    Subscription -->|"nur numerischer Zähler"| Counter["Historische Zeitreihe"]

Wann einsetzen

Anatomie der Definition

Eine OPC-UA-Ziel-Definition ist ein flaches JSON-Objekt:

Die Knoten-ID folgt dem Muster ns=<Namespace-Index>;<Adressform>=<Bezeichner>. Die Adressform bestimmt, wie der letzte Teil zu lesen ist: s= steht für einen symbolischen Namen wie Spindel.Drehzahl, i= für eine numerische ID, g= für eine GUID und b= für einen rohen Byte-String. Welche Form eine Steuerung anbietet, hängt vom jeweiligen OPC-UA-Server ab. Die Dokumentation und die freigegebenen Diagnosewerkzeuge Ihrer Steuerung zeigen die verfügbaren Knoten samt korrekter Adressform an.

Eine telemetry.Binding ordnet einem benannten OPC-UA-Ziel eine Maschine, einen Metriknamen, eine Beschriftung und eine Einheit zu. Optional hat telemetry.Binding.Kind den Wert counter. Dieser Wert ist keine Eigenschaft des OPC-UA-Ziels. Nur ein numerischer Wert einer solchen Zählerbindung wird zusätzlich in die Zeitreihentabelle für den Zählerabgleich geschrieben. Andere gebundene Werte bleiben aktuelle Anzeigezeilen.

Für diese Live-Telemetriebindungen gibt es derzeit weder UI- noch HTTP-CRUD. „OPC-UA-Ziele“ verwaltet das referenzierte Ziel, nicht die Zuordnung zur Maschine. Eine Ansicht konfiguriert ebenfalls nur die Maschine des Widgets.

Telemetrie ist reine Anzeige. Ein Live-Wert ist keine Buchung, taucht in keiner Rückverfolgung auf und ersetzt keinen Schritt-Abschluss. Verbindlich wird eine Zahl erst durch eine Buchung, also durch einen abgeschlossenen Schritt oder eine Aktion. Der Maschinenzähler mag einen bestimmten Stand anzeigen; für das System und für die Rückverfolgung zählt trotzdem nur, was ein Bediener am Terminal tatsächlich abgeschlossen hat.

Beispiele

presse-1-drehzahl opcua-target
{
  "name": "presse-1-drehzahl",
  "endpoint": "opc.tcp://plc.example.invalid:4840",
  "node": "ns=2;s=Spindel.Drehzahl",
  "type": "int",
  "mode": "read",
  "security": {}
}
Mit dem Assistenten
Lese-Ziel für die Spindeldrehzahl anlegen.

Die Minimalform eines Ziels: name, endpoint, node, type und mode: read, ganz ohne security-Block. Fehlt der Block, gilt der Kanal als unverschlüsselt und die Anmeldung als anonym. opcua.read kann dieses Ziel lesen, opcua.write dagegen nicht. Für Live-Telemetrie muss die separate, beim Start geladene Telemetriebindung den Zielnamen und eine Maschine zuordnen; das telemetry-Widget selbst referenziert nur die Maschine.

presse-1-freigabe opcua-target
{
  "name": "presse-1-freigabe",
  "endpoint": "opc.tcp://plc.example.invalid:4840",
  "node": "ns=2;s=Steuerung.Freigabe",
  "type": "bool",
  "mode": "write",
  "security": {
    "policy": "Basic256Sha256",
    "mode": "SignAndEncrypt",
    "auth": "username",
    "username": "werkspur",
    "password_secret": "presse-1-opcua-passwort"
  }
}
Mit dem Assistenten
Schreib-Ziel mit signierter, verschlüsselter Verbindung und Benutzer-Anmeldung anlegen.

mode: write erlaubt opcua.write auf dieses Ziel. Der Kanal läuft signiert und verschlüsselt (SignAndEncrypt), was eine Policy voraussetzt, hier Basic256Sha256. Die Anmeldung läuft per Benutzername; password_secret ist ein Namens-Verweis auf das hinterlegte Secret, nicht das Passwort selbst.

Fallstricke

Wie ein telemetry-Widget eine Maschine in einer Ansicht auswählt, zeigt das Kapitel Ansichten. Wie der Zählerabgleich eine counter-Bindung gegen gebuchte Stückzahlen prüft, beschreibt das Kapitel Kennzahlen & Cockpit. Den vollständigen Weg von Telemetry Ingest über Speicherung und Regeln bis zur Live-Anzeige beschreibt MQTT & Telemetrie. Eine sichere Diagnosefolge finden Sie unter Integration: Fehlersuche.