Ir al contenido

Programar en Ladder con CODESYS en un Raspberry PLC

Proyecto Ladder, i2c_init y funciones de E/S para los Raspberry PLC de Industrial Shields en CODESYS
11 de noviembre de 2024 por
Programar en Ladder con CODESYS en un Raspberry PLC
Boot & Work Corp. S.L, Francesc Nosàs Moliner

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.

ElementoSímboloQué 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
CajaRectángulo con EN y ENOLlama a una función o bloque de función cuando EN es TRUE
Caja EXECUTECaja con texto dentroEjecuta 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

  1. 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.
  2. Abre el proyecto preestablecido Ladder del repositorio Projecte-CodeSys en GitHub.
  3. 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.
  4. 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.
Vistas Devices y POUs de CODESYS del proyecto plantilla Ladder, con la carpeta rpiplc, los bloques GPIOs y GPIOsR y la función i2c_init

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;.

Escalón Ladder con un contacto Init y una caja EXECUTE que llama a i2c_init() y pone Init a FALSE, junto a la ToolBox de CODESYS

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.

Escalón Ladder con una caja i2c_init cuya salida pone a FALSE la variable Init, así que solo se ejecuta una vez

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.

Escalón Ladder con una caja EXECUTE que escribe la salida Q0.1, invierte la variable i y lee la entrada I0.11 con bloques GPIOs

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".

Escalón Ladder con una caja a_analog_read que lee el puerto I0.8 en la variable analog_reading

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.

Escalón Ladder con una caja a_digital_write que escribe la variable i en el puerto Q0.4 y devuelve 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ónCarpetaEntradasDevuelve
i2c_init()rpiplcNingunaBOOL, siempre FALSE
a_digital_readrpiplc/GPIOsport (WSTRING)BOOL
a_digital_writerpiplc/GPIOsvalue (BOOL), port (WSTRING)BOOL
a_analog_readrpiplc/GPIOsport (WSTRING)UINT
a_analog_writerpiplc/GPIOsvalue (UINT), port (WSTRING)BOOL
r_digital_readrpiplc/GPIOsRport (WSTRING)BOOL
r_digital_writerpiplc/GPIOsRvalue (BOOL), port (WSTRING)BOOL
r_analog_readrpiplc/GPIOsRport (WSTRING)UINT
r_analog_writerpiplc/GPIOsRvalue (UINT), port (WSTRING)BOOL
r_relay_writerpiplc/GPIOsRport (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:

EscalonesQué hacenElementos
1. InitInicializar el bus I2C una vezContacto Init y caja i2c_init, o EXECUTE
2. Leer entradasCopiar las entradas a variables BOOL o UINTCajas a_digital_read y a_analog_read
3. LógicaContactos, bobinas, temporizadores y contadores sobre esas variablesContactos, bobinas, TON, CTU
4. Escribir salidasCopiar las variables de resultado a las salidasCajas 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.

Buscar en nuestro blog

Programar en Ladder con CODESYS en un Raspberry PLC
Boot & Work Corp. S.L, Francesc Nosàs Moliner 11 de noviembre de 2024
Compartir esta publicación
Etiquetas

¿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