Introducción
PROFINET es una solución de Ethernet industrial abierta basada en estándares internacionales. Es un protocolo de comunicación diseñado para intercambiar datos entre controladores y dispositivos en un entorno de automatización para el control industrial.
En este post, ejecutaremos la pila de dispositivos PROFINET de p-net y su aplicación de ejemplo en la industria PLC Raspberry como dispositivo IO, y configuraremos un segundo PLC industrial Raspberry Pi como controlador IO con Codesys.
Enlaces relacionados
PROFINET
PROFINET es un estándar técnico de la industria para la comunicación de datos a través de Ethernet industrial, diseñado para la recogida de datos y el control de los equipos en los sistemas industriales, con especial fuerza en la entrega de datos bajo restricciones de tiempo. PROFINET te ayuda a crear procesos integrados con comunicación en tiempo real y a conectarlos a la nube mediante OPC UA. La apertura y la flexibilidad de PROFINET te permiten disfrutar de la máxima libertad a la hora de diseñar la estructura de tus máquinas y sistemas. Su eficiencia te permite utilizar los recursos disponibles de forma óptima, al tiempo que aumenta significativamente la disponibilidad de la planta. El rendimiento de PROFINET aumenta la productividad de forma sostenible.
Para garantizar un rendimiento adecuado, PROFINET suministra datos a través de los siguientes canales de comunicación:
TCP/IP (o UDP/IP)
PROFINET en tiempo real (RT)
PROFINET en tiempo real isócrono (IRT)
Redes sensibles al tiempo (Time Sensitive Networking (TSN))
Fíjate en el modelo ISO/OSI, un modelo de siete capas que describe genéricamente las capas de abstracción de un sistema de comunicación. Cualquier comunicación de red puede dividirse en una serie de capas.

Ethernet se sitúa en la capa 1 (capa física) y en la capa 2 (capa de enlace de datos) del modelo ISO/OSI. Las tramas de Ethernet incluyen información como las direcciones MAC del emisor y el receptor, el etiquetado de LAN virtual (VLAN) y la calidad del servicio (QoS).
PROFINET se sitúa en la capa 7 del modelo ISO/OSI, ya que es una aplicación. Define la comunicación cíclica y acíclica entre componentes, incluyendo el diagnóstico, la seguridad funcional, las alarmas y otra información relacionada. Además, PROFINET se basa en el estándar Ethernet para su medio de comunicación. El gran ancho de banda, el gran tamaño de los mensajes y la versatilidad son algunas de las ventajas de contar con Ethernet en el entorno industrial.
Tutorial
En este post, vamos a ejecutar la pila de dispositivos PROFINET p-net y su aplicación de ejemplo de rt-labs para la automatización industrial. Vamos a implementar un dispositivo PROFINET IO, teniendo un módulo IO con 8 entradas y 8 salidas digitales, y un PLC basado en Raspberry Pi como controlador IO ejecutando el runtime Codesys para la automatización de Raspberry Pi. Una vez que consigamos que la aplicación de ejemplo se ejecute en nuestros PLCs Raspberry, seremos capaces de comunicar ambos PLCs Raspberry con PROFINET.
Requisitos
2x PLCs Raspberry
Hub Ethernet USB
1x Suministro de energía
2x Cables Ethernet
Ordenador portátil Windows (o máquina virtual Windows) con CODESYS
Ordenador portátil Linux o una pantalla con cable HDMI para conectarse a su controlador lógico programable Raspberry a través de SSH
Configuración del controlador IO
1. En primer lugar, establece una dirección IP estática para Ethernet desde tu ordenador portátil con Windows: 192.168.0.60. Conecta un cable Ethernet desde tu portátil Windows a tu PLC industrial Raspberry Pi y conéctate a través de SSH:
Como alternativa, puedes conectar un cable micro HDMI desde el PLC Raspberry a un monitor.
Establece una dirección IP estática para la interfaz eth0 de tu PLC Raspberry IO-Controller: 192.168.0.100.

