Interfaces de contadores

Mapas de registros Modbus: direcciones, tipos de datos y escalas

Qué contiene un mapa de registros Modbus y cómo leerlo: los cuatro tipos de registro, una fila de ejemplo, direcciones 40001, valores de 32 bits y escalas.

Modbus es un protocolo de comunicación abierto para contadores, controladores y sensores: un maestro (el cliente en Modbus TCP) consulta los valores que cada dispositivo publica en registros numerados. Un mapa de registros Modbus es la tabla del manual de un dispositivo que enumera cada valor que publica y dónde leerlo. Para cada valor debería especificar la tabla de registros, la dirección, el tipo de dato, el orden de las palabras, el factor de escala y la unidad. La mayoría de las lecturas Modbus erróneas se deben a uno de estos seis campos, no a la conexión. Esta guía explica cada campo y cómo comprobar que se interpreta correctamente.

Esta guía forma parte de la serie sobre Modbus y RS-485. Las mismas reglas se aplican a Modbus RTU y Modbus TCP.

Para el protocolo que rodea al mapa, con sus peticiones, códigos de función y excepciones, vea ¿Qué es Modbus?.

Cómo leer un mapa de registros: una fila de ejemplo

El documento de protocolo de Eastron para el contador trifásico SDM630 empieza su tabla de registros de entrada con la tensión de fase 1 a neutro en la referencia 30001, dirección inicial 00 00 en hexadecimal, en voltios, e indica que cada valor es un flotante IEEE 754 que ocupa dos registros. Desglosada campo a campo, esa fila se lee así:

CampoEn la filaQué indica
NombreTensión de fase 1 a neutroLa medición
Referencia30001Tabla 3, registros de entrada, registro 1
Código de función04, lectura de registros de entradaLa función que lee esta tabla
Dirección en la petición0 (0x0000)La dirección de protocolo de base cero
Tipo de dato y longitudfloat32, 2 registrosLeer los dos registros y decodificarlos juntos
Orden de palabrasNormal o invertido, ajustado en el contadorComprobarlo con un valor real, no por el valor predeterminado
Unidad y escalaV, sin factor de escalaEl flotante decodificado ya está en voltios

Por tanto, la petición es la función 04, dirección 0, cantidad 2. Una respuesta 4366 0000, con la palabra alta primero, equivale a 230,0 V. Compárela con la pantalla del contador antes de leer el resto del mapa. La página del SDM630-Modbus muestra más de ese mapa y una plantilla de Edge para el contador.

Los cuatro tipos de registros Modbus

El protocolo de aplicación Modbus define cuatro tablas, cada una con sus códigos de función:

TablaTamañoAccesoFunción de lecturaFunción de escrituraReferencia clásica
Bobinas (coils)1 bitLectura y escritura0105, 150xxxx
Entradas discretas1 bitSolo lectura02Ninguna1xxxx
Registros de entrada16 bitsSolo lectura04Ninguna3xxxx
Registros de retención (holding)16 bitsLectura y escritura0306, 164xxxx

Cada registro tiene 16 bits, dos bytes enviados con el byte alto primero; las bobinas y las entradas discretas son bits. Cada tabla tiene direcciones de 0 a 65.535 en la petición. Los contadores de energía suelen publicar las mediciones en registros de entrada o de retención, y la configuración en registros de retención. Utilice el código de función indicado en el mapa. Leer un registro de entrada con la función 03 devuelve otro valor o una excepción.

Convenciones de direccionamiento

Un mismo registro puede aparecer de varias formas en el mapa. La petición transmitida siempre contiene una dirección que empieza en cero:

Forma en el mapaSignificadoDirección en la petición
40001Referencia clásica de cinco cifras: tabla 4, registro 10
400001Referencia ampliada de seis cifras0
1 (base uno)Registro 1 de la tabla indicada en el mapa0
0 o 0x0000 (base cero)Dirección del protocolo0

Si el mapa mezcla convenciones o una herramienta de configuración espera otra, aparece un error de una posición: cada lectura procede del registro contiguo al correcto. Confirme primero la convención con un valor conocido. El conversor de direcciones Modbus traduce entre las distintas formas:

Tipos de datos

Un registro contiene 16 bits. El mapa indica cómo interpretar esos bits:

