Salta ai contenuti

Connettore PROFINET

Il connettore PROFINET abilita la comunicazione con dispositivi PROFINET IO utilizzando indirizzamento slot/subslot/index come definito da IEC 61158. Parla il protocollo PROFINET DCE-RPC su UDP, stabilendo una Application Relation (AR) con il dispositivo di destinazione e scambiando letture e scritture di record data.

Tipi Connettore:

  • ProfinetReader - Effettua polling di record data da dispositivi PROFINET IO
  • ProfinetWriter - Scrive record data su dispositivi PROFINET IO
  • ✅ Lettura/scrittura di record data PROFINET IO tramite indirizzamento slot/subslot/index
  • ✅ Trasporto DCE-RPC su UDP
  • ✅ Gestione Application Relation (AR) con riconnessione automatica
  • ✅ Decodifica binaria big-endian per tutti i tipi primitivi
  • ✅ Ampio supporto di tipi di dato: Bool, Int8/16/32, UInt8/16/32, Float32/64, OctetString
  • ✅ Frequenza di polling e timeout per chiamata configurabili
{
"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
}
]
}

L’indirizzo IP e la porta PROFINET DCE-RPC del dispositivo di destinazione.

{ "endpoint": "192.168.0.50:34964" }

Formato: host:port. La porta PROFINET DCE-RPC predefinita è 34964. Alcuni dispositivi ascoltano su porte alternative — consulta il file GSD del dispositivo.

Richiesto per il reader. L’intervallo in millisecondi tra letture successive.

{ "pollingRate": 1000 }

Valori raccomandati:

  • Dati diagnostici veloci: 100-500ms
  • Variabili di processo: 500-2000ms
  • Telemetria lenta: 5000ms+

I dispositivi PROFINET IO sono generalmente tolleranti a frequenze di polling elevate, ma la LAN e il budget di risposta del dispositivo sono limiti reali.

Opzionale. Timeout RPC per chiamata in millisecondi. Il default è definito dall’implementazione.

{ "timeout": 5000 }

Valori raccomandati:

  • Dispositivi LAN locali: 1000-3000ms
  • Dispositivi dietro NAT o relay: 5000-10000ms

Ogni variabile descrive un indirizzo di record e la sua codifica sulla linea.

{
"key": "temperature",
"slot": 1,
"subslot": 1,
"index": 100,
"dataType": "Float32",
"length": 4
}
CampoTipoRichiestoDescrizione
keystringChiave del payload Meddle
slotuint16Numero di slot PROFINET
subslotuint16Numero di subslot PROFINET
indexuint16Indice record
dataTypestringCodifica (vedi sotto)
lengthuint16Numero di byte da leggere/scrivere

I dispositivi PROFINET IO modellano il loro I/O come una gerarchia:

  • Slot: Una “scheda” logica all’interno del dispositivo. Lo slot 0 è riservato al dispositivo stesso (DAP)
  • Subslot: Un sottomodulo all’interno dello slot. Il subslot 1 è tipicamente l’I/O primario
  • Index: Un record specifico su quel sottomodulo, definito nel file GSDML del dispositivo

Consulta il file GSDML (General Station Description Markup Language) fornito con il dispositivo per la mappa di indirizzamento.

Il connettore decodifica i byte del record utilizzando l’ordine di byte big-endian (convenzione PROFINET):

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

1 byte; 0x00false, qualsiasi altro valore → true.

Tipi supportati:

TipoByteTipo di output Go
Bool1bool
Int81int8
UInt81uint8
Int162int16
UInt162uint16
Int324int32
UInt324uint32
Float324float32
Float648float64
OctetStringvariabilestring
Dispositivo PROFINET → ProfinetReader (RPC ReadRecord) → valori decodificati → Payload Meddle

Esempio:

Configurazione del reader:

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

Payload di output:

{
"temperature": 24.7,
"running": true
}
Payload Meddle → ProfinetWriter (codifica + RPC WriteRecord) → Dispositivo PROFINET

Esempio:

Payload di input:

{
"setpoint": 75.0,
"enable_output": true
}

Ogni chiave che corrisponde a un variable.key configurato è codificata secondo il suo dataType e scritta tramite WriteRecord. Le chiavi non presenti nella lista delle variabili vengono ignorate.

1. Lettura di Dati Diagnostici da un Modulo PROFINET IO

Sezione intitolata “1. Lettura di Dati Diagnostici da un Modulo PROFINET IO”
{
"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 }
]
}

Problema: Impossibile stabilire una Application Relation (AR) con il dispositivo

