MODBUS MASTER MONITOR 1.0
Loading...
Searching...
No Matches
main.cpp File Reference

Firmware Maestro Modbus RTU sobre LoRaWAN (ESP32/TTGO). More...

#include <Arduino.h>
#include <SPI.h>
#include <hal/hal.h>
#include <lmic.h>
#include <vector>
#include <cstdint>
#include <map>
#include <ctime>
#include <cstring>
#include <algorithm>
#include "ModbusClientRTU.h"

Classes

struct  ModbusSensorParam
 Define los parámetros de configuración de un sensor individual. More...
struct  ModbusSlaveParam
 Vector global que almacena la configuración y estado de todos los esclavos Modbus descubiertos. More...
struct  ModbusRequestInfo
 Contexto de una solicitud Modbus en vuelo. More...
struct  ResponseFormat
 Estructura intermedia para pasar datos desde el callback Modbus a las tareas. More...
struct  SensorSchedule
 Elemento de planificación para el muestreo de sensores. More...
struct  EventManagerFormat
 Estructura de mensaje para comunicación interna de eventos. 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...
struct  Fragmento
 Fragmento binario listo para transmisión LoRaWAN. More...

Macros

#define RX_PIN   13
 < Utilidades de memoria (memcpy).
#define TX_PIN   12
 Pin de transmisión UART para RS485.
#define MAX_MODBUS_RESPONSE_LENGTH   256
 Longitud máxima esperada para una respuesta Modbus.
#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).

Enumerations

enum  DiscoveryOrder { DISCOVERY_GET_COUNT = 1 , DISCOVERY_GET_DATA_OFFSET = 255 , DISCOVERY_READ_SENSOR_PARAM = 8 }
 Comandos especiales utilizados durante la fase de descubrimiento de sensores. More...
enum  RequestType { REQUEST_UNKNOWN , REQUEST_DISCOVERY , REQUEST_SAMPLING }
 Clasificación del propósito de una solicitud Modbus. More...

Functions

void addRequest (uint32_t token, uint8_t slaveId, uint8_t sensorId, uint8_t functionCode, RequestType type)
 Registra una nueva solicitud en el buffer circular.
ModbusRequestInfofindRequestByToken (uint32_t token)
 Busca una solicitud pendiente por su token.
void initScheduler ()
 Inicializa o actualiza la lista de planificación (Scheduler).
void handleData (ModbusMessage response, uint32_t token)
 Callback ejecutado al recibir datos Modbus válidos.
void handleError (Error error, uint32_t token)
 Callback ejecutado al ocurrir un error Modbus.
bool discoverDeviceSensors (uint8_t deviceId)
 Inicia el proceso de descubrimiento para un dispositivo específico.
void initialDiscoveryTask (void *pvParameters)
 Tarea de un solo uso para el descubrimiento inicial de sensores.
void DataRequestScheduler (void *pvParameters)
 Tarea principal del Planificador (Scheduler).
bool getSensorParams (uint8_t slaveId, uint8_t sensorID, uint16_t &startAddr, uint16_t &numRegs)
 Obtiene los parámetros de configuración de un sensor específico.
uint8_t getRegistersPerChannel (uint8_t slaveId, uint8_t sensorID)
 Calcula el número de registros por canal para un sensor.
void parseAndStoreDiscoveryResponse (const ResponseFormat &response, uint8_t slaveId)
 Parsea la respuesta de descubrimiento y actualiza la lista de esclavos.
void EventManager (void *pvParameters)
 Tarea Gestor de Eventos.
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.
void DataPrinterTask (void *pvParameters)
 Tarea temporal para imprimir los payloads de datos formateados.
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 os_getArtEui (u1_t *buf)
 Funciones de configuración LMIC (placeholders).
void os_getDevEui (u1_t *buf)
void os_getDevKey (u1_t *buf)
void onEvent (ev_t ev)
 Callback de eventos LMIC/LoRaWAN.
void initLoRa ()
 Inicializa la pila LMIC y configura LoRaWAN (ABP, US915).
void tareaLoRa (void *pvParameters)
 Tarea dedicada al envío de datos por LoRaWAN.
void tareaRunLoop (void *pvParameters)
 Tarea del runloop LMIC.
void DataAggregatorTask (void *pvParameters)
 Tarea proactiva que recolecta y empaqueta datos de sensores a un ritmo fijo.
void setup ()
void loop ()

Variables

ModbusClientRTU MB
 Instancia global del cliente Modbus RTU.
std::vector< ModbusSlaveParamslaveList
constexpr size_t MAX_REQUESTS = 16
 Tamaño máximo del buffer de solicitudes pendientes.
ModbusRequestInfo requestBuffer [MAX_REQUESTS]
 Buffer circular de solicitudes.
size_t requestHead = 0
 Índice de escritura del buffer circular.
QueueHandle_t queueRespuestas
 Cola de respuestas Modbus recibidas.
QueueHandle_t queueEventos_Peripheral
 Colas de eventos hacia el EventManager (periféricos y scheduler).
QueueHandle_t queueEventos_Scheduler
QueueHandle_t queueFragmentos
 Cola para mensajes binarios LoRa.
SemaphoreHandle_t semaforoEnvioCompleto
 Semáforo para sincronizar el fin de un ciclo de envío.
std::vector< SensorSchedulescheduleList
 Lista maestra de planificación.
SemaphoreHandle_t schedulerMutex
 Mutex para proteger el acceso concurrente a scheduleList;.
std::vector< uint8_t > dispositivosAConsultar = {1, 2, 3}
 Lista predefinida de IDs Modbus a escanear al inicio.
QueueHandle_t queueSensorDataPayload
 Cola para payloads de sensores procesados.
const uint8_t SENSOR_ID_BATERIA = 0
 Asignado al Bit 0 del Activate Byte.
const uint8_t SENSOR_ID_VOLTAJE = 1
 Asignado al Bit 1 del Activate Byte.
const uint8_t SENSOR_ID_CORRIENTE = 2
 Asignado al Bit 2 del Activate Byte.
const uint8_t SENSOR_ID_EXT_START = 3
 Inicio de IDs para sensores externos (Bits 3-7).
const int MAX_SENSORES_EXTERNOS = 5
 Cantidad de bits restantes disponibles (3 al 7).
static u1_t NWKSKEY [16]
 Claves ABP y dirección de dispositivo (DEMO).
static u1_t APPSKEY [16]
static const u4_t DEVADDR = 0x260C691F
const lmic_pinmap lmic_pins
 Mapa de pines para el radio SX127x de la TTGO LoRa32.
constexpr size_t LORA_PAYLOAD_MAX = 220

Detailed Description

Firmware Maestro Modbus RTU sobre LoRaWAN (ESP32/TTGO).

Este sistema gestiona la comunicación RS485 con múltiples esclavos, planifica lecturas periódicas, formatea los datos y los transmite vía LoRaWAN.

Date
2025-12-02

Function Documentation

◆ DataPrinterTask()

void DataPrinterTask ( void * pvParameters)

Tarea temporal para imprimir los payloads de datos formateados.

Simula el consumidor final (que será la tarea LoRa) para propósitos de depuración.

Variable Documentation

◆ APPSKEY

u1_t APPSKEY[16]
static
Initial value:
= {
0x42, 0x8F, 0x67, 0xFA, 0xD7, 0xD7, 0x4A, 0x85,
0x3C, 0x10, 0x80, 0x5F, 0x10, 0x1A, 0x0E, 0x14
}