Guía completa: OpenPLC con PLC industriales
Para usar Modbus con OpenPLC en un Arduino Mega, activa Modbus RTU (Serial) en la pestaña Communications de Transfer Program to PLC, fija la velocidad y el ID de esclavo, y asigna direcciones IEC a tus variables. OpenPLC sirve entonces cada salida %QX como coil, cada entrada %IX como entrada discreta, cada %IW como input register y cada %QW como holding register. El número de coil es 8 por el primer índice más el segundo, así que %QX1.1 es el coil 9.
En esta guía el Arduino Mega es un esclavo Modbus RTU por USB. El programa Ladder genera dos señales que parpadean en oposición, un maestro Modbus en el PC las lee y el maestro para todo el programa escribiendo un coil. Crearás el diagrama Ladder, asignarás las variables a coils, cargarás el programa con Modbus activado y lo probarás con un simulador de maestro gratuito.
Los pasos y las capturas son del OpenPLC Editor clásico. OpenPLC Editor v4 es una aplicación nueva con otra interfaz, así que allí los menús pueden tener otros nombres. Es la segunda guía de la serie: empieza por Primeros pasos con OpenPLC y Arduino Mega si todavía no has usado OpenPLC.
Qué necesitas
- Un Arduino Mega 2560 y su cable USB.
- El OpenPLC Editor, con el proyecto Blink de la guía de primeros pasos.
- Un maestro Modbus en el PC. Esta guía usa el Radzio! Modbus Master Simulator gratuito para Windows; sirve cualquier maestro Modbus RTU.
Los mismos pasos sirven para un PLC M-Duino, que está basado en el Arduino Mega, cuando las placas de Industrial Shields ya están en OpenPLC. Consulta ESP32 PLC, M-Duino y Ardbox con OpenPLC.
Crea el diagrama Ladder
Abre el ejemplo Blink en File > Tutorials and Examples > 2: Blink. Sus temporizadores TON y TOF cambian la variable blink_led cada 500 ms. Después haz tres cambios:
- En la tabla de variables, añade dos variables de tipo
BOOL:blink_led_offyglobal. Pon el valor inicial deglobala 1.globalservirá para parar todo el programa. - Con la herramienta de variables, coloca
blink_led_offcomo salida y conéctala a la derecha del contacto negadoblink_led. - Con la herramienta de contactos, coloca
globaljusto antes de la bobinablink_led.



Compila e inicia la simulación. blink_led_off siempre toma el valor contrario de blink_led. Si pones global a 0, las dos se paran.
Cómo asigna OpenPLC las direcciones IEC a Modbus
Con Modbus activado, OpenPLC añade un esclavo Modbus al programa que compila para la placa y enlaza cada dirección IEC con una tabla Modbus. En el Arduino Mega los rangos son estos:
| Dirección IEC | Tabla Modbus | Códigos de función | Rango en Arduino Mega | El maestro puede |
|---|---|---|---|---|
%IX0.0 a %IX2.7 | Entradas discretas | 02 | 0 a 23 | Leer |
%QX0.0 a %QX2.7 | Coils | 01, 05, 15 | 0 a 23 | Leer y escribir |
%IW0 a %IW7 | Input registers | 04 | 0 a 7 | Leer |
%QW0 a %QW11 | Holding registers | 03, 06, 16 | 0 a 11 | Leer y escribir |
Para los bits, la dirección Modbus es 8 por el primer índice más el segundo: %QX1.1 es 8 × 1 + 1 = 9. Para las palabras, es el propio índice: %QW11 es el holding register 11. Da a las tres variables estas ubicaciones:
| Variable | Ubicación | Coil | Pin del Arduino Mega con la I/O Config por defecto |
|---|---|---|---|
global | %QX0.7 | 7 | 21 |
blink_led | %QX1.0 | 8 | 23 |
blink_led_off | %QX1.1 | 9 | 25 |
Una ubicación %QX es una salida real: los pines 21, 23 y 25 conmutan con las variables. Déjalos sin conectar en esta prueba. Con Modbus activado, cada pin de la I/O Config pasa a ser también un coil o un registro que el maestro puede escribir, aunque el programa Ladder no lo use.
Opcional: muestra el estado en el LED integrado
El LED del Arduino Mega está en el pin PWM 13, que OpenPLC asigna a la salida analógica %QW11. Añade una variable ledMega de tipo UINT en %QW11 y dos bloques MOVE: 65535 (fondo de escala) cuando blink_led está activa y 0 cuando lo está blink_led_off. El maestro también puede leerla como holding register 11.

Activa Modbus RTU y carga el programa
Abre Transfer Program to PLC, ve a la pestaña Communications y marca Enable Modbus RTU (Serial). Esta guía usa estos valores:
| Parámetro | Valor | Qué hace |
|---|---|---|
| Interface | Serial | El puerto serie USB del Arduino Mega |
| Baud | 115200 | Debe ser igual en el maestro |
| Slave ID | 1 | La dirección a la que pregunta el maestro (1 a 247) |
| Tx Pin | -1 | Sin transceptor RS-485. Con uno, es el pin que habilita el transmisor: OpenPLC lo pone en alto mientras envía una trama |
| Enable Modbus TCP | Desactivado | El Arduino Mega no tiene Ethernet ni Wi-Fi |

