Ir al contenido

Conector PROFINET

El conector PROFINET habilita la comunicación con dispositivos PROFINET IO usando direccionamiento por slot/subslot/index según define la IEC 61158. Habla el protocolo DCE-RPC de PROFINET sobre UDP, estableciendo una Application Relation (AR) con el dispositivo destino e intercambiando lecturas y escrituras de record-data.

Tipos de Conector:

  • ProfinetReader - Sondea datos de registro de dispositivos PROFINET IO
  • ProfinetWriter - Escribe datos de registro en dispositivos PROFINET IO
  • ✅ Lectura/escritura de datos de registro PROFINET IO mediante direccionamiento slot/subslot/index
  • ✅ Transporte DCE-RPC sobre UDP
  • ✅ Gestión de Application Relation (AR) con reconexión automática
  • ✅ Decodificación binaria big-endian para todos los tipos primitivos
  • ✅ Amplio soporte de tipos de dato: Bool, Int8/16/32, UInt8/16/32, Float32/64, OctetString
  • ✅ Tasa de sondeo y timeout por llamada configurables
{
"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
}
]
}

La dirección IP y el puerto DCE-RPC de PROFINET del dispositivo destino.

{ "endpoint": "192.168.0.50:34964" }

Formato: host:puerto. El puerto DCE-RPC por defecto de PROFINET es 34964. Algunos dispositivos escuchan en puertos alternativos — consulta el archivo GSD del dispositivo.

Obligatorio para el lector. El intervalo en milisegundos entre lecturas sucesivas.

{ "pollingRate": 1000 }

Valores recomendados:

  • Datos de diagnóstico rápidos: 100-500ms
  • Variables de proceso: 500-2000ms
  • Telemetría lenta: 5000ms+

Los dispositivos PROFINET IO generalmente toleran tasas de sondeo altas, pero la LAN y el presupuesto de respuesta del dispositivo son límites reales.

Opcional. Timeout RPC por llamada en milisegundos. El valor por defecto depende de la implementación.

{ "timeout": 5000 }

Valores recomendados:

  • Dispositivos en LAN local: 1000-3000ms
  • Dispositivos detrás de NAT o relay: 5000-10000ms

Cada variable describe una dirección de registro y su codificación en el cable.

{
"key": "temperature",
"slot": 1,
"subslot": 1,
"index": 100,
"dataType": "Float32",
"length": 4
}
CampoTipoObligatorioDescripción
keystringClave de carga de Meddle
slotuint16Número de slot PROFINET
subslotuint16Número de subslot PROFINET
indexuint16Índice de registro
dataTypestringCodificación (ver abajo)
lengthuint16Número de bytes a leer/escribir

Los dispositivos PROFINET IO modelan sus E/S como una jerarquía:

  • Slot: Una “tarjeta” lógica dentro del dispositivo. El Slot 0 está reservado para el dispositivo en sí (DAP)
  • Subslot: Un submódulo dentro del slot. El Subslot 1 es típicamente la E/S primaria
  • Index: Un registro específico en ese submódulo, definido en el archivo GSDML del dispositivo

Consulta el archivo GSDML (General Station Description Markup Language) que se entrega con el dispositivo para el mapa de direccionamiento.

El conector decodifica los bytes del registro usando orden de bytes big-endian (convención PROFINET):

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

1 byte; 0x00false, cualquier otra cosa → true.

Tipos soportados:

TipoBytesTipo de salida Go
Bool1bool
Int81int8
UInt81uint8
Int162int16
UInt162uint16
Int324int32
UInt324uint32
Float324float32
Float648float64
OctetStringvariablestring
Dispositivo PROFINET → ProfinetReader (RPC ReadRecord) → valores decodificados → Carga de Meddle

Ejemplo:

Configuración del lector:

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

Carga de salida:

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

Ejemplo:

Carga de entrada:

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

Cada clave que coincide con un variable.key configurado se codifica según su dataType y se escribe vía WriteRecord. Las claves no presentes en la lista de variables se ignoran.

1. Lectura de Datos de Diagnóstico de un Módulo PROFINET IO

Sección titulada «1. Lectura de Datos de Diagnóstico de un Módulo 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: No se puede establecer una Application Relation (AR) con el dispositivo

Soluciones:

  1. Verifica la IP y el puerto del dispositivo: ping 192.168.0.50 y nc -zv -u 192.168.0.50 34964
  2. Confirma que la pila PROFINET del dispositivo está corriendo y no en estado de fallo
  3. Comprueba que el dispositivo no esté ya en una AR con otro controlador (los dispositivos PROFINET típicamente permiten un número limitado de ARs concurrentes)
  4. Usa una herramienta como Wireshark con el disector PROFINET para inspeccionar el handshake de conexión

