Direccionamiento Modbus: 40001 vs el offset base cero
Pocas cosas rompen más mapas Modbus que un corrimiento de uno, y casi siempre se rastrea a la diferencia entre el número de registro que lee una persona y la dirección que realmente va en el cable. El famoso 40001 no es el número que envía el maestro; es una convención de nomenclatura que esconde debajo un offset base cero. Esta guía desenreda la confusión entre 40001 y el offset, explica por qué 40001 es en realidad el offset 0 leído con el código de función 03, y muestra cómo alinear la lista de registros de un fabricante con lo que el maestro sondea.
Direccionamiento Modbus (40001 vs offset base cero) en una línea: El direccionamiento de registros Modbus tiene dos capas fáciles de confundir. El número de registro orientado a personas, como 40001, codifica la tabla (el 4 inicial significa registro holding) y una posición base uno dentro de ella. La dirección que realmente va en el cable es un offset base cero, así que 40001 corresponde al offset 0, 40002 al offset 1, y así sucesivamente, todos leídos con el código de función 03. Mezclar las dos, tratando 40001 como si fuera el offset 40001 u olvidando restar uno, produce un corrimiento de uno que lee el registro equivocado o un error de dirección ilegal.
El número de registro contra la dirección en el cable
El número estilo 4xxxx es una convención humana que empaqueta dos piezas de información en una sola cifra. El dígito inicial nombra la tabla: 0 para bobinas (coils), 1 para entradas discretas, 3 para registros de entrada y 4 para registros holding; los dígitos restantes dan una posición base uno dentro de esa tabla, empezando en 1. Así, 40001 significa el primer registro holding, 40002 el segundo y 30001 el primer registro de entrada. Esta numeración se diseñó para ser legible por personas: un ingeniero mira 40001 y sabe que es el registro holding número uno.
El protocolo Modbus real no envía ese número. Una solicitud lleva un código de función, que selecciona la tabla, y una dirección base cero, que da la posición empezando desde 0. El 4 inicial se convierte en el código de función 03 para leer registros holding, y la posición empieza en 0 y no en 1. Ese es el punto central de toda la confusión: el número humano es base uno e incluye el dígito de la tabla, mientras que la dirección en el cable es base cero y no lleva dígito de tabla porque el código de función ya eligió la tabla.
Juntando las dos cosas, el registro holding 40001 se lee enviando el código de función 03 con la dirección 0. El registro holding 40002 es código de función 03, dirección 1. La regla general para el rango 4xxxx es quitar el 4 inicial y restar uno a lo que queda: 40001 se vuelve offset 0, 40100 se vuelve offset 99, 41000 se vuelve offset 999. La misma regla de quitar-y-restar-uno aplica a los otros rangos con sus propios códigos de función. Una vez interiorizada esta traducción, la notación 40001 deja de ser misteriosa y se convierte en una etiqueta amigable para un par específico de código de función y offset.
De dónde sale el corrimiento de uno
El error clásico es restar uno donde no hace falta, o no restarlo donde sí. Algunas herramientas y documentos de fabricante presentan las direcciones ya como offsets base cero, así que una tabla que lista el offset 0 para un valor le está diciendo exactamente qué poner en el cable. Otros documentos usan la numeración humana 4xxxx, así que un valor listado como 40001 debe traducirse al offset 0 antes de que el maestro lo sondee. Si un técnico toma un número de un documento que ya usa offsets y le resta uno de todos modos, cada registro se lee una posición abajo; si toma un número 4xxxx y olvida restar, cada registro se lee una posición arriba.
La confusión empeora porque ambos errores suelen devolver datos en lugar de un error, ya que el registro vecino normalmente existe y responde. Leer el offset 1 cuando se quería el offset 0 no falla de forma ruidosa: devuelve el valor del registro siguiente, que puede verse plausible, sobre todo si los registros adyacentes contienen valores relacionados. Eso hace insidioso al corrimiento de uno: el sondeo tiene éxito, el número parece una medición real, y solo una comparación cuidadosa contra un valor conocido revela que cada lectura está desplazada un registro.
Una trampa adicional aparece con los valores multiregistro. Si un valor de 32 bits ocupa dos registros consecutivos y el offset base está corrido por uno, el maestro lee una palabra correcta y una palabra que pertenece a otro valor, produciendo un número que no está meramente desplazado sino sin sentido. En ese caso el corrimiento de uno es más fácil de atrapar porque el resultado es obviamente incorrecto y no plausiblemente incorrecto, pero la causa raíz es la misma: un desajuste entre el número de registro del documento y el offset base cero en el cable.
Alinear la lista de registros del fabricante con el sondeo del maestro
La forma confiable de evitar el corrimiento de uno es determinar primero qué convención usa la lista de registros del fabricante antes de mapear un solo valor. Si la lista muestra números estilo 4xxxx, traduzca cada entrada quitando el dígito de tabla y restando uno para obtener el offset del cable, y use el código de función que la tabla implica. Si la lista ya muestra offsets base cero junto a códigos de función, úselos directamente sin restar nada. La pregunta más útil que puede hacerle a cualquier documento de registros es simplemente si sus números son números de registro base uno u offsets base cero, porque la respuesta determina si usted resta uno.
Cuando un documento es ambiguo, un valor conocido es el árbitro más rápido. Sondee un registro cuyo valor pueda verificar de forma independiente, un identificador fijo del dispositivo, una versión de firmware o una medición que pueda leer en una pantalla local, y vea si aterriza en el offset esperado o uno al lado. Si el valor esperado aparece un registro arriba o abajo, encontró el desajuste de convención y puede correr el mapa completo en consecuencia. Esta verificación empírica suele ser más rápida y más segura que razonar sobre la documentación, sobre todo con un fabricante cuya numeración es inconsistente entre sus propias páginas.
En un SCADA en la nube, esta alineación se hace una vez por dispositivo y luego se reutiliza para cada tag. Cuando Merobix sondea un dispositivo de campo por Modbus, cada tag es un código de función más un offset base cero, así que construir bien el mapa significa traducir los números de registro del fabricante a offsets una sola vez y verificar un valor conocido antes de confiar en el resto. Hacer bien esa traducción en la puesta en marcha es lo que evita que toda una batería de tags lea silenciosamente un registro corrido, una falla que de otro modo aparecería mucho después como mediciones sutil y consistentemente equivocadas.
Preguntas frecuentes
¿Por qué 40001 es en realidad el offset 0 en Modbus?
La notación 40001 es una convención humana: el 4 inicial nombra la tabla de registros holding y se convierte en el código de función 03, mientras que los dígitos restantes son una posición base uno que empieza en 1. El protocolo en el cable usa una dirección base cero que empieza en 0, así que el primer registro holding, escrito 40001 para las personas, es el offset 0 en el cable. La regla general es quitar el 4 inicial y restar uno, de modo que 40001 mapea al offset 0.
¿Cómo sé si la lista de registros de un fabricante es base cero o base uno?
Primero revise si el documento usa números de registro estilo 4xxxx, que son base uno e incluyen un dígito de tabla, o offsets planos listados con códigos de función, que típicamente son base cero. Si sigue siendo ambiguo, sondee un registro cuyo valor pueda verificar de forma independiente, como un ID de dispositivo o una versión de firmware, y vea si aterriza donde esperaba o un registro al lado. Dónde aterriza le dice qué convención usa la lista.
¿Por qué un error de corrimiento por uno en Modbus devuelve datos en lugar de un error?
Porque el registro vecino normalmente existe y responde. Leer el offset 1 cuando se quería el offset 0 devuelve el valor del registro siguiente en lugar de fallar, y ese valor puede parecer una medición plausible, sobre todo cuando los registros adyacentes contienen datos relacionados. Eso es lo que hace tan fácil pasar por alto el corrimiento: el sondeo tiene éxito y el número parece real, así que solo comparar contra un valor conocido revela que cada lectura está desplazada.
Servicios de automatización
¿Necesita convertir esta información en un sistema que funcione?
Merobix integra SCADA, programa PLC Allen-Bradley y Siemens, y diseña y fabrica tableros de control industrial.
Las solicitudes de reunión se revisan antes de confirmarse.