TipoRegistrosRango o precisión
uint161De 0 a 65.535
int161De −32.768 a 32.767
uint32, int322Aproximadamente ±2.100 millones con signo o de 0 a 4.290 millones sin signo
float32 (IEEE 754)2Unas 7 cifras significativas
uint64, int644Números enteros exactos de 18 cifras o más
float644Unas 15 o 16 cifras significativas

Los mismos bits producen cifras diferentes según el tipo. El registro 0xFFF6 vale 65.526 como uint16 y −10 como int16. Determine si tiene signo a partir del mapa, no del valor. Los controladores de refrigeración son un caso habitual: un congelador a −18,0 °C envía −180 décimas, que se leen como 65.356 si el registro se decodifica sin signo. La guía de controladores de refrigeración recoge los registros de temperatura con signo de los controladores Danfoss, Carel y Dixell.

Un float32 ofrece unas siete cifras significativas. Un contador de energía almacenado como float32 en 12.345.678,9 kWh ya no puede mostrar un cambio de 0,1 kWh. Por eso muchos contadores también publican la energía como entero de 32 o 64 bits.

Orden de palabras en valores de 32 y 64 bits

La especificación Modbus define el orden de bytes dentro de un registro: primero el byte más significativo. No establece el orden de los registros que forman un valor de varias palabras, por lo que varía entre fabricantes. Denominemos el orden mediante los bytes del valor, siendo A el más significativo:

OrdenRegistros leídosDescripción habitual
ABCDPalabra alta y después palabra bajaOrden de mayor a menor peso; palabra alta primero
CDABPalabra baja y después palabra altaPalabras intercambiadas
BADCPalabra alta primero, bytes intercambiadosBytes intercambiados
DCBAPalabra baja primero, bytes intercambiadosOrden de menor a mayor peso

Un orden incorrecto produce una cifra aparentemente aleatoria, no una cifra ligeramente desviada. Un contador uint32 de 100.000 aparece como 0x0001 y después 0x86A0 en orden ABCD. Interpretadas en otro orden, las mismas palabras dan 2.258.632.705:

El decodificador de registros Modbus muestra los cuatro órdenes juntos y el conversor IEEE 754 muestra cómo se codifica un valor de coma flotante.

Escalas y unidades

Muchos contadores envían un entero acompañado de un factor de escala. El mapa puede expresarlo de tres formas:

  • Factor fijo. «Tensión, uint16, 0,1 V»: un valor bruto de 2.305 equivale a 230,5 V.
  • Potencia de diez. «Energía, int32, 10−2 kWh»: un valor bruto de 1.234.567 equivale a 12.345,67 kWh.
  • Registro de factor de escala. Los modelos SunSpec utilizados por muchos inversores publican otro registro que contiene la potencia de diez para un grupo de valores. Lea el factor en la misma petición que el valor, porque puede cambiar.

Siga este orden: decodifique el tipo, aplique la escala y, después, la unidad. Registre dónde se aplica el factor. Si el dispositivo, el gateway y la plataforma receptora aplican todos un factor, el valor se escala más de una vez. Una cifra 10 o 1.000 veces mayor de lo esperado suele indicar este problema.

En los contadores de energía, registre también el valor al que el contador vuelve a empezar y su comportamiento al alcanzar ese límite o reiniciarse. La guía de contadores de impulsos trata el mismo problema para ese tipo de contador.

Palabras de estado y campos de bits

Un registro de estado agrupa indicadores en sus 16 bits. El bit 0 es el menos significativo. El valor 0x0025 equivale a 0000 0000 0010 0101 en binario; por tanto, están activos los bits 0, 2 y 5. El mapa define qué significa cada bit y si un 1 indica actividad o buen estado.

Dos reglas ayudan a manejar estos campos con seguridad:

  • Consulte el mapa para conocer el significado. La posición de un bit no define por sí sola una alarma. Registre qué significan 0 y 1 para cada bit utilizado.
  • No escriba una palabra completa de estado o control para cambiar un solo bit. Sobrescribiría los demás bits con los últimos valores leídos por el software. Utilice el método documentado para el equipo: un registro de órdenes independiente, la función 22 de escritura con máscara si el dispositivo la admite o una secuencia de lectura, modificación y escritura aprobada por el propietario del equipo.

Valores no disponibles o no válidos

Muchos dispositivos devuelven un código fijo cuando no hay un valor disponible, por ejemplo 0xFFFF, 0x8000 o un float NaN. SunSpec define estos códigos para sus modelos; otros mapas indican los suyos. Si el mapa los especifica, trátelos antes de aplicar la escala y guarde la lectura como ausente, no como número. Un valor de −32.768 V es un código, no una medición.