2. Ves a tu ordenador portátil con Windows, y descarga e instala el Sistema de desarrollo CODESYS V3 y el CODESYS Control para Raspberry Pi SL. Existe una versión de prueba gratuita. Es necesario registrarse. Y con la versión de prueba, tendrás que reiniciar el tiempo de ejecución de Codesys en el PLC Raspberry cada dos horas.
3. Una vez instalado, abre Codesys y crea un nuevo proyecto estándar. En la siguiente ventana que aparece, selecciona el dispositivo "Codesys Control for Raspberry Pi SL" y selecciona programar en "Texto estructurado (ST)".
Nota: Si no puedes ver el dispositivo "Codesys Control for Raspberry Pi SL" significa que la instalación no se ha realizado correctamente. Inténtalo de nuevo y comprueba que tu dispositivo en el menú de la izquierda aparece como "Codesys Control for Raspberry Pi SL".
4. En el menú superior, utiliza Tools > Update Raspberry Pi > Type Username and Password > Scan your "IP address". 5. Selecciona la IP estática de la Raspberry Pi (Por ejemplo, para este tutorial, 192.168.0.100).
5. Haz doble clic en el "Dispositivo (CODESYS Control for Raspberry Pi SL)" > Haz clic en la pestaña "Scan Network" y selecciona tu Raspberry PLC. El marcador de la imagen debería volverse verde. Para verificar la comunicación, ve a la pestaña "Device" y "Send Echo Service".
Nota: Si tienes algún problema, haz clic con el botón derecho del ratón en "Device (CODESYS Control for Raspberry Pi SL)" > Actualizar dispositivo... > Mostrar todas las versiones (sólo para expertos) > Y selecciona la misma versión que elegiste al crear el nuevo proyecto, en este caso: CODESYS Control for Raspberry Pi SL - Versión 4.0.1.0. Y vuelve a intentar el paso 5.
6. Go to the rt-labs Github and save this file on your Windows laptop.
7. Vuelve a Codesys, en el menú superior "Tools" ("Herramientas"), selecciona "Device Repository" ("Repositorio de dispositivos") > Instalar > selecciona el archivo GSDML que acabas de guardar.
8. En el "Device (CODESYS Control for Raspberry Pi SL)" del panel de dispositivos, haga clic con el botón derecho y seleccione "Add Device..." > Adaptador Ethernet > Ethernet.
9. Haz clic con el botón derecho del ratón en Ethernet > select "Add Device..." > "Profinet IO" > "Profinet IO Master" > "PN_Controller".
10. Haz clic con el botón derecho del ratón en "PN_Controller (PN-Controller)" > Selecciona "Añadir dispositivo... " > "P-Net Sample App".
11. Haz clic con el botón derecho del ratón en la "P_Net_Sample_App (P-Net Sample App)" > Seleccione "Añadir dispositivo..." > "Fieldbuses" > "Profinet IO" > "Profinet IO Module" > "DIO 8xLogicLevel".
12. Ve a la Ethernet del paso 8 y haz doble clic > Selecciona la interfaz "eth0". La dirección IP se actualizará después.
13. Ve a "PN_Controller" en el menú de la izquierda y modifica la Primera dirección IP 192.168.0.50 y la Última dirección IP 192.168.0.60 .
14. Ve al nodo "P_Net_Sample_App" en el menú de la izquierda > Parámetro IP > Ajusta la dirección IP a la dirección existente de tu IO-Device: 192.168.0.50.
15. Ve a tu proyecto en el panel izquierdo > Device (CODESYS Control for Raspberry Pi SL) > PLC Logic > Application > PLC_PRG (PRG).
16. Hay dos secciones, la de las variables en la parte superior y la del programa en la inferior.
Sección de las variables
PROGRAM PLC_PRG VAR in_pin_button_LED: BOOL; out_pin_LED: BOOL; in_pin_button_LED_previous: BOOL; flashing: BOOL; oscillator_state: BOOL := FALSE; oscillator_cycles: UINT := 0; END_VAR
Sección 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;
17. Haz clic con el botón derecho del ratón en "DIO_8xLogicLevel" > "Edit IO mapping..." > Haz doble clic en el icono del "Bit de entrada 7" > Haz clic en el botón [...] > Ve a Aplicación > PLC_PRG > "in_pin_button_LED".
18. Haz clic con el botón derecho del ratón en "DIO_8xLogicLevel" > "Edit IO mapping..." > Haz doble clic en el icono del "Bit de salida 7" > Haz clic en el botón [...] > Ve a Aplicación > PLC_PRG > "out_pin_LED".
19. Haz doble clic en la Aplicación > "Configuración de tareas" > Tarea principal > Selecciona "Cíclico" > 4 ms.
20. Haz doble clic en la aplicación > "Profinet_CommunicationTask" > Selecciona "Cyclic" > 10 ms. Utiliza la prioridad 30.
21. En el menú superior, ve a Build > Generate Code.
22. En el menú superior, ve a Online > Login, para transferir la aplicación a la Raspberry Pi. Selecciona "Sí" en la ventana emergente.
23. Ve al menú superior Herramientas > "Actualizar Raspberry Pi" > Información del sistema, y mira en el cuadro de texto "Información de tiempo de ejecución" para seguir los registros del controlador.
24. Una vez configurado el IO-Controller, puedes apagar la máquina Windows que ejecuta la aplicación Codesys.
Recuerda que debes apagar y encender el controlador IO del PLC Raspberry cada dos horas si utilizas la versión de prueba.
25. Instala Wireshark. Comprueba que tu PLC Raspberry IO-Controller envía paquetes LLDP cada 5 segundos.
Configuración del dispositivo IO
25. Ahora, vamos a configurar el IO-Device para ejecutar la aplicación PROFINET desde rt-labs.
26. Enciende el IO-Device Raspberry PLC, cambia su dirección IP a 192.168.0.50 y conéctalo al IO-Controller Raspberry PLC.

