Определение массивов в 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]
2 ответа
Хорошо, если вы просто хотите сделать это до 100 элементов и хотите, чтобы элементы массива продолжали работать, вы можете использовать этот код для инициализации массива при первом сканировании plc вместо инициализации в объявлении массива.
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;
Вы можете использовать ()-shorthand, если вы хотите инициализировать массив или часть массива с теми же значениями.
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 в метод.