Массивы дают очень большое преимущество именно в языке программирования ST. В других языках стандарта МЭК практически невозможно применить данный тип данных.
Мне помогало когда много различных параметров или датчиков, или механизмов. Удобно их упаковать в единый пакет, к которому нужно обращаться по мере необходимости.
Массивы я применял ещё для реализации красивой менюшки в визуализации Codesys 3.5.
Array (Массивы) — объявление
Попробуем объявить несколько переменных с различными простыми типами.
VAR
A : ARRAY[1..4] OF INT;
B : ARRAY[-10..20] OF BOOL;
C : ARRAY[1..c_MAX_GH] OF Temp;
D : ARRAY[Svetofor#green..Svetofor#red] OF BOOL;
END_VAR
VAR CONSTANT
c_MAX_GH: INT := 5;
END_VAR
Можно использовать целочисленные данные, можно булевые, можно флоаты, можно использовать структуры данных, получается целый арсенал.
Определять любое начало и конец индексации не обязательно с нуля или единицы, здесь могут быть и отрицательные числа. Допустимо использовать константы или структуры, как в случае с переменной С, или перечисления, как в случае с переменной D.
Например, [11..20] инициирует массив из 10 элементов, начиная с индекса 10.
Обратите внимание на переменную C. Берем определенную нами ранее структуру Temp и создаем массив. Допустим, что у вас много датчиков температур с дополнительными параметрами. Один модуль — это один датчик и один элемент массива типа Temp. Вы можете сделать алгоритм снятие показаний, обработка ошибок, задание фильтра и т.д, а затем, чтобы добавить управление новым параметром, нужно всего лишь добавить в массив новый элемент.
Массивы — главное
Массивы так же могут быть многомерными. Для объявления многомерного массива, назначаем индексы на второй уровень через запятую.
VAR
Temp : ARRAY [1..2, 1..3] OF REAL;
END_VAR
Temp[1, 2] := 25,5;
Temp[2, 3] := 100;
Сначала инициализируется массив с двумя элементами, с 1 по 2. Затем в
каждом инициированном элементе этого массива инициализируется другой
массив, с 1 до 3, cо значением типа REAL. По умолчанию стоит 0.0 для каждого элемента массива.
Представление этого массива после назначения в примере в
виде JSON было бы следующим:
[
[0.0, 25.5, 0.0],
[0.0, 0.0, 100]
]
Операции с ячейками массива:
// Чтение элемента одномерного массива
A := b[2];
// Чтение элемента многомерного массива
A := b[3, 4];
// Чтение свойств элемента определенной нами структуры в массиве
A := b[1].Temperature;
// Назначение элемента одномерного массива
b[2] := TRUE;
// Назначение элемента многомерного массива
b[3, 4] := TRUE;
Запись данных в массив
После объявления массива начинаем заполнять его данными, если это необходимо. В противном случае массив останется со «Штатными настройкаи».
Назначить данные в массив можно, как в коде программы, так и при инициализации. Приведу пример назначения элементов при инициализации массива.
Назначить всем 2-м элементам массива значение TRUE:
Pump : ARRAY [1..2] OF BOOL := [TRUE, TRUE]; [true, true]
Частичная инициализация. Можно назначить только первые элементы, и не
обязательно назначать все. Указанные элементы примут значение по
умолчанию.
Pump : ARRAY [1..5] OF BOOL := [TRUE, TRUE]; [true, true, false, false, false]
Групповые назначения. Например, нужно назначить первые 2 значения TRUE, а следующие 3 значения FALSE.
Pump : ARRAY [1..5] OF BOOL := [2(TRUE), 3(FALSE)]; [true, true, false, false, false]
Двумерный массив. Назначаем 2 значения на первый элемент массива и 2 на второй.
Ust_Temperature : ARRAY [1..2, 1..2] OF INT := [[20, 15], [17, 43]]; [
[20, 15],
[17, 43]
]
Многомерный массив с групповыми назначениями. В этом случае назначаем массив из значений от 1 до 10 на первые 5 элементов. Следующие 4 элемента будут 4 пятерки и 3 двойки. И последний элемент — все 10 двоек. Все, что не назначено, примет значение 0.
Pump : ARRAY [1..10, 1..10] OF INT := [
5([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),4(5(5),3(2)),
1(10(2))
]; [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[5, 5, 5, 5, 5, 2, 2, 2, 0, 0],
[5, 5, 5, 5, 5, 2, 2, 2, 0, 0],
[5, 5, 5, 5, 5, 2, 2, 2, 0, 0],
[5, 5, 5, 5, 5, 2, 2, 2, 0, 0],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
]
Для многомерных массивов удобно работать со структурами:
Datchik : ARRAY [1..2] OF Temp :=
(Temperature := 30, Avverage := 40),
(Temperature := 31, Avverage := 45);
[
{
Temperature : 30,
Avverage : 40,
},
{
Temperature : 31,
Avverage : 45,
}
]
Верхняя часть блока — это 1-ый элемент, нижняя — это 2-ой элемент.
На этом всё, если есть вопросы, пишите в комментах, чтобы каждый желающий мог ознакомиться с содержимым.
С уважением, Гридин Семен