программирование ПЛКуроки

Типы данных и переменные в проекте CoDeSys

Опубликовано
CoDeSys и ОВЕН

Мы продолжаем изучать программирование ПЛК ОВЕН в универсальной среде программирования CoDeSys. В этой публикации представлены типы данных и переменные в проекте CoDeSys, рассмотрены принципы объявления переменных проекта в CoDeSys. С предыдущей публикацией по программированию ПЛК, посвященной знакомству с общей структурой проекта в CoDeSys можно ознакомиться здесь.

Типы данных

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

Элементарные типы данных

1. Целочисленные переменные отличаются различным диапазоном сохраняемых данных и, естественно, различными требованиями к памяти. Подробно данные характеристики представлены в таблице ниже.

Тип
Нижний предел
Верхний предел
Размер, байты
BYTE
8 бит
1
WORD
16 бит
2
DWORD
32 бита
4
LWORD
64 бита
8
SINT
-128
127
1
INT
-32768
32767
2
DINT
-231
231-1
4
LINT
-263
263-1
8
USINT
0
255
1
UINT
0
65535
2
UDINT
0
232-1
4
ULINT
0
264-1
8

2. Логические переменные объявляются ключевым словом BOOL. Они могут принимать только значение логического нуля («0») FALSE (ЛОЖЬ) или логической единицы («1») TRUE (ИСТИНА). При начальной инициализации логическое значение по умолчанию — ЛОЖЬ. Занимает 8 бит памяти, если не задан прямой битовый адрес.

3. Переменные действительного типа (REAL и LREAL) представляют действительные числа в формате с плавающей точкой. Для типа REAL необходимо 32 бита памяти и 64 – для LREAL.
Диапазон значений REAL от: 1.175494351e-38F до 3.402823466e+38F
Диапазон значений LREAL от: 2.2250738585072014e-308 до 1.7976931348623158e+308

4. Время суток и дата типы переменных, выражающие время дня или дату, представляются в соответствии с ISO 8601.

Тип
Короткое обозначение
Начальное значение
Максимальное значение
DATE
D
1 января 1970 г.
6 февраля 2106 г.
TIME_OF_DAY
TOD
00:00:00
23:59:59.999
DATE_AND_TIME
DT
00:00:00 1 января 1970 г.
06:28:15 6 февраля 2106 г.

5. Интервал времени – переменные типа TIME. В отличие от времени суток (TIME_OF_DAY) временной интервал не ограничен максимальным значением в 24 часа. Числа, выражающие временной интервал, должны начинаться с ключевого слова TIME# (в сокращенной форме Т#). Максимальное значение для типа TIME: 49d17h2m47s295ms (4194967295 ms).

6. Тип строковых переменных (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.

Адреса

Прямое указание адреса дает способ непосредственного обращения к конкретной области памяти. Прямой адрес образуется из префикса “%”, префиксов области памяти и размера, одного или нескольких целых чисел, разделенных точкой.

Префиксы области памяти:

IВходы
QВыходы
MПамять данных

Префиксы размера:

XОдин бит
ОтсутствуетОдин бит
BБайт (8 бит)
WСлово (16 бит)
DДвойное слово (32 бит)

Примеры:

%QX7.5 и %Q7.5бит 7.5 в области выходов
%IW215215-е слово в области входов
%QB7байт 7 в области выходов
%MD48двойное слово в позиции памяти 48
%IW2.5.7.1зависит от конфигурации PLC

Распределение памяти

Образование прямых адресов зависит от размера адресуемых данных.

Так, например, адрес %MD48 адресует в области памяти двойное слово 48 или байты 192, 193, 194 и 195 (48 * 4 = 192). Нумерация начинается с 0.

Адрес %MX5.0 означает младший бит пятого (считая с нуля) слова памяти.


В этой статье мы познакомились с типами данных, используемыми в проекте, и принципами объявления переменных CoDeSys. При написании программы для ПЛК использование тех или иных операторов зависит от того, какой язык программирования используется в текущем программном компоненте. Поэтому, прежде чем приступить к изучению используемых операторов, на следующем уроке разберемся подробнее с языками программирования, с использованием которых можно писать программы в CoDeSys.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *