# Modbus RTU

> Modbus sobre un bus serie, con la línea física modelada de forma explícita y compartida por sus dispositivos direccionados por unidad.

El driver Modbus RTU habla con dispositivos Modbus en un bus serie, RS-485 o RS-232,
alcanzado por un puerto COM físico, por un adaptador USB o por un puerto virtual o
redirigido. Como el bus se comparte físicamente, la topología es
**Driver → Línea → Dispositivo → Tag**: la **línea** posee todo lo eléctrico (puerto,
velocidad, formato, tiempos), y cada **dispositivo** que hay en ella posee solo su
dirección de unidad, su sondeo y sus tags.

## La línea serie {#serial-line}

| Campo | Significado | Valor inicial |
| --- | --- | --- |
| **Nombre** | Nombre amigable del bus. Editable en cualquier momento. | obligatorio |
| **Puerto serie** | El puerto del sistema operativo, por ejemplo `COM3`. El campo es de texto libre (funcionan los puertos físicos, los virtuales y los redirigidos) y la flecha que hay al lado ofrece los puertos que Windows detecta en ese momento (con un **Actualizar** para la conexión en caliente de un adaptador); la lista detectada es una comodidad, nunca una lista blanca. | `COM1` |
| **Baudios** | La tasa de bits que comparten todos los dispositivos del bus. | 9600 |
| **Modo de transmisión** | Cómo arma sus mensajes cada dispositivo del bus: **RTU**, tramas binarias verificadas con un CRC, o **ASCII**, tramas escritas como texto de dos puntos a un salto de línea y verificadas con un LRC, que hablan los equipos antiguos. Un bus habla un solo modo, por eso pertenece a la línea. | RTU |
| **Formato serie** | Elección cerrada entre `8N1`, `8N2`, `8E1`, `8E2`, `8O1`, `8O2`, y en una línea ASCII también `7N2`, `7E1`, `7E2`, `7O1`: el dígito son los bits de datos, la letra la paridad (`N` ninguna, `E` par, `O` impar) y el último dígito los bits de parada. Una trama RTU necesita 8 bits de datos, así que una línea RTU solo ofrece los formatos de 8 bits; un formato de 7 bits que quedó de una línea ASCII aparece vacío y se rechaza hasta que se elija otro. No se admiten otros anchos, ni la paridad mark/space, ni 1.5 bits de parada. | `8E1` |
| **Tiempo de espera de respuesta (ms)** | La espera más larga por la respuesta de una unidad, de 100 a 60,000. Los tiempos de espera largos acomodan a equipos lentos, pero hacen más lento identificar unidades ausentes, y también el descubrimiento. | 1000 |
| **Intervalo mínimo entre transacciones (ms)** | Cadencia de compatibilidad para toda la línea, de 0 a 1000. Cero conserva solo el silencio automático del protocolo; un valor positivo lo puede subir, nunca bajar. | 0 |

En una línea ASCII no aplica el silencio que se describe a continuación: una trama ASCII termina en su salto de línea, así que el silencio automático marca 0 ms y el **Intervalo mínimo entre transacciones (ms)** es la única pausa entre tramas, como dice la tarjeta debajo: "Las tramas ASCII terminan con un salto de línea, así que la línea no agrega silencio propio: este intervalo es la única pausa entre tramas." El modo de transmisión es un ajuste físico, bloqueado junto con el puerto, los baudios, el formato y el tiempo de espera de respuesta mientras la línea está habilitada; la dirección de runtime de un dispositivo en una línea ASCII termina en `/ascii`.

El protocolo mismo exige silencio entre tramas, y la línea siempre lo impone: a
19,200 baudios o menos, el silencio automático son 3.5 tiempos de carácter calculados
a partir del formato configurado; por encima de 19,200 baudios son los 1.75 ms fijos
que recomienda la especificación. El silencio efectivo es el **mayor** entre ese piso
automático y el intervalo configurado, nunca la suma de los dos, y el panel muestra
los dos valores. Subir el intervalo hace más lentas a propósito todas las unidades de
la línea; es una ayuda de compatibilidad, no un arreglo del cableado, la terminación,
la puesta a tierra o el ruido.

Una línea nueva arranca **desactivada** para que sus ajustes físicos se puedan
configurar primero. Cada puerto físico pertenece como máximo a una línea, comparado
sin distinguir mayúsculas e incluso mientras las líneas están desactivadas. El nombre
y el intervalo entre transacciones siguen siendo editables mientras la línea corre
(una edición de tiempos surte efecto sin ciclar el puerto); el puerto, la velocidad,
el formato y el tiempo de espera de respuesta quedan bloqueados mientras la línea está
activada: desactívela y guárdela primero. Desactivar una línea detiene la comunicación
de todos sus dispositivos sin cambiar la elección individual de Activado de ninguno.

La línea reporta el transporte físico aparte de sus dispositivos: **Apagada**,
**En reposo** (sin ningún dispositivo activado), **Conectando**, **En línea**, o
**Falla del puerto** con un diagnóstico. Eliminar una línea vacía quita solo la línea;
eliminar una que contiene dispositivos pide una confirmación explícita y elimina
también esos dispositivos y sus tags.

## El dispositivo {#device}

