Создайте массив в CoDeSys с изменяемым размером

Я работаю над алгоритмом скользящего среднего для анализа значений датчика, и значения хранятся в массиве. НО, длина массива вариабла (зависит от скорости одного мотора).

как я могу создать массив в CoDeSys с изменяемым размером. Неправильно определять Array так:

Название: ARRAY[1...SpeedValue] OF INT ;


person user2791484    schedule 27.09.2016    source источник


Ответы (3)


Мне жаль сообщать вам, что в Codesys V2/V3 нет изменяемого размера массивов. Общее объяснение заключается в том, что в ПЛК отсутствует динамическое выделение памяти, поскольку динамическое выделение памяти считается слишком ненадежным.

Единственный вариант — определить массив с константой ARRAY[1..N_MAX_SPEED_VALUE] и просто использовать массив до SpeedValue.

VAR
    arrnValues          : ARRAY[1..N_MAX_SPEED_VALUE] OF INT;
END_VAR
VAR CONSTANT
    N_MAX_SPEED_VALUE   : INT := 100; (*Max Array Size*)
END_VAR

Лично меня очень раздражает это ограничение. Я уже много раз запрашивал функцию, чтобы определять массивы, такие как ARRAY[*], иметь ключевые слова для начала и конца и определять фактический начальный и конечный размер при создании экземпляра. Это не имеет ничего общего с динамическим выделением памяти, потому что размер определяется во время компиляции.

person Felix Keil    schedule 27.09.2016

Я бы порекомендовал вам следующий пост.

https://stefanhenneken.wordpress.com/2016/09/27/iec-61131-3-arrays-with-variable-length/

Стефан шаг за шагом описывает, что можно делать с массивами переменной длины.

Я бы не рекомендовал то, что предложил Феликс, потому что:

Во-первых: вы никогда не захотите иметь переменное время сканирования.

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

person Armando    schedule 29.11.2016
comment
Пожалуйста, не забудьте обобщить, что содержит пост, чтобы ответ по-прежнему был полезен, если ссылка неактивна / удалена. - person Steve Byrne; 29.11.2016

Динамический массив возможен с помощью указателей и операторов "__NEW", "__DELETE":

VAR
     arrnValues : POINTER TO INT;
     SpeedValue : UDINT;
END_VAR

SpeedValue := 100;
arrnValues := __NEW(INT, SpeedValue);
__DELETE(arrnValues);

Вы также должны активировать динамическое выделение памяти в свойствах приложения: Параметры сборки приложения

person Robert Klonek    schedule 09.04.2020