27. Conecta tu PLC de código abierto Raspberry Pi a Internet vía LAN o WiFi para poder descargar el software.
28. Para compilar p-net en Raspberry, es necesario descargar primero algunos paquetes:
sudo apt update
sudo apt install snapd
sudo reboot
sudo snap install cmake --classic
29. Verifica la versión instalada:
cmake --version
30. Instala git:
sudo apt install git
31. Crea un directorio llamado profinet:
mkdir /home/pi/profinet cd /home/pi/profinet
32. Clona la fuente:
git clone --recurse-submodules https://github.com/rtlabs-com/p-net.git
33. Configura y crea la compilación:
cmake -B build -S p-net
34. Compila el código:
cmake --build build --target install
35. Configura y crea la complicación:
cmake -B build -S p-net
36. Ejecuta este comando desde el directorio de profinet:
snap run cmake -B build -S p-net -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON -DUSE_SCHED_FIFO=ON
37. Ve al directorio de compilación:
cd build
38. We are going to test this application with plain files. So, make two files to simulate buttons:
touch /home/pi/profinet/build/button1.txt touch /home/pi/profinet/build/button2.txt
40. Ejecuta la aplicación con los dos botones de archivos planos:
sudo ./pn_dev -vvvv -b /home/pi/profinet/build/button1.txt -d /home/pi/profinet/build/button2.txt
41. Si sólo tienes una terminal, necesitas ejecutar la aplicación en segundo plano para escribir manualmente 1 o 0 en el archivo /home/pi/profinet/build/buttonX.txt para cambiar sus valores así:
echo 1 > /home/pi/profinet/build/button1.txt echo 0 > /home/pi/profinet/build/button1.txt
Para más información sobre el tutorial, por favor visita este enlace .
¡Ahora es tu turno!
Ahora es el momento de que empieces a desarrollar tus propias aplicaciones. Puedes utilizar la aplicación de ejemplo como plantilla de partida. Experimenta modificando los módulos disponibles y los tipos de datos que envían y reciben. ¡Modifica tu archivo GSDML en consecuencia para explicar el comportamiento de los dispositivos IO a la herramienta de configuración del PLC!