Para conectar una pantalla HMI a un PLC basado en Arduino, usa Modbus: Modbus TCP por Ethernet o Modbus RTU por RS-485. En este ejemplo una HMI Kinco G100E es esclavo Modbus TCP (IP 192.168.0.5, puerto 502, estación 1) y un M-Duino 21+ es el maestro: con la librería Modbus de Industrial Shields escribe la bobina 0 en el bit LB 0 de la HMI y el registro 0 en la palabra LW 0, una vez por segundo.
Las pantallas táctiles HMI son la interfaz de operario habitual en una máquina: botones, pilotos y valores que el PLC lee y escribe. Esta guía configura una pantalla Kinco en Kinco DTools, la conecta al PLC por Ethernet y adapta dos ejemplos de la librería Modbus de Industrial Shields. Al final, un vídeo muestra toda la configuración.
- Paso 1Cableado y alimentaciónHMI a 24 Vdc, PLC a 12-24 Vdc, cable Ethernet entre los dos
- Paso 2HMI como esclavo ModbusNetwork Device Setting: Modbus TCP Slave, puerto 502, estación 1
- Paso 3Pantalla de la HMIUn Bit State Lamp en LB 0, un valor en LW 0
- Paso 4PLC como maestroEscribir la bobina 0 y el registro 0 con la librería Modbus
¿Qué necesitas?
| Elemento | Usado en este ejemplo |
|---|---|
| PLC | M-Duino 21+: Arduino Mega 2560 dentro, Ethernet, 13 entradas y 8 salidas |
| HMI | Kinco G100E: 10,1 pulgadas, 1024 x 600, Ethernet, puertos serie COM0 (RS-232, RS-485, RS-422), COM1 (RS-485, RS-422) y COM2 (RS-232) |
| Software de la HMI | Kinco DTools (V3.5.1 en las capturas), desde la web de Kinco |
| Software del PLC | Arduino IDE con las placas de Industrial Shields y la librería Modbus de Industrial Shields (versión 1.1.0 al actualizar esta guía) |
| Cableado | Fuente de 24 Vdc para la HMI, fuente de 12-24 Vdc para el PLC, un cable Ethernet, un cable USB para el PLC y un cable USB para la HMI |
Los papeles los fija la configuración de la HMI: la HMI es el esclavo Modbus TCP (servidor) y espera peticiones en el puerto 502; el PLC es el maestro (cliente) y las envía. Muchas HMI también pueden trabajar al revés, como maestros que consultan a un PLC esclavo; consulta Modbus TCP esclavo con un PLC basado en Arduino para ese caso.
¿Cómo se cablean y alimentan la HMI y el PLC?
- Alimenta la HMI con una fuente de 24 Vdc y el PLC con su fuente de 12-24 Vdc (12 Vdc en este ejemplo).
- Conecta el PLC y la HMI con un cable Ethernet, directamente o a través de un switch. Los dos deben estar en la misma subred: 192.168.0.4 para el PLC y 192.168.0.5 para la HMI en este ejemplo.
- Conecta el PC al PLC con un cable USB para cargar el programa, y a la HMI con un cable USB para descargar el proyecto de pantalla.
Paso 1: crea el proyecto de la HMI en Kinco DTools
Abre Kinco DTools y crea un proyecto nuevo. En el diálogo New Project, elige el HMI Model (aquí G100E); el diálogo muestra su información de hardware (Figura 1). Pulsa Next, sáltate el diálogo siguiente y pulsa Finish. En el centro del proyecto aparece un bloque para la pantalla, HMI0 (Figura 2).


Paso 2: configura la HMI como esclavo Modbus TCP
Haz doble clic en el bloque de la HMI, o clic derecho y Attribute. En la pestaña HMI, pulsa Network Device Setting (Figura 3), pulsa Add y configura el nuevo equipo como en la Figura 4:
| Campo | Valor |
|---|---|
| Device Type | HMI |
| Device No. | HMI0 |
| IP Address | 192.168.0.5 |
| Port Num | 502 |
| Comm Protocol | Modbus TCP Slave |
| Station NO. | 1 |


