Определение массивов в Codesys

Я использую Codesys для создания массива.

Пример ниже - это то, что я использую для создания массива для 5 значений.

ARRAY [1..5] OF INT := [1,2,3,4,5];

Это нормально для массива из 5, но нужен ли мне массив для 100 значений?

Есть ли более быстрый способ создания массива для 100 значений вместо того, чтобы вводить каждое значение отдельно, как показано в примере ниже.

ARRAY [1..100] OF INT :=[1,2,3,4,5,6,7 to 100]

person darnbar    schedule 06.01.2016    source источник


Ответы (2)


Хорошо, если вы просто хотите сделать это до 100 элементов, и вы хотите, чтобы элементы массива продолжались, чтобы вы могли использовать этот код для инициализации вашего массива при первом сканировании ПЛК вместо инициализации в объявлении массива.

VAR
   SomeArray: ARRAY[1..100] OF INT;
   i:INT:=0;
   isInitialized:BOOL:=false;
END_VAR

IF NOT isInitialized THEN
    FOR i:=1 TO 100 BY 1 DO
         SomeArray[i]:=i;
    END_FOR;
    isInitialized:=TRUE;
END_IF;
person mrsargent    schedule 06.01.2016
comment
Спасибо за ваш ответ Mrsargent, который работает очарование. Я также рассматривал использование реальных чисел, таких как «(0.1,0.2,0.3)», в массиве. Есть ли способ реализовать это? - person darnbar; 06.01.2016
comment
Для реальных чисел вы можете просто настроить другой массив, но сделать тип реальным. Затем просто выполните RealArray[i]:=i*0.1; в цикле for. - person mrsargent; 06.01.2016
comment
Если бы вы нашли этот ответ полезным, вы бы сделали его общепринятым решением, чтобы помочь другим найти это решение, если у них возникнет аналогичная проблема? - person mrsargent; 06.01.2016
comment
Большое спасибо за вашу помощь, г-н Сарджент, это работает, для некоторых из сгенерированных реальных чисел я вижу, что некоторые значения отображаются как 1,30007. Я предполагаю, что это связано со временем сканирования ПЛК? - person darnbar; 06.01.2016
comment
@darnbar это не проблема времени сканирования ПЛК. Это проблема кода и то, как значение REAL преобразуется и рассчитывается. Попробуйте этот код. Не думайте, что у вас возникнет эта проблема. RealArray[i]:= INT_TO_REAL(i)/10.0; - person mrsargent; 06.01.2016

Вы можете использовать ()-сокращение, если хотите инициализировать массив или часть массива с одинаковыми значениями.

ARRAY [1..100] OF INT :=[4(1),3(2),2(3),4]; //Equivalent [1,1,1,1,2,2,2,3,3,4]

В Codesys V3 или TwinCat 3 вы можете использовать метод FB_init для написания кода инициализации. Методы FB_init всех объявленных экземпляров FB будут вызываться при запуске до начала обычного циклического выполнения задачи.

Вы можете использовать его следующим образом:

METHOD FB_Init : BOOL
VAR_INPUT
  bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
  bInCopyCode : BOOL;  // if TRUE, the instance afterwards gets moved into the copy code (online change)
END_VAR
VAR
  unCount : UINT;
END_VAR

FOR unCount := 1 TO 100 DO
   arrnInitExample[unCount]:= unCount;
END_FOR

Примечание. Первые два логических входа метода FB_init всегда должны быть одинаковыми. Но вы также можете добавить дополнительные входные переменные впоследствии. Затем вы можете передать пользовательские параметры при объявлении экземпляра FB в метод.

person Felix Keil    schedule 07.01.2016