ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Четверг
2 декабря
/1146409
Топик полностью
AlexG (17.11.2021 15:24, просмотров: 218) ответил IBAH на Вах! а структура данных какая? Создается статически или динамически, если динамически то как? "связанные списки"?
Все довольно примитивно: 
//! Тип для описания опрашиваемого регистра
typedef struct
{
	uint8_t   node_id;   //!< адрес слейва
	uint16_t  address ;  //!< адрес регистра
	uint8_t  functions; //!< поддреживаемые функции протокола
	uint16_t  data;      //!< текущие данные

	uint32_t timestamp; //!< метка времени получения данных из девайса

	struct
	{
		uint8_t need_wr: 1;
		uint8_t need_rd: 1;
		uint8_t dir_wr: 1;
		uint8_t dir_rd: 1;
	};

} register_desc_t;

#define MX_REG 125

register_desc_t register_map[MX_REG];//!< карта регистров мастера, заполняется в конструкторе мастера исходя из уставок

//!< Конструктор. Инициализирует объект и связывает его с выбранным последовательным портом modbus_master::modbus_master(HAL_Com* Com) { comport=Com; comport->assign_protocol(this); // заполняем карту регистров мастера for(uint8_t r=0; r<MX_REG; r++) { if (ust.device_reg_cfg[r].device == 0) { register_map[r].node_id = 0; } // запросы к собственным регистрам else { register_map[r].node_id = ust.slave_device_cfg[ust.device_reg_cfg[r].device-1].node_id; } register_map[r].address = ust.device_reg_cfg[r].reg_adr-1; // переводим адрес из логического в физический if (ust.device_reg_cfg[r].device && (ust.slave_device_cfg[ust.device_reg_cfg[r].device-1].func_bm!=0)) { if (ust.device_reg_cfg[r].rw & BIT(0)) { register_map[r].dir_rd=1; register_map[r].need_rd=1; } if (ust.device_reg_cfg[r].rw & BIT(1)) { register_map[r].dir_wr=1; register_map[r].need_wr=0; } register_map[r].functions = ust.slave_device_cfg[ust.device_reg_cfg[r].device-1].func_bm; } else { register_map[r].functions = 0; } } }
Ответить
Ответы