Ir al contenido

Primeros pasos con OpenPLC y Arduino Mega

Tu primer programa Ladder: mapa de pines, bloques MOVE, simulación y carga
24 de mayo de 2024 por
Boot & Work Corp. S.L, Arnau Tena

Guía completa: OpenPLC con PLC industriales

Para programar un Arduino Mega con OpenPLC, instala el OpenPLC Editor, abre el ejemplo Blink y asigna a cada variable la dirección IEC del pin que quieres usar. El LED integrado está en el pin PWM 13, que OpenPLC asigna como salida analógica %QW11, así que lo controlas con una variable UINT y dos bloques MOVE que escriben 65535 (encendido) o 0 (apagado). Simula el programa en el Editor, después selecciona Arduino Mega y el puerto COM y haz clic en Transfer to PLC.

OpenPLC es software de PLC de código abierto. Escribes el programa en lenguajes IEC 61131-3 como Ladder Diagram o Structured Text, y el Editor lo compila en un firmware para la placa, así que no escribes nada de C++. Esta es la primera guía de la serie. Si quieres saber qué es OpenPLC y cuándo tiene sentido, empieza por la guía de OpenPLC para PLC industriales.

¿Qué versión del Editor? Las capturas son del OpenPLC Editor clásico, la aplicación en Python. OpenPLC Editor v4 es una aplicación nueva con otra interfaz, así que sus menús y botones son distintos. El programa Ladder y las direcciones IEC siguen la misma idea en los dos; comprueba la lista de placas y el mapa de pines en el Editor que instales.

Qué necesitas

  • Un Arduino Mega 2560 y su cable USB (tipo B).
  • El OpenPLC Editor, desde la web oficial, autonomylogic.com. La primera vez que lo abres tarda un rato en cargar.
  • Nada más. El Editor lleva sus propias herramientas de línea de comandos de Arduino e instala el core de la placa la primera vez que transfieres un programa, así que no necesitas el Arduino IDE.

Para esta primera prueba solo necesitas el Editor. El OpenPLC Runtime es para ordenadores con Linux; en una placa Arduino el Editor carga el programa como firmware y la propia placa se convierte en el PLC.

Cómo asigna OpenPLC los pines del Arduino Mega

OpenPLC nombra cada entrada y salida con una dirección IEC 61131-3 en lugar de un número de pin. %I es una entrada, %Q una salida, X un bit (BOOL) y W una palabra de 16 bits, que OpenPLC usa para valores analógicos de 0 a 65535. Las direcciones digitales tienen dos índices (%QX1.0) y las analógicas uno (%QW11). Este es el mapa por defecto del Arduino Mega en las definiciones de placa del OpenPLC Editor:

SeñalDirecciones IECPines del Arduino Mega, en orden
Entradas digitales%IX0.0 a %IX2.762 a 69 (A8 a A15), después 22, 24, 26 ... 52
Salidas digitales%QX0.0 a %QX2.714 a 21, después 23, 25, 27 ... 53
Entradas analógicas%IW0 a %IW7A0 a A7
Salidas analógicas (PWM)%QW0 a %QW112 a 13

El pin 13, el del LED integrado, es la última salida PWM, así que su dirección es %QW11. No está en la lista de salidas digitales, y por eso no puedes asignarlo sin más a la variable BOOL del ejemplo Blink. El mapa exacto de tu placa está en la sección I/O Config de la ventana Transfer Program to PLC.

Paso 1: abre el ejemplo Blink

Abre el OpenPLC Editor y ve a File, Tutorials and Examples, Blink. Lo usamos como plantilla: cambia el estado de una variable BOOL, blink_led, cada 500 ms con dos temporizadores.

Menú File del OpenPLC Editor con Tutorials and Examples abierto y el ejemplo Blink seleccionado

Al principio el área del editor está vacía.

OpenPLC Editor después de abrir el ejemplo Blink, con Blink y Res0 en el árbol del proyecto y el área del editor vacía

Haz doble clic en Blink en el árbol Project (arriba a la izquierda). Arriba aparece la tabla de variables y debajo el diagrama Ladder. Si los paneles laterales tapan el diagrama, pulsa F12 para ampliarlo y F12 otra vez para volver.

