Logo [馃嚛馃嚜 Deutsch](modbus-registers.de.md) | [馃嚞馃嚙 English](modbus-registers.en.md) | [馃嚝馃嚪 Fran莽ais](modbus-registers.fr.md) | 馃嚜馃嚫 Espa帽ol # Definici贸n del mapa de registros MODBUS v1.0 ## 1. Introducci贸n Este documento define los registros MODBUS para los nodos esclavos universales del sistema de riego. ### 1.1. Filosof铆a de direccionamiento Todos los registros se definen en una 煤nica lista continua por tipo de registro (`Input` o `Holding`). Una columna "Categor铆a" asigna l贸gicamente la funci贸n. Las direcciones se agrupan en bloques para dejar espacio para futuras ampliaciones y para aumentar la legibilidad. * **`0x0000 - 0x000F`**: Control y estado de la v谩lvula * **`0x0010 - 0x001F`**: Salidas digitales (LEDs / rel茅s) * **`0x0020 - 0x002F`**: Entradas digitales (botones / sensores) * **`0x00F0 - 0x00FF`**: Configuraci贸n y estado general del dispositivo * **`0x0100 - 0x01FF`**: Mecanismo de actualizaci贸n de firmware ### 1.2. C贸digos de funci贸n utilizados * **`0x03` (Read Holding Registers):** Para leer registros `4xxxx`. * **`0x04` (Read Input Registers):** Para leer registros `3xxxx`. * **`0x06` (Write Single Register):** Para escribir un 煤nico registro `4xxxx`. * **`0x10` (Write Multiple Registers):** Para escribir varios registros `4xxxx` a la vez. ## 2. Registros de entrada (3xxxx, solo lectura) | Direcci贸n (hex) | Nombre | Categor铆a | Descripci贸n | | :--- | :--- | :--- | :--- | | **0x0000** | `VALVE_STATE_MOVEMENT` | V谩lvula | Registro de estado combinado. **Byte alto**: Movimiento (`0`=Inactivo, `1`=Abriendo, `2`=Cerrando, `3`=Error). **Byte bajo**: Estado (`0`=Cerrado, `1`=Abierto). | | **0x0001** | `MOTOR_CURRENT_MA` | V谩lvula | Corriente actual del motor en miliamperios (mA). | | **0x0020** | `DIGITAL_INPUTS_STATE` | Entradas | M谩scara de bits de las entradas digitales. Bit 0: Entrada 1, Bit 1: Entrada 2. `1`=Activo. | | **0x0021** | `BUTTON_EVENTS` | Entradas | Banderas de eventos para botones (Borrar al leer). Bit 0: Bot贸n 1 presionado. Bit 1: Bot贸n 2 presionado. | | **0x00F0** | `FIRMWARE_VERSION_MAJOR_MINOR` | Sistema | p. ej. `0x0102` para v1.2. | | **0x00F1** | `FIRMWARE_VERSION_PATCH` | Sistema | p. ej. `3` para v1.2.3. | | **0x00F2** | `DEVICE_STATUS` | Sistema | `0`=OK, `1`=Error general. | | **0x00F3** | `UPTIME_SECONDS_LOW` | Sistema | 16 bits inferiores del tiempo de actividad en segundos. | | **0x00F4** | `UPTIME_SECONDS_HIGH` | Sistema | 16 bits superiores del tiempo de actividad. | | **0x0100** | `FWU_LAST_CHUNK_CRC` | Actualizaci贸n FW | Contiene el CRC16 del 煤ltimo trozo de datos recibido en el b煤fer. | ## 3. Registros de retenci贸n (4xxxx, lectura/escritura) | Direcci贸n (hex) | Nombre | Categor铆a | Descripci贸n | | :--- | :--- | :--- | :--- | | **0x0000** | `VALVE_COMMAND` | V谩lvula | `1`=Abrir, `2`=Cerrar, `0`=Detener movimiento. | | **0x0001** | `MAX_OPENING_TIME_S` | V谩lvula | Tiempo de espera de seguridad en segundos para el proceso de apertura. | | **0x0002** | `MAX_CLOSING_TIME_S` | V谩lvula | Tiempo de espera de seguridad en segundos para el proceso de cierre. | | **0x0010** | `DIGITAL_OUTPUTS_STATE` | Salidas | M谩scara de bits para leer y escribir las salidas. Bit 0: Salida 1, Bit 1: Salida 2. `1`=ON, `0`=OFF. | | **0x00F0** | `WATCHDOG_TIMEOUT_S` | Sistema | Tiempo de espera del watchdog de seguridad en segundos. `0`=Desactivado. | | **0x0100** | `FWU_COMMAND` | Actualizaci贸n FW | `1`: **Verificar trozo**: El 煤ltimo trozo transmitido fue considerado v谩lido por el cliente. El esclavo ahora debe escribirlo en la flash. `2`: **Finalizar actualizaci贸n**: Todos los trozos han sido transmitidos. Finalizar la instalaci贸n y reiniciar. | | **0x0101** | `FWU_CHUNK_OFFSET_LOW` | Actualizaci贸n FW | 16 bits inferiores del desplazamiento de 32 bits en el que se escribir谩 el siguiente trozo. | | **0x0102** | `FWU_CHUNK_OFFSET_HIGH` | Actualizaci贸n FW | 16 bits superiores del desplazamiento de 32 bits. | | **0x0103** | `FWU_CHUNK_SIZE` | Actualizaci贸n FW | Tama帽o del siguiente trozo en bytes (m谩x. 256). | | **0x0180** | `FWU_DATA_BUFFER` | Actualizaci贸n FW | **Direcci贸n de inicio** de un b煤fer de 128x16 bits (256 bytes). Corresponde a los registros `40384` a `40511`. | ## 4. Proceso detallado de actualizaci贸n de firmware Este proceso no tiene estado y es robusto frente a errores de transmisi贸n. 1. **Cliente:** Selecciona un trozo (m谩x. 256 bytes) del archivo de firmware y calcula su CRC16. 2. **Cliente:** Escribe el desplazamiento de destino (p. ej. `0`) en `FWU_CHUNK_OFFSET_...` y el tama帽o en `FWU_CHUNK_SIZE`. 3. **Cliente:** Escribe los datos del trozo en el `FWU_DATA_BUFFER` (desde la direcci贸n `0x0180`). 4. **Esclavo:** Recibe los datos, los coloca en el b煤fer de RAM y calcula el CRC. El resultado se proporciona en `FWU_LAST_CHUNK_CRC` (`30256`). 5. **Cliente:** Lee `FWU_LAST_CHUNK_CRC` y compara el valor con el CRC autocalculado. * **Error:** Volver al paso 3 para enviar el mismo trozo de nuevo. * **脡xito:** Contin煤a con el siguiente paso. 6. **Cliente:** Escribe el comando `1` ("Verificar trozo") en `FWU_COMMAND` (`40256`). 7. **Esclavo:** Recibe el comando, toma el trozo verificado del b煤fer de RAM y lo escribe en la ubicaci贸n correcta en la memoria flash. 8. **Cliente:** Contin煤a con el siguiente trozo (vuelta al paso 1 con nuevo desplazamiento y datos). 9. **脷ltimo trozo:** Despu茅s de que el 煤ltimo trozo ha sido transferido y escrito en la flash con el comando `1`, el cliente escribe el comando `2` ("Finalizar actualizaci贸n") en `FWU_COMMAND`. 10. **Esclavo:** Realiza las comprobaciones finales y se reinicia para que MCUBoot pueda realizar la instalaci贸n. ## Ap茅ndice: Registros del sensor de nivel QDY30A Estos registros pertenecen al sensor de nivel externo y tambi茅n se pueden direccionar en el bus. Seg煤n el fabricante, se trata de registros de retenci贸n (`4xxxx`) que se leen con el c贸digo de funci贸n `0x03`. | Direcci贸n (hex) | Nombre | L/E | Descripci贸n | | :--- | :--- | :-- | :--- | | **0x0000** | `NODE_ADDRESS` | L/E | Direcci贸n del dispositivo del sensor (1-255). | | **0x0001** | `BAUDRATE` | L/E | `0`=1200, `1`=2400, `2`=4800, `3`=9600, `4`=19200, `5`=38400, `6`=57600, `7`=115200. | | **0x0002** | `UNIT` | L/E | `0`=Ninguno, `1`=cm, `2`=mm, `3`=MPa, `4`=Pa, `5`=kPa. | | **0x0003** | `DECIMAL_PLACES` | L/E | N煤mero de decimales para el valor medido (0-3). | | **0x0004** | `CURRENT_MEASUREMENT` | L | El valor medido escalado como un entero de 16 bits con signo. | | **0x0005** | `MEASURING_RANGE_ZERO_POINT` | L/E | Valor bruto para el punto cero de la escala. | | **0x0006** | `MEASURING_RANGE_END_POINT` | L/E | Valor bruto para el punto final de la escala. |