MODBUS MASTER MONITOR 1.0
Loading...
Searching...
No Matches
Modbus Core

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...

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.

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.

Variables

ModbusClientRTU MB
 Instancia global del cliente Modbus RTU.
QueueHandle_t queueRespuestas
 Cola de respuestas Modbus recibidas.
QueueHandle_t queueEventos_Peripheral
 Colas de eventos hacia el EventManager (periféricos y scheduler).

Detailed Description

Resumen

Este módulo implementa el cliente Modbus RTU (ESP32/TTGO) y el flujo completo de:

  • Descubrimiento inicial de sensores en esclavos RS485.
  • Planificación de lecturas periódicas (Scheduler) en función de parámetros de cada sensor.
  • Gestión de respuestas y errores con correlación por token.
  • Formateo de datos en payloads por sensor y agregación en un payload LoRaWAN.

Estructura y componentes

API principal

Uso

Resumen del flujo:

1) Arranque Modbus

  • Inicializa UART RS485 y ModbusClientRTU (timeout/begin).
  • Registra callbacks: handleData(), handleError().
  • Crea tareas: EventManager y DataRequestScheduler.
  • Lanza initialDiscoveryTask con dispositivosAConsultar.

2) Descubrimiento

3) Muestreo periódico

  • DataRequestScheduler dispara REQUEST_SAMPLING según nextSampleTime.
  • EventManager consulta getSensorParams() y envía solicitud de lectura con startAddress/numRegs.
  • handleData() entrega registros al siguiente subsistema.

4) Errores Modbus

  • handleError(): gestiona TIMEOUT, aumenta consecutiveFails, elimina esclavos inactivos y recalcula scheduler.
  • Los tokens se invalidan tras procesarse.

Advertencias y buenas prácticas:

  • Asegurar layout consistente de 8 registros de parámetros para descubrimiento.
  • Respetar el offset 3 para datos de registros en respuestas Modbus RTU.
  • Proteger acceso a scheduleList con schedulerMutex.
  • Revisar límites MAX_* para evitar overflow en colas y tokens.

Macro Definition Documentation

◆ RX_PIN

#define RX_PIN   13

< Utilidades de memoria (memcpy).

< Necesario para definiciones de tipos enteros de tamaño fijo (uint8_t, etc). < Estructura de datos para mapeo de sensores. < Utilizado para la generación de timestamps UNIX.

Pin de recepción UART para RS485.

Enumeration Type Documentation

◆ DiscoveryOrder

Comandos especiales utilizados durante la fase de descubrimiento de sensores.

Enumerator
DISCOVERY_GET_COUNT 

Solicitar conteo de elementos.

DISCOVERY_GET_DATA_OFFSET 

Offset para obtener datos específicos.

DISCOVERY_READ_SENSOR_PARAM 

Orden para leer parámetros del sensor (registros 0..7).

◆ RequestType

Clasificación del propósito de una solicitud Modbus.

Enumerator
REQUEST_UNKNOWN 

Tipo de solicitud no identificado.

REQUEST_DISCOVERY 

Solicitud relacionada con el descubrimiento de hardware.

REQUEST_SAMPLING 

Solicitud de lectura periódica de datos.

Function Documentation

◆ addRequest()

void addRequest ( uint32_t token,
uint8_t slaveId,
uint8_t sensorId,
uint8_t functionCode,
RequestType type )

Registra una nueva solicitud en el buffer circular.

Parameters
tokenIdentificador único.
slaveIdID del esclavo.
sensorIdID del sensor.
functionCodeFunción Modbus.
typeTipo de solicitud.

◆ DataRequestScheduler()

void DataRequestScheduler ( void * pvParameters)

Tarea principal del Planificador (Scheduler).

Revisa periódicamente qué sensores deben ser muestreados y genera eventos para el EventManager.

◆ discoverDeviceSensors()

bool discoverDeviceSensors ( uint8_t deviceId)

Inicia el proceso de descubrimiento para un dispositivo específico.

Parameters
deviceIdID Modbus del dispositivo a consultar.
Returns
true si el evento se encoló correctamente, false en caso contrario.

◆ EventManager()

void EventManager ( void * pvParameters)

Tarea Gestor de Eventos.

Centraliza las peticiones de las colas (Scheduler y Peripheral) y las convierte en transacciones Modbus reales.

◆ findRequestByToken()

ModbusRequestInfo * findRequestByToken ( uint32_t token)

Busca una solicitud pendiente por su token.

Parameters
tokenToken a buscar.
Returns
Puntero a la estructura ModbusRequestInfo o nullptr si no existe.

◆ getRegistersPerChannel()

uint8_t getRegistersPerChannel ( uint8_t slaveId,
uint8_t sensorID )

Calcula el número de registros por canal para un sensor.

Returns
Número de registros o 0 si no se encuentra el sensor.

◆ getSensorParams()

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.

Parameters
slaveIdID del esclavo.
sensorIDID del sensor.
startAddrReferencia para devolver la dirección de inicio.
numRegsReferencia para devolver el número de registros.
Returns
true si se encontró el sensor, false en caso contrario.

◆ handleData()

void handleData ( ModbusMessage response,
uint32_t token )

Callback ejecutado al recibir datos Modbus válidos.

Parameters
responseObjeto con la respuesta cruda.
tokenToken de la solicitud original.

◆ handleError()

void handleError ( Error error,
uint32_t token )

Callback ejecutado al ocurrir un error Modbus.

Gestiona la lógica de reintentos y eliminación de esclavos inactivos (Timeout).

Parameters
errorCódigo de error.
tokenToken de la solicitud fallida.

◆ initialDiscoveryTask()

void initialDiscoveryTask ( void * pvParameters)

Tarea de un solo uso para el descubrimiento inicial de sensores.

Itera sobre dispositivosAConsultar, lanza el descubrimiento y luego se autoelimina.

◆ initScheduler()

void initScheduler ( )

Inicializa o actualiza la lista de planificación (Scheduler).

Recorre slaveList, calcula los intervalos efectivos basados en canales y registros, y puebla scheduleList. Es thread-safe mediante schedulerMutex.

◆ parseAndStoreDiscoveryResponse()

void parseAndStoreDiscoveryResponse ( const ResponseFormat & response,
uint8_t slaveId )

Parsea la respuesta de descubrimiento y actualiza la lista de esclavos.

Decodifica los 8 registros de parámetros y crea o actualiza la entrada en slaveList.

Parameters
responseDatos crudos recibidos.
slaveIdID del esclavo que respondió.