0

Сложные типы данных CoDeSys

Массивы

Элементарные типы данных могут образовывать одно-, двух-, и трехмерные массивы. Массивы  могут быть объявлены в разделе объявлений POU или в списке глобальных переменных. Путем вложения массивов можно получить многомерные массивы, но не более 9 мерных ( «ARRAY[0..2] OF ARRAY[0..3] OF …» ).

Синтаксис:

<Имя_массива>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>] OF <базовый тип>.

где ll1, ll2, ll3 указывают нижний предел индексов; ul1, ul2 и ul3 указывают верхние пределы.

Индексы должны быть целого типа. Нельзя использовать отрицательные индексы.

Пример:

Card_game: ARRAY [1..13, 1..4] OF INT;

Пример инициализации простых массивов:

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

arr2 : ARRAY [1..2,3..4] OF INT := 1,3(7); (* сокращение для 1,7,7,7 *)

arr3 : ARRAY [1..2,2..3,3..4] OF INT := 2(0),4(4),2,3;

(* сокращение для 0,0,4,4,4,4,2,3 *)

Пример инициализации массива структур:

TYPE STRUCT1

STRUCT

p1:int;

p2:int;

p3:dword;

END_STRUCT

ARRAY[1..3] OF STRUCT1:= (p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),
(p1:=14,p2:=5,p3:=112);

Пример инициализации части массива:

arr1 : ARRAY [1..10] OF INT := 1,2;

Не инициализированные явно элементы массива принимают значения по умолчанию. Так, в данном примере оставшиеся элементы примут значение 0.

Доступ к элементам массива:

Для доступа к элементам двухмерного массива используется следующий синтаксис:

<Имя_массива>[Индекс1,Индекс2]

Пример:

Card_game [9,2]

Функция CheckBounds

Определив в проекте функцию с именем CheckBounds, вы сможете использовать её для контроля за соблюдением границ индексов массивов. Имя функции фиксировано, изменять его нельзя.

Пример функции CheckBounds:

FUNCTION CheckBounds : INT
VAR_INPUT
index, lower, upper: INT;
END_VAR

IF  index < lower THEN
CheckBounds := lower;
ELSIF  index > upper THEN
CheckBounds := upper;
ELSE  CheckBounds := index;
END_IF

В этом примере CheckBounds ограничивает индекс массива заданными границами. Если запрашивается элемент, отсутствующий в массиве, функция  CheckBounds возвращает ближайший элемент.

Проверка работы функции CheckBounds:

PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b: INT:=10;
END_VAR

a[b]:=TRUE;

Указатели

Указатели позволяют работать с адресами переменных или функциональных блоков.

Синтаксис:

<Имя_указателя>: POINTER TO <Тип данных/Функциональный блок>;

Указатели применимы для всех базовых типов данных или функциональных блоков, включая  определяемые пользователем.

Адреса переменных и функциональных блоков можно получить во время исполнения программы при помощи оператора ADR. Для обращения через указатель необходимо добавить оператор «^»  (content) после его имени.

Обратите внимание: Указатели инкрементируются побайтно! Для увеличения указателя, как это принято в C-компиляторах, используйте инструкцию p=p+SIZEOF(p^);.

Пример:

pt:POINTER TO INT;

var_int1:INT := 5;

var_int2:INT;

pt := ADR(var_int1);

var_int2:= pt^;  (* var_int2 теперь равна 5 *)

Функция CheckPointer:

Данная функция позволяет контролировать обращение к допустимой области памяти через указатели. Если определена функция CheckPointer, то она будет автоматически вызываться при любом обращении через указатель. Функция должна быть определена в проекте (непосредственно или в библиотеке). Ее имя (CheckPointer) изменять нельзя.  Функция имеет следующие параметры:

Для систем с 32-х битными указателями:

FUNCTION CheckPointer : DWORD

VAR_INPUT

dwAddress : DWORD;

iSize : INT;

bWrite: BOOL;

END_VAR

