Руководство пользователя по программированию плк в CoDeSys 3
Скачать 5.57 Mb.
|
WORD, DINT, UDINT, DWORD, REAL, LREAL. Тип нужно указывать заглавными буквами. Пример: var1:=DINT#34; Если значение константы не соответствует требуемому типу, CoDeSys выдаст соответствующее сообщение об ошибке. Переменные Переменные могут быть объявлены либо как локальные в разделе определений POU, либо как глобальные - в списке глобальных переменных. Внимание: Глобальная и локальная переменные могут иметь одинаковое имя. В 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; Приложение В: Операнды в CoDeSys CoDeSys V2.3 10-30 В примере значение третьего бита переменной a будет присвоено переменной b. Если указанный номер бита превышает размер типа, формируется специальное сообщение: «Index ' Битовая адресация применима для типов :SINT, INT, DINT, USINT, UINT, UDINT, BYTE, WORD, DWORD. Если битовая адресация для данного типа не поддерживается, CoDeSys формирует сообщение: «Invalid data type ' Битовую адресацию нельзя использовать с переменными 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. Приложение В: Операнды в CoDeSys CoDeSys V2.3 10-31 Внимание: Для правильного отображения переменной, выполняющей битовый доступ к структурам через глобальную константу, в Ассистенте ввода при мониторинге в окне объявления и при использо- вании интеллектуального ввода используйте команду компилятора pragma {bitaccess}. В этом случае, кроме значения переменной, вы увидите и значение данного бита: Адреса Прямое указание адреса дает способ непосредственного обращения к конкретной области памяти. Прямой адрес образуется из префикса "%", префиксов области памяти и размера, одного или не- скольких целых чисел, разделенных точкой. Префиксы области памяти: I Входы Q Выходы M Память данных Префиксы размера: X Один бит Отсутствует Один бит B Байт (8 бит) W Слово (16 бит) D Двойное слово (32 бит) Примеры: %QX7.5 и %Q7.5 бит 7.5 в области выходов %IW215 215е слово в области входов %QB7 байт 7 в области выходов %MD48 двойное слово в позиции памяти 48 %IW2.5.7.1 зависит от конфигурации PLC Является ли последний указанный адрес значимым, будет определяться конкретной конфигураци- ей PLC. Примечание: По умолчанию логические переменные занимают один байт, если в объявлении не указан пря- мой битовый адрес. См. также битовые операции в приложении A. Приложение В: Операнды в CoDeSys CoDeSys V2.3 10-32 Распределение памяти Образование прямых адресов зависит от размера адресуемых данных. Так, например, адрес %MD48 адресует в области памяти двойное слово 48 или байты 192, 193, 194 и 195 (48 * 4 = 192). Нумерация начинается с 0. Адрес %MX5.0 означает младший бит пятого (считая с нуля) слова памяти. Функции в роли операндов В языке ST результат вызова функции может использоваться как операнд. Пример: Result := Fct(7) + 3; Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-33 Приложение С: Типы данных CoDeSys Тип данных определяет род информации и методы ее обработки и хранения, количество выделяемой па- мяти. Программист может непосредственно использовать элементарные (базовые) типы данных или соз- давать собственные (пользовательские) типы на их основе. Элементарные типы данных Логический (BOOL) BOOL логический тип данных. Переменная может принимать 2 значения ИСТИНА (TRUE) или ЛОЖЬ (FALSE). Занимает 8 бит памяти, если не задан прямой битовый адрес (См. «10.12 Ареса»). Целочисленные BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, и UDINT - все это целочисленные типы. Они отличаются различным диапазоном сохраняемых данных и, естественно, различными требованиями к памяти. Подробно данные характеристики представлены в следующей таблице: Тип Нижний предел Верхний предел Размер памяти BYTE 0 255 8 Бит WORD 0 65535 16 Бит DWORD 0 4294967295 32 Бит SINT -128 127 8 Бит USINT 0 255 8 Бит INT -32768 32767 16 Бит UINT 0 65535 16 Бит DINT -2147483648 2147483647 32 Бит UDINT 0 4294967295 32 Бит Очевидно, присвоение данных большего типа переменной меньшего типа может приводить к потере ин- формации. Рациональные REAL и LREAL данные в формате с плавающей запятой, используются для сохранения рациональных чисел. Для типа REAL необходимо 32 бита памяти и 64 для LREAL. Диапазон значений REAL от: 1.175494351e-38 до 3.402823466e+38 Диапазон значений LREAL от: 2.2250738585072014e-308 до 1.7976931348623158e+308 Строки Строковый тип STRING представляет строки символов. Максимальный размер строки определяет коли- чество резервируемой памяти и указывается при объявлении переменной. Размер задается в круглых или квадратных скобках. Если размер не указан, принимается размер по умолчанию – 80 символов. Длина строки не ограничена в CoDeSys, но строковые функции способны обращаться со строками от 1 до 255 символов ! Пример объявления строки размером до 35 символов: str:STRING(35):='Просто строка'; Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-34 Размер строк в CoDeSys не ограничен, но библиотека работы со строками поддерживает строки от 1 до 255 символов. Время и дата Ÿ TIME представляет длительность интервалов времени в миллисекундах. Максимальное значение для типа TIME : 49d17h2m47s295ms (4194967295 ms). Ÿ TIME, TIME_OF_DAY (сокр. TOD) содержит время суток, начиная с 0 часов (с точностью до мил- лисекунд). Диапазон значений TOD от: 00:00:00 до 23:59:59.999. Ÿ DATE содержит календарную дату, начиная с 1 января 1970 года. Диапазон значений от: 1970-00-00 до 2106-02-06. Ÿ DATE_AND_TIME (сокр. DT) содержит время в секундах, начиная с 0 часов 1 января 1970 года. Диапазон значений от: 1970-00-00-00:00:00 до 2106-02-06-06:28:15. Типы, TOD, DATE и DT сохраняются физически как DWORD. Формат представления данных описан выше в разделе «Константы». Пользовательские типы данных Массивы Элементарные типы данных могут образовывать одно-, двух-, и трехмерные массивы. Массивы могут быть объявлены в разделе объявлений POU или в списке глобальных переменных. Путем вложения мас- сивов можно получить многомерные массивы, но не более 9 мерных ( "ARRAY[0..2] OF ARRAY[0..3] OF …" ). Синтаксис: <Имя_массива>:ARRAY [ Индексы должны быть целого типа. Нельзя использовать отрицательные индексы. Пример: 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 *) Пример инициализации массива структур: 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); Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-35 Пример инициализации части массива: arr1 : ARRAY [1..10] OF INT := 1,2; Не инициализированные явно элементы массива принимают значения по умолчанию. Так, в данном примере оставшиеся элементы примут значение 0. Доступ к элементам массива: Для доступа к элементам двухмерного массива используется следующий синтаксис: <Имя_массива>[Индекс1,Индекс2] Пример: Card_game [9,2] Примечание: Если определить в проекте функцию с именем CheckBounds, вы сможете контролировать нарушение диапазона индексов массивов в проекте. Функция CheckBounds Определив в проекте функцию с именем CheckBounds, вы сможете использовать её для контроля за со- блюдением границ индексов. Имя функции фиксировано, изменять его нельзя. Пример функции CheckBounds: FUNCTION CheckBounds : DINT VAR_INPUT index, lower, upper: DINT; 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; Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-36 Внимание: Функция CheckBounds, содержащаяся в библиотеке Check.Lib, представляет собой пример реализации. Прежде чем использовать эту библиотеку, убедитесь, что данная функция работает так, как нужно в вашем случае, либо создайте собственную функцию непосредственно в вашем проекте. Указатели Указатели позволяют работать с адресами переменных или функциональных блоков. Синтаксис: <Имя_указателя>: 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) изменять нельзя. Функция имеет следующие параметры: Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-37 Для систем с 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 Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-38 Функция возвращает адрес, который будет использоваться как указатель. Если все хорошо, то это будет входной параметр – dwAddress. Перечисление Перечисление - это определяемый пользователем тип данных, задающий несколько строковых псевдонимов для числовых констант. Перечисление доступно в любой части проекта, даже при локальном его объявлении внутри POU. Поэтому наиболее разумно создавать все перечисления на вкладке “ Типы данных ” ( Data types ) Организатора Объектов (Object Organizer). Объявление должно начинаться с ключевого слова 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. Структуры Структуры создаются на вкладке “ Типы данных ” ( Data types ) Организатора Объектов (Object Organizer). Объявление должно начинаться с ключевых слов TYPE и STRUCT и заканчиваться строками END_STRUCT и END_TYPE. Синтаксис: TYPE <Имя _структуры>: STRUCT <Объявление переменной 1> <Объявление переменной n> END_STRUCT Приложение С: Типы данных CoDeSys CoDeSys V2.3 10-39 END_TYPE <Имя _структуры> образует новый тип данных, который может быть использован в любой части проекта наряду с базовыми типами. Вложенные структуры допускаются. Единственное ограничение заключается в запрете размеще- ния элементов структуры по прямым адресам (AT объявления недопустимы!). Пример объявления структуры по имени Polygонлайн: TYPE Polygонлайн: 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:polygонлайн := ( Start:=3,3, Point1 =5,2, Point2:=7,3, Point3:=8,5, Point4:=5,7, End := 3,5); Для доступа к элементам структуры используется следующий синтаксис: <Имя_структуры>.<Имя_компонента> Например, структура "Week" содержит компонент "Monday", обращение к которому будет выгля- деть так: Week.Monday Псевдонимы типов Псевдонимы типов нужны для создания альтернативных пользовательских наименований типов данных. Это удобно при работе с большим числом однотипных констант, переменных и функцио- нальных блоков. Псевдонимы типов определены на вкладке “ Типы данных ” ( Data types ) Организатора Объектов (Object Organizer). Объявление должно начинаться с ключевого слова TYPE и заканчиваться строкой END_TYPE. Синтаксис: TYPE <Имя псевдонима>: <Исходное имя>; END_TYPE Пример: TYPE message: STRING[50]; END_TYPE; Ограничение диапазона значений Ограничение диапазона позволяет объявить переменную, значения которой ограничены в опреде- ленных пределах. Существует возможность создать в проекте новые типы данных с ограниченным диапазоном значений либо задать диапазон непосредственно при объявлении переменной. |