Ir al contenido

PROFINET y Raspberry PLC: Cómo establecer la comunicación en Linux

p-net en Linux: compila la pila de IO-device PROFINET, ejecuta la aplicación de ejemplo y captura tramas LLDP y DCP con tshark
8 de junio de 2021 por
PROFINET y Raspberry PLC: Cómo establecer la comunicación en Linux
Boot & Work Corp. S.L, Fernandez Queralt Martinez

Para establecer la comunicación PROFINET en Linux con un Raspberry PLC, usa p-net, la pila de IO-device PROFINET de código abierto de RT-Labs. Clona la etiqueta v0.2.0 de p-net (la última versión pública con el sistema de compilación y la aplicación de ejemplo), compílala con cmake, da una dirección IP a la interfaz Ethernet y ejecuta sudo ./pn_dev -v. La placa pasa a ser un IO-device PROFINET que envía tramas LLDP y DCP y espera a un IO-controller.

Este tutorial ejecuta la aplicación de ejemplo de p-net en una placa Raspberry como IO-device y usa el Raspberry PLC de la misma red para capturar las tramas PROFINET con tshark. En la segunda parte, el Raspberry PLC pasa a ser el IO-controller con CODESYS e intercambia datos cíclicos con el dispositivo.

Industrial Shields no proporciona librerías PROFINET para las entradas y salidas del Raspberry PLC. Para leer y escribir las E/S del PLC, usa las librerías de C++, Python o Node-RED del GitHub de Industrial Shields, o CODESYS en el Raspberry PLC.

¿Qué es PROFINET?

PROFINET (Process Field Network) es el estándar de Ethernet industrial de PROFIBUS & PROFINET International (PI), definido en IEC 61158 e IEC 61784. Funciona sobre Ethernet estándar y conecta un IO-controller (el PLC) con IO-devices (E/S remotas, variadores, sensores). Un archivo GSDML describe cada IO-device a la herramienta de ingeniería del controlador.

CanalQué viaja por élCiclo típico
TCP/IP y UDP/IPConfiguración, parámetros, diagnóstico, lecturas y escrituras acíclicasSin requisitos de tiempo
Tiempo real (RT)Datos de E/S cíclicos, directamente sobre Ethernet con Ethertype 0x8892Desde 1 ms, lo típico en automatización de fábrica
Tiempo real isócrono (IRT)Control de movimiento con ancho de banda reservado, necesita hardware IRT en switches y dispositivosPor debajo de 1 ms

p-net es una pila de IO-device PROFINET escrita en C. Admite las Conformance Classes A y B, Real-Time class 1, LLDP, SNMP, alarmas y varios puertos Ethernet en Linux. No admite IRT ni redundancia de medio (MRP), y no implementa un IO-controller. Tiene doble licencia: GPLv3, o una licencia comercial de RT-Labs para productos comerciales.

Montaje de prueba: IO-device, Raspberry PLC y tshark

PlacaFunción en este tutorialDirección IP
Raspberry Pi (o un segundo Raspberry PLC)IO-device PROFINET con la aplicación de ejemplo de p-net192.168.0.50
Raspberry PLCCaptura las tramas PROFINET con tshark. IO-controller con CODESYS en la parte 2192.168.0.100
  • Una Raspberry Pi con Raspberry Pi OS y su fuente de alimentación USB-C, o un segundo Raspberry PLC
  • Un Raspberry PLC con Ethernet
  • Un switch Ethernet y dos cables Ethernet
  • Acceso a Internet en las dos placas para descargar los paquetes, por LAN o por Wi-Fi
Montaje de prueba PROFINET: Raspberry PLC como IO-controller en 192.168.0.100, Raspberry Pi como IO-device en 192.168.0.50 y tshark capturando el tráfico entre ellos

Instalar las herramientas de compilación en Raspberry Pi OS

En la placa del IO-device, instala git, cmake y el compilador. p-net necesita cmake 3.14 o posterior, y Raspberry Pi OS basado en Debian 12 (Bookworm) ya tiene cmake 3.25 en su repositorio, así que la versión snap de la primera edición de este tutorial no hace falta.

sudo apt update
sudo apt install -y git cmake build-essential
cmake --version

Descargar y compilar p-net v0.2.0

