AVF (10.09.2017 13:04, просмотров: 490) ответил 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