> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oryx.mechatronstudio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Modbus

> RTU, ASCII y TCP, con los códigos de función y las excepciones traducidos.

Modbus se apoya en la lectura de UART: **cada byte es un carácter de la línea
serie**. Por eso tiene sus propios ajustes de línea, independientes de los de
UART: no es raro leer una línea suelta en 8N1 y un bus Modbus en 8E1 en el mismo
rato.

## Ajustes

| Ajuste          | Opciones                              | Por defecto |
| --------------- | ------------------------------------- | ----------- |
| **Modo**        | RTU, ASCII, TCP                       | RTU         |
| **Sentido**     | Auto, Solicitud, Respuesta            | Auto        |
| **Línea serie** | El mismo formato de carácter que UART | 8E1         |

### Los tres modos

> En **RTU** las tramas se separan por un silencio de 3,5 caracteres; en
> **ASCII**, por `:` y CR LF; en **TCP**, por la longitud que declara el
> encabezado MBAP.

<Note>
  De **Modbus TCP** se interpreta el encuadre: el encabezado MBAP y la PDU. Las
  capas inferiores —TCP, IP, Ethernet— no se dibujan: los bytes se escriben como
  caracteres serie.
</Note>

### El sentido

El formato de los datos depende del lado de la conversación. En **Auto** se
deduce de la longitud de la trama y de la solicitud anterior; conviene fijarlo
para dibujar una trama aislada.

## Campos

| Campo                     | Qué es                                                                                 |
| ------------------------- | -------------------------------------------------------------------------------------- |
| **Dirección del esclavo** | Con quién se comunica el maestro. La 0 es difusión: todos la escuchan y nadie responde |
| **Función**               | Qué se pide. Con el bit `0x80` puesto, es una respuesta de excepción                   |
| **Dirección inicial**     | El primer registro o bobina de la solicitud                                            |
| **Cantidad**              | Cuántos registros o bobinas abarca                                                     |
| **Valor**                 | Lo que se escribe                                                                      |
| **Máscara AND / OR**      | En la escritura enmascarada                                                            |
| **CRC / LRC**             | La verificación, según el modo                                                         |

En TCP se suman los campos del encabezado MBAP:

| Campo                            | Qué es                                                                 |
| -------------------------------- | ---------------------------------------------------------------------- |
| **Identificador de transacción** | Empareja la respuesta con su solicitud                                 |
| **Identificador de protocolo**   | Siempre 0 para Modbus                                                  |
| **Longitud**                     | Cuántos bytes siguen, incluido el de unidad                            |
| **Identificador de unidad**      | A qué equipo detrás de la puerta de enlace; 255 es el de la propia red |

## Códigos de función que reconoce

| Código | Función                      |
| ------ | ---------------------------- |
| `01`   | Leer bobinas                 |
| `02`   | Leer entradas discretas      |
| `03`   | Leer registros retentivos    |
| `04`   | Leer registros de entrada    |
| `05`   | Escribir una bobina          |
| `06`   | Escribir un registro         |
| `07`   | Leer estado de excepción     |
| `08`   | Diagnóstico                  |
| `0B`   | Contador de eventos          |
| `0C`   | Registro de eventos          |
| `0F`   | Escribir varias bobinas      |
| `10`   | Escribir varios registros    |
| `11`   | Identificar el servidor      |
| `14`   | Leer registro de archivo     |
| `15`   | Escribir registro de archivo |
| `16`   | Escritura enmascarada        |
| `17`   | Leer y escribir registros    |
| `18`   | Leer la cola FIFO            |
| `2B`   | Transporte encapsulado       |

Un código fuera de la lista se muestra igual, como *Función N*.

## Excepciones

| Código | Excepción                                 |
| ------ | ----------------------------------------- |
| `01`   | Función no admitida                       |
| `02`   | Dirección de dato inválida                |
| `03`   | Valor de dato inválido                    |
| `04`   | Falla del dispositivo                     |
| `05`   | Recibido; tardará en procesarse           |
| `06`   | Dispositivo ocupado                       |
| `08`   | Error de paridad en memoria               |
| `0A`   | La puerta de enlace no encuentra una ruta |
| `0B`   | El destino no responde                    |

## Errores que detecta

| Etiqueta                    | Qué pasó                                                 |
| --------------------------- | -------------------------------------------------------- |
| **Trama corta**             | No alcanza a formar una trama                            |
| **Longitud incorrecta**     | La trama no mide lo que debería para esa función         |
| **Error de CRC**            | La verificación de RTU no coincide                       |
| **Error de LRC**            | La verificación de ASCII no coincide                     |
| **Función desconocida**     | El código de función no está en la lista                 |
| **Excepción**               | Es una respuesta de excepción                            |
| **Silencio en la trama**    | Hay un hueco de línea dentro de una misma trama          |
| **Error de línea**          | La lectura del carácter serie falló (encuadre o paridad) |
| **Cantidad fuera de rango** | La cantidad pedida no es válida para esa función         |
| **Contador incorrecto**     | El byte de cuenta no coincide con los datos que siguen   |
| **Valor de bobina**         | El valor escrito a una bobina no es válido               |
| **Dirección reservada**     | La dirección de esclavo está fuera del rango permitido   |
| **Sin CR LF**               | La trama ASCII no cierra con CR LF                       |
| **Carácter no hexadecimal** | En ASCII, un carácter que no es un dígito hexadecimal    |
| **Protocolo distinto de 0** | El identificador de protocolo del MBAP no es 0           |
| **Longitud del MBAP**       | La longitud declarada no coincide con la trama           |
| **Fuera de trama**          | Bytes que no pertenecen a ninguna trama                  |

## El resumen

Cada trama se resume con el equipo y la función, y una flecha que dice el
sentido:

* `0x01 → Leer registros retentivos` para una solicitud
* `0x01 ← Leer registros retentivos` para la respuesta
* `0x01 ✗ Leer registros retentivos` para una excepción
* `Difusión → Escribir varias bobinas` para la dirección 0
* `Trama incompleta` o `Fuera de trama` cuando no cierra

Al final, un `✓` o un `✗` según la verificación.

## Cómo empezar

Sin nada dibujado, el cuadro de estado lo explica:

> *Aún no hay ninguna trama. Cada byte es un carácter de la línea serie: en RTU
> y ASCII la trama comienza con la dirección del esclavo, y en TCP con el
> encabezado MBAP.*
