Para programar un Raspberry PLC en Ladder con CODESYS, crea un proyecto con un PLC_PRG en Ladder Logic Diagram (LD), copia los POU y la carpeta rpiplc de la plantilla Ladder de Industrial Shields en GitHub, y llama a i2c_init() una vez al arrancar el programa. Después lees y escribes las entradas y salidas de dos maneras: con bloques EXECUTE en Structured Text o con las funciones de rpiplc como cajas en el editor Ladder.
Esta guía continúa Configurar CODESYS en un Raspberry PLC, que explica la instalación, la licencia del runtime y el login. Aquí creas el proyecto Ladder, inicializas las E/S y usas cada función de E/S, con las capturas del proyecto plantilla.
¿Qué es la lógica Ladder en CODESYS?
Ladder Diagram (LD) es uno de los lenguajes de IEC 61131-3. Viene de los cuadros de control con relés: cada escalón es un circuito entre dos barras verticales de alimentación, con contactos a la izquierda y bobinas o cajas de función a la derecha. El PLC evalúa los escalones de arriba abajo en cada ciclo. Los equipos de mantenimiento que conocen los esquemas de relés pueden leerlo sin saber un lenguaje de texto.
| Elemento | Símbolo | Qué hace |
|---|---|---|
| Contacto normalmente abierto | --| |-- | Deja pasar la corriente cuando su variable BOOL es TRUE |
| Contacto normalmente cerrado | --|/|-- | Deja pasar la corriente cuando su variable BOOL es FALSE |
| Bobina | --( )-- | Escribe el resultado del escalón en una variable BOOL |
| Bobinas set y reset | --(S)-- --(R)-- | Ponen la variable a TRUE o FALSE y la mantienen |
| Caja | Rectángulo con EN y ENO | Llama a una función o bloque de función cuando EN es TRUE |
| Caja EXECUTE | Caja con texto dentro | Ejecuta unas líneas de Structured Text cuando EN es TRUE |
En CODESYS encontrarás estos elementos en la ToolBox del editor Ladder (ToolBox > General).
Antes de empezar: CODESYS en el Raspberry PLC
- CODESYS Development System V3.5 SP19 Patch 3 o posterior en un PC con Windows. Las plantillas de Industrial Shields se hicieron con esa versión.
- CODESYS Control for Raspberry Pi SL 4.11 o posterior, instalado en el PLC. Sin licencia funciona dos horas y después se detiene.
- El PC y el PLC en la misma red (el PLC responde en 10.10.10.20 por defecto) y un login que funcione.
- La interfaz I2C activada y el dispositivo I2C_master añadido debajo en Devices. Los bloques de E/S lo usan.
Todo esto se explica paso a paso en la guía de configuración de CODESYS para el Raspberry PLC.
Crear el proyecto Ladder a partir de la plantilla
- Crea un proyecto nuevo de CODESYS para el dispositivo Raspberry Pi, con el programa principal PLC_PRG en Ladder Logic Diagram (LD). El editor muestra entonces la ToolBox de Ladder.
- Abre el proyecto preestablecido Ladder del repositorio Projecte-CodeSys en GitHub.
- Copia sus POU (Program Organization Units: los bloques de función GPIOs y GPIOsR y la función i2c_init) en la ventana POUs de tu proyecto.
- Copia la carpeta rpiplc de la vista Devices de la plantilla en la Application de tu proyecto. Contiene las funciones que colocas como cajas en el editor Ladder.

Inicializar las E/S una vez con i2c_init()
La mayoría de entradas y salidas del Raspberry PLC están en expansores de E/S del bus I2C. i2c_init() prepara ese bus y debe ejecutarse una vez cada vez que arranca el programa. Sin ella, los bloques no llegan a las E/S. El patrón habitual es una variable BOOL Init := TRUE que habilita la llamada en el primer ciclo y después pasa a FALSE. Puedes escribirlo de dos maneras.
Con una caja EXECUTE. Añade ToolBox > General > Execute después de un contacto Init y escribe dentro las dos líneas: la llamada y Init := FALSE;.

Con la caja i2c_init. Coloca la función i2c_init de la carpeta rpiplc después del contacto Init y conecta su salida a Init. La función siempre devuelve FALSE, así que la primera llamada pone Init a FALSE y el escalón no vuelve a ejecutarse.

Método 1: cajas EXECUTE con Structured Text
Una caja EXECUTE ejecuta Structured Text cuando su escalón es TRUE. Dentro usas los bloques de función GPIOs igual que en Structured Text: declaras una instancia por entrada o salida, con su nombre como WSTRING, y llamas a sus métodos.
En este ejemplo las declaraciones son Q0_1 : GPIOs("Q0.1"); y I0_11 : GPIOs("I0.11");. Cuando Var1 es TRUE, la caja escribe i en la salida Q0.1, invierte i para que la salida parpadee al ritmo del ciclo y lee la entrada I0.11 en Var2.

Este método es útil cuando un escalón necesita más lógica que una caja, o para reutilizar código de un programa en Structured Text. Los métodos de los bloques (read_digital(), write_digital(), read_analog(), write_analog() y, en los modelos de relés, read_relay() y write_relay()) están en la guía de configuración de CODESYS.
Método 2: funciones de rpiplc como cajas en el editor Ladder
Las funciones de la carpeta rpiplc son cajas Ladder que leen o escriben una entrada o salida. A diferencia de los bloques GPIOs del método 1, no declaras una instancia por E/S: cada caja tiene una entrada port adicional, una variable WSTRING con el nombre de la entrada o salida, por ejemplo "I0.8".
En este escalón, cuando Var3 es TRUE, a_analog_read lee la entrada I0.8 y guarda el valor en la variable UINT analog_reading. La variable I0_8 está declarada como WSTRING := "I0.8".