Ejemplo Blink en el OpenPLC Editor: variables blink_led, TON0 y TOF0 y un diagrama Ladder con dos temporizadores de 500 ms
El ejemplo Blink: un temporizador TON y uno TOF de 500 ms cada uno generan una onda cuadrada en blink_led.

Paso 2: declara la salida del LED

Añade una variable con el botón + verde de la tabla de variables. Haz doble clic en sus celdas para llamarla ledMega, pon el tipo UINT y la ubicación %QW11. UINT es un entero sin signo de 16 bits, el tipo que encaja con una dirección de palabra.

Tabla de variables con ledMega declarada como variable local UINT en la ubicación %QW11

Paso 3: escribe 65535 o 0 con bloques MOVE

Los pasos siguientes usan dos herramientas de la barra de Ladder, marcadas en rojo: la de variable y la de bloque.

Barra de herramientas Ladder del OpenPLC Editor con las herramientas de variable y de bloque marcadas en rojo
  1. Selecciona la herramienta de bloque y haz clic debajo de blink_led. Busca el bloque MOVE, marca Execution control y colócalo. Conecta la entrada EN de MOVE a la salida Q de TOF0, y su salida ENO a la barra de alimentación derecha.
Bloque MOVE colocado debajo de la bobina blink_led con su entrada EN conectada a la salida Q del temporizador TOF0
  1. Selecciona la herramienta de variable y haz clic a la derecha de MOVE. Elige la clase Output y la expresión ledMega, y conéctala a OUT. Después añade otra variable a la izquierda de MOVE con la clase Input y la expresión 65535, y conéctala a IN.
Bloque MOVE con la constante 65535 en su entrada IN y la variable ledMega en su salida OUT

Cuando EN es TRUE, MOVE copia IN en OUT, así que ledMega recibe 65535 mientras blink_led está activa. 65535 es el máximo del rango analógico de OpenPLC y 0 el mínimo. En el Arduino Mega, OpenPLC divide el valor entre 256 antes de llamar a analogWrite(), así que 65535 se convierte en un ciclo PWM de 255 (encendido del todo) y 0 apaga el pin.

  1. Repite la misma estructura antes de TON0, después del contacto negado de blink_led, y escribe 0 en lugar de 65535. Este MOVE envía 0 a ledMega mientras blink_led está desactivada.
Diagrama Ladder terminado: un MOVE escribe 0 en ledMega después del contacto negado de blink_led y otro escribe 65535 cuando blink_led está activa
El diagrama terminado: 0 en ledMega mientras blink_led está desactivada, 65535 mientras está activa.

Paso 4: simula el programa

Prueba la lógica antes de conectar la placa. Haz clic en la figura azul que corre para iniciar la simulación del PLC.

Barra de herramientas del OpenPLC Editor con la figura azul que inicia la simulación del PLC

Después haz clic en las gafas junto a la instancia (Config0.Res0.instance0) para depurarla.

Selector de instancia Config0.Res0.instance0 con el icono de gafas que inicia la depuración marcado con una flecha roja

El diagrama Ladder muestra ahora las señales activas en verde y los valores en morado. Para seguir una variable, haz clic en su icono de gafas en la lista.

Lista de variables del depurador con el icono de gafas junto a ledMega (UINT) marcado con una flecha roja

ledMega debería cambiar entre 0 y 65535 cada medio segundo. Para la simulación con el botón rojo STOP.

Paso 5: transfiere el programa al Arduino Mega

Conecta el Arduino Mega al ordenador y haz clic en el botón naranja del procesador.

Barra de herramientas del OpenPLC Editor con el botón naranja del procesador que abre Transfer Program to PLC marcado con una flecha roja

En Board Type selecciona Arduino Mega, elige el puerto COM de la placa y haz clic en Transfer to PLC. El Editor compila el programa y lo carga. Si la placa aparece como [NOT INSTALLED], el Editor instala primero el core de la placa, así que la primera transferencia tarda más. Cuando acaba verás Done! en la salida de compilación.

Ventana de transferencia con Board Type Arduino Mega, puerto COM9 y la salida de compilación que termina en Done!

