Ir al contenido

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

Pedir el plan de lectura

08:00:00.000 Modo libre Valores simulados, tramas reales

-ciclo RTU
-lecturas buenas
0tiempos de espera
0errores de CRC
0excepciones (RTU)
0peticiones TCP

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

      Sobre esta red

      Red de ejemplo para que hagas pruebas. Un M-Duino 21 es el maestro Modbus RTU de un bus RS-485 con cuatro esclavos a 19200 baudios, 8E1:

      • Transmisor de temperatura, ID 1: input register 0, temperatura × 10, int16.
      • Transmisor de presión, ID 2: input registers 0 y 1, presión en bar, float32, palabra alta primero.
      • Caudalímetro, ID 3: holding registers 0 y 1, total en litros, uint32, palabra baja primero. Holding register 2, caudal × 10.
      • Variador de frecuencia, ID 4: holding register 0, velocidad en rpm. Holding register 1, corriente × 10.

      En Ethernet, el mismo PLC es un servidor Modbus TCP en el puerto 502. Un SCADA, un Panel PC y un histórico leen sus holding registers. El portátil envía las peticiones que tú montas.

      Las direcciones, los mapas de registros, los tiempos y los valores son ejemplos, no datos de equipos reales. Las tramas y el CRC son reales: los calcula esta página.

      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.

      TT-101 Transmisor de temperatura
      PT-102 Transmisor de presión
      FT-103 Caudalímetro
      M-104 Variador de frecuencia

      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

      LecturaEsclavoFunciónRegistroTipoOrden de palabrasEscalaValorCalidadOK / 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ónContenidoRegistrosValor

      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

      ClienteCadaLeetidRespuesta
      SCADA1 s-
      Panel PC200 msHR0 + 10-
      Histórico5 sHR0 + 10-
      Portátila peticiónabajo-

      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.

      1. 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.
      2. 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.
      3. 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.
      4. 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 CA pide al esclavo 1 su input register 0. 31 CA es 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.

      Más ejemplos: PLC Solution Library · todos los simuladores.

      M-Duino 21: las especificaciones que cuentan aquí

      ComunicaciónEthernet (W5500, 10/100 Mbit, RJ45), RS-485, RS-232, serie TTL, I2C, SPI
      ModbusModbus RTU por RS-485 y Modbus TCP por Ethernet, como maestro o esclavo, con las librerías Arduino de Industrial Shields
      E/S13 entradas (6 analógicas 0-10 V), 8 salidas (3 analógicas/PWM 0-10 V)
      IntegradoReloj de tiempo real, ranura microSD
      ControladorArduino Mega 2560 en el interior
      Alimentación12 a 24 Vdc
      MontajeCarril DIN TS35, IP20
      ProgramaciónArduino IDE con el paquete de placas de Industrial Shields

      Puertos que usa este ejemplo

      PuertoFunciónEquipos
      RS-485, half duplex, 2 hilosMaestro Modbus RTU, 19200 baudios, 8E14 esclavos
      EthernetServidor Modbus TCP, puerto 502, unidad 1SCADA, Panel PC, histórico, portátil
      Entradas y salidasNo 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.