| Campo | Significado | Valor inicial |
| --- | --- | --- |
| **Línea serie** | Fija: un dispositivo se crea bajo su línea y hereda la tupla física, mostrada de solo lectura en el panel. Agregue el dispositivo bajo la línea que corresponda. | la línea bajo la que se agrega |
| **ID de unidad** | La dirección Modbus del dispositivo en el bus, de 1 a 247, única dentro de la línea (dispositivos desactivados incluidos). | 1 |
| **Intervalo de sondeo (ms)** | El ritmo de sondeo predeterminado para los tags que no lo invaliden. | 1000 |

La dirección interna del runtime es
`modbus+rtu://<id-de-línea>/<puerto>/<velocidad>/<formato>/<tiempo>/<idDeUnidad>/<intervalo>`:
lleva la identidad estable de la línea y sus ajustes físicos completos, nunca su
nombre amigable.

## El comportamiento de la línea compartida {#shared-line-behavior}

El driver abre **una sesión serie por línea** y serializa todas las peticiones de
todos los dispositivos a través de un solo despachador, así que las lecturas y las
escrituras nunca se traslapan en el bus. Una escritura pendiente toma el siguiente
turno libre con una prioridad acotada: las escrituras se atienden pronto, pero
escribir sin parar no puede dejar sin turno al sondeo. Los tiempos de espera de cada
unidad están aislados con espera progresiva, así que un dispositivo callado solo se
hace lento a sí mismo. Una excepción Modbus con CRC válido es un error de esa petición
sobre ese tag: la línea sigue sana. Solo una falla física de entrada y salida (el
puerto que desaparece, el adaptador desconectado) invalida la sesión compartida y
arranca una sola reapertura coordinada para toda la línea. El último dispositivo
liberado cierra el puerto.

## El direccionamiento del tag {#tag-addressing}

El direccionamiento del tag es idéntico al de [Modbus TCP](driver-modbus-tcp): una
**Clase de registro** (Bobina (0xxxx), Entrada discreta (1xxxx), Registro de entrada
(3xxxx), Registro de retención (4xxxx), derivada de forma predeterminada del tipo y del
acceso del tag), un **Número de
registro** desde 0, una **Cantidad (registros, en blanco = automático)** que se
calcula sola (Boolean, Int16 y UInt16 1 registro, Int32 y Float 2, String 4; la caja se
dibuja solo en los tags String, porque todos los demás anchos son fijos), y las dos
cajas de orden: **Byte más significativo primero (MSB first, big-endian)** para el orden de los bytes y
**Palabra más significativa primero (palabra alta primero)** para el orden de las palabras
(dibujada solo en los tipos de dos registros, Int32 y Float), las dos activadas de forma
predeterminada. La tarjeta Fuente termina con **Dirección en el manual**, la dirección del
tag tal como la imprime el manual del equipo (el registro de entrada 0 es 30001). Los tipos de valor admitidos son los mismos seis (Boolean, Int16, UInt16, Int32,
Float y String): Int16 y UInt16 leen un solo registro de 16 bits, con o sin signo, y
solo el orden de bytes aplica a ellos (la caja del orden de palabras no se dibuja). Los códigos de función de lectura y escritura y
las disposiciones del bus están documentados en la página de [Modbus TCP](driver-modbus-tcp) y valen aquí sin cambios.

## El descubrimiento {#discovery}

El descubrimiento sondea un rango de ID de unidad sobre una línea existente y vive en
el panel de esa línea:

| Campo | Significado | Valor inicial |
| --- | --- | --- |
| **ID de unidad inicial** | El primer id de unidad que se sondea, de 1 a 247. | 1 |
| **ID de unidad final** | El último id de unidad, ascendente desde el inicial. | 32 |

En una línea ASCII el sondeo es la misma petición en una trama ASCII y el LRC toma el lugar del CRC: una excepción con LRC válido prueba que hay una unidad presente, y una trama con LRC no válido no prueba nada.

El escaneo recarga los ajustes físicos guardados de la línea, abre el puerto una vez y
sondea el rango de forma **secuencial** con Read Basic Device Identification
(función 43/14), cadenciando cada sondeo con el silencio efectivo entre tramas de la
línea. Nunca prueba combinaciones de ajustes y nunca lee registros. Una excepción
Modbus con CRC válido prueba que hay una unidad presente sin declarar su identidad; un
tiempo de espera agotado o una trama no válida no lo prueban.

Una línea que está en uso nunca se interrumpe ni se conmuta automáticamente:
desactívela antes de escanear, y vuelva a activarla usted mismo después. Cancelar
cierra la sesión serie y deja los resultados que ya se hayan mostrado como candidatos
pasajeros hasta que usted los agregue de forma explícita. Un id de unidad que ya está
configurado se marca como tal y abre el dispositivo existente en lugar de crear un
duplicado; los resultados no llevan tags: los registros se configuran después de
**Agregar**.

El descubrimiento y la configuración de la línea comparten una sola reserva de fallo
inmediato por puerto físico, así que un escaneo y un cambio de ajustes no pueden
pelearse por el puerto: al que pierde se le dice qué operación lo tiene.

## Límites que conviene conocer {#limits-worth-knowing}

- Los seis tipos de valor son todo el vocabulario del códec del bus; los demás anchos
  de entero y Double no se ofrecen.
- El rendimiento es una propiedad del bus: todos los dispositivos de la línea
  comparten un solo flujo de peticiones, cadenciado por el silencio efectivo entre
  tramas, así que muchos dispositivos o un intervalo subido alargan cada ciclo de
  sondeo.
