MODBUS MASTER MONITOR 1.0
Loading...
Searching...
No Matches
Data Format & Payload

Classes

struct  ResponseFormat
 Estructura intermedia para pasar datos desde el callback Modbus a las tareas. More...
struct  BitPacker
 Utilidad para empaquetar bits arbitrarios en un flujo de bytes. More...
struct  SensorDataPayload
 Contenedor para los datos procesados de un sensor, listo para ser agregado. More...

Macros

#define MAX_SENSOR_PAYLOAD   128
 Tamaño máximo del payload de un sensor individual.
#define AGGREGATION_INTERVAL_MS   6100
 Intervalo de agregación (ms).
#define AGGREGATION_INTERVAL_MS   6100
 Intervalo de agregación (ms).

Functions

static bool formatAndEnqueueSensorData (const ResponseFormat &response, const ModbusRequestInfo &request, std::vector< uint8_t > &values)
 Extrae y formatea los datos de una respuesta Modbus de muestreo.
void DataFormatter (void *pvParameters)
 Tarea Formateador de Datos.
std::vector< uint8_t > construirPayloadUnificado (uint8_t id_mensaje, const std::vector< SensorDataPayload > &collectedPayloads)
 Construye un payload unificado a partir de una colección de datos de sensores.
void DataAggregatorTask (void *pvParameters)
 Tarea proactiva que recolecta y empaqueta datos de sensores a un ritmo fijo.

Detailed Description

Resumen

Este módulo se encarga de:

  • Parsear respuestas crudas Modbus provenientes de queueRespuestas.
  • Normalizar datos por sensor y generar SensorDataPayload.
  • Agregar múltiples payloads en un mensaje compacto con Activate Byte y metadatos.
  • Entregar fragmentos listos para transmisión a la capa externa (LMIC) vía queueFragmentos.

Estructura y componentes

  • Transporte intermedio
  • Datos normalizados
    • SensorDataPayload: paquete por sensor con registros procesados y metadatos (sensorID, slaveID, longitud útil).
  • Tareas/Flujo

API principal

Uso

Resumen del flujo :

1) Formateo de respuestas

Descubrimiento: valida estructura y delega la actualización de parámetros del sensor (ver grupo Modbus).

2) Agregación de payloads

3) Entrega a transmisión

  • El fragmento agregado queda listo para ser tomado por la tarea de transmisión externa.

Estructura y codificación del payload

El firmware usa un esquema binario optimizado para maximizar la eficiencia de transmisión sobre LoRaWAN. Esta sección describe la estructura del payload para facilitar la implementación del decodificador.

Componentes del payload:

  • Encabezado (1 byte): Identificador de mensaje para mantener el orden de recepción.
  • Timestamp (4 bytes): Marca de tiempo desde el arranque del sistema en formato UNIX.
  • Activate byte (1 byte): Banderas que indican operación por tipo de sensor, codificadas bit a bit (Bit 0 = batería, Bit 1 = voltaje, Bit 2 = corriente; el resto reservado).
  • Bytes de longitud de datos (dependen del Activate byte): Definen cantidad y formato de codificación de cada tipo de sensor activo. El número de estos bytes es igual al número de sensores activos indicados en el Activate byte.

Estructura de cada byte de longitud (8 bits):

Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
------|-------|-------|-------|-------|-------|-------|-------
PKD | 2BIT | DATA_LENGTH (5 bits)

Descripción de campos:

  • Bits 0-4 (DATA_LENGTH): Número de lecturas del sensor (0–31 muestras).
  • Bit 6 (2BIT):
    • 0: Codificación estándar (1 bit por muestra).
    • 1: Codificación de 2 bits por muestra.
  • Bit 7 (PKD):
    • 0: Formato alineado a byte.
    • 1: Formato empaquetado a nivel de bit.

Orden de bytes de longitud:

Los bytes de longitud siguen el mismo orden que las banderas del Activate byte (LSB → MSB):

  • Bit 0: Batería (si activo)
  • Bit 1: Voltaje (si activo)
  • Bit 2: Corriente (si activo)

Ejemplo: Si Activate byte = 0x06 (voltaje + corriente activos), habrá 2 bytes de longitud: primero para voltaje, segundo para corriente.

  • Data bytes: Bytes con datos de sensores; tanto el Activate byte como los bytes de longitud son necesarios para decodificar estos datos.

Macro Definition Documentation

◆ AGGREGATION_INTERVAL_MS [1/2]

#define AGGREGATION_INTERVAL_MS   6100

Intervalo de agregación (ms).

Intervalo de agregación (6s + 100ms de margen).

◆ AGGREGATION_INTERVAL_MS [2/2]

#define AGGREGATION_INTERVAL_MS   6100

Intervalo de agregación (ms).

Intervalo de agregación (6s + 100ms de margen).

Function Documentation

◆ construirPayloadUnificado()

std::vector< uint8_t > construirPayloadUnificado ( uint8_t id_mensaje,
const std::vector< SensorDataPayload > & collectedPayloads )

Construye un payload unificado a partir de una colección de datos de sensores.

Estructura del Payload: [ID_MSG][TIMESTAMP][ACTIVATE_BYTE][LEN_BYTES...][DATA_BLOCKS...]

Parameters
id_mensajeEl byte de ID del mensaje (Cabecera).
collectedPayloadsEl vector con los datos recolectados.
Returns
std::vector<uint8_t> El payload binario listo para enviar.

◆ DataAggregatorTask()

void DataAggregatorTask ( void * pvParameters)

Tarea proactiva que recolecta y empaqueta datos de sensores a un ritmo fijo.

Se despierta cada AGGREGATION_INTERVAL_MS, vacía la cola de datos y envía un único payload LoRaWAN si ha recolectado algo.

◆ DataFormatter()

void DataFormatter ( void * pvParameters)

Tarea Formateador de Datos.

Consume respuestas de queueRespuestas, las procesa según su tipo (Descubrimiento o Muestreo) y encola los resultados formateados.

◆ formatAndEnqueueSensorData()

bool formatAndEnqueueSensorData ( const ResponseFormat & response,
const ModbusRequestInfo & request,
std::vector< uint8_t > & values )
static

Extrae y formatea los datos de una respuesta Modbus de muestreo.

Parameters
responseRespuesta cruda recibida.
requestInformación de la solicitud original.
valuesVector de salida donde se guardarán los bytes procesados.
Returns
true si el proceso fue exitoso.