Para activar alarmas PROFINET con CODESYS en un Raspberry PLC, convierte el Raspberry PLC en IO-controller con CODESYS Control for Raspberry Pi SL, instala el archivo GSDML de la aplicación de ejemplo de p-net, añade el dispositivo con un módulo DIO 8xLogicLevel y ejecuta pn_dev en el IO-device. Cada vez que el Button2 del IO-device pasa a 1, el dispositivo envía el siguiente evento de su secuencia de demostración: una alarma de proceso, entradas de diagnóstico, una entrada en el registro y la interrupción de la conexión. CODESYS las muestra en las pestañas Log y Status.
Esta es la parte 2 del tutorial de PROFINET para el Raspberry PLC. En la parte 1 compilaste p-net y ejecutaste la aplicación de ejemplo del IO-device en Linux. Aquí CODESYS en el Raspberry PLC se conecta a ese dispositivo, intercambia datos cíclicos cada pocos milisegundos y recibe sus alarmas.
Qué montas en este tutorial
| Equipo | Función | Dirección IP |
|---|---|---|
| PC con Windows y CODESYS Development System V3.5 | Programa y configura el IO-controller. No participa en el intercambio PROFINET | 192.168.0.60 |
| Raspberry PLC con CODESYS Control for Raspberry Pi SL | IO-controller PROFINET | 192.168.0.100 |
| Segundo Raspberry PLC, o una Raspberry Pi | IO-device PROFINET con la aplicación de ejemplo de p-net (nombre de estación rt-labs-dev) | 192.168.0.50 |
El IO-device intercambia un byte en cada sentido con el controlador. En el byte de entrada, los bits 0 a 6 son un contador y el bit 7 es el Button1. En el byte de salida, el bit 7 controla el LED de datos del dispositivo. El programa de CODESYS de más abajo hace parpadear ese LED, y el Button1 activa y desactiva el parpadeo.
- Dos unidades de Raspberry PLC con Ethernet, o un Raspberry PLC y una Raspberry Pi, con su fuente de alimentación
- Un switch Ethernet y tres cables Ethernet
- Un PC con Windows, CODESYS Development System V3.5 y el paquete CODESYS Control for Raspberry Pi SL
- Acceso a Internet en el IO-device para descargar p-net, por LAN o por Wi-Fi

Dónde se sitúa PROFINET en el modelo ISO/OSI
PROFINET usa dos caminos. La configuración, los parámetros y las lecturas y escrituras acíclicas van por UDP/IP, como cualquier otra aplicación IP. Los datos de E/S cíclicos y las alarmas de PROFINET Real-Time se saltan las capas de red y de transporte y van directamente en tramas Ethernet con el Ethertype 0x8892. Ese camino corto es lo que permite ciclos de pocos milisegundos con hardware Ethernet estándar.

Para los canales de PROFINET, el papel de LLDP y DCP y los límites de p-net, consulta la parte 1. Para comparar PROFINET con otros protocolos de Ethernet industrial, lee EtherNet/IP vs PROFINET vs Modbus TCP.
Prepara el IO-controller: CODESYS en el Raspberry PLC
- Conecta el PC al puerto Ethernet lateral (eth0) del Raspberry PLC. El PLC responde en 10.10.10.20 por defecto, así que da al PC una dirección de esa red y conéctate por SSH:
ssh [email protected] - Asigna a la eth0 del Raspberry PLC la dirección 192.168.0.100/24, siguiendo cómo configurar una IP estática en un Raspberry PLC. Después, da al PC la dirección 192.168.0.60/24.
- En el PC, instala CODESYS Development System V3.5 y el paquete CODESYS Control for Raspberry Pi SL, e instala el runtime en el PLC con Tools > Update Raspberry Pi (Deploy Control SL en las versiones recientes). Configurar CODESYS para un Raspberry Pi PLC explica cada paso, las versiones que debes usar y las condiciones de la licencia.
- Crea un Standard project, selecciona el dispositivo CODESYS Control for Raspberry Pi SL y el lenguaje Structured Text (ST). Usa la misma variante del runtime en el proyecto y en el PLC: SL (un núcleo) o SL MC (multinúcleo). Con variantes distintas, CODESYS no encuentra el controlador.
- Haz doble clic en Device, abre la pestaña Scan Network y selecciona el Raspberry PLC. El indicador se pone verde. Para comprobar el enlace, usa Send Echo Service en la pestaña Device.