Comprobar cada punto

Una respuesta sin errores demuestra la conexión, no el significado del dato. Para cada punto:

  1. Registre las palabras originales, el valor decodificado y el valor tras aplicar la escala.
  2. Compárelo con la pantalla del dispositivo o con un instrumento de referencia en el mismo momento.
  3. Repita la prueba en un segundo estado de funcionamiento: con una carga encendida y apagada, o con una consigna distinta.
  4. Compruebe un valor negativo si el punto puede tenerlo, por ejemplo, al exportar potencia.
  5. Conserve todo ello en el acta de aceptación.

La guía de puesta en marcha de Modbus RS-485 ofrece la secuencia completa, y la guía de diagnóstico de Modbus trata las respuestas de excepción y los valores aparentemente plausibles pero incorrectos.

Mapas de registros en el Directorio de dispositivos y Edge

El Directorio de dispositivos reúne mapas de registros de contadores Modbus habituales, con el tipo de dato y el orden de palabras de cada punto. Edge lee dispositivos Modbus TCP y Modbus RTU desde el Gateway. Para cada punto se configuran el código de función, la dirección de base cero, un tipo de dato de 16 o 32 bits, el orden de bytes y palabras, y un multiplicador y desplazamiento. Edge interpreta un float NaN como no disponible. Un código entero como 0xFFFF sigue siendo un número, de modo que debe tratarse con un punto calculado si así lo define el mapa. Para un contador alejado del Gateway, la interfaz Modbus ZMB lee muchos registros localmente, 8 o más y hasta 16 o más según el modelo, y los transmite por la red mallada Zigbee.

Preguntas frecuentes

¿Qué es un mapa de registros Modbus?

La tabla de la documentación Modbus de un dispositivo que enumera cada valor que publica. Cada fila indica el nombre del valor, la tabla de registros, la dirección, el tipo de dato y el número de registros, y la unidad o la escala. Algunos mapas indican también el orden de las palabras, el acceso (lectura o escritura) y el código de un valor no disponible. Cada fabricante escribe su propio mapa, que puede cambiar entre modelos y versiones de firmware.

¿Cuáles son los tipos de registros Modbus?

Modbus tiene cuatro tablas de datos. Las bobinas (coils) son bits de lectura y escritura, y las entradas discretas bits de solo lectura. Los registros de entrada son palabras de 16 bits de solo lectura, que se leen con la función 04. Los registros de retención (holding) son palabras de 16 bits que se leen con la función 03 y, si el dispositivo lo permite, se escriben con las funciones 06 y 16. Las lecturas de los contadores suelen estar en registros de entrada o de retención.

¿Qué diferencia hay entre los registros de retención y los de entrada?

Ambos contienen valores de 16 bits. Los registros de entrada son de solo lectura y se leen con la función 04. Los registros de retención se leen con la función 03 y, cuando el dispositivo lo permite, se escriben con las funciones 06 y 16. Muchos contadores colocan las mediciones en registros de entrada y la configuración en registros de retención, pero otros lo ponen todo en registros de retención.

¿Qué significa la dirección Modbus 40001?

Es el primer registro de retención en la notación de referencia clásica, donde el 4 inicial identifica esa tabla. La petición transmitida utiliza la dirección 0 con la función 03. Algunos mapas emplean una forma de seis cifras (400001) o números simples que empiezan en 0 o 1.

¿Qué tamaño tiene un registro Modbus?

16 bits, es decir, dos bytes, enviados con el byte alto primero. Un entero o flotante de 32 bits ocupa dos registros consecutivos y un valor de 64 bits, cuatro. Cada una de las cuatro tablas tiene direcciones de 0 a 65.535 en la petición, aunque un dispositivo solo publica las direcciones de su propio mapa.

¿Qué es el orden de palabras en Modbus?

Un valor de 32 bits ocupa dos registros de 16 bits. La especificación Modbus no indica cuál contiene la mitad más significativa, por lo que los fabricantes difieren. Si al decodificar aparece una cifra sin sentido, pruebe a intercambiar las dos palabras (de ABCD a CDAB).

¿Cuántos registros puedo leer en una petición?

Hasta 125 registros con la función 03 o 04, según la especificación del protocolo de aplicación Modbus. Muchos dispositivos aceptan menos y algunos devuelven una excepción si un bloque atraviesa un hueco en su mapa.