Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?
Вариантне даёт эффекта.Код:#pragma pack(arg)
Поддерживает ли компилятор макросов Конфигуратора СП3хх возможность задавать выравнивание для структур?
Если да, то как? Может быть есть информация какой компилятор используется в Конфигураторе?
Вариантне даёт эффекта.Код:#pragma pack(arg)
Просто интересно, а как вы структуру передаёте в панель?
Вообще то структуры используются в ПЛК , а в панель вам надо передать только готовые цифры для отображения, в нужные регистры с учётом выравнивания.
Максимум, что можно сделать, это передать в панель массив переменных одного типа, упакованные в String, опять же с учётом выравнивания.
Последний раз редактировалось kondor3000; 28.10.2021 в 11:18.
Я считываю телеметрию из ПЛК в панель и хочу записать её в структуру.
Поскольку готовые цифры для отображения нужно правильно интерпретировать.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Я не передаю в панель структуру. Я в панель читаю массив регистров из ПЛК и хочу интерпретировать этот кусок памяти как структуру
Последний раз редактировалось andemeno; 28.10.2021 в 12:16.
Вообще то, изначальный вопрос был про компилятор в панели и про возможность Задавать Компилятором, выравнивание структуры в панели.
В общем случае, структура может быть набита разными типами переменных в произвольном порядке. Отсюда и вопросы к ТС.
ЗЫ: Так и есть, на 2 стр. автор привёл в пример структуру из двух типов, WORD и REAL. И как ожидалось с выравниванием несвязуха.
Последний раз редактировалось kondor3000; 29.10.2021 в 14:10.
Представьте, что телеметрия от ПЛК состоит из 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 четный адрес
И читать в панели пришлось бы не 3, а 4 регистра и все попало бы куда нужно.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg