Все довольно примитивно: //! Тип для описания опрашиваемого регистра
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; }
}
}