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.
| Canal | Qué viaja por él | Ciclo típico |
|---|---|---|
| TCP/IP y UDP/IP | Configuración, parámetros, diagnóstico, lecturas y escrituras acíclicas | Sin requisitos de tiempo |
| Tiempo real (RT) | Datos de E/S cíclicos, directamente sobre Ethernet con Ethertype 0x8892 | Desde 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 dispositivos | Por 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
| Placa | Función en este tutorial | Dirección IP |
|---|---|---|
| Raspberry Pi (o un segundo Raspberry PLC) | IO-device PROFINET con la aplicación de ejemplo de p-net | 192.168.0.50 |
| Raspberry PLC | Captura las tramas PROFINET con tshark. IO-controller con CODESYS en la parte 2 | 192.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

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
- Ve al directorio de compilación:
cd /home/pi/profinet/build - Activa la interfaz Ethernet y configura la dirección IP inicial.
ipsustituye al antiguoifconfig, que no siempre está instalado:sudo ip link set eth0 up sudo ip addr add 192.168.0.50/24 dev eth0 - 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_dev | Qué hace |
|---|---|
-i eth0 | Interfaz Ethernet que se usa (eth0 por defecto) |
-s NAME | Nombre de estación, si aún no está guardado (rt-labs-dev por defecto) |
-b FILE, -d FILE | Lee Button1 y Button2 de un archivo o de un GPIO |
-p PATH | Directorio de los ajustes guardados |
-r, -f | Borra los archivos guardados, o vuelve a los ajustes de fábrica |
-v | Má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
- Da al Raspberry PLC la dirección IP 192.168.0.100 en la misma red. En Bookworm, usa
nmclio 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 - 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 - 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 - 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:

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):

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.

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 porExecStartPre=/usr/sbin/ip link set eth0 upsiifconfigno está instalado.ExecStartPre=/usr/bin/enable-rpi-gpio-pins.shy las opciones-by-dleen 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-by-dapunten a archivos de texto.WorkingDirectoryyExecStartdeben 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.
Más sobre el Raspberry PLC en redes industriales
- PROFINET y Raspberry PLC: activar alarmas con CODESYS
- Configurar CODESYS en el Raspberry PLC
- EtherNet/IP vs PROFINET vs Modbus TCP
- 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.