graph TD subgraph "Mapa de Memoria Modbus" direction LR Coils["0x: Coils
(Salidas Digitales)
Lectura/Escritura"] DI["1x: Discrete Inputs
(Entradas Digitales)
Solo Lectura"] IR["3x: Input Registers
(Entradas Analógicas)
Solo Lectura"] HR["4x: Holding Registers
(Parámetros/Salidas Analógicas)
Lectura/Escritura"] end style Coils fill:#27ae60,color:white style DI fill:#2980b9,color:white style IR fill:#8e44ad,color:white style HR fill:#c0392b,color:white

1. Las Cuatro Áreas de Memoria

A diferencia de protocolos modernos como PROFINET, que utilizan estructuras de datos complejas, Modbus es extremadamente simple. Su mapa de memoria se divide en solo cuatro tipos de datos. Para un técnico de UF1794, dominar estas cuatro áreas es esencial para integrar cualquier dispositivo Modbus, desde un sensor de temperatura hasta un variador de frecuencia complejo.

Estas áreas se dividen en dos categorías: datos de un solo bit (digitales) y datos de 16 bits (analógicos o de configuración).



2. Datos de un solo Bit: Coils y Discrete Inputs

  • Coils (Bobinas - 0x): Son el equivalente a las salidas digitales de un PLC. Son lectura/escritura. Se utilizan para activar o desactivar relés, contactores, luces, etc. Por ejemplo, escribir un '1' en la Coil 00001 podría arrancar un motor.
  • Discrete Inputs (Entradas Discretas - 1x): Son el equivalente a las entradas digitales de un PLC. Son de solo lectura. Se utilizan para leer el estado de sensores, finales de carrera, pulsadores, etc. Por ejemplo, leer la Discrete Input 10001 nos dirá si una puerta de seguridad está abierta o cerrada.


3. Datos de 16 bits (Words): Input y Holding Registers

  • Input Registers (Registros de Entrada - 3x): Son registros de 16 bits de solo lectura. Se utilizan para leer valores analógicos que provienen de un proceso físico, como la temperatura de una sonda, la presión de un manómetro o la velocidad actual de un motor.
  • Holding Registers (Registros de Retención - 4x): Son los registros más versátiles y potentes. Son registros de 16 bits de lectura/escritura. Se utilizan para almacenar consignas (setpoints), parámetros de configuración, contadores, o cualquier dato que el PLC necesite modificar en el dispositivo esclavo. Por ejemplo, para cambiar la velocidad deseada de un motor, escribiríamos el valor en un Holding Register.


4. La Confusión del Direccionamiento: 40001 vs. Registro 0

El mayor punto de confusión en Modbus es la notación de las direcciones. Históricamente, para diferenciar las cuatro áreas de memoria, se les asignó un prefijo:

  • 0xxxx para Coils.
  • 1xxxx para Discrete Inputs.
  • 3xxxx para Input Registers.
  • 4xxxx para Holding Registers.

Así, cuando un manual dice "lea el registro 40001", se refiere al primer Holding Register. Sin embargo, a nivel de protocolo, la dirección que se envía en la trama es la dirección real del registro, que empieza en 0. Por lo tanto, para leer el registro 40001, el cliente Modbus debe solicitar la lectura del Holding Register en la dirección 0.

Esta diferencia entre la "dirección de manual" (base 1) y la "dirección de protocolo" (base 0) es una fuente constante de errores de configuración. Un buen software cliente Modbus suele permitir elegir qué notación usar para evitar confusiones.

ESTRUCTURA DEL MAPA DE MEMORIA MODBUS 0x: COILS 00001 00002 . Tipo: Bit Acceso: R/W Uso: Activar Salidas 1x: DISCRETE INPUTS 10001 10002 . Tipo: Bit Acceso: Read-Only Uso: Leer Sensores 3x: INPUT REGISTERS 30001 30002 . Tipo: 16-bit Word Acceso: Read-Only Uso: Leer Medidas 4x: HOLDING REGISTERS 40001 40002 . Tipo: 16-bit Word Acceso: R/W Uso: Escribir Setpoints La dirección 40001 en el manual corresponde a la dirección de protocolo 0 en el área de Holding Registers.
Figura 1: Las cuatro áreas de memoria de Modbus. Dos áreas para datos de un solo bit (Coils y Discrete Inputs) y dos áreas para palabras de 16 bits (Input y Holding Registers). La clave es diferenciar las que son de solo lectura (para leer el estado del mundo físico) de las que son de lectura/escritura (para enviar comandos y configuraciones).
Fuente: Elaboración Propia. Licencia: CC BY-SA 4.0.

🎥 Formación Técnica: Mapa de Memoria Modbus en la Práctica

Comprende visualmente para qué sirve cada área de memoria y cómo la notación de direcciones (ej. 40001 vs 0) puede causar errores de comunicación si no se interpreta correctamente.

▶ Ver Mapa de Memoria en YouTube

📝 Evaluación Técnica: Direccionamiento Modbus

1. Un cliente SCADA necesita leer el estado de un final de carrera físico (un sensor digital que está abierto o cerrado). ¿En qué área de memoria Modbus debería buscar este dato?

2. Para cambiar la consigna de temperatura (setpoint) de un controlador PID, un PLC debe escribir un valor de 16 bits. ¿Qué área de memoria y función Modbus se utilizaría?

3. El manual de un equipo indica que la velocidad actual del motor se encuentra en la dirección "40100". A nivel de protocolo, ¿qué dirección de registro debe solicitar realmente el cliente Modbus?

🤖 Ejercicio Práctico 5: Servidor y Cliente Modbus Completo

Objetivo: Crear un ecosistema Modbus completo para entender la interacción entre las cuatro áreas de memoria.

Copia el siguiente *prompt* y pégalo en un modelo de IA (como ChatGPT, Gemini o Claude).

Actúa como un desarrollador de sistemas de control. Escribe dos scripts en Python usando la librería `pyModbusTCP`. **Script 1: `modbus_server.py`** 1. Debe crear un servidor Modbus TCP en `localhost`, puerto 502. 2. Debe inicializar las 4 áreas de memoria: 10 Coils (con la primera en True), 10 Discrete Inputs (con la segunda en True), 10 Input Registers (con valores de 100, 101, .), y 10 Holding Registers (con valores de 200, 201, .). 3. Debe arrancar el servidor en un bucle infinito. **Script 2: `modbus_client.py`** 1. Debe conectarse al servidor anterior. 2. Si la conexión es exitosa, debe realizar 4 lecturas: - Leer 2 Coils desde la dirección 0. - Leer 2 Discrete Inputs desde la dirección 0. - Leer 2 Input Registers desde la dirección 0. - Leer 2 Holding Registers desde la dirección 0. 3. Debe imprimir los resultados de cada lectura de forma clara. Comenta ambos scripts explicando qué función Modbus (ej. `read_coils`) se corresponde con cada área de memoria.