Необходимо оптимизировать код (Уменьшить размер) CODESYS ST (TwinCat 2) для экономии памяти

Размер кода (CODESYS ST, TwinCat 2) для ПЛК beckhoff BC9000 (макс. 64 КБ) следует уменьшить до минимума:

var

word_CO2: word;

(код пропущен)

Нужно уменьшить размер этого кода:

MEMCPY(ADR(word_CO2),ADR(ReceiveBuffer[3]),1);

MEMCPY(ADR(word_CO2)+1,ADR(ReceiveBuffer[2]),1);


person Andrey Andreev    schedule 18.01.2021    source источник
comment
Извините, а в чем вопрос?   -  person Jakob    schedule 18.01.2021
comment
Уменьшите размер этого кода: MEMCPY(ADR(word_CO2),ADR(ReceiveBuffer[3]),1); MEMCPY(ADR(word_CO2)+1,ADR(ReceiveBuffer[2]),1);   -  person Andrey Andreev    schedule 18.01.2021
comment
Так я правильно это понимаю? Вы пытаетесь загрузить программу на свой ПЛК, но у вас не хватает памяти? Если да, то происходит ли это, когда вы пытаетесь загрузить программу в ПЛК или запускаете программу во время выполнения?   -  person Guiorgy    schedule 18.01.2021
comment
Я могу успешно скомпилировать код, если его размер меньше 64 КБ. Мне нужно увеличить код, но я получаю ограничение в 64 КБ. В моем коде много команд MEMCPY(), когда я получаю число (INT/WORD) из 2-х элементов массива. Если я смогу оптимизировать эти строки, я смогу переписать код и получить еще несколько КБ для нового кода.   -  person Andrey Andreev    schedule 18.01.2021
comment
Я не думаю, что MEMCPY связан с вашей ошибкой. Как вы думаете, почему именно эта часть кода?   -  person Sergey Romanov    schedule 19.01.2021


Ответы (2)


Чтобы уменьшить размер кода в CoDeSys 2.3, сделайте следующее:

  1. Перейдите в «Проект» -> «Параметры» -> «Сборка».
  2. Выберите «Заменить константы».
  3. Выберите «Исключить объекты»… и начните исключать неактивные FB и FUN в системных библиотеках один за другим.
  4. Выполните команды «Очистить все» и «Перестроить все», если вы не уверены в том, что исключаете. Также выполняйте их регулярно между ними.

Если вышеперечисленное не помогает, ваш код нуждается в пересмотре и оптимизации. Вообще говоря, старайтесь избегать множественных операторов IF...ELSIF, вместо этого используйте операторы MUX и SEL и (немного) логику CASE. Также помогает переключение на арифметику POINTER и сжатие данных в МАССИВЫ. Используйте битовый доступ к переменным BYTE, WORD и DWORD вместо переменных BOOL.

person Alexey Kuleshov    schedule 21.01.2021
comment
Хорошие идеи! А также по возможности используйте VAR_IN_OUT везде (функции, функциональные блоки и т.д.). Таким образом, новые переменные не выделяются. - person Quirzo; 21.01.2021
comment
@Quirzo, разве указатели тоже не занимают место? POINTER хранятся как __XWORD (4 байта на 32-битном ПЛК и 8 байт на 64-битном ПЛК), или я ошибаюсь? - person Guiorgy; 21.01.2021
comment
Вот так. Таким образом, нет смысла использовать указатель вместо INT и т. д. Однако, если у вас есть строки или структуры, вы можете сэкономить место, используя указатели, ссылки и IN_OUT. - person Quirzo; 21.01.2021
comment
@Quirzo, Верно, и именно поэтому я бы не использовал POINTERS/REFERENCE везде, а в основном со структурами. Кроме того, Function Blocks используют много места (оба кодируют память), поэтому я бы избегал их в пользу структур и функций. - person Guiorgy; 21.01.2021

MEMCPY уже является оптимизированной библиотечной функцией (т. е. она вызывает функцию, а не «встроенный код»). Я не вижу, как вы собираетесь оптимизировать это больше, чем сейчас. Ваш код нуждается либо в некоторой реструктуризации, чтобы уменьшить повторяющийся код в других местах, уменьшить количество используемых переменных памяти, либо в более качественном аппаратном обеспечении. 64 КБ в настоящее время довольно мало. Контроллеры PLCopen, с которыми я работаю, имеют 4 МБ с 64 КБ только для сохранения данных...

Возможно, переработайте свой вопрос, как вы видели в комментариях, читатели действительно не совсем понимают, почему вы предположили, что MEMCPY - ваш нарушитель спокойствия....

person Scott    schedule 18.01.2021