Soluzioni:

  1. Verifica l’IP e la porta del dispositivo: ping 192.168.0.50 e nc -zv -u 192.168.0.50 34964
  2. Conferma che lo stack PROFINET del dispositivo sia in esecuzione e non in stato di fault
  3. Controlla che il dispositivo non sia già in una AR con un altro controllore (i dispositivi PROFINET tipicamente consentono un numero limitato di AR concorrenti)
  4. Usa uno strumento come Wireshark con il dissector PROFINET per ispezionare l’handshake di connessione

Problema: Una variabile restituisce un errore mentre altre hanno successo

Soluzioni:

  1. Verifica slot/subslot/index rispetto al file GSDML del dispositivo
  2. Controlla che la length configurata corrisponda alla dimensione effettiva del record sul dispositivo
  3. Alcuni indici sono write-only o protetti — consulta la documentazione del dispositivo

Problema: Il dispositivo ha restituito meno byte di quelli richiesti dal tipo di dato

Soluzioni:

  1. Aumenta length per la variabile per corrispondere alla dimensione della risposta del dispositivo
  2. Per OctetString, length è un massimo; per tipi a larghezza fissa deve essere uguale al conteggio di byte del tipo
  3. Alcuni dispositivi fanno padding delle risposte — assicurati che length sia almeno il minimo richiesto (es. 4 per Float32)

Problema: Errori ErrProfinetDisconnected appaiono dopo un periodo di funzionamento normale

Soluzioni:

  1. Il connettore si riconnette automaticamente al prossimo ciclo di polling — aspettati un breve gap e ripresa
  2. Se le disconnessioni sono frequenti, controlla la rete PROFINET per problemi di cavo, sovraccarico switch o indirizzi IP duplicati
  3. Aumenta timeout per reti ad alta latenza

Problema: I valori Int32/Float sono ovviamente errati (magnitudine enorme, NaN, segno errato)

Soluzioni:

  1. Il formato wire PROFINET è sempre big-endian. Non c’è un toggle per l’ordine dei byte. Se la documentazione del tuo dispositivo afferma little-endian, controlla se è un record vendor-specific (i record vendor possono usare altre codifiche — decodifica esternamente con un Transform)
  2. Conferma che il tipo di dato corrisponda alla dichiarazione GSDML

Le assegnazioni di slot, subslot e index sono specifiche del dispositivo. Il GSDML è la fonte canonica — non dedurre l’indirizzamento.

2. Usa Slot 0 / Subslot 1 per i Record a Livello di Dispositivo

Sezione intitolata “2. Usa Slot 0 / Subslot 1 per i Record a Livello di Dispositivo”

Per convenzione:

  • Slot 0 = DAP (Device Access Point) — identità del dispositivo, diagnostica, record di sistema
  • Slot N, Subslot 1 = I/O primario dell’N-esimo sottomodulo I/O

I dispositivi PROFINET IO elaborano i record data tramite il livello applicativo, non il canale I/O ciclico — quindi un polling troppo aggressivo può affamare il percorso ciclico. 500-2000ms è tipico per il polling di record.

Usa un connettore Filter o Validation dopo il reader per gestire l’elaborazione ulteriore durante le finestre di riconnessione.

Quando pubblichi setpoint, pre-limita i valori a monte con un Transform o Reshape in modo che dati fuori range non raggiungano mai il writer. I dispositivi PROFINET possono rifiutare (o peggio, accettare) valori estremi in modo incoerente.

ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer
└→ Isa182 → Alert
  1. ProfinetReader: Legge temperature, current, vibration da un drive a 1Hz
  2. Validation: Assicura che tutti i segnali siano presenti e numerici
  3. Reshape: Tagga con asset_id, line, area
  4. Predictive: Calcola trend e RUL per temperature e vibration
  5. InfluxDb2Writer: Archiviazione a lungo termine
  6. Isa182: Attiva allarme su degrado dello score di salute
  7. Alert: Notifica la manutenzione
ScriptReader (logica di controllo) → ProfinetWriter
ProfinetReader → ScriptReader (loop di feedback)

Un connettore Script legge gli ingressi PROFINET, calcola un output di controllo e lo scrive nuovamente tramite il writer PROFINET — un classico loop di supervisione.

  • Modbus - Fieldbus industriale alternativo
  • Siemens S7 - Protocollo S7 diretto per PLC Siemens
  • OPC UA - Astrazione moderna sui dati PROFINET/S7
  • Validation - Gestisci a valle durante le riconnessioni
  • Predictive - Analisi predittive su segnali PROFINET