Zum Hauptinhalt springen

OPC-UA Treiber

Übersicht​

Industrieller Standardprotokoll basierend auf OPC Unified Architecture (IEC 62541).

항목Wert
opc_typeOPCUA
Implementierungsklasseplantpulse.driver.protocol.opcua.OPCUA_34_Driver
BibliothekEclipse Milo (milo-sdk-client)
read✅
write✅ (node.writeValue)
SicherheitBenutzerauthentifizierung Anonymous, Username/Password. Kanalsicherheit None · Sign · SignAndEncrypt · auto

Kompatibel mit den meisten OPC-UA Servern wie Kepware, Matrikon und Prosys.


OPC-Registrierungsformular​

FeldBedeutungBeispiel
opc_agent_ipOPC-UA Server IP192.168.0.40
opc_agent_portOPC-UA Server TCP Port49320 (Kepware Standard)
timecyclePolling-Zyklus (ms)1000
options.servernameServername am Ende des Endpunkts(Leer lassen bei Kepware)
options.usernameAuthentifizierter Benutzerkopens
options.passwordAuthentifizierungs-Passwort***
options.discoveryWenn true, wird beim Verbindungsaufbau der gesamte Knotebaum ab RootFolder durchsucht und im Log gespeichert (keine Endpunktsuche — Endpunkte über [Endpunkte abrufen] auf dem Bildschirm)false (Empfohlen)
options.security_modeKanalsicherheitsmodus. None(Standard) · Sign · SignAndEncrypt · auto(das Stärkste aus Sign oder SignAndEncrypt). Wenn nicht None, wird nicht auf None zurückgegriffen. Groß-/Kleinschreibung wird ignoriert, unbekannte Werte werden als OPCUA_SECURITY_CONFIG_INVALID behandeltSignAndEncrypt
options.security_policyauto(Standard) · Basic256Sha256 · Aes128_Sha256_RsaOaep · Aes256_Sha256_RsaPss. auto folgt der Reihenfolge Aes256_Sha256_RsaPss > Basic256Sha256 > Aes128_Sha256_RsaOaep. Wird ignoriert, wenn der Sicherheitsmodus None istauto
options.allow_deprecated_policyWenn true, werden auch veraltete Basic256 · Basic128Rsa15 zugelassen(werden in auto Kandidaten aufgenommen und können explizit angegeben werden). Werte außer true/false sind OPCUA_SECURITY_CONFIG_INVALIDfalse

Format der generierten Endpoint-URL:

opc.tcp://<opc_agent_ip>:<opc_agent_port>/<servername>

Wenn sowohl username + password vorhanden sind, wird UsernameProvider verwendet, ansonsten AnonymousProvider.

pki_dir (Verzeichnis für Client-Zertifikate und Trust-Listen) ist kein Eingabefeld. edge-web fügt $PE_DATA_DIR/pp-data/opcua-client nur hinzu, wenn der Sicherheitsmodus nicht None ist; im Verbindungsdatensatz gespeicherte Werte werden verworfen.

Endpunkt-Auswahl:

  • security_mode=None (OPCUA_34_Driver.selectEndpoint) — Wählt aus der vom Server angebotenen Liste nur diejenigen aus, die MessageSecurityMode.None sind. Endpunkte, die den zu verwendenden Token-Typ (UserName / Anonymous) ankündigen, haben Vorrang; ansonsten wird der erste None-Endpunkt verwendet.
  • Andere Modi (OpcuaEndpointSelector.selectSecure) — Wählt den stärksten Endpunkt aus, der sowohl den akzeptierten Modus/die Richtlinie als auch den zu verwendenden Token-Typ erfüllt. Wenn keiner vorhanden ist, erfolgt kein Rückfall auf None, sondern ein Fehlschlag mit OPCUA_NO_MATCHING_ENDPOINT.

Der Host der gewählten Endpoint-URL wird durch opc_agent_ip ersetzt (Port und Pfad bleiben wie vom Server angekündigt). Bekannte Fehlerursachen (Zertifikat, Sicherheitseinstellung, kein passender Endpunkt) hinterlassen eine einzelne OPCUA connect refused: error_code=<코드> opc_id=<OPC ID> ... WARN-Zeile (nur einmal bei gleicher Ursache). OPCUA_CONNECT_FAILED · OPCUA_PKI_ERROR hinterlassen jedes Mal einen OPCUA connect failed: ... ERROR mit Stacktrace.

Verfahren für sichere Verbindungen

