Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?
Вариантне даёт эффекта.Код:#pragma pack(arg)
Вид для печати
Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?
Вариантне даёт эффекта.Код:#pragma pack(arg)
Просто интересно, а как вы структуру передаёте в панель?
Вообще то структуры используются в ПЛК , а в панель вам надо передать только готовые цифры для отображения, в нужные регистры с учётом выравнивания.
Максимум, что можно сделать, это передать в панель массив переменных одного типа, упакованные в String, опять же с учётом выравнивания.
Я считываю телеметрию из ПЛК в панель и хочу записать её в структуру.
Поскольку готовые цифры для отображения нужно правильно интерпретировать.
Я не передаю в панель структуру. Я в панель читаю массив регистров из ПЛК и хочу интерпретировать этот кусок памяти как структуру
Вообще то, изначальный вопрос был про компилятор в панели и про возможность Задавать Компилятором, выравнивание структуры в панели.
В общем случае, структура может быть набита разными типами переменных в произвольном порядке. Отсюда и вопросы к ТС.
ЗЫ: Так и есть, на 2 стр. автор привёл в пример структуру из двух типов, WORD и REAL. И как ожидалось с выравниванием несвязуха.
Представьте, что телеметрия от ПЛК состоит из 3 регистров.
Я читаю эти регистры в массив:
Дальше я хочу скопировать этот массив в следующую структуру:Код:const int plctm_regs_count = 3;
const WORD plctm_addr = 0;
static WORD plctm_regs[plctm_regs_count];
Reads(PLC, slave_id, MODBUS_RTU_REGS_3X, plctm_addr, plctm_regs_count, &plctm_regs);
Но этот код не работает так, как ожидается, потому что для компилятора структура выглядит так:Код:typedef struct plctm_telemetry_ {
WORD reg;
float real;
} plctm_telemetry_t;
plc_telemetry_t plctm;
memcpy(&plctm, plctm_regs, sizeof(plctm_regs));
и при копировании второй регистр телеметрии попадёт в reg_subКод:typedef struct plctm_telemetry_ {
WORD reg;
WORD reg_stub; // компилятор добавил это для 4-ехбайтного выравнивания
float real;
} plctm_telemetry_t;
А задать выравнивание для структуры, как выяснилось, возможности нет
Контроллер не ОВЕН?
Потому, что кодесис выравнял бы автоматом и сделал бы для real четный адрес
https://owen.ru/forum/attachment.php...5&d=1395648726
И читать в панели пришлось бы не 3, а 4 регистра и все попало бы куда нужно.