Desde 2024, la rama por defecto del repositorio de p-net en GitHub solo contiene las fuentes de la pila: sin CMakeLists.txt, sin aplicación de ejemplo y sin documentación (comprobado en octubre de 2026). La última versión pública con el sistema de compilación y la aplicación de ejemplo pn_dev es la etiqueta v0.2.0 (abril de 2022). Clona esa etiqueta con sus submódulos:

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

Estos comandos compilan pn_dev en /home/pi/profinet/build. Los hemos comprobado con cmake 3.28 y gcc 13 en Linux. -DBUILD_TESTING=OFF omite las pruebas unitarias y la descarga de googletest, que además falla con CMake 4.

¿Ya lo has clonado sin submódulos? Ejecuta git submodule update --init --recursive en la carpeta p-net.

Ajustes para una prueba en tiempo real. Este comando cmake compila una versión de depuración con librerías compartidas y planificación SCHED_FIFO:

cmake -B build -S p-net -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON -DUSE_SCHED_FIFO=ON

Ejecutar la aplicación de ejemplo de p-net

  1. Ve al directorio de compilación:
    cd /home/pi/profinet/build
  2. Activa la interfaz Ethernet y configura la dirección IP inicial. ip sustituye al antiguo ifconfig, que no siempre está instalado:
    sudo ip link set eth0 up
    sudo ip addr add 192.168.0.50/24 dev eth0
  3. Ejecuta la aplicación de ejemplo con un nivel de registro alto:
    sudo ./pn_dev -v -v -v -v

La aplicación muestra su nombre de estación (rt-labs-dev por defecto) y su dirección IP, y espera la conexión de un IO-controller. Sin controlador ya envía una trama LLDP cada 5 segundos y una petición DCP Hello con su nombre de estación.

Opción de pn_devQué hace
-i eth0Interfaz Ethernet que se usa (eth0 por defecto)
-s NAMENombre de estación, si aún no está guardado (rt-labs-dev por defecto)
-b FILE, -d FILELee Button1 y Button2 de un archivo o de un GPIO
-p PATHDirectorio de los ajustes guardados
-r, -fBorra los archivos guardados, o vuelve a los ajustes de fábrica
-vMás salida de registro, se puede repetir

Deja que p-net gestione la dirección IP del IO-device. Un IO-controller PROFINET asigna el nombre y la dirección IP del dispositivo con DCP, y el cliente DHCP de Linux interfiere. En Raspberry Pi OS Bookworm, ese cliente es NetworkManager: desactívalo en la interfaz del dispositivo con sudo nmcli device set eth0 managed no. No des al IO-device una IP fija en la configuración de red.

Capturar tramas PROFINET en el Raspberry PLC con tshark

  1. Da al Raspberry PLC la dirección IP 192.168.0.100 en la misma red. En Bookworm, usa nmcli o sigue cómo configurar una IP fija en un Raspberry PLC. Para una prueba rápida:
    sudo ip addr add 192.168.0.100/24 dev eth0
  2. Instala tshark, la versión de línea de comandos de Wireshark. Responde Yes cuando pregunte si los usuarios sin privilegios pueden capturar paquetes, y añade tu usuario al grupo wireshark:
    sudo apt update
    sudo apt install -y tshark
    sudo usermod -a -G wireshark $USER
  3. Cierra la sesión, vuelve a entrar y comprueba la instalación. Si respondiste No, ejecuta sudo dpkg-reconfigure wireshark-common.
    tshark --version
    tshark -D
  4. Captura en eth0. El filtro de captura deja solo las tramas LLDP y PROFINET:
    tshark -i eth0 -f "ether proto 0x88cc or ether proto 0x8892"

La captura muestra una trama LLDP del IO-device cada 5 segundos:

Salida de tshark con una trama LLDP cada 5 segundos del IO-device p-net a la dirección multicast LLDP

La captura también muestra la petición DCP Hello con el nombre de estación rt-labs-dev. Sin el filtro verás además el tráfico IP del dispositivo en 192.168.0.50 (ARP, IGMP y mDNS):

Salida de tshark con una petición PN-DCP Hello para el nombre de estación rt-labs-dev y tráfico ARP, IGMP y mDNS de 192.168.0.50

LLDP y DCP en una red PROFINET