Informationen zum Vertrauen von Serverzertifikaten, zum Herunterladen von Edge-Zertifikaten und zu Fehlermeldungen finden Sie unter OPC-UA Verbindung — Sichere Verbindung. Erstmalig gesehene Serverzertifikate werden abgelehnt (kein automatisches Vertrauen beim ersten Zugriff) und erst nach Bestätigung durch den Betreiber auf dem Bildschirm verbunden.


Tag plc_address Format​

OPC-UA Standard NodeId Notation. Beispiel:

NotationBedeutung
ns=2;s=Simulator.Sine1Namespace 2, String-Bezeichner Simulator.Sine1
ns=2;i=1234Numerischer Bezeichner 1234
ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28aGUID-Bezeichner
ns=2;b=Mb=Opaque (Bytestring)-Bezeichner

Bei Kepware ist dies normalerweise im Format ns=2;s=<Channel>.<Device>.<Tag>.


data_type / format Mapping​

Der Wert Value eines OPC-UA Variablenknotens wird in einen String umgewandelt und zurückgegeben. data_type wird von nachfolgenden Schritten (z. B. PLCValueFomula, Sparkplug-Veröffentlichung) für die Umwandlung verwendet.

data_typeVerhalten
Float / DoubleZahl bleibt unverändert
Int / Integer / Int32 / Short / LongZahl bleibt unverändert
Boolean / Booltrue/false Zeichenfolge
String / TextUTF-8 Zeichenfolge
DateTimeISO-Zeichenfolge

format wird in OPC-UA im Allgemeinen nicht verwendet. Wenn eine Nachbearbeitungsformel erforderlich ist, verwenden Sie fomula.


Häufige Fehler + Lösungen​

Nachricht / SymptomUrsacheLösung
connection refusedServer nicht in Betrieb, Port blockiertKommunikation über telnet <ip> <port> prüfen
Bad_UserAccessDeniedUsername/Password-Fehler, Anonymous nicht erlaubtBenutzer auf Serverseite registrieren oder Anonymous aktivieren
OPCUA_CLIENT_CERT_REJECTED (Bad_SecurityChecksFailed etc.)Server vertraut dem Edge-Client-Zertifikat nichtEdge-Zertifikat (.der) in die Trust-Liste des Servers aufnehmen
OPCUA_NO_MATCHING_ENDPOINTServer bietet keinen Endpunkt für diesen Modus/Richtlinie/Token anÜber [Endpunkte abrufen] auf dem Bildschirm die vom Server angebotenen Kombinationen prüfen und anpassen
Verbindungsfehler aufgrund falscher PortDer Treiber ersetzt nur den Host des angekündigten Endpunkts durch opc_agent_ip; Port und Pfad werden beibehaltenWenn der Port durch NAT/Port-Weiterleitung geändert wurde, muss er mit dem vom Server angekündigten Port übereinstimmen. Host-Mapping ist nicht erforderlich
Wert ist immer 0 / nullTippfehler in NodeId, Namespace-Nummer stimmt nicht übereinNodeId-Read mit einem Client wie UA Expert validieren

curl Registrierungsbeispiel​

curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_UA_Kepware",
"opc_type": "OPCUA",
"opc_name": "Kepware",
"opc_agent_ip": "192.168.0.40",
"opc_agent_port": "49320",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 1000,
"options": {
"username": "kopens",
"password": "***",
"discovery": "false"
},
"tag_list": [
{
"tag_id": "OPC_UA_Kepware_TAG_00001",
"tag_name": "Sine1",
"plc_address": "ns=2;s=Simulator.Sine1",
"data_type": "Float",
"description": "Sine wave"
},
{
"tag_id": "OPC_UA_Kepware_TAG_00002",
"tag_name": "Random1",
"plc_address": "ns=2;s=Simulator.Random1",
"data_type": "Integer"
}
]
}'

Wert lesen:

curl -s http://<edge-host>/api/v1/tag/OPC_UA_Kepware_TAG_00001/value | jq

Referenz: Kepware Kurzeinrichtungsleitfaden​

  1. Kepware Server → Project → Kanal hinzufügen (z. B. Simulator).
  2. Gerät hinzufügen (z. B. Simulator) → Modell = 16 Bit Device.
  3. Tag hinzufügen → Sine1, Typ Float, Scan-Rate 100ms etc.
  4. In Project Properties → OPC UA → Server Endpoint Port 49320 aktivieren.
  5. Anonymous oder Benutzerkonto aktivieren. Bei sicherer Verbindung in der Endpunktsicherheitsrichtlinie «Sign and Encrypt» sowie eine Stufe über Basic256Sha256 aktivieren und Edge-Zertifikat in die Trust-Liste aufnehmen.