OpenPLC abre el puerto serie con el formato por defecto de Arduino: 8 bits de datos, sin paridad y 1 bit de parada (8N1). Muchos equipos Modbus usan paridad par por defecto, así que aquí configura el maestro en 8N1. Vuelve a la pestaña Transfer y carga el programa. Si añadiste el LED, parpadea cada medio segundo.
Prueba el esclavo con un simulador de maestro Modbus
- Abre Radzio y ve a Connection > Settings. Selecciona Modbus RTU, el puerto COM del Arduino, 115200 baudios, paridad None, 1 bit de parada y "Register address (starting from 0)".
- En Setup > Data definition, fija el scan rate en 100 ms.
- Crea una página con File > New: Device ID 1, Coil status, dirección 0, longitud 10.
- Haz clic en Connection > Connect. Los coils 8 y 9 cambian cada 500 ms y el coil 7 se queda en 1.
- Haz doble clic en el valor del coil 7 y ponlo en Off.
globalpasa a 0, los coils 8 y 9 se paran y el LED se apaga.




En el cable, la lectura es la trama 01 01 00 00 00 0A BC 0D (esclavo 1, función 01, desde el coil 0, 10 coils, CRC). Escribir el coil 7 a Off es 01 05 00 07 00 00 7C 0B. La guía de la trama y los códigos de función de Modbus RTU explica cada byte.
Desconecta Radzio antes de cargar un programa nuevo. Solo una aplicación puede usar el puerto COM, y la carga falla mientras el maestro lo tiene abierto.
Si el maestro no recibe respuesta
| Qué ves | Causa probable | Qué hacer |
|---|---|---|
| Timeout en todas las peticiones | Puerto COM, velocidad, paridad o ID de esclavo incorrectos | Usa el puerto del Arduino, 115200, sin paridad, 1 bit de parada e ID 1 |
| La carga falla en OpenPLC | El maestro aún tiene abierto el puerto COM | Desconecta el maestro, carga y vuelve a conectar |
| Los valores salen desplazados una posición | El maestro numera los coils desde 1 | Selecciona direcciones desde 0, o suma 1 (el coil 7 es el 00008 si se numera desde 1) |
| Un coil vuelve a su valor después de escribirlo | El programa Ladder escribe esa variable en cada ciclo | Escribe solo variables que el programa no controla, como global |
| Los coils 8 y 9 no cambian nunca | global está a 0 | Pon su valor inicial a 1, o escribe el coil 7 a On |
Del Arduino Mega a una red Modbus industrial
Un esclavo Modbus por USB sirve para aprender. En un cuadro, el esclavo está en un bus RS-485 o en Ethernet. Un PLC M-Duino mantiene la base del Arduino Mega y añade RS-485, Ethernet y entradas y salidas de 24 V, y el mod de Industrial Shields lo añade a OpenPLC. Si el PLC tiene que ser el maestro Modbus, prográmalo en el Arduino IDE con la librería de Industrial Shields, como en Modbus RTU con PLC basados en Arduino y ESP32. Para comparar las familias, lee cómo elegir un controlador industrial.
Mira una red Modbus completa antes de montarla. En el simulador de red Modbus, un M-Duino 21 consulta cuatro esclavos Modbus RTU por RS-485 y sirve los datos por Modbus TCP. Apaga un esclavo o cambia la velocidad y observa las tramas.
Abre el simulador de red ModbusLee el caso de la red Modbus de temperatura
Preguntas frecuentes sobre Modbus en OpenPLC con Arduino
¿Puede un Arduino con OpenPLC ser maestro Modbus?
El firmware que genera el OpenPLC Editor para placas Arduino solo incluye un esclavo Modbus. Para consultar contadores, variadores u otros PLC, programa el PLC en el Arduino IDE con una librería de maestro Modbus.
¿Por qué paridad None si Modbus RTU usa paridad par por defecto?
OpenPLC abre el puerto serie del Arduino en 8N1. El maestro y todos los equipos de la línea deben usar el mismo formato, así que configura el maestro sin paridad y con 1 bit de parada.
¿Funciona por RS-485?
Sí, con un transceptor RS-485 en un puerto serie de la placa. En Tx Pin pon el pin que habilita el transmisor del transceptor. OpenPLC lo pone en alto mientras responde y en bajo después.
¿Cómo leo valores analógicos por Modbus?
Las entradas analógicas (%IW) son input registers y se leen con la función 04. Las salidas analógicas (%QW) son holding registers: se leen con la función 03 y se escriben con la 06 o la 16. OpenPLC usa de 0 a 65535: en el Arduino Mega, una entrada analógica es la lectura de 10 bits multiplicada por 64.
¿Por qué se reinicia el Arduino cuando se conecta el maestro?
El Arduino Mega se reinicia cuando un programa abre su puerto USB con DTR activo. Deja DTR inactivo en el maestro, como en la configuración de Radzio de arriba.
Más guías de OpenPLC y Modbus
- OpenPLC con PLC industriales: la guía completa
- Primeros pasos con OpenPLC y Arduino Mega
- ESP32 PLC, M-Duino y Ardbox con OpenPLC (la siguiente de la serie)
- Variables externas en OpenPLC para extensiones Arduino
- Trama Modbus RTU, códigos de función y CRC
- Conceptos básicos de RS-485 en PLC industriales