ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
23 декабря
779319 Топик полностью
AVF (10.09.2017 13:04, просмотров: 501) ответил AlexG на Я обычно группирую данные по логической связанности +из-за особенностей ПО устройства некоторые данные могут идти только в определенной последовательности (например, массивы структур из памяти МК отображаемые на регистры Modbus). Оставляю между
делаю массив указателей на параметры, т.е. если спрашивают регистр Х, то в массиве по адресу Х лежит указатель на нужную переменную, получается дикий оверхед по флэши - 4 байта на каждый параметр, но сильно упрощает все остальное. Делаю в виде файлика modbus_cfg.h примерно такого содержания #ifndef MODBUS_CONF_H #define MODBUS_CONF_H #define NUM_REG_INPDISCRETE 1 #define NUM_REG_COILS 1 #define NUM_COILS 4 #define NUM_REG_INPUT_16 16 #define NUM_REG_INPUT_32 16 #define NUM_REG_INPUT_FLOAT 260 #define NUM_REG_HOLDING_16 16 #define NUM_REG_HOLDING_32 16 #define NUM_REG_HOLDING_FLOAT 16 #define APPADR_INPDISCRETE 0x0000 #define APPADR_COILS 0x0000 #define APPADR_INPUT_16 0x0000 #define APPADR_INPUT_32 0x1000 #define APPADR_INPUT_FLOAT 0x2000 #define APPADR_HOLDING_16 0x0000 #define APPADR_HOLDING_32 0x1000 #define APPADR_HOLDING_FLOAT 0x2000 extern EECONFIG eeCfg; uint16_t * pRegHolding16[NUM_REG_HOLDING_16] = { (uint16_t *)&eeCfg.eeModbusSlaveAdr, (uint16_t *)&eeCfg.eeModbusSpeed_x10, 0 // указатель на последний регистр обязательно 0, чтобы остановить считывание }; uint16_t * pRegInputFloat[NUM_REG_INPUT_FLOAT] = { // flow1 (uint16_t *)&conc[0].result[0], (uint16_t *)&conc[0].result[0] + 1, 0 } #endif