OPC-UA Treiber
Übersicht
Industrieller Standardprotokoll basierend auf OPC Unified Architecture (IEC 62541).
| 항목 | Wert |
|---|---|
opc_type | OPCUA |
| Implementierungsklasse | plantpulse.driver.protocol.opcua.OPCUA_34_Driver |
| Bibliothek | Eclipse Milo (milo-sdk-client) |
| read | ✅ |
| write | ✅ (node.writeValue) |
| Sicherheit | Benutzerauthentifizierung Anonymous, Username/Password. Kanalsicherheit None · Sign · SignAndEncrypt · auto |
Kompatibel mit den meisten OPC-UA Servern wie Kepware, Matrikon und Prosys.
OPC-Registrierungsformular
| Feld | Bedeutung | Beispiel |
|---|---|---|
opc_agent_ip | OPC-UA Server IP | 192.168.0.40 |
opc_agent_port | OPC-UA Server TCP Port | 49320 (Kepware Standard) |
timecycle | Polling-Zyklus (ms) | 1000 |
options.servername | Servername am Ende des Endpunkts | (Leer lassen bei Kepware) |
options.username | Authentifizierter Benutzer | kopens |
options.password | Authentifizierungs-Passwort | *** |
options.discovery | Wenn 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_mode | Kanalsicherheitsmodus. 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 behandelt | SignAndEncrypt |
options.security_policy | auto(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 ist | auto |
options.allow_deprecated_policy | Wenn 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_INVALID | false |
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, dieMessageSecurityMode.Nonesind. 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 mitOPCUA_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.
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:
| Notation | Bedeutung |
|---|---|
ns=2;s=Simulator.Sine1 | Namespace 2, String-Bezeichner Simulator.Sine1 |
ns=2;i=1234 | Numerischer Bezeichner 1234 |
ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28a | GUID-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_type | Verhalten |
|---|---|
Float / Double | Zahl bleibt unverändert |
Int / Integer / Int32 / Short / Long | Zahl bleibt unverändert |
Boolean / Bool | true/false Zeichenfolge |
String / Text | UTF-8 Zeichenfolge |
DateTime | ISO-Zeichenfolge |
format wird in OPC-UA im Allgemeinen nicht verwendet. Wenn eine Nachbearbeitungsformel erforderlich ist, verwenden Sie fomula.
Häufige Fehler + Lösungen
| Nachricht / Symptom | Ursache | Lösung |
|---|---|---|
connection refused | Server nicht in Betrieb, Port blockiert | Kommunikation über telnet <ip> <port> prüfen |
Bad_UserAccessDenied | Username/Password-Fehler, Anonymous nicht erlaubt | Benutzer auf Serverseite registrieren oder Anonymous aktivieren |
OPCUA_CLIENT_CERT_REJECTED (Bad_SecurityChecksFailed etc.) | Server vertraut dem Edge-Client-Zertifikat nicht | Edge-Zertifikat (.der) in die Trust-Liste des Servers aufnehmen |
OPCUA_NO_MATCHING_ENDPOINT | Server 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 Port | Der Treiber ersetzt nur den Host des angekündigten Endpunkts durch opc_agent_ip; Port und Pfad werden beibehalten | Wenn 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 / null | Tippfehler in NodeId, Namespace-Nummer stimmt nicht überein | NodeId-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
- Kepware Server → Project → Kanal hinzufügen (z. B.
Simulator). - Gerät hinzufügen (z. B.
Simulator) → Modell =16 Bit Device. - Tag hinzufügen →
Sine1, TypFloat, Scan-Rate100msetc. - In
Project Properties → OPC UA → Server EndpointPort49320aktivieren. - Anonymous oder Benutzerkonto aktivieren. Bei sicherer Verbindung in der Endpunktsicherheitsrichtlinie «Sign and Encrypt» sowie eine Stufe über
Basic256Sha256aktivieren und Edge-Zertifikat in die Trust-Liste aufnehmen.
→ Edge-Registrierungsformular:
| Feld | Wert |
|---|---|
| opc_agent_ip | Kepware Server IP |
| opc_agent_port | 49320 |
| options.servername | (Leer lassen) |
| options.username/password | Zuvor erstelltes Konto |
| plc_address | ns=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_type | plc_address Beispiel | Bemerkung |
|---|---|---|
Boolean | ns=2;s=Simulator.Boolean1 | Boolean-Tag des Kepware Simulators |
Boolean | ns=2;s=PLC.Status.Running | Kepware Channel.Device.Tag |
Boolean | ns=2;i=1003 | Numerische NodeId |
16/32-Bit Ganzzahl
data_type | plc_address Beispiel | Bemerkung |
|---|---|---|
Integer | ns=2;s=Simulator.Random1 | Zufällige Ganzzahl-Simulation |
Integer | ns=2;s=Simulator.Counter1 | Zähler |
Integer | ns=2;s=PLC.D100 | Über Kepware MELSEC-Kanal exponiert |
64-Bit Ganzzahl
data_type | plc_address Beispiel | Bemerkung |
|---|---|---|
Long | ns=2;s=Simulator.LongCounter | UInt64 / Int64 Knoten |
Long | ns=2;s=PLC.Cycle.Total | Akkumulierender Zähler |
Gleitkommazahl
data_type | plc_address Beispiel | Bemerkung |
|---|---|---|
Float | ns=2;s=Simulator.Sine1 | Sinuswellen-Simulation |
Float | ns=2;s=Simulator.Ramp1 | Rampenwellen |
Double | ns=2;s=PLC.Pressure | Präzisionsmesswert |
Zeichenfolge
data_type | plc_address Beispiel | Bemerkung |
|---|---|---|
String | ns=2;s=Simulator.User1.Name | String-Knoten |
String | ns=2;s=PLC.Recipe.Active | Rezeptname |
Nach NodeId-Format
| Bezeichner-Typ | plc_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
| Zweck | data_type | fomula | Bemerkung |
|---|---|---|---|
| Einheitenumrechnung | Float | ${VALUE}*0.001 | z. B. g → kg |
| Nullpunktkorrektur | Float | ${VALUE}-${TAG_ZERO} | Referenz auf andere OPC-UA Tags möglich |
| Typumwandlung | Float | ${VALUE}*1.0 | Erzwingung von Integer → Float |
| Polynom | Float | ${VALUE}*${VALUE}*0.0001 | Nicht 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"}
]
}'