diff --git a/components/meter_orno/CMakeLists.txt b/components/meter_orno/CMakeLists.txt index a344f4e..fd8a80b 100755 --- a/components/meter_orno/CMakeLists.txt +++ b/components/meter_orno/CMakeLists.txt @@ -1,6 +1,8 @@ set(srcs - "src/meter_orno.c" "src/modbus_params.c" "src/orno513.c" "src/orno516.c" + "src/modbus_params.c" "src/orno513.c" "src/orno516.c" ) idf_component_register(SRCS "${srcs}" - INCLUDE_DIRS "include") + INCLUDE_DIRS "include" + PRIV_REQUIRES nvs_flash driver + REQUIRES esp-modbus) \ No newline at end of file diff --git a/components/meter_orno/include/meter_orno.h b/components/meter_orno/include/meter_orno513.h similarity index 100% rename from components/meter_orno/include/meter_orno.h rename to components/meter_orno/include/meter_orno513.h diff --git a/components/meter_orno/include/meter_orno516.h b/components/meter_orno/include/meter_orno516.h new file mode 100755 index 0000000..81a23bb --- /dev/null +++ b/components/meter_orno/include/meter_orno516.h @@ -0,0 +1,73 @@ +#ifndef METER_ORNO516_H_ +#define METER_ORNO516_H_ + +#include +#include "esp_err.h" + + +#include +#include +#include "esp_err.h" + +/** + * @brief Inicializa o driver do medidor (SPI, mutex, registradores ADE7758). + */ +esp_err_t meter_init(void); + +/** + * @brief Inicia a tarefa de leitura de dados do medidor. + */ +esp_err_t meter_start(void); + +/** + * @brief Para a tarefa de leitura e limpa os dados internos. + */ +void meter_stop(void); + +/** + * @brief Verifica se o medidor está em execução. + * + * @return true se a tarefa estiver ativa, false caso contrário. + */ +bool meter_is_running(void); + +/** + * @brief Limpa os dados armazenados no medidor (zera todos os valores). + */ +void meter_clear_data(void); + +// ----- Leituras por fase (L1, L2, L3) ----- + +// Tensão RMS (em volts) +float meter_get_vrms_l1(void); +float meter_get_vrms_l2(void); +float meter_get_vrms_l3(void); + +// Corrente RMS (em amperes) +float meter_get_irms_l1(void); +float meter_get_irms_l2(void); +float meter_get_irms_l3(void); + +// Potência ativa (W) +int meter_get_watt_l1(void); +int meter_get_watt_l2(void); +int meter_get_watt_l3(void); + +// Potência reativa (VAR) +int meter_get_var_l1(void); +int meter_get_var_l2(void); +int meter_get_var_l3(void); + +// Potência aparente (VA) +int meter_get_va_l1(void); +int meter_get_va_l2(void); +int meter_get_va_l3(void); + +// (Opcional) contador de watchdog para diagnóstico +uint32_t meter_get_watchdog_counter(void); + +#ifdef __cplusplus +} +#endif + +#endif /* METER_ORNO516_H_ */ diff --git a/components/meter_orno/src/meter_orno.c b/components/meter_orno/src/meter_orno.c deleted file mode 100755 index bbfa9de..0000000 --- a/components/meter_orno/src/meter_orno.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "meter_orno.h" -#include -#include "esp_log.h" - -static const char *TAG = "orno_modbus"; -static bool meter_state = false; -static bool meter_test = false; -static bool model_enabled = false; - -esp_err_t orno_modbus_init(void) -{ - ESP_LOGI(TAG, "Initializing ORNO Modbus driver"); - return ESP_OK; -} - -esp_err_t orno_modbus_read_current(orno_meter_type_t type, float *current) -{ - if (!current) { - return ESP_ERR_INVALID_ARG; - } - // Stub implementation - replace with real Modbus queries - *current = 0.0f; - ESP_LOGD(TAG, "Read current type %d -> %f", type, *current); - return ESP_OK; -} - -void orno_modbus_set_meter_test(bool state) -{ - meter_test = state; -} - -void orno_modbus_set_model(bool enabled) -{ - model_enabled = enabled; -} - -bool orno_modbus_get_meter_state(void) -{ - return meter_state; -} - -void orno_modbus_start(void) -{ - ESP_LOGI(TAG, "Starting ORNO Modbus driver"); - meter_state = true; -} - -void orno_modbus_stop(void) -{ - ESP_LOGI(TAG, "Stopping ORNO Modbus driver"); - meter_state = false; -} diff --git a/components/meter_orno/src/orno513.c b/components/meter_orno/src/orno513.c index d6e7270..699bcb7 100755 --- a/components/meter_orno/src/orno513.c +++ b/components/meter_orno/src/orno513.c @@ -1,530 +1,267 @@ -#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE +/************************************** + * INCLUDES + **************************************/ +#include "meter_orno513.h" #include "esp_log.h" - -#include "modbus_params.h" // for modbus parameters structures +#include "modbus_params.h" #include "mbcontroller.h" #include "sdkconfig.h" -#include "meter_orno.h" +#include "meter_orno513.h" -#define TXD_PIN (GPIO_NUM_17) -#define RXD_PIN (GPIO_NUM_16) +/************************************** + * DEFINES E CONFIGURAÇÕES + **************************************/ +#define TAG "ORNO513" -static const char *TAG = "serial_mdb"; +#define MB_PORT_NUM 2 +#define MB_DEV_SPEED 9600 +#define MB_UART_TXD 17 +#define MB_UART_RXD 16 +#define MB_UART_RTS 5 +#define MASTER_MAX_RETRY 30 +#define POLL_TIMEOUT_TICS pdMS_TO_TICKS(500) +#define UPDATE_CIDS_TIMEOUT_TICS pdMS_TO_TICKS(3000) +#define ERROR_TIMEOUT_MS 1000 + +#define STR(fieldname) ((const char *)(fieldname)) +#define OPTS(min_val, max_val, step_val) { .opt1 = min_val, .opt2 = max_val, .opt3 = step_val } + +/************************************** + * VARIÁVEIS GLOBAIS + **************************************/ static bool enabled = false; static bool meterState = false; static bool meterTest = false; - static TaskHandle_t serial_mdb_task = NULL; -#define MB_PORT_NUM 2 //(CONFIG_MB_UART_PORT_NUM) // Number of UART port used for Modbus connection -#define MB_DEV_SPEED 9600 //(CONFIG_MB_UART_BAUD_RATE) // The communication speed of the UART -// #define MB_PARITY_EVEN +/************************************** + * ENUMS E CONSTANTES DE PARAMETROS + **************************************/ +enum { + MB_DEVICE_ADDR1 = 1 +}; -#define MB_UART_TXD 17 -#define MB_UART_RXD 16 -#define MB_UART_RTS 5 +enum { + CID_TOTALFACTIVE = 0, + CID_TOTALRACTIVE, + CID_ACTIVEPOWER, + CID_APPARENTPOWER, + CID_REACTIVEPOWER, + CID_L1CURRENT, + CID_L1VOLTAGE +}; -// Note: Some pins on target chip cannot be assigned for UART communication. -// See UART documentation for selected board and target to configure pins using Kconfig. +#define TOTALFACTIVE 0x010E +#define TOTALRACTIVE 0x0118 +#define ACTIVEPOWER 0x0104 +#define APPARENTPOWER 0x0106 +#define REACTIVEPOWER 0x0108 +#define L1CURRENT 0x0102 +#define L1VOLTAGE 0x0100 -// The number of parameters that intended to be used in the particular control process -#define MASTER_MAX_CIDS num_device_parameters - -// Number of reading of parameters from slave -#define MASTER_MAX_RETRY 30 - -// Timeout to update cid over Modbus -#define UPDATE_CIDS_TIMEOUT_MS (3000) -#define UPDATE_CIDS_TIMEOUT_TICS (UPDATE_CIDS_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between polls -#define POLL_TIMEOUT_MS (500) -#define POLL_TIMEOUT_TICS (POLL_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between erros -#define ERROR_TIMEOUT_MS (1000) -#define ERROR_TIMEOUT_TICS (ERROR_TIMEOUT_MS / portTICK_PERIOD_MS) - -// The macro to get offset for parameter in the appropriate structure #define HOLD_OFFSET(field) ((uint16_t)(offsetof(holding_reg_params_t, field) + 1)) -#define INPUT_OFFSET(field) ((uint16_t)(offsetof(input_reg_params_t, field) + 1)) -#define COIL_OFFSET(field) ((uint16_t)(offsetof(coil_reg_params_t, field) + 1)) -// Discrete offset macro -#define DISCR_OFFSET(field) ((uint16_t)(offsetof(discrete_reg_params_t, field) + 1)) -#define STR(fieldname) ((const char *)(fieldname)) -// Options can be used as bit masks or parameter limits -#define OPTS(min_val, max_val, step_val) \ - { \ - .opt1 = min_val, .opt2 = max_val, .opt3 = step_val} - -// Enumeration of modbus device addresses accessed by master device -enum -{ - MB_DEVICE_ADDR1 = 1 // Only one slave device used for the test (add other slave addresses here) -}; - -// Enumeration of all supported CIDs for device (used in parameter definition table) -enum -{ - CID_HOLD_DATA_0 = 0, - CID_HOLD_DATA_1 = 1, - CID_HOLD_DATA_2 = 2, - CID_HOLD_DATA_3 = 3, - CID_HOLD_DATA_4 = 4, - CID_HOLD_DATA_5 = 5, - CID_HOLD_DATA_6 = 6 -}; - -#define SN 0x1000 -#define METERID 0x1003 -#define FW 0x1004 - -#define L1VOLTAGE 0x0100 -// #define L2VOLTAGE 0x0010 -// #define L3VOLTAGE 0x0012 - -#define L1CURRENT 0x0102 -// #define L2CURRENT 0x0018 -// #define L3CURRENT 0x001A - -#define ACTIVEPOWER 0x0104 -#define APPARENTPOWER 0x0106 -#define REACTIVEPOWER 0x0108 - -#define TOTALFACTIVE 0x010E -#define TOTALRACTIVE 0x0118 - -// Example Data (Object) Dictionary for Modbus parameters: -// The CID field in the table must be unique. -// Modbus Slave Addr field defines slave address of the device with correspond parameter. -// Modbus Reg Type - Type of Modbus register area (Holding register, Input Register and such). -// Reg Start field defines the start Modbus register number and Reg Size defines the number of registers for the characteristic accordingly. -// The Instance Offset defines offset in the appropriate parameter structure that will be used as instance to save parameter value. -// Data Type, Data Size specify type of the characteristic and its data size. -// Parameter Options field specifies the options that can be used to process parameter value (limits or masks). -// Access Mode - can be used to implement custom options for processing of characteristic (Read/Write restrictions, factory mode values and etc). const mb_parameter_descriptor_t device_parameters[] = { - // { CID, Param Name, Units, Modbus Slave Addr, Modbus Reg Type, Reg Start, Reg Size, Instance Offset, Data Type, Data Size, Parameter Options, Access Mode} - - {CID_HOLD_DATA_0, STR("TOTALFACTIVE"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALFACTIVE, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_1, STR("TOTALRACTIVE"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALRACTIVE, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("ACTIVEPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, ACTIVEPOWER, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("APPARENTPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, APPARENTPOWER, 2, - HOLD_OFFSET(holding_data3), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("REACTIVEPOWER"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, REACTIVEPOWER, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("L1CURRENT"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("L1VOLTAGE"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ} - /* - - {CID_HOLD_DATA_3, STR("L1VOLTAGE 4"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data3), PARAM_TYPE_I32_DCBA, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("L1VOLTAGE 5"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("L1CURRENT 2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_FLOAT, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_2, STR("ID 2"), STR("ID 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("ID 3"), STR("FW 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_2, STR("ID 2"), STR("ID 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 1, - HOLD_OFFSET(holding_data2), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_3, STR("ID 3"), STR("FW 2"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 1, - HOLD_OFFSET(holding_data3), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_4, STR("ID 4"), STR("ID 4"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("ID 5"), STR("ID 5"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U16, 2, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("ID 6"), STR("ID 6"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_U32, 4, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - - - {CID_HOLD_DATA_4, STR("ID 4"), STR("ID 3"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data4), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_5, STR("ID 5"), STR("FW 3"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FW, 2, - HOLD_OFFSET(holding_data5), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_6, STR("ID 6"), STR("ID 4"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - HOLD_OFFSET(holding_data6), PARAM_TYPE_U8, 2, OPTS(0, 100000, 1), PAR_PERMS_READ} - - - {CID_HOLD_DATA_0, STR("L1"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - - {CID_HOLD_DATA_1, STR("L2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2CURRENT, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("L3"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3CURRENT, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ} - */ - + {CID_TOTALFACTIVE, STR("Total Active"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALFACTIVE, 2, HOLD_OFFSET(holding_data0), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_TOTALRACTIVE, STR("Total Reactive"),STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALRACTIVE, 2, HOLD_OFFSET(holding_data1), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_ACTIVEPOWER, STR("Active Power"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, ACTIVEPOWER, 2, HOLD_OFFSET(holding_data2), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_APPARENTPOWER, STR("Apparent Power"),STR("VA"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, APPARENTPOWER,2, HOLD_OFFSET(holding_data3), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_REACTIVEPOWER, STR("Reactive Power"),STR("var"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, REACTIVEPOWER,2, HOLD_OFFSET(holding_data4), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_L1CURRENT, STR("L1 Current"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, HOLD_OFFSET(holding_data5), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ}, + {CID_L1VOLTAGE, STR("L1 Voltage"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, HOLD_OFFSET(holding_data6), PARAM_TYPE_I32_CDAB, 4, OPTS(-100000, 100000, 1), PAR_PERMS_READ} }; -// Calculate number of parameters in the table -const uint16_t num_device_parameters = (sizeof(device_parameters) / sizeof(device_parameters[0])); +const uint16_t num_device_parameters = sizeof(device_parameters) / sizeof(device_parameters[0]); -// The function to get pointer to parameter storage (instance) according to parameter description table -static void *master_get_param_data(const mb_parameter_descriptor_t *param_descriptor) -{ - assert(param_descriptor != NULL); - void *instance_ptr = NULL; - if (param_descriptor->param_offset != 0) - { - switch (param_descriptor->mb_param_type) - { - case MB_PARAM_HOLDING: - instance_ptr = ((void *)&holding_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_INPUT: - instance_ptr = ((void *)&input_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_COIL: - instance_ptr = ((void *)&coil_reg_params + param_descriptor->param_offset - 1); - break; - case MB_PARAM_DISCRETE: - instance_ptr = ((void *)&discrete_reg_params + param_descriptor->param_offset - 1); - break; +/************************************** + * FUNÇÕES AUXILIARES + **************************************/ +static void *master_get_param_data(const mb_parameter_descriptor_t *desc) { + assert(desc != NULL); + switch (desc->mb_param_type) { + case MB_PARAM_HOLDING: return ((void *)&holding_reg_params + desc->param_offset - 1); + case MB_PARAM_INPUT: return ((void *)&input_reg_params + desc->param_offset - 1); + case MB_PARAM_COIL: return ((void *)&coil_reg_params + desc->param_offset - 1); + case MB_PARAM_DISCRETE: return ((void *)&discrete_reg_params + desc->param_offset - 1); default: - instance_ptr = NULL; - break; - } + ESP_LOGE(TAG, "Unknown register type for CID %u", desc->cid); + return NULL; } - else - { - ESP_LOGE(TAG, "Wrong parameter offset for CID #%u", (unsigned)param_descriptor->cid); - assert(instance_ptr != NULL); - } - return instance_ptr; } -// Float - Mid-Little Endian (CDAB) -float ReverseFloat(const float inFloat) -{ - float retVal; - char *floatToConvert = (char *)&inFloat; - char *returnFloat = (char *)&retVal; - - // swap the bytes into a temporary buffer - returnFloat[0] = floatToConvert[2]; - returnFloat[1] = floatToConvert[3]; - returnFloat[2] = floatToConvert[0]; - returnFloat[3] = floatToConvert[1]; - - return retVal; -} - -// Int - Mid-Little Endian (CDAB) -int ReverseInt(const int inFloat) -{ - int retVal; - char *floatToConvert = (char *)&inFloat; - char *returnFloat = (char *)&retVal; - - // swap the bytes into a temporary buffer - returnFloat[0] = floatToConvert[2]; - returnFloat[1] = floatToConvert[3]; - returnFloat[2] = floatToConvert[0]; - returnFloat[3] = floatToConvert[1]; - - return retVal; -} - -static void serial_mdb_task_func(void *param) -{ - ESP_LOGI(TAG, "serial_mdb_task_func"); - esp_err_t err = ESP_OK; - - float maxcurrent = 0; - float l1current = 0; - float l2current = 0; - float l3current = 0; +/************************************** + * TAREFA PRINCIPAL DO MODBUS + **************************************/ +static void serial_mdb_task_func(void *param) { + ESP_LOGI(TAG, "Modbus polling started"); + esp_err_t err; int error_count = 0; + void *modbus_ctx = NULL; // Inicializando o contexto Modbus - bool alarm_state = false; - const mb_parameter_descriptor_t *param_descriptor = NULL; + // Inicializando o Modbus Master + err = mbc_master_init(MB_PORT_SERIAL_MASTER, &modbus_ctx); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to initialize Modbus master"); + return; + } - ESP_LOGI(TAG, "Start modbus..."); + while (true) { + // Se o Modbus não estiver habilitado e não for modo de teste, aguarda e continua o loop + if (!enabled && !meterTest) { + vTaskDelay(UPDATE_CIDS_TIMEOUT_TICS); + continue; + } - while (true) - { + for (uint16_t cid = 0; cid < num_device_parameters; cid++) { + const mb_parameter_descriptor_t *desc = NULL; - // if ((evse_state_is_charging(evse_get_state()) && enabled) || (meterTest && enabled)) - { - // Read all found characteristics from slave(s) - for (uint16_t cid = 0; (err != ESP_ERR_NOT_FOUND) && cid < MASTER_MAX_CIDS; cid++) - { - // Get data from parameters description table - // and use this information to fill the characteristics description table - // and having all required fields in just one table - err = mbc_master_get_cid_info(cid, ¶m_descriptor); - if ((err != ESP_ERR_NOT_FOUND) && (param_descriptor != NULL)) - { - void *temp_data_ptr = master_get_param_data(param_descriptor); - uint8_t type = 0; + // Obtém as informações do CID, agora com o contexto + err = mbc_master_get_cid_info(modbus_ctx, cid, &desc); + if (err != ESP_OK || !desc) { + continue; // Se falhar, pula para o próximo CID + } - err = mbc_master_get_parameter(cid, (char *)param_descriptor->param_key, - (uint8_t *)temp_data_ptr, &type); + // Obtém os dados associados ao CID + void *data = master_get_param_data(desc); + if (!data) { + continue; // Se falhar ao obter os dados, pula para o próximo CID + } - if (err == ESP_OK) - { + uint8_t type = 0; + // Realiza a leitura do parâmetro Modbus + err = mbc_master_get_parameter(cid, (char *)desc->param_key, (uint8_t *)data, &type); + if (err == ESP_OK) { + // Se a leitura for bem-sucedida, trata os dados lidos + if (type == PARAM_TYPE_FLOAT) { + float val = *(float *)data; + ESP_LOGI(TAG, "CID %u [%s] = %.2f %s", desc->cid, desc->param_key, val, desc->param_units); + } else { + int val = *(int *)data; + ESP_LOGI(TAG, "CID %u [%s] = %d %s", desc->cid, desc->param_key, val, desc->param_units); + } - ESP_LOGI(TAG, "err == ESP_OK..."); + meterState = true; + error_count = 0; - error_count = 0; - meterState = true; - - if ((param_descriptor->mb_param_type == MB_PARAM_HOLDING) || - (param_descriptor->mb_param_type == MB_PARAM_INPUT)) - { - int value = *(int *)temp_data_ptr; - // value = ReverseInt(value); - - /* - switch (cid) - { - case 0: - // setMaxGridCurrent(grid_get_max_current() * 10); - maxcurrent = 0; - l1current = 0; - l2current = 0; - l3current = 0; - - l1current = value; - break; - case 1: - l2current = value; - break; - case 2: - l3current = value; - - maxcurrent = (l1current > l2current) ? l1current : l2current; - maxcurrent = (maxcurrent > l3current) ? maxcurrent : l3current; - - // maxcurrent = (maxcurrent * 5) + 25; - - // setLiveGridCurrent((int)maxcurrent * 10); - break; - default: - // code block - }*/ - - ESP_LOGI(TAG, "Characteristic #%u %s (%s) value = %d (0x%" PRIx32 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - value, - *(uint32_t *)temp_data_ptr); - - if (((value > param_descriptor->param_opts.max) || - (value < param_descriptor->param_opts.min))) - { - alarm_state = true; - break; - } - } - else - { - uint8_t state = *(uint8_t *)temp_data_ptr; - const char *rw_str = (state & param_descriptor->param_opts.opt1) ? "ON" : "OFF"; - if ((state & param_descriptor->param_opts.opt2) == param_descriptor->param_opts.opt2) - { - ESP_LOGI(TAG, "Characteristic 6 #%u %s (%s) value = %s (0x%" PRIx8 ") read successful.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - } - else - { - ESP_LOGE(TAG, "Characteristic 7 #%u %s (%s) value = %s (0x%" PRIx8 "), unexpected value.", - param_descriptor->cid, - param_descriptor->param_key, - param_descriptor->param_units, - (const char *)rw_str, - *(uint8_t *)temp_data_ptr); - alarm_state = true; - break; - } - if (state & param_descriptor->param_opts.opt1) - { - alarm_state = true; - break; - } - } + // Verifica se o valor está dentro dos limites + if (desc->param_opts.min != 0 || desc->param_opts.max != 0) { + if (desc->param_opts.max && val > desc->param_opts.max) { + ESP_LOGW(TAG, "CID %u value out of range! %d > %d", desc->cid, val, desc->param_opts.max); } - else - { - - if (error_count > 3 && !meterTest) - { - meterState = false; - vTaskDelay(ERROR_TIMEOUT_MS * error_count); // timeout between polls - } - else - { - error_count++; - } - - ESP_LOGE(TAG, "Characteristic 8 #%u (%s) read fail, err = 0x%x (%s).", - param_descriptor->cid, - param_descriptor->param_key, - (int)err, - (char *)esp_err_to_name(err)); + if (desc->param_opts.min && val < desc->param_opts.min) { + ESP_LOGW(TAG, "CID %u value out of range! %d < %d", desc->cid, val, desc->param_opts.min); } + } + } else { + ESP_LOGE(TAG, "Failed to read CID %u (%s), err=0x%x", cid, desc->param_key, err); + error_count++; - vTaskDelay(POLL_TIMEOUT_TICS); // timeout between polls + // Se muitos erros consecutivos ocorrerem, desabilita a leitura do medidor + if (error_count > 3 && !meterTest) { + meterState = false; + vTaskDelay(pdMS_TO_TICKS(ERROR_TIMEOUT_MS * error_count)); // Atraso antes de tentar novamente } } + + // Espera um tempo antes de ler o próximo CID + vTaskDelay(POLL_TIMEOUT_TICS); } + + // Espera antes de realizar a próxima rodada de leitura vTaskDelay(UPDATE_CIDS_TIMEOUT_TICS); } - - if (alarm_state) - { - ESP_LOGI(TAG, "Alarm triggered by cid #%u.", param_descriptor->cid); - } - else - { - ESP_LOGE(TAG, "Alarm is not triggered after %u retries.", MASTER_MAX_RETRY); - } - ESP_LOGI(TAG, "Destroy master..."); - ESP_ERROR_CHECK(mbc_master_destroy()); - - /* - while (true) - { - - - vTaskDelay(pdMS_TO_TICKS(1000)); - } - */ } -// Modbus master initialization -static esp_err_t master_init(void) -{ - // Initialize and start Modbus controller + +/************************************** + * INICIALIZAÇÃO DO MASTER MODBUS + **************************************/ +static esp_err_t master_init(void) { + void *handler = NULL; // Este é o contexto de comunicação Modbus mb_communication_info_t comm = { - //.slave_addr = 1, .port = MB_PORT_NUM, .mode = MB_MODE_RTU, .baudrate = MB_DEV_SPEED, - .parity = UART_PARITY_DISABLE}; - void *master_handler = NULL; + .parity = UART_PARITY_DISABLE // Configuração de paridade + }; - esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &master_handler); - MB_RETURN_ON_FALSE((master_handler != NULL), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail."); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller initialization fail, returns(0x%x).", (int)err); - err = mbc_master_setup((void *)&comm); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller setup fail, returns(0x%x).", (int)err); + // Inicializa o Modbus Master, passando o handler para ser preenchido + esp_err_t err = mbc_master_init(MB_PORT_SERIAL_MASTER, &handler); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha ao inicializar o Modbus Master, erro = 0x%x", err); + return err; // Retorna o erro caso falhe + } - // Set UART pin numbers - err = uart_set_pin(MB_PORT_NUM, MB_UART_TXD, MB_UART_RXD, - MB_UART_RTS, UART_PIN_NO_CHANGE); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set pin failure, uart_set_pin() returned (0x%x).", (int)err); + // Configura a comunicação Modbus + err = mbc_master_setup(&comm); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha na configuração do Modbus, erro = 0x%x", err); + return err; + } - err = mbc_master_start(); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller start fail, returned (0x%x).", (int)err); + // Configura os pinos UART para Modbus RTU + err = uart_set_pin(MB_PORT_NUM, MB_UART_TXD, MB_UART_RXD, MB_UART_RTS, UART_PIN_NO_CHANGE); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha ao configurar os pinos UART, erro = 0x%x", err); + return err; + } - // Set driver mode to Half Duplex + // Configura o UART para RS485 Half-Duplex err = uart_set_mode(MB_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb serial set mode failure, uart_set_mode() returned (0x%x).", (int)err); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha ao configurar o modo UART para RS485, erro = 0x%x", err); + return err; + } - vTaskDelay(5); - err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters); - MB_RETURN_ON_FALSE((err == ESP_OK), ESP_ERR_INVALID_STATE, TAG, - "mb controller set descriptor fail, returns(0x%x).", (int)err); - ESP_LOGI(TAG, "Modbus master stack initialized..."); - return err; + // Inicia o Modbus Master + err = mbc_master_start(); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha ao iniciar o Modbus Master, erro = 0x%x", err); + return err; + } + + // Atraso para garantir que tudo tenha sido configurado corretamente + vTaskDelay(pdMS_TO_TICKS(5)); + + // Configura o descritor do Modbus Master para os parâmetros do dispositivo + err = mbc_master_set_descriptor(device_parameters, num_device_parameters); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Falha ao configurar o descritor Modbus, erro = 0x%x", err); + return err; + } + + ESP_LOGI(TAG, "Modbus master initialized successfully."); + return ESP_OK; // Sucesso } -/** - * @brief Set meter model - * - */ -void serial_mdb_set_model(bool _enabled) -{ - enabled = _enabled; -} - -/** - * @brief Set meter state - * - */ -bool serial_mdb_get_meter_state() -{ - return meterState; -} - -/** - * @brief Set meter state - * - */ -void serial_mdb_set_meter_test(bool _meterTest) -{ - meterTest = _meterTest; -} - -void serial_mdb_start() -{ - - ESP_LOGI(TAG, "Starting MDB Serial"); - +/************************************** + * API PÚBLICA + **************************************/ +void serial_mdb_start() { + ESP_LOGI(TAG, "Iniciando MDB Serial"); enabled = meter_get_model() != ENERGY_METER_NONE; - - ESP_ERROR_CHECK(master_init()); - - xTaskCreate(serial_mdb_task_func, "serial_mdb_task", 4 * 1024, NULL, 5, &serial_mdb_task); + master_init(); + xTaskCreate(serial_mdb_task_func, "serial_mdb_task", 4096, NULL, 5, &serial_mdb_task); } -void serial_mdb_stop(void) -{ - ESP_LOGI(TAG, "Stopping"); - - if (serial_mdb_task) - { +void serial_mdb_stop() { + ESP_LOGI(TAG, "Parando MDB Serial"); + if (serial_mdb_task) { vTaskDelete(serial_mdb_task); serial_mdb_task = NULL; } - - // if (port != -1) - //{ uart_driver_delete(MB_PORT_NUM); - // port = -1; - //} -} \ No newline at end of file +} + +void serial_mdb_set_model(bool _enabled) { + enabled = _enabled; +} + +void serial_mdb_set_meter_test(bool _meterTest) { + meterTest = _meterTest; +} + +bool serial_mdb_get_meter_state() { + return meterState; +} diff --git a/components/meter_orno/src/orno516.c b/components/meter_orno/src/orno516.c index 77528fd..6c5a842 100755 --- a/components/meter_orno/src/orno516.c +++ b/components/meter_orno/src/orno516.c @@ -1,123 +1,89 @@ #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE #include "esp_log.h" -#include "meter_orno.h" -#include "modbus_params.h" // for modbus parameters structures +#include "meter_orno516.h" +#include "modbus_params.h" #include "mbcontroller.h" #include "sdkconfig.h" -#define TXD_PIN (GPIO_NUM_17) -#define RXD_PIN (GPIO_NUM_16) +#define TAG "ORNO516" -static const char *TAG = "serial_mdb"; +#define MB_PORT_NUM 2 +#define MB_DEV_SPEED 9600 +#define MB_UART_TXD 17 +#define MB_UART_RXD 16 +#define MB_UART_RTS 5 + +#define MASTER_MAX_RETRY 30 +#define UPDATE_CIDS_TIMEOUT_TICS pdMS_TO_TICKS(5000) +#define POLL_TIMEOUT_TICS pdMS_TO_TICKS(1) +#define ERROR_TIMEOUT_TICS pdMS_TO_TICKS(30000) + +#define HOLD_OFFSET(field) ((uint16_t)(offsetof(holding_reg_params_t, field) + 1)) +#define STR(name) ((const char *)(name)) +#define OPTS(min_val, max_val, step_val) { .opt1 = min_val, .opt2 = max_val, .opt3 = step_val } static bool enabled = false; static bool meterState = false; static bool meterTest = false; - static TaskHandle_t serial_mdb_task = NULL; -#define MB_PORT_NUM 2 //(CONFIG_MB_UART_PORT_NUM) // Number of UART port used for Modbus connection -#define MB_DEV_SPEED 9600 //(CONFIG_MB_UART_BAUD_RATE) // The communication speed of the UART -// #define MB_PARITY_EVEN - -#define MB_UART_TXD 17 -#define MB_UART_RXD 16 -#define MB_UART_RTS 5 - -// Note: Some pins on target chip cannot be assigned for UART communication. -// See UART documentation for selected board and target to configure pins using Kconfig. - -// The number of parameters that intended to be used in the particular control process -#define MASTER_MAX_CIDS num_device_parameters - -// Number of reading of parameters from slave -#define MASTER_MAX_RETRY 30 - -// Timeout to update cid over Modbus -#define UPDATE_CIDS_TIMEOUT_MS (5000) -#define UPDATE_CIDS_TIMEOUT_TICS (UPDATE_CIDS_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between polls -#define POLL_TIMEOUT_MS (1) -#define POLL_TIMEOUT_TICS (POLL_TIMEOUT_MS / portTICK_PERIOD_MS) - -// Timeout between erros -#define ERROR_TIMEOUT_MS (30000) -#define ERROR_TIMEOUT_TICS (ERROR_TIMEOUT_MS / portTICK_PERIOD_MS) - -// The macro to get offset for parameter in the appropriate structure -#define HOLD_OFFSET(field) ((uint16_t)(offsetof(holding_reg_params_t, field) + 1)) -#define INPUT_OFFSET(field) ((uint16_t)(offsetof(input_reg_params_t, field) + 1)) -#define COIL_OFFSET(field) ((uint16_t)(offsetof(coil_reg_params_t, field) + 1)) -// Discrete offset macro -#define DISCR_OFFSET(field) ((uint16_t)(offsetof(discrete_reg_params_t, field) + 1)) - -#define STR(fieldname) ((const char *)(fieldname)) -// Options can be used as bit masks or parameter limits -#define OPTS(min_val, max_val, step_val) \ - { \ - .opt1 = min_val, .opt2 = max_val, .opt3 = step_val} - -// Enumeration of modbus device addresses accessed by master device -enum -{ - MB_DEVICE_ADDR1 = 1 // Only one slave device used for the test (add other slave addresses here) +enum { + MB_DEVICE_ADDR1 = 1 }; -// Enumeration of all supported CIDs for device (used in parameter definition table) -enum -{ - CID_HOLD_DATA_0 = 0, - CID_HOLD_DATA_1 = 1, - CID_HOLD_DATA_2 = 2, - CID_HOLD_DATA_3 = 3, - CID_HOLD_DATA_4 = 4, - CID_HOLD_DATA_5 = 5, - CID_HOLD_DATA_6 = 6 +enum { + CID_L1CURRENT = 0, + CID_L2CURRENT, + CID_L3CURRENT, + CID_L1VOLTAGE, + CID_L2VOLTAGE, + CID_L3VOLTAGE, + CID_TOTALACTIVEPOWER, + CID_TOTALREACTIVEPOWER, + CID_TOTALAPPARENTPOWER, + CID_TOTALACTIVEENERGY, + CID_TOTALREACTIVEENERGY, + CID_TOTALAPPARENTENERGY, + CID_POWERFACTORTOTAL, + CID_FREQUENCY }; -#define SN 0x01 -#define METERID 0x02 +#define L1CURRENT 0x0016 +#define L2CURRENT 0x0018 +#define L3CURRENT 0x001A +#define L1VOLTAGE 0x000E +#define L2VOLTAGE 0x0010 +#define L3VOLTAGE 0x0012 +#define TOTALACTIVEPOWER 0x001C +#define TOTALREACTIVEPOWER 0x0024 +#define TOTALAPPARENTPOWER 0x002C +#define TOTALACTIVEENERGY 0x0100 +#define TOTALREACTIVEENERGY 0x0108 +#define TOTALAPPARENTENERGY 0x0110 +#define POWERFACTORTOTAL 0x0118 +#define FREQUENCY 0x0120 -#define L1VOLTAGE 0x000E -#define L2VOLTAGE 0x0010 -#define L3VOLTAGE 0x0012 - -#define L1CURRENT 0x0016 -#define L2CURRENT 0x0018 -#define L3CURRENT 0x001A - -#define TOTALACTIVEPOWER 0x001C - -// Example Data (Object) Dictionary for Modbus parameters: -// The CID field in the table must be unique. -// Modbus Slave Addr field defines slave address of the device with correspond parameter. -// Modbus Reg Type - Type of Modbus register area (Holding register, Input Register and such). -// Reg Start field defines the start Modbus register number and Reg Size defines the number of registers for the characteristic accordingly. -// The Instance Offset defines offset in the appropriate parameter structure that will be used as instance to save parameter value. -// Data Type, Data Size specify type of the characteristic and its data size. -// Parameter Options field specifies the options that can be used to process parameter value (limits or masks). -// Access Mode - can be used to implement custom options for processing of characteristic (Read/Write restrictions, factory mode values and etc). const mb_parameter_descriptor_t device_parameters[] = { - // { CID, Param Name, Units, Modbus Slave Addr, Modbus Reg Type, Reg Start, Reg Size, Instance Offset, Data Type, Data Size, Parameter Options, Access Mode} - - //{CID_HOLD_DATA_0, STR("ID 1"), STR("ID"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, METERID, 2, - // HOLD_OFFSET(holding_data0), PARAM_TYPE_U8, 1, OPTS(0, 100000, 1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_0, STR("L1"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, - HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_1, STR("L2"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2CURRENT, 2, - HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, - - {CID_HOLD_DATA_2, STR("L3"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3CURRENT, 2, - HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ} - + {CID_L1CURRENT, STR("L1 Current"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1CURRENT, 2, HOLD_OFFSET(holding_data0), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, + {CID_L2CURRENT, STR("L2 Current"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2CURRENT, 2, HOLD_OFFSET(holding_data1), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, + {CID_L3CURRENT, STR("L3 Current"), STR("A"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3CURRENT, 2, HOLD_OFFSET(holding_data2), PARAM_TYPE_FLOAT, 4, OPTS(-1000, 1000, 0.1), PAR_PERMS_READ}, + {CID_L1VOLTAGE, STR("L1 Voltage"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L1VOLTAGE, 2, HOLD_OFFSET(holding_data3), PARAM_TYPE_FLOAT, 4, OPTS(0, 300, 0.1), PAR_PERMS_READ}, + {CID_L2VOLTAGE, STR("L2 Voltage"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L2VOLTAGE, 2, HOLD_OFFSET(holding_data4), PARAM_TYPE_FLOAT, 4, OPTS(0, 300, 0.1), PAR_PERMS_READ}, + {CID_L3VOLTAGE, STR("L3 Voltage"), STR("V"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, L3VOLTAGE, 2, HOLD_OFFSET(holding_data5), PARAM_TYPE_FLOAT, 4, OPTS(0, 300, 0.1), PAR_PERMS_READ}, + {CID_TOTALACTIVEPOWER, STR("Total Active Power"), STR("W"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALACTIVEPOWER, 2, HOLD_OFFSET(holding_data6), PARAM_TYPE_FLOAT, 4, OPTS(0, 10000, 1), PAR_PERMS_READ}, + {CID_TOTALREACTIVEPOWER, STR("Total Reactive Power"), STR("var"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALREACTIVEPOWER, 2, HOLD_OFFSET(holding_data7), PARAM_TYPE_FLOAT, 4, OPTS(0, 10000, 1), PAR_PERMS_READ}, + {CID_TOTALAPPARENTPOWER, STR("Total Apparent Power"), STR("VA"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALAPPARENTPOWER, 2, HOLD_OFFSET(holding_data8), PARAM_TYPE_FLOAT, 4, OPTS(0, 10000, 1), PAR_PERMS_READ}, + {CID_TOTALACTIVEENERGY, STR("Total Active Energy"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALACTIVEENERGY, 2, HOLD_OFFSET(holding_data9), PARAM_TYPE_FLOAT, 4, OPTS(0, 100000, 1), PAR_PERMS_READ}, + {CID_TOTALREACTIVEENERGY, STR("Total Reactive Energy"), STR("kWh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALREACTIVEENERGY, 2, HOLD_OFFSET(holding_data10), PARAM_TYPE_FLOAT, 4, OPTS(0, 100000, 1), PAR_PERMS_READ}, + {CID_TOTALAPPARENTENERGY, STR("Total Apparent Energy"), STR("kVAh"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, TOTALAPPARENTENERGY, 2, HOLD_OFFSET(holding_data11), PARAM_TYPE_FLOAT, 4, OPTS(0, 100000, 1), PAR_PERMS_READ}, + {CID_POWERFACTORTOTAL, STR("Power Factor Total"), STR("-"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, POWERFACTORTOTAL, 2, HOLD_OFFSET(holding_data12), PARAM_TYPE_FLOAT, 4, OPTS(-1.0, 1.0, 0.01), PAR_PERMS_READ}, + {CID_FREQUENCY, STR("Frequency"), STR("Hz"), MB_DEVICE_ADDR1, MB_PARAM_HOLDING, FREQUENCY, 2, HOLD_OFFSET(holding_data13), PARAM_TYPE_FLOAT, 4, OPTS(45, 65, 0.1), PAR_PERMS_READ} }; -// Calculate number of parameters in the table -const uint16_t num_device_parameters = (sizeof(device_parameters) / sizeof(device_parameters[0])); +const uint16_t num_device_parameters = sizeof(device_parameters) / sizeof(device_parameters[0]); + +// (Task function, master_init, e funções públicas como serial_mdb_start, stop, etc.) // The function to get pointer to parameter storage (instance) according to parameter description table static void *master_get_param_data(const mb_parameter_descriptor_t *param_descriptor) diff --git a/dependencies.lock b/dependencies.lock index ffb477c..b1dac2d 100755 --- a/dependencies.lock +++ b/dependencies.lock @@ -5,6 +5,12 @@ dependencies: service_url: https://api.components.espressif.com/ type: service version: 0.5.3 + espressif/esp-modbus: + component_hash: 260482d114dfc6d62e731214454dc1d5e8194689465ecc41ee48acc700a700dc + source: + service_url: https://api.components.espressif.com/ + type: service + version: 2.0.2 espressif/mdns: component_hash: 3ec0af5f6bce310512e90f482388d21cc7c0e99668172d2f895356165fc6f7c5 source: @@ -22,6 +28,6 @@ dependencies: source: type: idf version: 5.3.0 -manifest_hash: 182b2719a9746e2efb089e041f2387b8dedb900344831b6f5b6ce215a485c67f +manifest_hash: 253b38bbacb90b7a58fb4e0a96c88ab21a32954ca3fb9d40351fb0e858008c75 target: esp32 version: 1.0.0 diff --git a/main/idf_component.yml b/main/idf_component.yml old mode 100755 new mode 100644 index ac10af3..66875aa --- a/main/idf_component.yml +++ b/main/idf_component.yml @@ -1,5 +1,6 @@ ## IDF Component Manager Manifest File dependencies: + espressif/esp-modbus: "*" espressif/mdns: "=*" espressif/ntc_driver: "^0.3.0" idf: