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ñal | Direcciones IEC | Pines del Arduino Mega, en orden |
|---|---|---|
| Entradas digitales | %IX0.0 a %IX2.7 | 62 a 69 (A8 a A15), después 22, 24, 26 ... 52 |
| Salidas digitales | %QX0.0 a %QX2.7 | 14 a 21, después 23, 25, 27 ... 53 |
| Entradas analógicas | %IW0 a %IW7 | A0 a A7 |
| Salidas analógicas (PWM) | %QW0 a %QW11 | 2 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.

Al principio el área del editor está 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.

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.

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.

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

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

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.
- 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 aledMegamientrasblink_ledestá desactivada.

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.

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

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.

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.

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.

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é ves | Causa probable | Qué hacer |
|---|---|---|
ledMega se queda en 0 en la simulación | MOVE no tiene control de ejecución, o EN no está conectada a la salida del temporizador | Vuelve a colocar MOVE con Execution control marcado y conecta EN a Q de TOF0 |
| El LED no se enciende nunca | La ubicación es una dirección digital como %QX | El pin 13 solo está asignado como %QW11: usa una variable UINT en esa dirección |
| El LED se queda encendido | Falta el MOVE que escribe 0 | Añade el segundo MOVE después del contacto negado de blink_led |
| La carga falla | Puerto COM equivocado, u otro programa está usando el puerto | Cierra 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
- Modbus en Arduino Mega con OpenPLC
- ESP32 PLC, M-Duino y Ardbox con OpenPLC
- Variables externas entre Ladder y una extensión Arduino
- 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.