PROFINET-Konnektor
Übersicht
Abschnitt betitelt „Übersicht“Der PROFINET-Konnektor ermöglicht die Kommunikation mit PROFINET-IO-Geräten unter Verwendung der Slot/Subslot/Index-Adressierung, wie sie in IEC 61158 definiert ist. Er spricht das PROFINET-DCE-RPC-Protokoll über UDP, baut eine Application Relation (AR) mit dem Zielgerät auf und tauscht Datensatzdaten-Lese- und Schreibvorgänge aus.
Konnektor-Typen:
ProfinetReader- Pollt Datensatzdaten von PROFINET-IO-GerätenProfinetWriter- Schreibt Datensatzdaten auf PROFINET-IO-Geräte
Funktionen
Abschnitt betitelt „Funktionen“- ✅ PROFINET-IO-Datensatzdaten lesen/schreiben über Slot/Subslot/Index-Adressierung
- ✅ DCE-RPC über UDP-Transport
- ✅ Application Relation (AR)-Verwaltung mit automatischer Wiederverbindung
- ✅ Big-Endian-Binärdekodierung für alle primitiven Typen
- ✅ Breite Datentypunterstützung: Bool, Int8/16/32, UInt8/16/32, Float32/64, OctetString
- ✅ Konfigurierbare Polling-Rate und Pro-Aufruf-Timeout
Grundkonfiguration
Abschnitt betitelt „Grundkonfiguration“PROFINET Reader
Abschnitt betitelt „PROFINET Reader“{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 1000, "timeout": 5000 }, "variables": [ { "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4 }, { "key": "running_state", "slot": 1, "subslot": 1, "index": 101, "dataType": "Bool", "length": 1 } ]}PROFINET Writer
Abschnitt betitelt „PROFINET Writer“{ "type": "ProfinetWriter", "config": { "endpoint": "192.168.0.50:34964", "timeout": 5000 }, "variables": [ { "key": "setpoint", "slot": 1, "subslot": 1, "index": 200, "dataType": "Float32", "length": 4 }, { "key": "enable_output", "slot": 1, "subslot": 1, "index": 201, "dataType": "Bool", "length": 1 } ]}Konfigurationsparameter
Abschnitt betitelt „Konfigurationsparameter“Endpoint
Abschnitt betitelt „Endpoint“Die IP-Adresse und der PROFINET-DCE-RPC-Port des Zielgeräts.
{ "endpoint": "192.168.0.50:34964" }Format: host:port. Der standardmäßige PROFINET-DCE-RPC-Port ist 34964. Einige Geräte lauschen auf alternativen Ports — konsultieren Sie die GSD-Datei des Geräts.
Polling Rate
Abschnitt betitelt „Polling Rate“Erforderlich für den Reader. Das Intervall in Millisekunden zwischen aufeinanderfolgenden Lesevorgängen.
{ "pollingRate": 1000 }Empfohlene Werte:
- Schnelle Diagnosedaten: 100-500ms
- Prozessvariablen: 500-2000ms
- Langsame Telemetrie: 5000ms+
PROFINET-IO-Geräte tolerieren im Allgemeinen hohe Polling-Raten, aber das LAN und das Antwort-Budget des Geräts sind reale Grenzen.
Timeout
Abschnitt betitelt „Timeout“Optional. Pro-Aufruf-RPC-Timeout in Millisekunden. Standardwert ist implementierungsabhängig.
{ "timeout": 5000 }Empfohlene Werte:
- Lokale LAN-Geräte: 1000-3000ms
- Geräte hinter NAT oder Relay: 5000-10000ms
Variablen
Abschnitt betitelt „Variablen“Jede Variable beschreibt eine Datensatzadresse und ihre Wire-Codierung.
Variablenstruktur
Abschnitt betitelt „Variablenstruktur“{ "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
key | string | Ja | Meddle-Payload-Schlüssel |
slot | uint16 | Ja | PROFINET-Slot-Nummer |
subslot | uint16 | Ja | PROFINET-Subslot-Nummer |
index | uint16 | Ja | Datensatzindex |
dataType | string | Ja | Codierung (siehe unten) |
length | uint16 | Ja | Anzahl der zu lesenden/schreibenden Bytes |
Slot / Subslot / Index-Adressierung
Abschnitt betitelt „Slot / Subslot / Index-Adressierung“PROFINET-IO-Geräte modellieren ihre I/O als Hierarchie:
- Slot: Eine logische “Karte” innerhalb des Geräts. Slot 0 ist für das Gerät selbst reserviert (DAP)
- Subslot: Ein Submodul innerhalb des Slots. Subslot 1 ist typischerweise die primäre I/O
- Index: Ein spezifischer Datensatz an diesem Submodul, definiert in der GSDML-Datei des Geräts
Konsultieren Sie die mit dem Gerät gelieferte GSDML (General Station Description Markup Language)-Datei für die Adressierungs-Map.
Datentypen
Abschnitt betitelt „Datentypen“Der Konnektor dekodiert Datensatz-Bytes mit Big-Endian-Byte-Reihenfolge (PROFINET-Konvention):
{ "dataType": "Bool", "length": 1 }1 Byte; 0x00 → false, alles andere → true.
{ "dataType": "Int8", "length": 1 }{ "dataType": "UInt8", "length": 1 }{ "dataType": "Int16", "length": 2 }{ "dataType": "UInt16", "length": 2 }{ "dataType": "Int32", "length": 4 }{ "dataType": "UInt32", "length": 4 }Alle Multi-Byte-Ganzzahlen sind Big-Endian.
{ "dataType": "Float32", "length": 4 }{ "dataType": "Float64", "length": 8 }IEEE 754-Gleitkomma, Big-Endian.
{ "dataType": "OctetString", "length": 32 }Rohe Bytes, die als UTF-8-String interpretiert werden. Das length steuert die maximalen Bytes zum Lesen; die tatsächliche Antwortlänge des Geräts bestimmt, wie viele zurückgegeben werden.
Unterstützte Typen:
| Typ | Bytes | Go-Ausgabetyp |
|---|---|---|
Bool | 1 | bool |
Int8 | 1 | int8 |
UInt8 | 1 | uint8 |
Int16 | 2 | int16 |
UInt16 | 2 | uint16 |
Int32 | 4 | int32 |
UInt32 | 4 | uint32 |
Float32 | 4 | float32 |
Float64 | 8 | float64 |
OctetString | variabel | string |
Datenfluss
Abschnitt betitelt „Datenfluss“Reader-Datenfluss
Abschnitt betitelt „Reader-Datenfluss“PROFINET-Gerät → ProfinetReader (RPC ReadRecord) → dekodierte Werte → Meddle-PayloadBeispiel:
Reader-Konfiguration:
{ "variables": [ { "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4 }, { "key": "running", "slot": 1, "subslot": 1, "index": 101, "dataType": "Bool", "length": 1 } ]}Ausgabe-Payload:
{ "temperature": 24.7, "running": true}Writer-Datenfluss
Abschnitt betitelt „Writer-Datenfluss“Meddle-Payload → ProfinetWriter (Codieren + RPC WriteRecord) → PROFINET-GerätBeispiel:
Eingabe-Payload:
{ "setpoint": 75.0, "enable_output": true}Jeder Schlüssel, der mit einem konfigurierten variable.key übereinstimmt, wird gemäß seinem dataType codiert und über WriteRecord geschrieben. Schlüssel, die nicht in der Variablenliste sind, werden ignoriert.
Häufige Anwendungsfälle
Abschnitt betitelt „Häufige Anwendungsfälle“1. Lesen von Diagnosedaten von einem PROFINET-IO-Modul
Abschnitt betitelt „1. Lesen von Diagnosedaten von einem PROFINET-IO-Modul“{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 2000, "timeout": 5000 }, "variables": [ { "key": "module_status", "slot": 1, "subslot": 1, "index": 1000, "dataType": "UInt16", "length": 2 }, { "key": "temperature_c", "slot": 1, "subslot": 1, "index": 1001, "dataType": "Float32", "length": 4 }, { "key": "uptime_seconds", "slot": 0, "subslot": 1, "index": 2000, "dataType": "UInt32", "length": 4 }, { "key": "device_name", "slot": 0, "subslot": 1, "index": 3000, "dataType": "OctetString", "length": 64 } ]}2. Senden von Sollwerten an einen Antrieb
Abschnitt betitelt „2. Senden von Sollwerten an einen Antrieb“{ "type": "ProfinetWriter", "config": { "endpoint": "192.168.0.60:34964", "timeout": 3000 }, "variables": [ { "key": "speed_rpm", "slot": 1, "subslot": 1, "index": 100, "dataType": "Int32", "length": 4 }, { "key": "torque_limit", "slot": 1, "subslot": 1, "index": 101, "dataType": "Float32", "length": 4 }, { "key": "enable", "slot": 1, "subslot": 1, "index": 102, "dataType": "Bool", "length": 1 } ]}3. Lesen aus mehreren Submodulen
Abschnitt betitelt „3. Lesen aus mehreren Submodulen“{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 1000, "timeout": 5000 }, "variables": [ { "key": "input_card_1_value", "slot": 1, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "input_card_2_value", "slot": 2, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "input_card_3_value", "slot": 3, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "device_temp", "slot": 0, "subslot": 1, "index": 200, "dataType": "Float32", "length": 4 } ]}Fehlerbehebung
Abschnitt betitelt „Fehlerbehebung“ErrProfinetConnect beim Start
Abschnitt betitelt „ErrProfinetConnect beim Start“Problem: Kann keine Application Relation (AR) mit dem Gerät aufbauen
Lösungen:
- Geräte-IP und Port überprüfen:
ping 192.168.0.50undnc -zv -u 192.168.0.50 34964 - Bestätigen, dass der PROFINET-Stack des Geräts läuft und sich nicht im Fehlerzustand befindet
- Prüfen, ob das Gerät nicht bereits in einer AR mit einem anderen Controller ist (PROFINET-Geräte erlauben typischerweise eine begrenzte Anzahl gleichzeitiger ARs)
- Ein Tool wie Wireshark mit dem PROFINET-Dissector verwenden, um den Connect-Handshake zu inspizieren
ErrProfinetReadFailed bei einer bestimmten Variable
Abschnitt betitelt „ErrProfinetReadFailed bei einer bestimmten Variable“Problem: Eine Variable gibt einen Fehler zurück, während andere erfolgreich sind
Lösungen:
- Slot/Subslot/Index anhand der GSDML-Datei des Geräts überprüfen
- Prüfen, ob die konfigurierte
lengthmit der tatsächlichen Datensatzgröße auf dem Gerät übereinstimmt - Einige Indexe sind nur lesbar oder geschützt — konsultieren Sie die Gerätedokumentation
insufficient data for <type>
Abschnitt betitelt „insufficient data for <type>“Problem: Gerät hat weniger Bytes zurückgegeben, als der Datentyp erfordert
Lösungen:
lengthfür die Variable erhöhen, um der Antwortgröße des Geräts zu entsprechen- Für OctetString ist
lengthein Maximum; für Festbreitentypen muss es dem Byte-Count des Typs entsprechen - Einige Geräte füllen Antworten auf — stellen Sie sicher, dass
lengthmindestens dem Minimum entspricht (z.B. 4 für Float32)
Verbindung mitten im Lesevorgang verloren
Abschnitt betitelt „Verbindung mitten im Lesevorgang verloren“Problem: ErrProfinetDisconnected-Fehler erscheinen nach einer Periode normalen Betriebs
Lösungen:
- Der Konnektor verbindet sich beim nächsten Poll-Zyklus automatisch wieder — erwarten Sie eine kurze Lücke und Wiederaufnahme
- Wenn Verbindungsabbrüche häufig sind, das PROFINET-Netzwerk auf Kabelprobleme, Switch-Überlastung oder doppelte IP-Adressen prüfen
timeoutfür Netzwerke mit hoher Latenz erhöhen
Falsche Werte für Multi-Byte-Typen
Abschnitt betitelt „Falsche Werte für Multi-Byte-Typen“Problem: Int32/Float-Werte sind offensichtlich falsch (riesige Größen, NaN, falsches Vorzeichen)
Lösungen:
- Das PROFINET-Wire-Format ist immer Big-Endian. Es gibt keinen Byte-Order-Schalter. Wenn Ihre Gerätedokumentation Little-Endian behauptet, prüfen Sie, ob es sich um einen herstellerspezifischen Datensatz handelt (Herstellerdatensätze können andere Codierungen verwenden — extern mit einem
Transformdekodieren) - Bestätigen, dass der Datentyp mit der GSDML-Deklaration übereinstimmt
Best Practices
Abschnitt betitelt „Best Practices“1. Immer die GSDML konsultieren
Abschnitt betitelt „1. Immer die GSDML konsultieren“Slot-, Subslot- und Indexzuweisungen sind gerätespezifisch. Die GSDML ist die kanonische Quelle — keine Adressierung erschließen.
2. Slot 0 / Subslot 1 für gerätelevel-Datensätze verwenden
Abschnitt betitelt „2. Slot 0 / Subslot 1 für gerätelevel-Datensätze verwenden“Konventionell:
- Slot 0 = DAP (Device Access Point) — Geräteidentität, Diagnose, Systemdatensätze
- Slot N, Subslot 1 = primäre I/O des N-ten I/O-Submoduls
3. Bei Polling-Raten konservativ sein
Abschnitt betitelt „3. Bei Polling-Raten konservativ sein“PROFINET-IO-Geräte verarbeiten Datensatzdaten über die Anwendungsschicht, nicht den zyklischen I/O-Kanal — also kann zu aggressives Polling den zyklischen Pfad aushungern. 500-2000ms sind typisch für Datensatz-Polling.
4. Wiederverbindungen nachgelagert elegant behandeln
Abschnitt betitelt „4. Wiederverbindungen nachgelagert elegant behandeln“Verwenden Sie einen Filter- oder Validation-Konnektor nach dem Reader, um weitere Verarbeitung während Wiederverbindungsfenstern zu unterbrechen.
5. Schreibvorgänge defensiv codieren
Abschnitt betitelt „5. Schreibvorgänge defensiv codieren“Beim Veröffentlichen von Sollwerten Werte vorab mit einem Transform oder Reshape einklemmen, damit Daten außerhalb des Bereichs niemals den Writer erreichen. PROFINET-Geräte können extreme Werte inkonsistent ablehnen (oder schlimmer noch, akzeptieren).
Beispiel-Workflows
Abschnitt betitelt „Beispiel-Workflows“PROFINET-Antrieb-Überwachungs-Pipeline
Abschnitt betitelt „PROFINET-Antrieb-Überwachungs-Pipeline“ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer └→ Isa182 → Alert- ProfinetReader: Liest
temperature,current,vibrationvon einem Antrieb mit 1Hz - Validation: Stellt sicher, dass alle Signale vorhanden und numerisch sind
- Reshape: Markiert mit
asset_id,line,area - Predictive: Berechnet Trends und RUL für
temperatureundvibration - InfluxDb2Writer: Langzeitspeicherung
- Isa182: Triggert Alarm bei sinkendem Gesundheitsscore
- Alert: Benachrichtigt die Wartung
Geschlossener PROFINET-Sollwert-Regelkreis
Abschnitt betitelt „Geschlossener PROFINET-Sollwert-Regelkreis“ScriptReader (Steuerungslogik) → ProfinetWriterProfinetReader → ScriptReader (Rückkopplungsschleife)Ein Script-Konnektor liest PROFINET-Eingänge, berechnet eine Steuerausgabe und schreibt sie über den PROFINET-Writer zurück — ein klassischer Aufsichtsregelkreis.
Verwandte Konnektoren
Abschnitt betitelt „Verwandte Konnektoren“- Modbus - Alternativer industrieller Feldbus
- Siemens S7 - Direktes S7-Protokoll für Siemens-SPSen
- OPC UA - Moderne Abstraktion über PROFINET/S7-Daten
- Validation - Während Wiederverbindungen nachgelagert blockieren
- Predictive - Prädiktive Analytik auf PROFINET-Signalen
Zusätzliche Ressourcen
Abschnitt betitelt „Zusätzliche Ressourcen“- PROFINET-Spezifikation (PI)
- IEC 61158 - PROFINET-Protokollstandard
- GSDML-Spezifikation - General Station Description Markup Language
- Wireshark PROFINET Dissector