PLC Solution Library · Simulador de red Modbus
Haz funcionar una red Modbus RTU y TCP y encuentra el fallo
Tu SCADA muestra un valor que no cambia desde hace una hora. ¿Se ha bloqueado el transmisor, se ha cortado el cable o el mapa de registros está mal? En este simulador, un M-Duino 21 pregunta a cuatro esclavos Modbus RTU por RS-485 y sirve los datos a clientes Modbus TCP por Ethernet. Ves cada trama, cada CRC y cada tiempo de espera.
Un M-Duino 21 pregunta a cuatro esclavos Modbus RTU y sirve los datos por Modbus TCP. Elige un fallo y encuéntralo en las tramas.
Apaga un esclavo, da la misma dirección a dos esclavos, cambia el orden de palabras o la velocidad. Después usa los contadores y las tramas para encontrar la causa.
Elige un fallo para diagnosticar
A 1/10, un segundo en pantalla son 100 ms en el bus. Pausa y avanza para leer cada trama.
RS-485 · Modbus RTU
Ethernet · Modbus TCP
Lo que ve el SCADA
Equipos de campo
El lado de los equipos: la alimentación y la dirección configurada en cada uno. Los cuatro usan 19200 baudios, 8E1.
Tu programa del PLC
En los dos casos, el bit de estado de esa lectura pasa a 0. El PLC reintenta tras un tiempo de espera o un error de CRC, nunca tras una excepción. Los valores de fallo son 0x8000 para int16, 0xFFFF para uint16, 0xFFFFFFFF para uint32 y NaN para float32.
Editor del mapa de registros: lo que lee el PLC por RS-485
| Lectura | Esclavo | Función | Registro | Tipo | Orden de palabras | Escala | Valor | Calidad | OK / fallidas |
|---|
Cada fila es una transacción Modbus. Cambia un esclavo, una función, un registro o un tipo y mira la respuesta: tiempo de espera, excepción o un valor equivocado. Si cambias un tipo de dato, el mapa TCP de abajo se desplaza y los clientes tienen que adaptarse.
Mapa del servidor Modbus TCP del PLC
| Dirección | Contenido | Registros | Valor |
|---|
Holding registers, función 03, unidad 1. Los clientes los leen con la función 03 desde el HR0. El PLC monta este mapa con sus últimas lecturas. Los clientes nunca hablan con los esclavos.
Clientes Modbus TCP
| Cliente | Cada | Lee | tid | Respuesta |
|---|---|---|---|---|
| SCADA | 1 s | - | ||
| Panel PC | 200 ms | HR0 + 10 | - | |
| Histórico | 5 s | HR0 + 10 | - | |
| Portátil | a petición | abajo | - |
Monta una petición desde el portátil
Inspector de tramas: la última transacción, byte a byte
¿Cómo pregunta un PLC a varios esclavos Modbus RTU en un mismo bus RS-485?
El PLC es el único maestro del bus. Envía una petición, espera la respuesta de un esclavo y solo entonces pregunta al siguiente. Los esclavos nunca hablan por su cuenta. Una vuelta completa de peticiones es un ciclo de lectura.
- Petición. Dirección del esclavo, código de función, primer registro, número de registros y un CRC. A 19200 baudios con 8E1, un byte son 11 bits, unos 0,57 ms, así que una petición de 8 bytes tarda unos 4,6 ms.
- Respuesta. El esclavo repite su dirección y la función, y añade el número de bytes, los datos y su propio CRC. Lo que tarda un esclavo en empezar a responder depende del equipo. Este simulador usa 5 ms como ejemplo.
- Silencio. Entre dos tramas el bus queda en silencio al menos 3,5 tiempos de carácter. Por encima de 19200 baudios, la norma fija este silencio en 1,75 ms.
- Lectura siguiente. El PLC pasa a la fila siguiente de su mapa. Después de la última fila empieza un ciclo nuevo.
Con 6 lecturas a 19200 baudios, el ciclo dura unos 100 ms. Cuando dos valores están en registros seguidos del mismo esclavo, una sola petición con más registros lee los dos y ahorra una transacción entera.
Ejecuta el escenario Red sana y pulsa Pausa y luego Avanzar para seguir las transacciones una a una.
¿Qué lleva una trama Modbus RTU y qué comprueba el CRC?
Una trama Modbus RTU es binaria. El primer byte es la dirección del esclavo, de 1 a 247. El segundo es el código de función. Después vienen los datos, y los dos últimos bytes son un CRC-16. El receptor calcula el CRC de los bytes que le llegan y lo compara con los dos últimos. Si no coinciden, descarta la trama.
- La función 03 lee holding registers y la función 04 lee input registers. Las dos devuelven registros de 16 bits. Una petición lee hasta 125 registros.
- El CRC va con el byte bajo primero. Ejemplo:
01 04 00 00 00 01 31 CApide al esclavo 1 su input register 0.31 CAes el CRC. - Una respuesta de excepción lleva el código de función más 0x80 y después un código de excepción: 01 función no válida, 02 dirección de datos no válida, 03 valor de datos no válido, 04 fallo del esclavo.
Un error de CRC quiere decir que algunos bytes se han dañado por el camino: ruido, falta de terminación, una mala referencia de masa o dos esclavos hablando a la vez. Una excepción quiere decir que el esclavo ha entendido la petición y la rechaza. Entonces el arreglo está en la petición, no en el cableado.
El inspector de tramas de arriba muestra cada byte de la última transacción, con el CRC que calcula esta página.
¿Qué debe hacer el PLC cuando un esclavo no responde?
El PLC espera hasta un tiempo límite. Si no llega ninguna respuesta válida, puede reintentar y después pasa a la lectura siguiente. Un esclavo que no responde cuesta el tiempo de espera entero en cada intento, así que un solo esclavo caído hace más lento todo el ciclo. Con 200 ms de espera y 1 reintento, un esclavo mudo con dos lecturas añade unos 0,8 s a cada ciclo.
El último valor bueno sigue en la memoria del PLC. Si el PLC lo entrega como si fuera reciente, el SCADA muestra un valor estable y creíble de un equipo apagado. Es un valor obsoleto. Hay dos formas habituales de hacerlo visible:
- Conservar el último valor y poner a 0 un bit de estado. Los clientes leen el registro de estado y marcan el valor como malo. En este simulador, el registro de estado tiene un bit por lectura.
- Escribir un valor de fallo que no pueda ser una lectura real, por ejemplo 0x8000 para un valor de 16 bits con signo o NaN para un float. Un cliente que no mira el estado también ve que algo va mal.
Añade un registro de latido que el PLC incrementa en cada ciclo. Si deja de cambiar, los clientes saben que el PLC ha dejado de leer. Reintenta tras un tiempo de espera o un error de CRC. No reintentes tras una excepción: el esclavo ya ha respondido y volverá a dar la misma respuesta.
Ejecuta el escenario Un esclavo deja de responder y compara el valor del editor del mapa con la calidad que ve el SCADA.
¿Cómo se encuentra una dirección Modbus duplicada?
Dos esclavos con la misma dirección responden a la misma petición y a la vez. Sus señales se mezclan en el par RS-485 y el maestro recibe bytes dañados. Los síntomas típicos son:
- Errores de CRC en una sola dirección, mientras las demás están limpias.
- Valores que saltan entre dos lecturas, o respuestas que no encajan con el equipo, como una excepción 01 de un equipo que sí admite la función.
- Otra dirección que de repente deja de responder: el equipo que debería estar ahí tiene ahora la dirección equivocada.
Suele pasar después de un cambio de equipo, porque el equipo nuevo conserva su dirección de fábrica. Configura la dirección de un equipo nuevo antes de conectarlo al bus y guarda la lista de direcciones con el esquema de cableado. Para confirmarlo, apaga el equipo sospechoso y mira los contadores de esa dirección.
Ejecuta el escenario Se cambia un variador, encuentra la causa y arréglala en la tarjeta del equipo.
¿Por qué sale mal un valor Modbus de 32 bits?
Un registro Modbus tiene 16 bits. Un entero de 32 bits o un float ocupa dos registros seguidos, y la norma no fija cuál va primero. Algunos equipos envían primero la palabra alta y otros la baja. Dentro de cada registro, el byte alto va siempre primero.
Ejemplo: el total de 1.284.560 L es 0x001399D0. Un caudalímetro que envía primero la palabra baja pone 0x99D0 en el registro 0 y 0x0013 en el registro 1. Si el PLC los lee con la palabra alta primero, forma 0x99D00013, que es 2.580.545.555.
El CRC está bien y la lectura es OK, así que ningún contador muestra el problema. Mira el orden de palabras en el manual de cada equipo y prueba con un valor que conozcas. Un float con el orden equivocado suele dar un número minúsculo, uno enorme o NaN.
En el lado TCP existe la misma elección. El PLC decide el orden de palabras de su propio mapa de servidor, y todos los clientes tienen que usar el mismo. Ejecuta el escenario Orden de palabras equivocado, y después cambia el orden de palabras del mapa TCP y mira el SCADA.
¿Cómo sirve un PLC Modbus TCP a varios clientes?
En Ethernet, el PLC es un servidor Modbus TCP en el puerto 502. Cada cliente abre una conexión TCP y envía peticiones. La petición es la misma que en Modbus RTU: código de función, primer registro y cantidad. Delante va la cabecera MBAP de 7 bytes. No hay CRC, porque TCP ya comprueba los datos.
- Identificador de transacción, 2 bytes: lo pone el cliente y el servidor lo copia en la respuesta, así el cliente sabe a qué petición corresponde cada respuesta.
- Identificador de protocolo, 2 bytes: 0 para Modbus.
- Longitud, 2 bytes: el número de bytes que siguen, con el identificador de unidad incluido.
- Identificador de unidad, 1 byte: identifica un esclavo serie detrás de una pasarela. En este ejemplo, el PLC responde a la unidad 1 desde su propio mapa.
Cada cliente pregunta a su ritmo: aquí el Panel PC cada 200 ms, el SCADA cada segundo y el histórico cada 5 segundos. El ciclo RTU y las peticiones TCP van por separado. Un cliente lee la copia de los datos que tiene el PLC, nunca el esclavo, así que un cliente rápido no carga el bus RS-485.
Una petición fuera del mapa recibe la excepción 02 y ningún dato. Un cliente que pide 20 registros a un mapa de 10 pierde los 20 valores, no solo los 10 últimos. El chip Ethernet del M-Duino 21, un W5500, tiene 8 sockets por hardware, así que planifica cuántos clientes se conectan a la vez.
Ejecuta el escenario Un cliente lee fuera del mapa, o monta tu propia petición desde el portátil.
Decisiones de diseño que tomas tú
1. Tiempo de espera y reintentos
Pon el tiempo de espera por encima de la respuesta más lenta que esperas, con algo de margen, y no mucho más. Un tiempo de espera largo encarece cada fallo. Un reintento recupera una trama dañada suelta sin multiplicar una y otra vez el coste de un esclavo caído.
2. Una petición por valor o una por bloque
Leer un bloque de registros seguidos en una sola petición acorta el ciclo. Leer cada valor por separado hace más fácil encontrar un registro equivocado, porque una excepción solo afecta a un valor. Muchos mapas combinan las dos cosas.
3. Qué escribe una lectura fallida
Conservar el último valor con un bit de estado o escribir un valor de fallo. Elijas lo que elijas, anótalo en el documento del mapa de registros que entregas al integrador del SCADA, junto con el registro de latido.
4. Orden de palabras del mapa TCP
Elige un solo orden de palabras para todos los valores de 32 bits de tu mapa de servidor y anótalo en el mismo documento. Convierte en el PLC cuando un esclavo use el otro orden.
5. Configuración serie
Todos los equipos de un bus usan la misma velocidad y el mismo formato serie. La especificación de Modbus sobre línea serie usa la paridad par por defecto (8E1). Sin paridad, pide 2 bits de parada (8N2). Muchos equipos aceptan también 8N1. Cablea en cadena, no en estrella, con una terminación de 120 Ω en los dos extremos.
El caso de estudio detrás de este simulador
Este simulador acompaña a nuestro caso de estudio de una red de temperatura con PLC M-Duino: unos PLC locales leen termómetros por Modbus RTU, un PLC principal reúne sus datos y un servidor y un Panel PC los leen por Modbus TCP.
Lee el caso de estudio: una red de temperatura con Modbus RTU y TCP
Lo que ves aquí es un patrón general. Los equipos, las direcciones, los mapas de registros, los tiempos y los fallos son ejemplos, no el diseño de una instalación real.
Para leer contadores de energía y repartir la energía por máquina y turno, usa el simulador de contadores de energía.
Aprende las piezas
Estos tutoriales y ejemplos cubren cada parte de esta red en un PLC basado en Arduino.
- Modbus RTU con PLC basados en Arduino y ESP32, maestro y esclavo
- Modbus TCP con PLC basados en Arduino y ESP32, maestro y esclavo
- Modbus RTU, Modbus TCP u OPC UA: cuál usar
- Maestro Modbus RTU por RS-485 (PLC Solution Library)
- Leer el contador de 32 bits de un caudalímetro por Modbus (PLC Solution Library)
- Mapa de registros Modbus TCP para una planta (PLC Solution Library)
- Pasarela Modbus TCP a RTU en un PLC M-Duino (PLC Solution Library)
Más ejemplos: PLC Solution Library · todos los simuladores.
M-Duino 21: las especificaciones que cuentan aquí
| Comunicación | Ethernet (W5500, 10/100 Mbit, RJ45), RS-485, RS-232, serie TTL, I2C, SPI |
|---|---|
| Modbus | Modbus RTU por RS-485 y Modbus TCP por Ethernet, como maestro o esclavo, con las librerías Arduino de Industrial Shields |
| E/S | 13 entradas (6 analógicas 0-10 V), 8 salidas (3 analógicas/PWM 0-10 V) |
| Integrado | Reloj de tiempo real, ranura microSD |
| Controlador | Arduino Mega 2560 en el interior |
| Alimentación | 12 a 24 Vdc |
| Montaje | Carril DIN TS35, IP20 |
| Programación | Arduino IDE con el paquete de placas de Industrial Shields |
Puertos que usa este ejemplo
| Puerto | Función | Equipos |
|---|---|---|
| RS-485, half duplex, 2 hilos | Maestro Modbus RTU, 19200 baudios, 8E1 | 4 esclavos |
| Ethernet | Servidor Modbus TCP, puerto 502, unidad 1 | SCADA, Panel PC, histórico, portátil |
| Entradas y salidas | No se usan en este ejemplo | - |
La red usa un puerto serie y el puerto Ethernet, así que basta el M-Duino más pequeño. Los ejemplos Modbus de la librería de Industrial Shields usan el nombre de placa M-Duino 21+, que es este PLC. Configura los interruptores RS-485 del PLC como indica la ficha técnica de la familia M-Duino. Especificaciones completas: M-Duino 21 · familia M-Duino.
Preguntas frecuentes
¿Por qué mi esclavo Modbus da tiempo de espera agotado?
El PLC no ha recibido una respuesta válida a tiempo. Si falla un solo esclavo, revisa su alimentación, su dirección, su conexión al bus y su configuración serie. Si fallan todos a la vez, revisa primero el maestro: velocidad, paridad, los hilos A y B, la terminación, y que el puerto RS-485 esté en half duplex para un bus de 2 hilos.
¿Qué causa los errores de CRC en Modbus?
Bytes dañados: ruido eléctrico, una terminación de 120 Ω que falta o que sobra, un cableado en estrella en lugar de en cadena, una mala referencia de masa o dos esclavos con la misma dirección respondiendo a la vez. Cuenta los errores de CRC por dirección. Errores en una sola dirección apuntan a ese equipo o a su dirección. Errores en todas apuntan al bus.
¿Qué diferencia hay entre un tiempo de espera agotado y una excepción Modbus?
Un tiempo de espera agotado quiere decir que no ha vuelto nada válido. Una excepción quiere decir que el esclavo ha entendido la petición y la rechaza, por ejemplo 02 dirección de datos no válida cuando el registro no existe. Reintenta tras un tiempo de espera o un error de CRC. Corrige la petición tras una excepción.
¿A cuántos esclavos puede preguntar un PLC antes de que el ciclo sea demasiado lento?
El primer límite que encuentras suele ser el tiempo de ciclo: cada lectura añade una transacción y cada esclavo mudo añade sus tiempos de espera. Cuenta las lecturas, multiplica por el tiempo de una transacción y suma los tiempos de espera de los esclavos que pueden fallar. El protocolo y el bus permiten más: direcciones de esclavo de 1 a 247, y 32 cargas unitarias por segmento RS-485, más con transceptores de 1/4 o 1/8 de carga unitaria o con repetidores.
¿Por qué está mal mi valor Modbus de 32 bits?
Los dos registros están en el orden equivocado. Modbus no fija el orden de palabras de los valores de 32 bits, así que cada equipo elige el suyo. Cambia el orden de palabras y prueba con un valor que conozcas. Si el valor es un float, comprueba también que el tipo sea float32 y no un entero de 32 bits.
¿Pueden varios clientes SCADA o HMI leer un PLC por Modbus TCP?
Sí. El PLC responde a cada cliente desde su propio mapa de registros, así que los clientes no cargan el bus RS-485. Cada cliente usa sus propios identificadores de transacción. Cuántas conexiones quedan abiertas a la vez depende del programa del servidor y del chip Ethernet: el W5500 del M-Duino 21 tiene 8 sockets por hardware.
¿Necesito saber programar para montar esta red?
El programa del PLC se escribe en C++ con el Arduino IDE, con la librería Modbus de Industrial Shields y sus ejemplos públicos de Modbus RTU y Modbus TCP, enlazados más arriba. Si lo prefieres, un integrador puede escribir el programa a partir de tu mapa de registros.
Pide un plan de lectura para tu red
Cuéntanos qué esclavos tienes, sus direcciones y mapas de registros, y qué clientes leen los datos. Nuestro equipo te responde con una propuesta de plan de lectura y de mapa de registros del servidor para tu caso. Los ajustes del simulador van con la petición.