ErrProfinetReadFailed en una Variable Específica

Sección titulada «ErrProfinetReadFailed en una Variable Específica»

Problema: Una variable devuelve error mientras otras tienen éxito

Soluciones:

  1. Verifica el slot/subslot/index contra el archivo GSDML del dispositivo
  2. Comprueba que el length configurado coincide con el tamaño real del registro en el dispositivo
  3. Algunos índices son sólo de escritura o están protegidos — consulta la documentación del dispositivo

Problema: El dispositivo devolvió menos bytes de los que el tipo de dato requiere

Soluciones:

  1. Aumenta length para la variable para que coincida con el tamaño de respuesta del dispositivo
  2. Para OctetString, length es un máximo; para tipos de ancho fijo debe ser igual al recuento de bytes del tipo
  3. Algunos dispositivos rellenan las respuestas — asegúrate de que length sea al menos el mínimo requerido (ej. 4 para Float32)

Problema: Aparecen errores ErrProfinetDisconnected tras un periodo de operación normal

Soluciones:

  1. El conector se reconecta automáticamente en el siguiente ciclo de sondeo — espera una breve interrupción y reanuda
  2. Si las desconexiones son frecuentes, comprueba la red PROFINET por problemas de cable, sobrecarga de switch o direcciones IP duplicadas
  3. Aumenta timeout para redes de alta latencia

Problema: Los valores Int32/Float son claramente erróneos (magnitudes enormes, NaN, signo equivocado)

Soluciones:

  1. El formato de cable PROFINET es siempre big-endian. No hay conmutador de orden de bytes. Si la documentación del dispositivo afirma little-endian, comprueba si es un registro específico del proveedor (los registros del proveedor pueden usar otras codificaciones — decodifica externamente con un Transform)
  2. Confirma que el tipo de dato coincide con la declaración GSDML

Las asignaciones de slot, subslot e index son específicas del dispositivo. El GSDML es la fuente canónica — no infieras el direccionamiento.

2. Usa Slot 0 / Subslot 1 para Registros de Nivel de Dispositivo

Sección titulada «2. Usa Slot 0 / Subslot 1 para Registros de Nivel de Dispositivo»

Convencionalmente:

  • Slot 0 = DAP (Device Access Point) — identidad del dispositivo, diagnósticos, registros de sistema
  • Slot N, Subslot 1 = E/S primaria del N-ésimo submódulo de E/S

Los dispositivos PROFINET IO procesan los datos de registro a través de la capa de aplicación, no del canal cíclico de E/S — por lo que sondear demasiado agresivamente puede inanir la ruta cíclica. 500-2000ms es típico para sondeo de registros.

4. Maneja las Reconexiones Adecuadamente Aguas Abajo

Sección titulada «4. Maneja las Reconexiones Adecuadamente Aguas Abajo»

Usa un conector Filter o Validation después del lector para filtrar el procesado posterior durante las ventanas de reconexión.

Al publicar setpoints, pre-acota los valores aguas arriba con un Transform o Reshape para que datos fuera de rango nunca lleguen al escritor. Los dispositivos PROFINET pueden rechazar (o peor, aceptar) valores extremos de forma inconsistente.

ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer
└→ Isa182 → Alert
  1. ProfinetReader: Lee temperature, current, vibration de un variador a 1Hz
  2. Validation: Asegura que todas las señales están presentes y son numéricas
  3. Reshape: Etiqueta con asset_id, line, area
  4. Predictive: Calcula tendencias y RUL para temperature y vibration
  5. InfluxDb2Writer: Almacenamiento a largo plazo
  6. Isa182: Dispara alarma con degradación del health score
  7. Alert: Notifica a mantenimiento

Control de Setpoint PROFINET en Lazo Cerrado

Sección titulada «Control de Setpoint PROFINET en Lazo Cerrado»
ScriptReader (lógica de control) → ProfinetWriter
ProfinetReader → ScriptReader (bucle de realimentación)

Un conector Script lee las entradas PROFINET, calcula una salida de control y la escribe de vuelta a través del escritor PROFINET — un bucle de supervisión clásico.

  • Modbus - Bus de campo industrial alternativo
  • Siemens S7 - Protocolo S7 directo para PLCs Siemens
  • OPC UA - Abstracción moderna sobre datos PROFINET/S7
  • Validation - Filtra aguas abajo durante reconexiones
  • Predictive - Analítica predictiva sobre señales PROFINET