Для систем с 16-и битными указателями:

FUNCTION CheckPointer : WORD

VAR_INPUT

dwAddress : WORD;

iSize : INT;

bWrite: BOOL;

END_VAR

Функция возвращает адрес, который будет использоваться как указатель. Если все хорошо то, это будет входной параметр — dwAddress.

Перечисление

Перечисление — это определяемый пользователем тип данных, задающий несколько строковых псевдонимов для числовых констант.

Перечисление доступно в любой части проекта, даже при локальном его объявлении внутри POU. Поэтому наиболее разумно создавать все перечисления на вкладке Типы данных Организатора Объектов. Объявление должно начинаться с ключевого слова TYPE и заканчиваться строкой END_TYPE.

Синтаксис:

TYPE <Имя_перечисления>:(<Элемент_0> ,< Элемент _1>, …< Элемент _n>);END_TYPE

Переменная типа  <Имя_перечисления> может принимать только перечисленные значения. При инициализации переменная получает первое из списка значение. Если числовые значения элементов перечисления не указаны явно, им присваиваются последовательно возрастающие числа, начиная с 0. Фактически элемент перечисления — это число типа INT и работать с ними можно точно так же. Можно напрямую присвоить число переменной типа перечисление.

Пример:

TYPE TRAFFIC_SIGNAL: (Red, Yellow, Green:=10); (*Каждому цвету

соответствует свое значение, для red — это 0, для yellow — 1 и для green — 10 *)

END_TYPE

TRAFFIC_SIGNAL1 : TRAFFIC_SIGNAL;

TRAFFIC_SIGNAL1:=0; (* Переменная получила значение red*)

FOR i:= Red TO Green DO

i := i + 1;

END_FOR;

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

Пример:

TRAFFIC_SIGNAL: (red, yellow, green);

COLOR: (blue, white, red);

Ошибка: попытка повторного использования элемента TRAFFIC_SIGNAL red  в COLOR.

Структуры

Структуры создаются на вкладке Типы данных Организатора Объектов. Объявление должно начинаться с ключевых слов TYPE и STRUCT и заканчиваться строками END_STRUCT и END_TYPE.

Синтаксис:

TYPE <Имя _структуры>:

STRUCT

<Объявление переменной 1>

.

.

<Объявление переменной n>

END_STRUCT

END_TYPE

<Имя _структуры> образует новый тип данных, который может быть использован в любой части проекта наряду с базовыми типами.

Вложенные структуры допускаются. Единственное ограничение заключается в запрете размещения элементов структуры по прямым адресам (AT объявления недопустимы!).

Пример объявления структуры по имени Polygonline:

TYPE Polygonline:

STRUCT

Start:ARRAY [1..2] OF INT;

Point1:ARRAY [1..2] OF INT;

Point2:ARRAY [1..2] OF INT;

Point3:ARRAY [1..2] OF INT;

Point4:ARRAY [1..2] OF INT;

End:ARRAY [1..2] OF INT;

END_STRUCT

END_TYPE

Пример инициализации структуры:

Poly_1:polygonline := ( Start:=3,3, Point1 =5,2, Point2:=7,3, Point3:=8,5, Point4:=5,7, End := 3,5);

Для доступа к элементам структуры используется следующий синтаксис:

<Имя_структуры>.<Имя_компонента>

Например, структура «Week» содержит компонент «Monday», обращение к которому будет выглядеть так:

Week.Monday

Псевдонимы типов

Псевдонимы типов нужны для создания альтернативных пользовательских наименований типов данных. Это удобно при работе с большим числом однотипных констант, переменных и функциональных блоков.

Псевдонимы типов определены на вкладке Типы данных Организатора Объектов. Объявление должно начинаться с ключевого слова TYPE и заканчиваться строкой  END_TYPE.

Синтаксис:

TYPE <Имя псевдонима>: <Исходное имя>;
END_TYPE

Пример:

TYPE message:STRING[50];

END_TYPE;

