Мы продолжаем изучать программирование ПЛК ОВЕН в универсальной среде программирования CoDeSys. В этой публикации представлены типы данных и переменные в проекте CoDeSys, рассмотрены принципы объявления переменных проекта в CoDeSys.
Типы данных
Программируемый логический контроллер способен работать с различными типами данных, которые определяют род информации, диапазон представления и множество допустимых операций. Типы данных МЭК разделяются на элементарные и пользовательские.
Элементарные типы данных
- Целочисленные переменные отличаются различным диапазоном сохраняемых данных и, естественно, различными требованиями к памяти. Подробно данные характеристики представлены в таблице ниже.
- Логические переменные объявляются ключевым словом BOOL. Они могут принимать только значение логического нуля («0») FALSE (ЛОЖЬ) или логической единицы («1») TRUE (ИСТИНА). При начальной инициализации логическое значение по умолчанию — ЛОЖЬ. Занимает 8 бит памяти, если не задан прямой битовый адрес.
- Переменные действительного типа (REAL и LREAL) представляют действительные числа в формате с плавающей точкой. Для типа REAL необходимо 32 бита памяти и 64 – для LREAL.
Диапазон значений REAL от: 1.175494351e-38F до 3.402823466e+38F
Диапазон значений LREAL от: 2.2250738585072014e-308 до 1.7976931348623158e+308
- Время суток и дата типы переменных, выражающие время дня или дату, представляются в соответствии с ISO 8601.
- Интервал времени – переменные типа TIME. В отличие от времени суток (TIME_OF_DAY) временной интервал не ограничен максимальным значением в 24 часа. Числа, выражающие временной интервал, должны начинаться с ключевого слова TIME# (в сокращенной форме Т#). Максимальное значение для типа TIME: 49d17h2m47s295ms (4194967295 ms).
- Тип строковых переменных (STRING) определяет переменные, содержащие текстовую информацию. Размер строки задается при объявлении. Если размер не указан, принимается размер по умолчанию – 80 символов. Размер задается в круглых или квадратных скобках.
Важно:
Длина строки не ограничена в CoDeSys, но библиотека работы со строками и строковые функции способны обращаться со строками от 1 до 255 символов!Пример объявления строки размером до 35 символов:
str:STRING(35) := ‘Просто строка’;
Пользовательские типы данных
Массивы
Массивы представляют собой множество однотипных элементов с произвольным доступом. Они могут быть одномерными или многомерными. Размерность массива и диапазоны индексов задаются при объявлении.
Синтаксис:
<Имя массива>:ARRAY [<li1>..<hi1>,<li2>..<hi2>,<li3>..<hi3> OF <тип элемента>;
где li1, li2, li3 указывают нижние пределы индексов; hi1, hi2 и hi3 – верхние пределы. Индексы должны быть целого типа и только положительные. Отрицательные индексы использовать нельзя.
Элементарные типы данных могут образовывать одно-, двух-, и трехмерные массивы. Путем вложения массивов можно получить многомерные массивы, но не более 9-мерных (“ARRAY[0..2] OF ARRAY[0..3] OF …”).
Пример:
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); (*сокращение для 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 *)
Для доступа к элементам двухмерного массива используется следующий синтаксис:
<Имя_массива>[Индекс1,Индекс2]
Пример: Card_game [9,2]
Структуры
Структуры предназначены для создания новых типов данных на основе элементов разных базовых типов. С переменной типа структура можно обращаться как с единым элементом, передавать в качестве параметра, создавать указатели, копировать и т. д.
Объявление структуры должно начинаться с ключевого слова STRUCT и заканчиваться END_STRUCT.
Синтаксис:
TYPE <имя_структуры>
STRUCT
<переменная_0> ,< переменная _1>, …< переменная _n>
END_STRUCT
END_TYPE
Пример объявления:
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
Перечисления
Перечисление позволяет определить несколько последовательных значений переменной и присвоить им наименования. Перечисление доступно в любой части проекта, даже при локальном его объявлении внутри POU. Поэтому наиболее разумно создавать все перечисления на вкладке типы данных (Data types) «Организатора Объектов» (Object Organizer). Объявление должно начинаться с ключевого слова TYPE и заканчиваться строкой END_TYPE.
Синтаксис:
TYPE <Имя_перечисления>:(<Элемент_0> ,< Элемент_1>, …< Элемент_n>); END_TYPE
Переменная типа <Имя_перечисления> может принимать только перечисленные значения. При инициализации переменная получает первое из списка значение. Если числовые значения элементов перечисления не указаны явно, им присваиваются последовательно возрастающие числа, начиная с 0. Фактически элемент перечисления – это число типа INT и работать с ними можно точно также. Можно напрямую присвоить число переменной типа перечисление.
Элемент, уже включенный в перечисление, нельзя повторно включать в другое перечисление.
Ограничение диапазона значений
Ограничение диапазона позволяет объявить переменную, значения которой ограничены в определенных пределах. Существует возможность создать в проекте новые типы данных с ограниченным диапазоном значений либо задать диапазон непосредственно при объявлении переменной.
Создание нового типа выглядит так:
TYPE < Имя > : < Целый тип > (<от>..<до>) END_TYPE;
< Имя> любой допустимый МЭК идентификатор;
<Целый тип> один из типов SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD);
<от> константа, определяющая начало диапазона значений включительно;
<до> константа, определяющая конец диапазона значений включительно.
Переменные
Среди элементов МЭК-языков есть переменные.
Каждая переменная обязательно имеет наименование и тип. Сущность переменной может быть различной: представлять вход или выход ПЛК, данные в оперативной или энергонезависимой памяти.
Переменные принято разделять на глобальные и локальные по области видимости.
Глобальные переменные определяются на уровне ресурсов проекта (VAR_GLOBAL) и доступны для всех программных компонентов проекта.
Локальные переменные описываются при объявлении компонента и доступны только внутри него.
Описание любого программного компонента содержит, как минимум, один раздел объявления локальных переменных VAR, переменных интерфейса VAR_INPUT, VAR_OUTPUT, VAR_IN_OUT и внешних глобальных переменных VAR_EXTERNAL.
Внимание:
Глобальная и локальная переменные могут иметь одинаковое имя. В POU, где объявлена такая локальная переменная, она оказывается «сильнее» одноименной глобальной. Использовать одноименные глобальные переменные нельзя (например, объявленные в конфигурации контроллера и в списке глобальных переменных).Имя переменной (идентификатор) не должно содержать пробелов и спецсимволов, не должно объявляться более одного раза и не должно совпадать с ключевыми словами. Регистр символов не учитывается, это означает, что VAR1, Var1 и var1 – это одна и та же переменная.
Символ подчеркивания является значимым, т.е. “A_BCD” и “AB_CD” – это разные имена.
Имя должно включать не более одного символа подчеркивания. Ограничений на длину имени нет. Область применения переменной задается ее типом. Список всех объявленных переменных в CoDeSys
доступен через ассистент ввода (Input Assistant).
Системные флаги
Системные флаги – это неявно объявленные переменные, различные для конкретных моделей PLC. Для получения списка доступных системных флагов используйте команду “Insert” “Operand”. В диалоге ассистента ввода (Input Assistant) флаги собраны в разделе System Variable.
Синтаксис доступа к элементам массивов, структур и POU
Элемент двумерного массива:
<ИмяМассива>[Индекс1, Индекс2]
Переменная структуры:
<ИмяСтруктуры>.<ИмяПеременной>
Переменная программы или функционального блока:
<ИмяФункциональногоБлока>.<ИмяПеременной>
Доступ к битам в переменных
В целочисленных переменных существует возможность обращаться к отдельным битам. Для этого указывается номер бита, начиная с 0 через точку после имени.
a : INT;
b : BOOL;
…
a.2 := b;
В примере значение третьего бита переменной a будет присвоено переменной b.
Если указанный номер бита превышает размер типа, формируется специальное сообщение: «Index ‘<n>’ outside the valid range for variable ‘<var>‘»
Битовая адресация применима для типов: SINT, INT, DINT, USINT, UINT, UDINT, BYTE, WORD, DWORD.
Битовую адресацию нельзя использовать с переменными VAR_IN_OUT.
Битовая адресация через глобальные константы
Если объявить целую глобальную константу, то ее можно будет затем использовать для доступа к битам.
Например, так:
Объявление константы
VAR_CONSTANT GLOBAL
enable: int := 1;
END_VAR
Пример 1, битовая адресация через константу:
Объявление POU:
VAR
xxx: int;
END_VAR
Битовая адресация:
xxx.enable := true; (*установлен в единицу второй бит переменной xxx *)
Пример 2, битовая адресация к элементу структуры:
Объявление структуры stru1:
TYPE stru1 :
STRUCT
bvar: BOOL;
rvar: REAL;
wvar: WORD;
{bitaccess: ‘enable’ 42 ‘Start drive’}
END_STRUCT
END_TYPE
Объявление POU:
VAR
x:stru1;
END_VAR
Битовая адресация:
x.enable := true;
Эта инструкция установит 42-й бит переменной x. Поскольку bvar занимает 8 бит, rvar занимает 32 бита, а битовый доступ обращается ко второму биту переменной wvar, получающей в результате значение 4.
Адреса
Прямое указание адреса дает способ непосредственного обращения к конкретной области памяти. Прямой адрес образуется из префикса “%”, префиксов области памяти и размера, одного или нескольких целых чисел, разделенных точкой.
Префиксы области памяти:
Распределение памяти
Образование прямых адресов зависит от размера адресуемых данных.
Так, например, адрес %MD48 адресует в области памяти двойное слово 48 или байты 192, 193, 194 и 195 (48 * 4 = 192). Нумерация начинается с 0.
Адрес %MX5.0 означает младший бит пятого (считая с нуля) слова памяти.
В этой статье мы познакомились с типами данных, используемыми в проекте, и принципами объявления переменных CoDeSys. При написании программы для ПЛК использование тех или иных операторов зависит от того, какой язык программирования используется в текущем программном компоненте. Поэтому, прежде чем приступить к изучению используемых операторов, на следующем уроке разберемся подробнее с языками программирования, с использованием которых можно писать программы в CoDeSys.
Источник: https://www.sdt42.ru/типы-данных-и-переменные-в-проекте-codesys/