Fórum

arrow_back

Descritor de parametros

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;
}


Este site usa cookies para melhorar sua experiência. Política de Privacidade