Ограничение диапазона значений

Ограничение диапазона позволяет объявить переменную, значения которой ограничены в определенных пределах. Существует возможность создать в проекте новые типы данных с ограниченным диапазоном значений либо задать диапазон непосредственно при объявлении переменной.

Создание нового типа выглядит так:

TYPE < Имя > : < Целый тип > (<от>..<до>) END_TYPE;

<Имя> любой допустимый МЭК идентификатор,
<IЦелый тип> один из типов SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD,DWORD (LINT, ULINT, LWORD).
<от> константа, определяющая начало диапазона значений включительно
<до> константа, определяющая конец диапазона значений включительно.

Пример:

TYPE

SubInt : INT (-4095..4095);

END_TYPE

Ограничение диапазона при объявлении переменной:

i : INT (-4095..4095);

ui : UINT (0..10000);

END_VAR

При попытке присвоить переменной с ограниченным диапазоном константы, не попадающей в заданный диапазон (например i := 5000;) CoDeSys даст сообщение об ошибке.

Для контроля значений «ограниченных» переменных в процессе исполнения, применяются функции CheckRangeSigned или CheckRangeUnsigned. Они позволяют обрабатывать ошибки произвольным образом. Например, ограничить присваиваемое значение или сформировать флаги ошибки. Первая функция работает для переменных со знаком, вторая для переменных без знака (unsigned). Изменять идентификаторы этих функций нельзя.

Пример:

Здесь применяется функция CheckRangeSigned, контролирующая переменные со знаком (как, например, объявленная выше i). Функция «обрезает» присваиваемые значения по границам диапазона.

FUNCTION CheckRangeSigned : DINT

VAR_INPUT

value, lower, upper: DINT;

END_VAR

IF (value < lower) THEN

CheckRangeSigned := lower;

ELSIF(value > upper) THEN

CheckRangeSigned := upper;

ELSE

CheckRangeSigned := value;

END_IF

Функция вызывается автоматически при соответствующих операциях присваивания. Она получает три параметра: присваиваемое значение (value) и обе границы диапазона (lower, upper). Фактически присваивается возвращаемое CheckRangeSigned значение.

Например, при присваивании i:=10*y происходит неявный вызов:

i := CheckRangeSigned(10*y, -4095, 4095);

В результате, даже если y > 1000, i не получит значение более 4095.

Аналогично объявляется и функция CheckRangeUnsigned:

FUNCTION CheckRangeUnsigned : UDINT

VAR_INPUT

value, lower, upper: UDINT;

END_VAR

Важно: Если функции CheckRangeSigned или CheckRangeUnsigned не включены в проект, ограничение границ диапазонов во время исполнения работать не будет.

Внимание: Функции CheckRange…, содержащащиеся в библиотеке Check.Lib представляют собой пример реализации. Прежде чем использовать эту библиотеку, убедитесь, что данные функции работает  так, как нужно в вашем случае, либо создайте собственные функции непосредственно в вашем проекте.

Пример. Переменная ui не превысит 10000, и цикл FOR никогда не закончится:
VAR
ui : UINT (0..10000);
END_VAR

FOR ui:=0 TO 10000 DO

END_FOR

Раздел: CoDeSys. Теория. Метки: ,

Оставить комментарий

Отправить сообщение

CoDeSys GSM/GPRS модем Lectus OPC MasterSCADA Modbus MX110 Omron OPC-сервер owen OWEN Easy Logic owen logic PLC Configuration PROFIBUS s-200 SCADA scada системы siemens siemens plc SIMATIC Simplight SMS step7 TRACE MODE Динамизация ИП-320 ОВЕН ОВЕН ПЛК ОВЕН ПЧВ ПЛК ПЛК ОВЕН ПР 110 Панель оператора Программируемое реле Частотный преобразователь библиотека в CoDeSys визуализация диспетчеризация конфигурация панели программирование ПЛК серия NS сименс плк частотник частотное управление язык CFC язык ST
.