OPC-UA Treiber
Überblick
Industrielles Datenstandardprotokoll auf Basis der OPC Unified Architecture (IEC 62541).
| Punkt | Wert |
|---|---|
opc_type | OPCUA |
| Implementierungsklasse | plantpulse.driver.protocol.opcua.OPCUA_34_Driver |
| Bibliothek | Eclipse Milo (milo-sdk-client) |
| read | ✅ |
| write | ❌ (Phase 3 / zusammen mit Sparkplug NCMD) |
| Sicherheit | Username/Password, Anonymous |
Kompatibel mit den meisten OPC-UA Servern wie Kepware, Matrikon, Prosys usw.
OPC-Registrierungsformular
| Feld | Bedeutung | Beispiel |
|---|---|---|
opc_agent_ip | IP des OPC-UA Servers | 192.168.0.40 |
opc_agent_port | TCP-Port des OPC-UA Servers | 49320 (Kepware-Standard) |
timecycle | Abfrageintervall (ms) | 1000 |
options.servername | Servername am Ende des Endpoints | (bei Kepware leer lassen) |
options.username | Benutzer für die Authentifizierung | kopens |
options.password | Passwort für die Authentifizierung | *** |
options.discovery | Discovery-Endpoint verwenden | false (bei true werden Endpoints automatisch ermittelt) |
Format der erzeugten Endpoint-URL:
opc.tcp://<opc_agent_ip>:<opc_agent_port>/<servername>
Sind username und password beide vorhanden, wird UsernameProvider verwendet, andernfalls AnonymousProvider.
Format von Tag-plc_address
OPC-UA-Standard-NodeId-Notation. Beispiele:
| Notation | Bedeutung |
|---|---|
ns=2;s=Simulator.Sine1 | Namespace 2, String-Identifier Simulator.Sine1 |
ns=2;i=1234 | Numerischer Identifier 1234 |
ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28a | GUID-Identifier |
ns=2;b=Mb= | Opaque (Bytestring) Identifier |
Bei Kepware üblicherweise das Format ns=2;s=<Channel>.<Device>.<Tag>.
Zuordnung data_type / format
Der Value des OPC-UA-Variablenknotens wird nach String gecastet und zurückgegeben. data_type wird von den nachgelagerten Stufen
(PLCValueFomula, Sparkplug-Veröffentlichung usw.) für das Casting verwendet.
data_type | Verhalten |
|---|---|
Float / Double | Zahl unverändert |
Int / Integer / Int32 / Short / Long | Zahl unverändert |
Boolean / Bool | true/false als Zeichenkette |
String / Text | UTF-8-Zeichenkette |
DateTime | ISO-Zeichenkette |
format wird bei OPC-UA in der Regel nicht verwendet. Wird eine Nachbearbeitungsformel benötigt, fomula verwenden.
Häufige Fehler + Lösungen
| Meldung / Symptom | Ursache | Lösung |
|---|---|---|
connection refused | Server nicht in Betrieb, Port blockiert | Kommunikation mit telnet <ip> <port> prüfen |
Bad_UserAccessDenied | Fehler bei username/password, anonymer Zugriff nicht erlaubt | Benutzer serverseitig anlegen oder Anonymous aktivieren |
Bad_SecurityChecksFailed | Nicht übereinstimmende Sicherheitsrichtlinie | Richtlinie am Server prüfen (None / Basic256Sha256 usw.). In Phase 1 hat MessageSecurityMode.None Vorrang |
endpointUrl stimmt nicht überein | discovery=false gesetzt, Server liefert jedoch einen anderen Hostnamen zurück | Auf discovery=true belassen oder in der hosts-Datei zuordnen |
| Wert immer 0 / null | Tippfehler in der NodeId, Namespace-Nummer stimmt nicht | Denselben NodeId-Read mit einem Client wie UA Expert verifizieren |
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
Hinweis: Kurzanleitung zur Kepware-Konfiguration
- Kepware Server → Project → Kanal hinzufügen (z. B.
Simulator). - Gerät hinzufügen (z. B.
Simulator) → Modell =16 Bit Device. - Tag hinzufügen →
Sine1, typeFloat, scan rate100msusw. - In
Project Properties → OPC UA → Server Endpointden Port49320aktivieren. - Anonymous oder Benutzerkonto aktivieren.
→ Edge-Registrierungsformular:
| Feld | Wert |
|---|---|
| opc_agent_ip | IP des Kepware-Servers |
| opc_agent_port | 49320 |
| options.servername | (leer) |
| options.username/password | oben angelegtes Konto |
| plc_address | ns=2;s=Simulator.Simulator.Sine1 |
Beispielsammlung (nach Datentyp)
OPC-UA castet den Wert des Variablenknotens (Variant) nach String und gibt ihn zurück. data_type wird von der Nachbearbeitung (PLCValueFomula, Sparkplug DataTypeMapper) für das Casting verwendet. format wird in der Regel nicht verwendet.
Boolean
data_type | plc_address Beispiel | Hinweis |
|---|---|---|
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-Ganzzahlen
data_type | plc_address Beispiel | Hinweis |
|---|---|---|
Integer | ns=2;s=Simulator.Random1 | Simulation Random Integer |
Integer | ns=2;s=Simulator.Counter1 | Counter |
Integer | ns=2;s=PLC.D100 | Über Kepware MELSEC-Kanal bereitgestellt |
64-Bit-Ganzzahlen
data_type | plc_address Beispiel | Hinweis |
|---|---|---|
Long | ns=2;s=Simulator.LongCounter | UInt64 / Int64 Knoten |
Long | ns=2;s=PLC.Cycle.Total | Kumulativer Zähler |
Gleitkommazahlen
data_type | plc_address Beispiel | Hinweis |
|---|---|---|
Float | ns=2;s=Simulator.Sine1 | Sinuswellen-Simulation |
Float | ns=2;s=Simulator.Ramp1 | Rampenverlauf |
Double | ns=2;s=PLC.Pressure | Präzisionsmesswert |
Zeichenketten
data_type | plc_address Beispiel | Hinweis |
|---|---|---|
String | ns=2;s=Simulator.User1.Name | String-Knoten |
String | ns=2;s=PLC.Recipe.Active | Rezeptname |
Nach NodeId-Format
| Identifier-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= |
Einsatz von Formula
| Zweck | data_type | fomula | Hinweis |
|---|---|---|---|
| Einheitenumrechnung | Float | ${VALUE}*0.001 | z. B. g → kg |
| Nullpunktkorrektur | Float | ${VALUE}-${TAG_ZERO} | Verweis auf andere OPCUA-Tags möglich |
| Typumwandlung | Float | ${VALUE}*1.0 | Integer → Float erzwingen |
| Polynom | Float | ${VALUE}*${VALUE}*0.0001 | Nichtlinear |
Umfassendes curl-Beispiel (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"}
]
}'