→ Edge-Registrierungsformular:

FeldWert
opc_agent_ipKepware Server IP
opc_agent_port49320
options.servername(Leer lassen)
options.username/passwordZuvor erstelltes Konto
plc_addressns=2;s=Simulator.Simulator.Sine1

Beispielsammlung (nach Datentyp)​

OPC-UA wandelt den Wert (Variant) des Variablenknotens in einen String um und gibt ihn zurück. data_type wird für die Nachbearbeitung (PLCValueFomula, Sparkplug DataTypeMapper) bei der Umwandlung verwendet. format wird im Allgemeinen nicht verwendet.

Boolean​

data_typeplc_address BeispielBemerkung
Booleanns=2;s=Simulator.Boolean1Boolean-Tag des Kepware Simulators
Booleanns=2;s=PLC.Status.RunningKepware Channel.Device.Tag
Booleanns=2;i=1003Numerische NodeId

16/32-Bit Ganzzahl​

data_typeplc_address BeispielBemerkung
Integerns=2;s=Simulator.Random1Zufällige Ganzzahl-Simulation
Integerns=2;s=Simulator.Counter1Zähler
Integerns=2;s=PLC.D100Über Kepware MELSEC-Kanal exponiert

64-Bit Ganzzahl​

data_typeplc_address BeispielBemerkung
Longns=2;s=Simulator.LongCounterUInt64 / Int64 Knoten
Longns=2;s=PLC.Cycle.TotalAkkumulierender Zähler

Gleitkommazahl​

data_typeplc_address BeispielBemerkung
Floatns=2;s=Simulator.Sine1Sinuswellen-Simulation
Floatns=2;s=Simulator.Ramp1Rampenwellen
Doublens=2;s=PLC.PressurePräzisionsmesswert

Zeichenfolge​

data_typeplc_address BeispielBemerkung
Stringns=2;s=Simulator.User1.NameString-Knoten
Stringns=2;s=PLC.Recipe.ActiveRezeptname

Nach NodeId-Format​

Bezeichner-Typplc_address Beispiel
String (s=)ns=2;s=Simulator.Sine1
Numeric (i=)ns=2;i=1234
GUID (g=)ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28a
Opaque (b=)ns=2;b=Mb=

Nutzung von Formeln​

Zweckdata_typefomulaBemerkung
EinheitenumrechnungFloat${VALUE}*0.001z. B. g → kg
NullpunktkorrekturFloat${VALUE}-${TAG_ZERO}Referenz auf andere OPC-UA Tags möglich
TypumwandlungFloat${VALUE}*1.0Erzwingung von Integer → Float
PolynomFloat${VALUE}*${VALUE}*0.0001Nicht linear

curl Gesamtbeispiel (alle Typen)​

curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_UA_FULL",
"opc_type": "OPCUA",
"opc_name": "Kepware Full",
"opc_agent_ip": "192.168.0.40",
"opc_agent_port": "49320",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 1000,
"options": { "discovery": "false" },
"tag_list": [
{"tag_id":"OPC_UA_FULL_T01", "tag_name":"BoolTag", "plc_address":"ns=2;s=Simulator.Boolean1", "data_type":"Boolean"},
{"tag_id":"OPC_UA_FULL_T02", "tag_name":"IntTag", "plc_address":"ns=2;s=Simulator.Random1", "data_type":"Integer"},
{"tag_id":"OPC_UA_FULL_T03", "tag_name":"LongTag", "plc_address":"ns=2;s=Simulator.LongCounter", "data_type":"Long"},
{"tag_id":"OPC_UA_FULL_T04", "tag_name":"FloatTag", "plc_address":"ns=2;s=Simulator.Sine1", "data_type":"Float"},
{"tag_id":"OPC_UA_FULL_T05", "tag_name":"DoubleTag", "plc_address":"ns=2;s=PLC.Pressure", "data_type":"Double"},
{"tag_id":"OPC_UA_FULL_T06", "tag_name":"StringTag", "plc_address":"ns=2;s=Simulator.User1.Name", "data_type":"String"},
{"tag_id":"OPC_UA_FULL_T07", "tag_name":"NumIdTag", "plc_address":"ns=2;i=1234", "data_type":"Integer"},
{"tag_id":"OPC_UA_FULL_T08", "tag_name":"ScaledTag", "plc_address":"ns=2;s=Simulator.Sine1", "data_type":"Float", "fomula":"${VALUE}*100"}
]
}'