El LED integrado parpadea ahora cada medio segundo. El programa se ejecuta desde la memoria flash de la placa, así que sigue funcionando sin el ordenador.

Si el LED no parpadea

Qué vesCausa probableQué hacer
ledMega se queda en 0 en la simulaciónMOVE no tiene control de ejecución, o EN no está conectada a la salida del temporizadorVuelve a colocar MOVE con Execution control marcado y conecta EN a Q de TOF0
El LED no se enciende nuncaLa ubicación es una dirección digital como %QXEl pin 13 solo está asignado como %QW11: usa una variable UINT en esa dirección
El LED se queda encendidoFalta el MOVE que escribe 0Añade el segundo MOVE después del contacto negado de blink_led
La carga fallaPuerto COM equivocado, u otro programa está usando el puertoCierra cualquier monitor serie y elige el puerto que aparece al conectar la placa

De un Arduino Mega a un PLC industrial

Un Arduino Mega es una buena placa para aprender OpenPLC, pero sus pines trabajan a 5 V y no tiene protección para el cableado de una máquina. La familia M-Duino se basa en el Arduino Mega y ejecuta el mismo tipo de programa OpenPLC con entradas y salidas de 24 V, relés y montaje en carril DIN. Con el mod de Industrial Shields para el Editor seleccionas tu modelo de M-Duino, Ardbox o ESP32 PLC como placa, y las direcciones siguen los nombres impresos en el PLC (%IX1.4 es I1_4). Los pasos están en ESP32 PLC, M-Duino y Ardbox con OpenPLC. Para comparar antes tipos de controlador, lee cómo elegir un controlador industrial.

Mira una secuencia de PLC funcionando en un M-Duino. En el simulador de test de final de línea, un M-Duino 42 ejecuta pasos de continuidad, aislamiento y prueba funcional y marca cada uno como OK o KO. Introduce un fallo y mira qué paso detiene el test.

Abrir el simulador de test de final de líneaLeer el caso del banco de pruebas neumático

Preguntas frecuentes sobre OpenPLC y Arduino Mega

¿Necesito el OpenPLC Runtime para un Arduino?

No. El Runtime ejecuta programas en ordenadores con Linux. Para una placa Arduino el Editor compila el programa y lo carga como firmware, y la placa lo ejecuta por sí sola.

¿Por qué el LED integrado es una salida analógica?

Porque OpenPLC asigna los pines 2 a 13 del Mega como salidas PWM, de %QW0 a %QW11. El pin 13 no está en la lista de salidas digitales, así que solo acepta un valor de 16 bits.

¿Puedo usar Structured Text en lugar de Ladder?

Sí. El Editor admite los lenguajes IEC 61131-3: Ladder Diagram, Structured Text, Function Block Diagram, Instruction List y Sequential Function Chart. Las direcciones IEC funcionan igual en todos.

¿Qué otras placas Arduino funcionan con OpenPLC?

La lista de placas del Editor incluye, entre otras, Arduino Uno, Leonardo, Nano, Due, Mega y varias placas ESP32 y Raspberry Pi Pico. Cada una tiene su mapa de pines, que puedes ver en I/O Config.

¿La simulación usa la placa real?

No. La simulación ejecuta el programa en el ordenador, sin entradas ni salidas. Úsala para comprobar la lógica y después transfiere el programa para probar el hardware.

¿El Arduino Mega puede comunicarse por Modbus con OpenPLC?

Sí. Activa Modbus en la pestaña Communications de la ventana de transferencia y la placa se convierte en esclavo Modbus. La siguiente guía, Modbus en Arduino Mega con OpenPLC, explica cómo.

Siguientes pasos en la serie OpenPLC

  1. Modbus en Arduino Mega con OpenPLC
  2. ESP32 PLC, M-Duino y Ardbox con OpenPLC
  3. Variables externas entre Ladder y una extensión Arduino
  4. Depuración en vivo con OpenPLC

Todas las guías, la compatibilidad por familia de PLC y las preguntas frecuentes están en la guía de OpenPLC para PLC industriales. ¿Dudas sobre tu proyecto? Pregunta a un ingeniero.

Buscar en nuestro blog

Boot & Work Corp. S.L, Arnau Tena 24 de mayo 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