6.7 KiB
6.7 KiB
🇩🇪 Deutsch | 🇬🇧 English | 🇫🇷 Français | 🇪🇸 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álvula0x0010 - 0x001F: Salidas digitales (LEDs / relés)0x0020 - 0x002F: Entradas digitales (botones / sensores)0x00F0 - 0x00FF: Configuración y estado general del dispositivo0x0100 - 0x01FF: Mecanismo de actualización de firmware
1.2. Códigos de función utilizados
0x03(Read Holding Registers): Para leer registros4xxxx.0x04(Read Input Registers): Para leer registros3xxxx.0x06(Write Single Register): Para escribir un único registro4xxxx.0x10(Write Multiple Registers): Para escribir varios registros4xxxxa 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.
- Cliente: Selecciona un trozo (máx. 256 bytes) del archivo de firmware y calcula su CRC16.
- Cliente: Escribe el desplazamiento de destino (p. ej.
0) enFWU_CHUNK_OFFSET_...y el tamaño enFWU_CHUNK_SIZE. - Cliente: Escribe los datos del trozo en el
FWU_DATA_BUFFER(desde la dirección0x0180). - 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). - Cliente: Lee
FWU_LAST_CHUNK_CRCy 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.
- Cliente: Escribe el comando
1("Verificar trozo") enFWU_COMMAND(40256). - 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.
- Cliente: Continúa con el siguiente trozo (vuelta al paso 1 con nuevo desplazamiento y datos).
- Ú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 comando2("Finalizar actualización") enFWU_COMMAND. - 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. |