Conector PROFINET
Descripción General
Sección titulada «Descripción General»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 IOProfinetWriter- Escribe datos de registro en dispositivos PROFINET IO
Características
Sección titulada «Características»- ✅ 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
Configuración Básica
Sección titulada «Configuración Básica»Lector PROFINET
Sección titulada «Lector PROFINET»{ "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 } ]}Escritor PROFINET
Sección titulada «Escritor PROFINET»{ "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 } ]}Parámetros de Configuración
Sección titulada «Parámetros de Configuración»Endpoint
Sección titulada «Endpoint»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.
Polling Rate
Sección titulada «Polling Rate»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.
Timeout
Sección titulada «Timeout»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
Variables
Sección titulada «Variables»Cada variable describe una dirección de registro y su codificación en el cable.
Estructura de Variable
Sección titulada «Estructura de Variable»{ "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4}| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
key | string | Sí | Clave de carga de Meddle |
slot | uint16 | Sí | Número de slot PROFINET |
subslot | uint16 | Sí | Número de subslot PROFINET |
index | uint16 | Sí | Índice de registro |
dataType | string | Sí | Codificación (ver abajo) |
length | uint16 | Sí | Número de bytes a leer/escribir |
Direccionamiento Slot / Subslot / Index
Sección titulada «Direccionamiento Slot / Subslot / Index»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.
Tipos de Datos
Sección titulada «Tipos de Datos»El conector decodifica los bytes del registro usando orden de bytes big-endian (convención PROFINET):
{ "dataType": "Bool", "length": 1 }1 byte; 0x00 → false, cualquier otra cosa → 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 }Todos los enteros multi-byte son big-endian.
{ "dataType": "Float32", "length": 4 }{ "dataType": "Float64", "length": 8 }Coma flotante IEEE 754, big-endian.
{ "dataType": "OctetString", "length": 32 }Bytes en bruto interpretados como cadena UTF-8. length controla el máximo de bytes leídos; la longitud real de respuesta del dispositivo determina cuántos se devuelven.
Tipos soportados:
| Tipo | Bytes | Tipo de salida 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 | variable | string |
Flujo de Datos
Sección titulada «Flujo de Datos»Flujo de Datos del Lector
Sección titulada «Flujo de Datos del Lector»Dispositivo PROFINET → ProfinetReader (RPC ReadRecord) → valores decodificados → Carga de MeddleEjemplo:
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}Flujo de Datos del Escritor
Sección titulada «Flujo de Datos del Escritor»Carga de Meddle → ProfinetWriter (codifica + RPC WriteRecord) → Dispositivo PROFINETEjemplo:
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.
Casos de Uso Comunes
Sección titulada «Casos de Uso Comunes»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 } ]}2. Envío de Setpoints a un Variador
Sección titulada «2. Envío de Setpoints a un Variador»{ "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. Lectura desde Múltiples Submódulos
Sección titulada «3. Lectura desde Múltiples Submódulos»{ "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 } ]}Solución de Problemas
Sección titulada «Solución de Problemas»ErrProfinetConnect al Arranque
Sección titulada «ErrProfinetConnect al Arranque»Problema: No se puede establecer una Application Relation (AR) con el dispositivo
Soluciones:
- Verifica la IP y el puerto del dispositivo:
ping 192.168.0.50ync -zv -u 192.168.0.50 34964 - Confirma que la pila PROFINET del dispositivo está corriendo y no en estado de fallo
- 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)
- 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:
- Verifica el slot/subslot/index contra el archivo GSDML del dispositivo
- Comprueba que el
lengthconfigurado coincide con el tamaño real del registro en el dispositivo - Algunos índices son sólo de escritura o están protegidos — consulta la documentación del dispositivo
insufficient data for <type>
Sección titulada «insufficient data for <type>»Problema: El dispositivo devolvió menos bytes de los que el tipo de dato requiere
Soluciones:
- Aumenta
lengthpara la variable para que coincida con el tamaño de respuesta del dispositivo - Para OctetString,
lengthes un máximo; para tipos de ancho fijo debe ser igual al recuento de bytes del tipo - Algunos dispositivos rellenan las respuestas — asegúrate de que
lengthsea al menos el mínimo requerido (ej. 4 para Float32)
Conexión Perdida a Mitad de Lectura
Sección titulada «Conexión Perdida a Mitad de Lectura»Problema: Aparecen errores ErrProfinetDisconnected tras un periodo de operación normal
Soluciones:
- El conector se reconecta automáticamente en el siguiente ciclo de sondeo — espera una breve interrupción y reanuda
- Si las desconexiones son frecuentes, comprueba la red PROFINET por problemas de cable, sobrecarga de switch o direcciones IP duplicadas
- Aumenta
timeoutpara redes de alta latencia
Valores Erróneos para Tipos Multi-Byte
Sección titulada «Valores Erróneos para Tipos Multi-Byte»Problema: Los valores Int32/Float son claramente erróneos (magnitudes enormes, NaN, signo equivocado)
Soluciones:
- 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) - Confirma que el tipo de dato coincide con la declaración GSDML
Mejores Prácticas
Sección titulada «Mejores Prácticas»1. Consulta Siempre el GSDML
Sección titulada «1. Consulta Siempre el 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
3. Sé Conservador con las Tasas de Sondeo
Sección titulada «3. Sé Conservador con las Tasas de Sondeo»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.
5. Codifica las Escrituras Defensivamente
Sección titulada «5. Codifica las Escrituras Defensivamente»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.
Flujos de Trabajo de Ejemplo
Sección titulada «Flujos de Trabajo de Ejemplo»Pipeline de Monitoreo de Variador PROFINET
Sección titulada «Pipeline de Monitoreo de Variador PROFINET»ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer └→ Isa182 → Alert- ProfinetReader: Lee
temperature,current,vibrationde un variador a 1Hz - Validation: Asegura que todas las señales están presentes y son numéricas
- Reshape: Etiqueta con
asset_id,line,area - Predictive: Calcula tendencias y RUL para
temperatureyvibration - InfluxDb2Writer: Almacenamiento a largo plazo
- Isa182: Dispara alarma con degradación del health score
- 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) → ProfinetWriterProfinetReader → 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.
Conectores Relacionados
Sección titulada «Conectores Relacionados»- 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
Recursos Adicionales
Sección titulada «Recursos Adicionales»- Especificación PROFINET (PI)
- IEC 61158 - Estándar del protocolo PROFINET
- Especificación GSDML - General Station Description Markup Language
- Disector PROFINET de Wireshark