En la Figura 3 el campo Network 0 todavía muestra la dirección por defecto 192.168.0.100. Use la HMI la dirección que use al final, el programa del PLC debe apuntar a esa misma dirección (192.168.0.5 en este ejemplo).
Paso 3: añade los elementos de pantalla
Haz clic derecho en el bloque de la HMI y elige Edit para abrir la pantalla. La Graph element window de la izquierda muestra los elementos que puedes añadir.
- Para un bit, arrastra un Bit State Lamp a la pantalla y configura Addr Type: LB y Address: 0. Deja el resto de valores por defecto. Para más bits, usa las direcciones siguientes (LB 1, LB 2...). En las opciones de estado de bit eliges cómo se comporta el elemento; este ejemplo usa conmutación (toggle).
- Para un valor, usa un elemento con el tipo de dirección LW (palabra), y aumenta la longitud de palabra si necesitas más de 16 bits.
Compila con Tools > Compile. Si no hay errores, descarga el proyecto con Tools > Download: pon el tipo de comunicación en USB port y pulsa Download.

Paso 4: programa el PLC como maestro Modbus TCP
Instala las placas de Industrial Shields en el IDE de Arduino, descarga la librería Modbus de GitHub como archivo ZIP y añádela con Programa > Incluir librería > Añadir biblioteca .ZIP. Reinicia el IDE si los ejemplos no aparecen.

