Connettore PROFINET
Panoramica
Sezione intitolata “Panoramica”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 IOProfinetWriter- Scrive record data su dispositivi PROFINET IO
Caratteristiche
Sezione intitolata “Caratteristiche”- ✅ 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
Configurazione di Base
Sezione intitolata “Configurazione di Base”PROFINET Reader
Sezione intitolata “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
Sezione intitolata “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 } ]}Parametri di Configurazione
Sezione intitolata “Parametri di Configurazione”Endpoint
Sezione intitolata “Endpoint”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.
Polling Rate
Sezione intitolata “Polling Rate”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.
Timeout
Sezione intitolata “Timeout”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
Variabili
Sezione intitolata “Variabili”Ogni variabile descrive un indirizzo di record e la sua codifica sulla linea.
Struttura della Variabile
Sezione intitolata “Struttura della Variabile”{ "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4}| Campo | Tipo | Richiesto | Descrizione |
|---|---|---|---|
key | string | Sì | Chiave del payload Meddle |
slot | uint16 | Sì | Numero di slot PROFINET |
subslot | uint16 | Sì | Numero di subslot PROFINET |
index | uint16 | Sì | Indice record |
dataType | string | Sì | Codifica (vedi sotto) |
length | uint16 | Sì | Numero di byte da leggere/scrivere |
Indirizzamento Slot / Subslot / Index
Sezione intitolata “Indirizzamento Slot / Subslot / Index”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.
Tipi di Dato
Sezione intitolata “Tipi di Dato”Il connettore decodifica i byte del record utilizzando l’ordine di byte big-endian (convenzione PROFINET):
{ "dataType": "Bool", "length": 1 }1 byte; 0x00 → false, qualsiasi altro valore → 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 }Tutti gli interi multi-byte sono big-endian.
{ "dataType": "Float32", "length": 4 }{ "dataType": "Float64", "length": 8 }Floating point IEEE 754, big-endian.
{ "dataType": "OctetString", "length": 32 }Byte raw interpretati come stringa UTF-8. La length controlla il numero massimo di byte letti; la lunghezza effettiva della risposta del dispositivo governa quanti vengono restituiti.
Tipi supportati:
| Tipo | Byte | Tipo di output Go |
|---|---|---|
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 | variabile | string |
Flusso di Dati
Sezione intitolata “Flusso di Dati”Flusso Dati Reader
Sezione intitolata “Flusso Dati Reader”Dispositivo PROFINET → ProfinetReader (RPC ReadRecord) → valori decodificati → Payload MeddleEsempio:
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}Flusso Dati Writer
Sezione intitolata “Flusso Dati Writer”Payload Meddle → ProfinetWriter (codifica + RPC WriteRecord) → Dispositivo PROFINETEsempio:
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.
Casi d’Uso Comuni
Sezione intitolata “Casi d’Uso Comuni”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 } ]}2. Invio di Setpoint a un Drive
Sezione intitolata “2. Invio di Setpoint a un Drive”{ "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. Lettura da Più Sottomoduli
Sezione intitolata “3. Lettura da Più Sottomoduli”{ "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 } ]}Risoluzione dei Problemi
Sezione intitolata “Risoluzione dei Problemi”ErrProfinetConnect all’Avvio
Sezione intitolata “ErrProfinetConnect all’Avvio”Problema: Impossibile stabilire una Application Relation (AR) con il dispositivo
Soluzioni:
- Verifica l’IP e la porta del dispositivo:
ping 192.168.0.50enc -zv -u 192.168.0.50 34964 - Conferma che lo stack PROFINET del dispositivo sia in esecuzione e non in stato di fault
- 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)
- Usa uno strumento come Wireshark con il dissector PROFINET per ispezionare l’handshake di connessione
ErrProfinetReadFailed su una Variabile Specifica
Sezione intitolata “ErrProfinetReadFailed su una Variabile Specifica”Problema: Una variabile restituisce un errore mentre altre hanno successo
Soluzioni:
- Verifica slot/subslot/index rispetto al file GSDML del dispositivo
- Controlla che la
lengthconfigurata corrisponda alla dimensione effettiva del record sul dispositivo - Alcuni indici sono write-only o protetti — consulta la documentazione del dispositivo
insufficient data for <type>
Sezione intitolata “insufficient data for <type>”Problema: Il dispositivo ha restituito meno byte di quelli richiesti dal tipo di dato
Soluzioni:
- Aumenta
lengthper la variabile per corrispondere alla dimensione della risposta del dispositivo - Per OctetString,
lengthè un massimo; per tipi a larghezza fissa deve essere uguale al conteggio di byte del tipo - Alcuni dispositivi fanno padding delle risposte — assicurati che
lengthsia almeno il minimo richiesto (es. 4 per Float32)
Connessione Persa a Metà Lettura
Sezione intitolata “Connessione Persa a Metà Lettura”Problema: Errori ErrProfinetDisconnected appaiono dopo un periodo di funzionamento normale
Soluzioni:
- Il connettore si riconnette automaticamente al prossimo ciclo di polling — aspettati un breve gap e ripresa
- Se le disconnessioni sono frequenti, controlla la rete PROFINET per problemi di cavo, sovraccarico switch o indirizzi IP duplicati
- Aumenta
timeoutper reti ad alta latenza
Valori Errati per Tipi Multi-Byte
Sezione intitolata “Valori Errati per Tipi Multi-Byte”Problema: I valori Int32/Float sono ovviamente errati (magnitudine enorme, NaN, segno errato)
Soluzioni:
- 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) - Conferma che il tipo di dato corrisponda alla dichiarazione GSDML
Migliori Pratiche
Sezione intitolata “Migliori Pratiche”1. Consulta Sempre il GSDML
Sezione intitolata “1. Consulta Sempre il 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
3. Sii Conservativo con le Frequenze di Polling
Sezione intitolata “3. Sii Conservativo con le Frequenze di Polling”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.
4. Gestisci le Riconnessioni con Grazia a Valle
Sezione intitolata “4. Gestisci le Riconnessioni con Grazia a Valle”Usa un connettore Filter o Validation dopo il reader per gestire l’elaborazione ulteriore durante le finestre di riconnessione.
5. Codifica le Scritture in Modo Difensivo
Sezione intitolata “5. Codifica le Scritture in Modo Difensivo”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.
Esempi di Flussi
Sezione intitolata “Esempi di Flussi”Pipeline di Monitoraggio Drive PROFINET
Sezione intitolata “Pipeline di Monitoraggio Drive PROFINET”ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer └→ Isa182 → Alert- ProfinetReader: Legge
temperature,current,vibrationda un drive a 1Hz - Validation: Assicura che tutti i segnali siano presenti e numerici
- Reshape: Tagga con
asset_id,line,area - Predictive: Calcola trend e RUL per
temperatureevibration - InfluxDb2Writer: Archiviazione a lungo termine
- Isa182: Attiva allarme su degrado dello score di salute
- Alert: Notifica la manutenzione
Controllo di Setpoint PROFINET a Loop Chiuso
Sezione intitolata “Controllo di Setpoint PROFINET a Loop Chiuso”ScriptReader (logica di controllo) → ProfinetWriterProfinetReader → 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.
Connettori Correlati
Sezione intitolata “Connettori Correlati”- 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
Risorse Aggiuntive
Sezione intitolata “Risorse Aggiuntive”- Specifica PROFINET (PI)
- IEC 61158 - Standard del protocollo PROFINET
- Specifica GSDML - General Station Description Markup Language
- Dissector Wireshark PROFINET