JOAO ARTUR CERESOLI
18/07/2022 10:17:01
Olá, estou desenvolvendo uma soluçao para internet das coisas utilizando leitura de sensores ModBus, ja consigo comunicar com os sensores e tudo mais, tambem ja tenho uma comunicaçao mqtt funcional e consigo salvar parametros que recebo via mqtt na memoria nvs e na proxima inicialização iniciar por ela.
A questao é que eu gostaria de poder receber os endereços dos sensores Modbus via mqtt na primeira inicializaçao do meu esp32, porem, utilizando a estrutura com CID isso nao me parece possivel, visto que os endereços modbus sao constantes, gostaria de saber se existe uma forma de fazer isso.
FERNANDO SIMPLICIO DE SOUSA
20/07/2022 11:20:38
Olá,
Você precisa manipular a variável que contém o CID em RAM. Segue um exemplo que escrevi no DEVC++
#include #include #include #include /** * @brief Characteristics descriptor type is used to describe characteristic and * link it with Modbus parameters that reflect its data. */ typedef struct { uint16_t cid; /*!< Characteristic cid */ const char* param_key; /*!< The key (name) of the parameter */ const char* param_units; /*!< The physical units of the parameter */ uint8_t mb_slave_addr; /*!< Slave address of device in the Modbus segment */ //... } mb_parameter_descriptor_t; //Global mb_parameter_descriptor_t device_parameters[1]; void cid_config(uint16_t cid_value, const char * str_name, const char * str_units, uint8_t slave_addr) { uint16_t num_device_parameters; mb_parameter_descriptor_t device_parameters_aux[] = { { .cid = cid_value, //CID .param_key = str_name, //Param Name .param_units = str_units, //Units .mb_slave_addr = slave_addr, //Modbus Slave Addr /* MB_PARAM_HOLDING, //Modbus Reg Type 0, //Reg Start 2, //Reg Size HOLD_OFFSET(holding_data0), //Instance Offset PARAM_TYPE_U16, //Data Type 2, //Data Size OPTS( 0, 100, 1 ), //Parameter Options. MIN-MAX-STEP ou OPT1-OPT2-OPT3. Atenção: tipos definidos como int; PAR_PERMS_WRITE_TRIGGER //PAR_PERMS_READ_WRITE_TRIGGER//Access Mode */ }, }; //copia a variável local na global pois a variável será usada pelo stack modbus; memcpy(&device_parameters, &device_parameters_aux, sizeof(device_parameters_aux)); num_device_parameters = (sizeof(device_parameters)/sizeof(device_parameters[0])); //Salva o novo descritor no master; //err = mbc_master_set_descriptor(&device_parameters[0], num_device_parameters); } int main(void) { char str_name[] = "Temperatura"; char str_unit[] = "%"; uint16_t cid_value = 0; uint8_t slave_addr = 0; cid_config(cid_value, str_name, str_unit, slave_addr); return 0; }