irrigation_system/docs/modbus-registers.es.md

6.7 KiB

Logo

🇩🇪 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á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.