Ir al contenido

Modbus en Arduino Mega con OpenPLC

Asigna direcciones IEC a coils y registros, activa Modbus RTU y prueba el esclavo con un simulador de maestro
8 de julio de 2024 por
Boot & Work Corp. S.L, Arnau Tena

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

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:

  1. En la tabla de variables, añade dos variables de tipo BOOL: blink_led_off y global. Pon el valor inicial de global a 1. global servirá para parar todo el programa.
  2. Con la herramienta de variables, coloca blink_led_off como salida y conéctala a la derecha del contacto negado blink_led.
  3. Con la herramienta de contactos, coloca global justo antes de la bobina blink_led.
Tabla de variables de OpenPLC con blink_led, blink_led_off y global declaradas como BOOL, global con valor inicial 1
Tabla de variables: blink_led, blink_led_off y global son BOOL, y global empieza en 1.
Línea Ladder donde blink_led_off está conectada después del contacto negado blink_led y el temporizador TON
blink_led_off está conectada después del contacto negado blink_led.
Línea Ladder con el contacto global antes de la bobina blink_led, después del temporizador TOF
El contacto global está antes de la bobina blink_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 IECTabla ModbusCódigos de funciónRango en Arduino MegaEl maestro puede
%IX0.0 a %IX2.7Entradas discretas020 a 23Leer
%QX0.0 a %QX2.7Coils01, 05, 150 a 23Leer y escribir
%IW0 a %IW7Input registers040 a 7Leer
%QW0 a %QW11Holding registers03, 06, 160 a 11Leer 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:

VariableUbicaciónCoilPin del Arduino Mega con la I/O Config por defecto
global%QX0.7721
blink_led%QX1.0823
blink_led_off%QX1.1925

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.

Dos bloques MOVE que escriben 65535 o 0 en la variable ledMega en %QW11
Dos bloques MOVE escriben 65535 o 0 en ledMega (%QW11), el LED integrado.

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ámetroValorQué hace
InterfaceSerialEl puerto serie USB del Arduino Mega
Baud115200Debe ser igual en el maestro
Slave ID1La dirección a la que pregunta el maestro (1 a 247)
Tx Pin-1Sin transceptor RS-485. Con uno, es el pin que habilita el transmisor: OpenPLC lo pone en alto mientras envía una trama
Enable Modbus TCPDesactivadoEl Arduino Mega no tiene Ethernet ni Wi-Fi
Pestaña Communications de OpenPLC con Modbus RTU por serie activado a 115200 baudios, ID de esclavo 1 y Tx Pin -1
Pestaña Communications: Modbus RTU por el puerto serie a 115200 baudios, ID de esclavo 1, Tx Pin -1.

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

  1. 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)".
  2. En Setup > Data definition, fija el scan rate en 100 ms.
  3. Crea una página con File > New: Device ID 1, Coil status, dirección 0, longitud 10.
  4. Haz clic en Connection > Connect. Los coils 8 y 9 cambian cada 500 ms y el coil 7 se queda en 1.
  5. Haz doble clic en el valor del coil 7 y ponlo en Off. global pasa a 0, los coils 8 y 9 se paran y el LED se apaga.
Configuración de conexión de Radzio Modbus Master Simulator para Modbus RTU a 115200 baudios, sin paridad, 1 bit de parada
Conexión de Radzio: Modbus RTU, 115200 baudios, sin paridad, 1 bit de parada, direcciones desde 0.
Ventana de configuración de Radzio con un scan rate de 100 ms
Scan rate de 100 ms.
Página de Radzio con device ID 1, coil status, dirección 0 y longitud 10
Página nueva: device ID 1, coil status, dirección 0, longitud 10.
Radzio leyendo los coils del Arduino Mega con el coil 7 a 1 y el coil 9 a 1
Conectado: el coil 7 está a 1 y los coils 8 y 9 se alternan.

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é vesCausa probableQué hacer
Timeout en todas las peticionesPuerto COM, velocidad, paridad o ID de esclavo incorrectosUsa el puerto del Arduino, 115200, sin paridad, 1 bit de parada e ID 1
La carga falla en OpenPLCEl maestro aún tiene abierto el puerto COMDesconecta el maestro, carga y vuelve a conectar
Los valores salen desplazados una posiciónEl maestro numera los coils desde 1Selecciona 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 escribirloEl programa Ladder escribe esa variable en cada cicloEscribe solo variables que el programa no controla, como global
Los coils 8 y 9 no cambian nuncaglobal está a 0Pon 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.

Buscar en nuestro blog

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