Selecciona tu modelo de M-Duino y el puerto, y abre Archivo > Ejemplos > Modbus > ModbusTCPMasterWriteSingleCoil. Cambia el bloque de configuración del principio con las direcciones de este montaje:
// Modbus master IP (the M-Duino)
#define ETHERNET_MASTER_IP IPAddress(192, 168, 0, 4);
// Modbus slave IP (the Kinco HMI)
#define ETHERNET_SLAVE_IP IPAddress(192, 168, 0, 5);
// Modbus slave port
#define ETHERNET_SLAVE_PORT 502
// Modbus address of the slave (Station NO.)
#define MODBUS_SLAVE_ADDRESS 1
// Coil address to write (LB 0 in the HMI)
#define MODBUS_COIL_TO_WRITE 0
// Milliseconds between requests
#define MS_BETWEEN_REQUESTS 1000
El ejemplo abre una conexión TCP con la HMI, se reconecta si se cae y cada 1.000 ms envía una petición Write Single Coil (código de función 05) que conmuta la bobina 0. El Bit State Lamp de LB 0 cambia de estado cada segundo.
static void sendModbusRequest(void) {
static bool coilValue;
if (master.writeSingleCoil(slaveEth, MODBUS_SLAVE_ADDRESS, MODBUS_COIL_TO_WRITE, coilValue)) {
coilValue = !coilValue;
}
else {
// For some reason, the request could not be completed.
Serial.println("Request to write a coil failed");
}
}
Para enviar un valor, abre ModbusTCPMasterWriteSingleRegister y cambia las mismas líneas (la dirección del registro es MODBUS_HOLDING_REGISTER_TO_WRITE, 0). Envía una petición Write Single Register (código de función 06) que alterna el valor del registro 0, la palabra LW 0 de la HMI, entre 0 y 1000:
if (master.writeSingleRegister(slaveEth, MODBUS_SLAVE_ADDRESS, MODBUS_HOLDING_REGISTER_TO_WRITE, registerValue)) {
registerValue = registerValue == 0 ? 1000 : 0;
}
Carga el programa en el PLC. Hemos compilado los dos ejemplos con estos cambios para el M-Duino 21+ (ATmega2560) con la versión 1.1.0 de la librería; pruébalos con tu propia HMI antes de usarlos en una máquina.
| Petición del PLC | Función Modbus | Dirección | Elemento de la HMI |
|---|---|---|---|
writeSingleCoil | 05, Write Single Coil | Bobina 0 | Bit State Lamp, LB 0 |
writeSingleRegister | 06, Write Single Register | Registro de retención 0 | Elemento de palabra, LW 0 |
Más sobre la librería maestra y sus funciones de lectura en Modbus TCP maestro con PLC basados en Arduino y ESP32.
Vídeo: HMI Kinco y M-Duino por Modbus TCP
El vídeo muestra la configuración de la HMI y la comunicación entre el PLC y la pantalla, paso a paso.
Solución de problemas
- El monitor serie muestra "The first connection attempt failed": revisa el cable Ethernet, que el PLC y la HMI estén en la misma subred y que la IP del programa sea la que usa de verdad la HMI.
- La conexión funciona pero la pantalla no cambia: comprueba que el número de estación del programa (
MODBUS_SLAVE_ADDRESS) y el de DTools sean el mismo, y que el elemento use LB 0 o LW 0. - La respuesta contiene un error: la HMI ha contestado con una excepción Modbus; revisa el tipo de dirección y la dirección del elemento.
Preguntas frecuentes sobre cómo conectar una HMI a un PLC basado en Arduino
¿Puedo conectar la HMI por RS-485 en lugar de Ethernet?
Sí, con Modbus RTU, si la HMI tiene puerto RS-485 (la G100E lo tiene en COM0 y COM1). El PLC usa entonces los ejemplos de maestro RTU de la misma librería. Consulta Modbus RTU con PLC basados en Arduino y ESP32.
¿Funciona con otras marcas de HMI?
Sí, con cualquier HMI que admita Modbus TCP o Modbus RTU. Solo cambia la herramienta de configuración; la parte del PLC es la misma.
¿La HMI debe ser maestro o esclavo?
Las dos opciones funcionan. Con la HMI como esclavo, como aquí, el PLC decide cuándo escribir. Con la HMI como maestro, la HMI consulta al PLC, que ejecuta un esclavo Modbus; es la opción habitual cuando la pantalla debe leer muchos valores del PLC.
¿Puede el PLC leer valores de la HMI?
Sí. La librería tiene funciones de lectura de bobinas y registros de retención; úsalas para leer botones (LB) o consignas (LW) que escribe el operario.
¿Qué protocolo Modbus elijo para una planta?
Modbus TCP entre PLC, HMI y SCADA, y Modbus RTU en el bus de campo. La guía de Modbus RTU, Modbus TCP y OPC UA explica dónde encaja cada uno.
Llévalo a la práctica
Pantallas de operario alrededor de un PLC en uso real: una cinta con un Panel PC, una bodega de fermentación con un panel PC y una pantalla táctil con LEDs de estado.
Caso de estudio
El PLC fija la velocidad. El variador mueve la cinta.
Un M-Duino 42+ gobierna el lazo de velocidad con señales analógicas de velocidad y corriente, y un Panel PC da las funciones al operario.
Lee el caso de estudio
Simulador
Mantén cada depósito de fermentación entre sus límites
Un M-Duino 42+ lee una sonda en cada uno de cuatro depósitos y abre la válvula de la camisa de refrigeración del que supera su máximo, con un panel PC para reconocer las alertas.
Abre el simulador
PLC Solution Library
LEDs de estado por MQTT para una HMI táctil de máquina
Un dashboard Node-RED en una TouchBerry Pi donde un LED sigue un topic MQTT y un botón publica órdenes de vuelta al broker.
Ver el ejemplo
Una HMI y un PLC del mismo catálogo. La TouchBerry Pi es un panel PC con Raspberry Pi, dashboards de Node-RED y algunas E/S propias, y habla Modbus TCP con M-Duino, ESP32 PLC y Raspberry PLC.
Más sobre Modbus con PLC industriales
- Modbus TCP maestro con PLC basados en Arduino y ESP32
- Cómo usar la librería Modbus TCP esclavo con un PLC basado en Arduino
- Trama Modbus RTU, códigos de función y CRC, con una librería maestra para PLC
- Guía de Modbus TCP y RTU para PLC con Raspberry Pi
- Aplicaciones industriales: 50 ejemplos reales por sector