Modo demo. Sin licencia, el runtime de CODESYS funciona dos horas y después se detiene. Reinícialo, o reinicia el PLC, para tener otras dos horas.
Añade el controlador PROFINET y el dispositivo p-net en CODESYS
- Copia al PC el archivo GSDML de la aplicación de ejemplo. Está en la carpeta de p-net que clonaste en el IO-device en la parte 1,
p-net/sample_app/GSDML-V2.4-RT-Labs-P-Net-Sample-App-20220324.xml. Desde el PC:
También puedes descargarlo del tag v0.2.0 del repositorio de p-net. No uses el enlace antiguo ascp [email protected]:/home/pi/profinet/p-net/sample_app/GSDML-V2.4-RT-Labs-P-Net-Sample-App-20220324.xml .samples/pn_devde la rama master: esa carpeta ya no existe. - En CODESYS, abre Tools > Device Repository, pulsa Install y selecciona el archivo GSDML.
- Haz clic derecho en Device (CODESYS Control for Raspberry Pi SL) > Add Device > Ethernet Adapter > Ethernet.
- Haz clic derecho en Ethernet > Add Device > PROFINET IO Master > PN-Controller.
- Haz clic derecho en PN_Controller > Add Device > P-Net Sample App.
- Haz clic derecho en P_Net_Sample_App > Add Device > DIO 8xLogicLevel. Este módulo tiene 8 entradas digitales y 8 salidas digitales.
- Haz doble clic en Ethernet y selecciona la interfaz eth0. CODESYS lee su dirección IP, 192.168.0.100.
- Haz doble clic en PN_Controller y pon tanto First IP como Last IP en 192.168.0.50, la dirección del IO-device. No incluyas la dirección del PC en este rango.
- Haz doble clic en P_Net_Sample_App y, en la pestaña General, pon la dirección IP 192.168.0.50. El nombre de estación debe ser
rt-labs-dev, el nombre que propone el archivo GSDML y quepn_devusa por defecto.
Programa en Structured Text: hacer parpadear el LED de datos del IO-device
Abre Application > PLC_PRG (PRG). El editor tiene la parte de declaración arriba y el cuerpo del programa abajo.
Parte de declaración:
PROGRAM PLC_PRG
VAR
in_pin_button_LED : BOOL; (* Input Bit 7: Button1 of the IO-device *)
out_pin_LED : BOOL; (* Output Bit 7: data LED of the IO-device *)
in_pin_button_LED_previous : BOOL;
flashing : BOOL := TRUE;
oscillator_state : BOOL := FALSE;
oscillator_cycles : UINT := 0;
END_VAR
Cuerpo del programa:
oscillator_cycles := oscillator_cycles + 1;
IF oscillator_cycles > 200 THEN
oscillator_cycles := 0;
oscillator_state := NOT oscillator_state;
END_IF;
IF in_pin_button_LED = TRUE THEN
IF in_pin_button_LED_previous = FALSE THEN
flashing := NOT flashing;
END_IF;
out_pin_LED := TRUE;
ELSIF flashing = TRUE THEN
out_pin_LED := oscillator_state;
ELSE
out_pin_LED := FALSE;
END_IF;
in_pin_button_LED_previous := in_pin_button_LED;
Con la tarea de 4 ms del siguiente paso, la salida cambia cada 200 ciclos, unos 0,8 s. Cuando el Button1 pasa a 1, el LED queda encendido y el parpadeo se activa o se desactiva. Es el programa de la documentación de p-net, con END_IF; en la forma estándar IEC 61131-3. Lo hemos compilado sin errores con matiec, el compilador IEC 61131-3 de código abierto. No lo hemos ejecutado en CODESYS para esta edición.
Asigna las E/S, configura las tareas y descarga el programa
- Haz clic derecho en DIO_8xLogicLevel > Edit IO mapping. Despliega Input 8 bits, haz doble clic en el icono de Input Bit 7, pulsa [...] y selecciona Application > PLC_PRG > in_pin_button_LED.
- Del mismo modo, asigna Output Bit 7 a out_pin_LED.
- Abre Application > Task Configuration > MainTask y selecciona Cyclic, 4 ms.
- Abre Profinet_CommunicationTask y selecciona Cyclic, 10 ms. La documentación de p-net usa la prioridad 14.
- Usa Build > Generate Code.
- Usa Online > Login y responde Yes para descargar la aplicación al PLC. Después usa Debug > Start.
- Sigue el registro del controlador en Tools > Update Raspberry Pi > System Info, en el cuadro Runtime Info. Muestra un error si el controlador no encuentra el IO-device.
Cuando el controlador está configurado, puedes apagar el PC. El PLC conserva la aplicación. Mientras el IO-device no responde, el controlador envía tramas LLDP cada 5 segundos y, cada 15 segundos, una petición ARP para 192.168.0.50 y una petición DCP para el nombre de estación rt-labs-dev. Puedes verlas con la captura de tshark de la parte 1.
Ejecuta el IO-device p-net con botones simulados
En el IO-device, compila p-net v0.2.0 como en la parte 1. En resumen:
sudo apt update
sudo apt install -y git cmake build-essential
mkdir -p /home/pi/profinet
cd /home/pi/profinet
git clone --branch v0.2.0 --recurse-submodules https://github.com/rtlabs-com/p-net.git
cmake -B build -S p-net -DBUILD_TESTING=OFF
cmake --build build --target install
La rama por defecto de p-net ya no tiene el sistema de compilación ni la aplicación de ejemplo, así que clona el tag v0.2.0. La primera edición de este post clonaba la rama por defecto e instalaba cmake con snap: esos comandos ya no generan pn_dev. Hemos compilado estos comandos con cmake 3.28 y gcc 13 en Linux x86, y pn_dev -h indica la revisión 0.2.0 de p-net. No hemos repetido la compilación en un Raspberry PLC (ARM).
- Activa eth0 con su dirección inicial y haz que NetworkManager deje de gestionarla, para que el controlador pueda asignar el nombre y la dirección con DCP:
sudo nmcli device set eth0 managed no sudo ip link set eth0 up sudo ip addr add 192.168.0.50/24 dev eth0 - Crea dos archivos de texto que sustituyen a los botones. En un Raspberry PLC, no uses los GPIO 27 y 22 para botones como en una Raspberry Pi normal: el PLC usa sus GPIO.
cd /home/pi/profinet/build touch button1.txt button2.txt - Arranca la aplicación de ejemplo en segundo plano, con los archivos de los botones:
sudo ./pn_dev -v -b /home/pi/profinet/build/button1.txt -d /home/pi/profinet/build/button2.txt & - Observa el LED de datos, que el script
set_profinet_ledsescribe en un archivo de texto de la carpeta build:watch -n 0.1 cat /home/pi/profinet/build/pnet_led_1.txt
Cuando el controlador se conecta, pnet_led_1.txt cambia entre 0 y 1. Escribe 1 y después 0 en button1.txt para activar o desactivar el parpadeo:
echo 1 > /home/pi/profinet/build/button1.txt
echo 0 > /home/pi/profinet/build/button1.txt
Para detener la aplicación, ejecuta sudo pkill pn_dev.
Activa alarmas PROFINET desde el IO-device
El Button2 ejecuta una secuencia de demostración en la aplicación de ejemplo. Cada vez que button2.txt pasa de 0 a 1, el dispositivo hace el siguiente paso y lo muestra en su consola:
echo 1 > /home/pi/profinet/build/button2.txt
echo 0 > /home/pi/profinet/build/button2.txt
| Pulsación | Qué hace el IO-device |
|---|---|
| 1 | Envía una alarma de proceso desde el módulo de entradas, con USI 0x0010 y un byte de datos que aumenta con cada alarma |
| 2 y 3 | Pone el estado de los datos cíclicos en backup y redundante, y después vuelve a primario y no redundante |
| 4 y 5 | Añade un diagnóstico de canal estándar (canal 4, tipo de error cortocircuito, gravedad fallo) y después lo actualiza |
| 6, 7 y 8 | Añade, actualiza y elimina un diagnóstico en formato USI |
| 9 | Elimina el diagnóstico de canal estándar |
| 10 | Escribe una entrada en el registro (logbook) del dispositivo |
| 11 | Interrumpe la conexión (AR). Normalmente el controlador se vuelve a conectar, y la siguiente pulsación vuelve a enviar una alarma de proceso |
El dispositivo solo envía una nueva alarma de proceso cuando el controlador ha confirmado la anterior. En CODESYS, las alarmas de proceso y de diagnóstico aparecen en la pestaña Log del dispositivo Raspberry Pi, de PN_Controller y de P_Net_Sample_App, y en la pestaña Status del módulo conectado. En la red, la alarma es una trama Alarm Notification del dispositivo, seguida de un Alarm Ack del controlador.
Solución de problemas de la conexión entre CODESYS y p-net
| Síntoma | Qué comprobar |
|---|---|
| El dispositivo "Codesys Control for Raspberry Pi SL" no aparece en la lista | El paquete de Raspberry Pi no está instalado. Instálalo y reinicia CODESYS. |
| Scan Network no encuentra el PLC | Misma variante del runtime (SL o SL MC) en el proyecto y en el PLC, dirección del PC en la misma red, runtime en marcha. |
| El controlador no encuentra el IO-device | Nombre de estación rt-labs-dev, First IP y Last IP en 192.168.0.50, pn_dev en marcha, NetworkManager sin gestionar eth0 en el dispositivo. |
PNET_EVENT_ABORT con código de error 5 o 6 en el dispositivo | Timeouts en Linux sin parches de tiempo real. Aumenta el reduction ratio y el tiempo de watchdog en la pestaña General de P_Net_Sample_App, y después bájalos paso a paso. |
| La conexión se detiene a las dos horas | Modo demo de CODESYS. Reinicia el runtime o añade una licencia. |
| cmake falla en el IO-device | Has clonado la rama por defecto. Clona el tag v0.2.0. |
La documentación de p-net v0.2.0, con más detalles de CODESYS, está en la carpeta doc del repositorio clonado (using_codesys.rst y codesys_details.rst).
Usa el Raspberry PLC como pasarela entre protocolos. Con CODESYS, el mismo PLC puede ser IO-controller PROFINET, maestro Modbus TCP o RTU y enlace con un sistema superior. Para ver un Raspberry PLC que recoge datos de protocolos de campo y los reenvía, lee el caso de la pasarela de datos a bordo.
Preguntas frecuentes sobre PROFINET con CODESYS en el Raspberry PLC
¿Puede un Raspberry PLC ser IO-controller PROFINET?
Sí. CODESYS Control for Raspberry Pi SL funciona en el Linux del Raspberry PLC, y el controlador PROFINET de CODESYS se conecta a IO-devices descritos por un archivo GSDML, como en este tutorial.
¿Qué es un archivo GSDML?
Un archivo XML que describe un IO-device PROFINET a la herramienta de ingeniería del controlador: módulos, datos de E/S, tiempos, alarmas y nombre de estación. La aplicación de ejemplo de p-net incluye su propio archivo GSDML.
¿Cómo envía un IO-device una alarma al PLC?
Por el canal de alarmas de la conexión PROFINET. El dispositivo envía un Alarm Notification con slot, subslot y datos, y el controlador responde con un Alarm Ack. En la aplicación de ejemplo de p-net, el Button2 envía una alarma de proceso.
¿Qué tiempo de ciclo puedo usar con p-net en Linux?
El archivo GSDML de la aplicación de ejemplo declara un send clock de 1 ms. En Linux sin parches de tiempo real, usa un reduction ratio para ralentizar el intercambio si la conexión se interrumpe por timeouts.
¿Necesito el PC con Windows cuando el controlador ya funciona?
No. El PC programa el controlador. Después de la descarga puedes apagarlo, y el Raspberry PLC sigue ejecutando la aplicación.
Más sobre el Raspberry PLC en redes industriales
- PROFINET en Linux: ejecutar la pila de IO-device p-net (parte 1)
- Configurar CODESYS para un Raspberry Pi PLC
- Programación en Ladder con CODESYS en un Raspberry PLC
- Cómo comprobar la configuración Ethernet
- Cómo elegir un controlador industrial
Elige el modelo y la combinación de E/S en la familia Raspberry PLC.