Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > SCADA-системы и контроллеры стандарта IEC (МЭК) > Выравнивание параметров FB в CoDeSys 2.3 |
Автор: ama_kid 29.5.2015, 13:36 |
Добрый день. На форуме 3S мой аккаунт никак не могут подтвердить board-администраторы, а вопрос хотелось бы решить не методом костыля (как сейчас я сделал). Хотелось бы проконсультироваться с гуру CoDeSys 2.3, если они сюда заглядывают, т.к. в такие дебри еще не влезал. Пишу внешнюю библиотеку на Visual C++, объявил функциональный блок: ![]() При этом автоматически генерируется h-файл соответствующего блока для реализации с соответствующими объявлениями: ![]() Прошу обратить внимание на параметры F_Local1 (типа BOOL) и F_Reserv, о них пойдет разговор по сути. Итак, ситуация изначально следующая: параметра F_Reserv нет вообще (это есть "костыль"), есть только F_Local1 типа BOOL и остальные UDINT. При этом структура LIB_FUNCtyp имеет разный размер на стороне памяти ПЛК (в моем случае SP PLCWinNT v2.4) и в скомпилированном коде obj-файла. Sizeof(LIB_FUNCtyp) внутри C-кода имеет значение 24 (что, в общем-то правильно, учитывая 4-байтное выравнивание, выставленное в настройках), а на стороне ПЛК опытным путем было установлено, что она имеет размер в 21 байт, т.е. за первым параметром F_Local1 идет сразу второй F_Local2 без какого-либо выравнивания. Соответственно, всё чтение-запись в параметры FB идёт лесом, перепутывая байты и работая с неверными значениями. Поэтому мой костыль выглядит следующим образом: строка "F_Reserv : ARRAY[1..3] OF BOOL;" в библиотеке CoDeSys вставляется, но в сгенерированном h-файле строка "BOOL F_RESERV[3];" комментируется. После этого все отрабатывает корректно. В настройках Target'а не нашел вообще возможности выставлять выравнивание структур. Возможно, где-то в настройках какого-нибудь реального контроллера такая настройка и будет, но конкретно для SoftPLC её нет. Может я не там ищу? Как мне избавиться от необходимости декларировать костыль? |