PROFINET usa LLDP (Link Layer Discovery Protocol, IEEE 802.1AB) para saber qué dispositivo está conectado a cada puerto del switch. Cada dispositivo envía tramas LLDP a la dirección MAC multicast 01-80-C2-00-00-0E, con Ethertype 0x88CC. El controlador usa esta información de vecindad para detectar la topología y para sustituir un dispositivo sin herramientas de ingeniería.

DCP (Discovery and Configuration Protocol) viaja con el Ethertype PROFINET 0x8892. El controlador lo usa para encontrar un dispositivo por su nombre de estación y asignarle la dirección IP. Por eso el nombre de estación del dispositivo debe coincidir con el nombre del proyecto del controlador.

Tabla de tramas LLDP capturadas con origen, destino multicast LLDP, protocolo, longitud y estado del puerto

Arrancar la aplicación p-net al inicio con systemd

p-net incluye un servicio systemd para la aplicación de ejemplo. Cópialo, revísalo y actívalo en el IO-device:

sudo cp /home/pi/profinet/p-net/src/ports/linux/pnet-sampleapp.service /lib/systemd/system
sudo cp /home/pi/profinet/p-net/src/ports/linux/enable-rpi-gpio-pins.sh /usr/bin/
sudo chmod +x /usr/bin/enable-rpi-gpio-pins.sh
sudo nano /lib/systemd/system/pnet-sampleapp.service
sudo systemctl daemon-reload
sudo systemctl enable pnet-sampleapp.service
sudo systemctl start pnet-sampleapp.service

Antes de activarlo, revisa tres líneas del archivo del servicio:

  • ExecStartPre=/sbin/ifconfig eth0 up: cámbiala por ExecStartPre=/usr/sbin/ip link set eth0 up si ifconfig no está instalado.
  • ExecStartPre=/usr/bin/enable-rpi-gpio-pins.sh y las opciones -b y -d leen botones en el GPIO 27 y el GPIO 22 de una Raspberry Pi. En un Raspberry PLC, no exportes GPIO que use el PLC: quita estas partes, o haz que -b y -d apunten a archivos de texto.
  • WorkingDirectory y ExecStart deben apuntar a tu directorio de compilación.

Para ver el estado del servicio y su salida de registro:

sudo systemctl status pnet-sampleapp.service
journalctl -fu pnet-sampleapp

Para seguir el registro del dispositivo por una consola serie, añade la línea enable_uart=1 a /boot/firmware/config.txt (/boot/config.txt antes de Bookworm) y reinicia.

Siguiente paso: el Raspberry PLC como IO-controller PROFINET. En la parte 2, CODESYS en el Raspberry PLC carga el archivo GSDML de p-net, se conecta al IO-device e intercambia 8 entradas y 8 salidas digitales. Para ver un Raspberry PLC que recoge datos de protocolos de campo y los envía a un sistema superior, lee el caso de la pasarela de datos a bordo.

IO-controller PROFINET con CODESYSLeer el caso de la pasarela de datos

Preguntas frecuentes sobre PROFINET en el Raspberry PLC

¿Puede un Raspberry PLC ser un IO-device PROFINET?

Sí, con p-net en Linux, como en este tutorial. La placa tiene que enviar y recibir tramas Ethernet en bruto, algo que Raspberry Pi OS permite con permisos de root.

¿Puede un Raspberry PLC ser un IO-controller PROFINET?

Sí, con CODESYS Control for Raspberry Pi SL y el controlador PROFINET de CODESYS. Consulta la parte 2 de este tutorial. p-net solo es una pila de dispositivo.

¿Por qué falla cmake después de clonar p-net?

La rama por defecto del repositorio no tiene CMakeLists.txt desde 2024. Clona la etiqueta con git clone --branch v0.2.0 --recurse-submodules.

¿p-net admite PROFINET IRT?

No. p-net admite Real-Time class 1 (RT) con las Conformance Classes A y B. IRT necesita hardware específico.

¿Puedo usar p-net en un producto comercial?

p-net tiene licencia GPLv3. Para un producto comercial que no cumpla la GPLv3, RT-Labs vende una licencia comercial.

Buscar en nuestro blog

PROFINET y Raspberry PLC: Cómo establecer la comunicación en Linux
Boot & Work Corp. S.L, Fernandez Queralt Martinez 8 de junio de 2021
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs