Codesys (824048), страница 59
Текст из файла (страница 59)
Для обращения через указатель необходимо добавить оператор "^" (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 : DWORDVAR_INPUTdwAddress : DWORD;iSize : INT;bWrite: BOOL;END_VARДля систем с 16-и битными указателями:FUNCTION CheckPointer : WORDVAR_INPUTdwAddress : WORD;iSize : INT;bWrite: BOOL;END_VARCoDeSys V2.310-39Приложение С: Типы данных CoDeSysФункция возвращает адрес, который будет использоваться как указатель.
Если все хорошо то, это будет входной параметр – 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_TYPETRAFFIC_SIGNAL1 : TRAFFIC_SIGNAL;TRAFFIC_SIGNAL1:=0;(*Переменная получила значение red*)FOR i:= Red TO Green DOi := 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>..CoDeSys V2.310-40Приложение С: Типы данных CoDeSys<Объявление переменной n>END_STRUCTEND_TYPE<Имя _структуры> образует новый тип данных, который может быть использован в любой части проекта наряду с базовыми типами.Вложенные структуры допускаются. Единственное ограничение заключается в запрете размещенияэлементов структуры по прямым адресам (AT объявления недопустимы!).Пример объявления структуры по имени Polygonline:TYPE Polygonline:STRUCTStart: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_STRUCTEND_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Псевдонимы типовПсевдонимы типов нужны для создания альтернативных пользовательских наименований типов данных.
Это удобно при работе с большим числом однотипных констант, переменных и функциональныхблоков.Псевдонимы типов определены на вкладке типы данных (Data types) «Организатора Объектов»(Object Organizer). Объявление должно начинаться с ключевого слова TYPE и заканчиваться строкойEND_TYPE.Синтаксис:TYPE <Имя псевдонима>: <Исходное имя>;END_TYPEПример:TYPE message: STRING[50];END_TYPE;CoDeSys V2.310-41Приложение С: Типы данных CoDeSysОграничение диапазона значенийОграничение диапазона позволяет объявить переменную, значения которой ограничены в определенных пределах. Существует возможность создать в проекте новые типы данных с ограниченным диапазоном значений либо задать диапазон непосредственно при объявлении переменной.Создание нового типа выглядит так:TYPE < Имя > : < Целый тип > (<от>..<до>) END_TYPE;< Имя> любой допустимый МЭК идентификатор,<Целый тип> один из типов SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD,DWORD (LINT, ULINT, LWORD).< от> константа, определяющая начало диапазона значений включительно.< до> константа, определяющая конец диапазона значений включительно.Пример:TYPESubInt : INT (-4095..4095);END_TYPEОграничение диапазона при объявлении переменной:VARi : INT (-4095..4095);ui : UINT (0..10000);END_VARПри попытке присвоить переменной с ограниченным диапазоном константы, не попадающей в заданный диапазон (например i := 5000;), CoDeSys даст сообщение об ошибке.Для контроля значений «ограниченных» переменных в процессе исполнения применяются функцииCheckRangeSigned или CheckRangeUnsigned.
Они позволяют обрабатывать ошибки произвольнымобразом. Например, ограничить присваиваемое значение или сформировать флаги ошибки. Перваяфункция работает для переменных со знаком, вторая для переменных без знака (unsigned). Изменятьидентификаторы этих функций нельзя.Пример:Здесь применяется функция CheckRangeSigned, контролирующая переменные со знаком (как, например, объявленная выше i). Функция «обрезает» присваиваемые значения по границам диапазона.FUNCTION CheckRangeSigned : DINTVAR_INPUTvalue, lower, upper: DINT;END_VARIF (value < lower) THENCheckRangeSigned := lower;ELSIF(value > upper) THENCoDeSys V2.310-42Приложение С: Типы данных CoDeSysCheckRangeSigned := upper;ELSECheckRangeSigned := value;END_IFФункция вызывается автоматически при соответствующих операциях присваивания.
Она получает трипараметра: присваиваемое значение (value) и обе границы диапазона (lower, upper). Фактическиприсваивается возвращаемое CheckRangeSigned значение.Например, при присваивании i:=10*y происходит неявный вызов:i := CheckRangeSigned(10*y, -4095, 4095);В результате, даже если y > 1000, i не получит значение более 4095.Аналогично объявляется и функция CheckRangeUnsigned:FUNCTION CheckRangeUnsigned : UDINTVAR_INPUTvalue, lower, upper: UDINT;END_VARЗамечание: Если функции CheckRangeSigned или CheckRangeUnsigned не включены в проект, ограничениеграниц диапазонов во время исполнения работать не будет.Внимание: Если функции «обрезают» значения, как в вышеописанном примере существует опасность получитьбесконечный цикл.
Это может случиться, если условие окончания итераций цикла не достигается изза искусственного ограничения значений переменной!Пример. Переменная ui не превысит 10000, и цикл FOR ни когда не закончится:VARui : UINT (0..10000);END_VARFOR ui:=0 TO 10000 DO...END_FORВнимание: Функции CheckRange…, содержащащиеся в библиотеке Check.Lib, представляют собой пример реализации. Прежде чем использовать эту библиотеку, убедитесь, что данные функции работает так, какнужно в вашем случае, либо создайте собственные функции непосредственно в вашем проекте.CoDeSys V2.310-43Приложение D: Библиотеки CoDeSysПриложение D: Библиотеки CoDeSys10.16 Стандартная библиотека Standard.lib10.16.1 Строковые функцииВнимание: В многозадачных проектах необходимо сосредоточить всю работу со строками в одной задаче.