Zum Inhalt springen

PROFINET-Konnektor

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äten
  • ProfinetWriter - Schreibt Datensatzdaten auf PROFINET-IO-Geräte
  • ✅ 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
{
"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
}
]
}
{
"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
}
]
}

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.

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.

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

Jede Variable beschreibt eine Datensatzadresse und ihre Wire-Codierung.

{
"key": "temperature",
"slot": 1,
"subslot": 1,
"index": 100,
"dataType": "Float32",
"length": 4
}
FeldTypErforderlichBeschreibung
keystringJaMeddle-Payload-Schlüssel
slotuint16JaPROFINET-Slot-Nummer
subslotuint16JaPROFINET-Subslot-Nummer
indexuint16JaDatensatzindex
dataTypestringJaCodierung (siehe unten)
lengthuint16JaAnzahl der zu lesenden/schreibenden Bytes

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.

Der Konnektor dekodiert Datensatz-Bytes mit Big-Endian-Byte-Reihenfolge (PROFINET-Konvention):

{ "dataType": "Bool", "length": 1 }

1 Byte; 0x00false, alles andere → true.

Unterstützte Typen:

TypBytesGo-Ausgabetyp
Bool1bool
Int81int8
UInt81uint8
Int162int16
UInt162uint16
Int324int32
UInt324uint32
Float324float32
Float648float64
OctetStringvariabelstring
PROFINET-Gerät → ProfinetReader (RPC ReadRecord) → dekodierte Werte → Meddle-Payload

Beispiel:

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
}
Meddle-Payload → ProfinetWriter (Codieren + RPC WriteRecord) → PROFINET-Gerät

Beispiel:

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.

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 }
]
}
{
"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 }
]
}
{
"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 }
]
}

Problem: Kann keine Application Relation (AR) mit dem Gerät aufbauen

Lösungen:

  1. Geräte-IP und Port überprüfen: ping 192.168.0.50 und nc -zv -u 192.168.0.50 34964
  2. Bestätigen, dass der PROFINET-Stack des Geräts läuft und sich nicht im Fehlerzustand befindet
  3. 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)
  4. 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:

  1. Slot/Subslot/Index anhand der GSDML-Datei des Geräts überprüfen
  2. Prüfen, ob die konfigurierte length mit der tatsächlichen Datensatzgröße auf dem Gerät übereinstimmt
  3. Einige Indexe sind nur lesbar oder geschützt — konsultieren Sie die Gerätedokumentation

Problem: Gerät hat weniger Bytes zurückgegeben, als der Datentyp erfordert

Lösungen:

  1. length für die Variable erhöhen, um der Antwortgröße des Geräts zu entsprechen
  2. Für OctetString ist length ein Maximum; für Festbreitentypen muss es dem Byte-Count des Typs entsprechen
  3. Einige Geräte füllen Antworten auf — stellen Sie sicher, dass length mindestens dem Minimum entspricht (z.B. 4 für Float32)

Problem: ErrProfinetDisconnected-Fehler erscheinen nach einer Periode normalen Betriebs

Lösungen:

  1. Der Konnektor verbindet sich beim nächsten Poll-Zyklus automatisch wieder — erwarten Sie eine kurze Lücke und Wiederaufnahme
  2. Wenn Verbindungsabbrüche häufig sind, das PROFINET-Netzwerk auf Kabelprobleme, Switch-Überlastung oder doppelte IP-Adressen prüfen
  3. timeout für Netzwerke mit hoher Latenz erhöhen

Problem: Int32/Float-Werte sind offensichtlich falsch (riesige Größen, NaN, falsches Vorzeichen)

Lösungen:

  1. 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 Transform dekodieren)
  2. Bestätigen, dass der Datentyp mit der GSDML-Deklaration übereinstimmt

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

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.

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).

ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer
└→ Isa182 → Alert
  1. ProfinetReader: Liest temperature, current, vibration von einem Antrieb mit 1Hz
  2. Validation: Stellt sicher, dass alle Signale vorhanden und numerisch sind
  3. Reshape: Markiert mit asset_id, line, area
  4. Predictive: Berechnet Trends und RUL für temperature und vibration
  5. InfluxDb2Writer: Langzeitspeicherung
  6. Isa182: Triggert Alarm bei sinkendem Gesundheitsscore
  7. Alert: Benachrichtigt die Wartung
ScriptReader (Steuerungslogik) → ProfinetWriter
ProfinetReader → 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.

  • 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