En este escalón, a_digital_write escribe el BOOL i en la salida Q0.4 (variable Q0_4 : WSTRING := "Q0.4") y devuelve el BOOL ack.

Funciones de rpiplc para las E/S del Raspberry PLC
Usa las funciones de rpiplc/GPIOs en los modelos con E/S analógicas y digitales, y las de rpiplc/GPIOsR en los modelos de relés.
| Función | Carpeta | Entradas | Devuelve |
|---|---|---|---|
i2c_init() | rpiplc | Ninguna | BOOL, siempre FALSE |
a_digital_read | rpiplc/GPIOs | port (WSTRING) | BOOL |
a_digital_write | rpiplc/GPIOs | value (BOOL), port (WSTRING) | BOOL |
a_analog_read | rpiplc/GPIOs | port (WSTRING) | UINT |
a_analog_write | rpiplc/GPIOs | value (UINT), port (WSTRING) | BOOL |
r_digital_read | rpiplc/GPIOsR | port (WSTRING) | BOOL |
r_digital_write | rpiplc/GPIOsR | value (BOOL), port (WSTRING) | BOOL |
r_analog_read | rpiplc/GPIOsR | port (WSTRING) | UINT |
r_analog_write | rpiplc/GPIOsR | value (UINT), port (WSTRING) | BOOL |
r_relay_write | rpiplc/GPIOsR | port (WSTRING), value (BOOL) | BOOL |
Los nombres de las entradas y salidas son los que lleva impresos el PLC: "I0.7", "Q0.0", "A0.6" o "R0.5". Usa comillas dobles rectas en los valores WSTRING, no comillas tipográficas. Comprueba el orden de las entradas de la caja en tu versión de la plantilla: r_relay_write recibe primero el puerto.
Estructura de un primer programa Ladder en el Raspberry PLC
Con estas piezas, un PLC_PRG sencillo en Ladder tiene cuatro grupos de escalones, en este orden:
| Escalones | Qué hacen | Elementos |
|---|---|---|
| 1. Init | Inicializar el bus I2C una vez | Contacto Init y caja i2c_init, o EXECUTE |
| 2. Leer entradas | Copiar las entradas a variables BOOL o UINT | Cajas a_digital_read y a_analog_read |
| 3. Lógica | Contactos, bobinas, temporizadores y contadores sobre esas variables | Contactos, bobinas, TON, CTU |
| 4. Escribir salidas | Copiar las variables de resultado a las salidas | Cajas a_digital_write o r_relay_write |
Leer las entradas al principio y escribir las salidas al final mantiene los mismos valores durante todo el ciclo, como en el scan de un PLC clásico. También deja los escalones de lógica sin nombres de puerto, así que se leen mejor.
Las entradas de interrupción no están en el bus I2C. Las funciones de rpiplc no las gestionan. En los modelos con E/S analógicas y digitales son I0.5, I0.6, I1.5, I1.6, I2.5 e I2.6 (I0.0, I0.1, I1.0, I1.1, I2.0 e I2.1 en los modelos de relés). Asígnalas a través del dispositivo GPIOs de CODESYS, como se explica en la guía de configuración de CODESYS.
El README del repositorio Projecte-CodeSys indica que estos bloques no son drivers de E/S estándar de CODESYS y que no se recomiendan en un entorno comercial. Úsalos para aprender, probar y hacer prototipos, y mide el tiempo de ciclo con tu propio programa.
Mira cómo un Raspberry PLC ejecuta una secuencia. En el simulador de planta de proceso, un Raspberry PLC 42 arranca una turbina o una bomba paso a paso como una máquina de estados y lee transmisores de 4-20 mA. En el caso de la planta de biogás, un Raspberry PLC 58 controla cuatro secciones del proceso con un panel TouchBerry como pantalla de operador.
Abrir el simulador de planta de procesoLeer el caso de la planta de biogás
Preguntas frecuentes sobre Ladder con CODESYS en un Raspberry PLC
¿Puedo programar un Raspberry PLC en Ladder?
Sí, con CODESYS. CODESYS Control for Raspberry Pi SL ejecuta el programa en el PLC, y la plantilla de Industrial Shields aporta las funciones de E/S para el editor Ladder.
¿Por qué no cambian las entradas y salidas?
Comprueba que i2c_init() se ejecuta una vez al arrancar, que el dispositivo I2C_master está en el proyecto, que usas las funciones GPIOs en los modelos analógicos y digitales y las GPIOsR en los de relés, y que el nombre del puerto está bien escrito.
¿Puedo mezclar Ladder y Structured Text?
Sí. Usa cajas EXECUTE dentro de un escalón Ladder, o escribe otros POU en Structured Text y llámalos desde el programa Ladder.
¿Puedo asignar las E/S del Raspberry PLC a direcciones %IX y %QX?
No las E/S de los expansores I2C: se accede a ellas con las funciones de esta guía. Solo los GPIO directos, las entradas de interrupción, se asignan a través del dispositivo GPIOs de CODESYS.
¿Puedo programar en Ladder un PLC basado en Arduino o ESP32?
No con CODESYS. Para M-Duino, Ardbox y ESP32 PLC usa OpenPLC, que también admite Ladder y los demás lenguajes de IEC 61131-3. Consulta la guía de OpenPLC con PLC industriales.
Más sobre CODESYS en el Raspberry PLC
- Configurar CODESYS en un Raspberry PLC para automatización industrial
- Configurar Modbus en un Raspberry PLC con CODESYS
- PROFINET y Raspberry PLC: disparar alarmas con CODESYS
- Node-RED vs CODESYS vs Arduino IDE: cuál elegir
- Cómo elegir un controlador industrial
Elige el modelo y la combinación de E/S en la familia Raspberry PLC.