Вызов функции и функции-блока
Синтаксис: {имя функции}({аргументы}) где {аргументы} – последовательность выражений, разделенных запятыми, или {имя функции}() если аргументы у функции или функции-блока отсутствуют. Число аргументов в вызове функции (функции-блока) должно быть равно числу аргументов, заданных для этой функции (функции-блока). Передача аргумента по значению или по ссылке задается определением аргумента функции. Строки и массивы всегда передаются по ссылке. В случае, когда соответствующий аргумент определяет передачу по значению, передача все равно осуществляется по ссылке, а аргумент считается константой. Термин по значениюобозначает передачу значения аргумента в вызываемую функцию. При этом функция оперирует с копией переменной и не может изменить ее истинное значение. Термин по ссылкеобозначает передачу адреса аргумента в вызываемую функцию. При этом функция оперирует с самой переменной и может изменить ее значение. Вызываемая функция или функция-блок может быть запрограммирована на любом из встроенных языков (функцию нельзя запрограммировать на Техно SFC) Следующие функции (функции-блоки) могут быть вызваны в основной программе только однократно: содержащие глобальные переменные программы; содержащие FBD-блоки с внутренними переменными. Другие функции могут вызываться в основной программе многократно. Пример Данная программа выполняет возведение в квадрат с использованием ST-функции. При этом показано отличие передачи значения аргумента по ссылке и по значению: FUNCTION SecondDegree: LREAL //VAR_ARG определяет передачу значения //переменной loc_var1 VAR_ARG xx: REAL; END_VAR //VAR_INOUT определяет передачу адреса //переменной loc_var2 VAR_INOUT yy: REAL; END_VAR //следующее действие не изменяет //значение loc_var1 xx = xx+1; //следующее действие изменяет значение loc_var2 yy = yy+1; RETURN (xx+yy)**2; END_FUNCTION PROGRAM VAR loc_var1:INT; loc_var2:INT; d : LREAL; END_VAR loc_var1 = 2; loc_var2=1; // передача loc_var1 и loc_var2 в функцию, // способ передачи задается в функции. // Переменной d присваивается значение, // определенное в функции оператором RETURN d := SecondDegree(loc_var1, loc_var2); END_PROGRAM Пример Данный пример демонстрирует особенности использования функции-блока. FUNCTION_BLOCK Sec_Degree VAR_ARG xx: REAL; yy: REAL; END_VAR VAR_OUTPUT result: LREAL; END_VAR result =(xx+yy+1)**2; END_FUNCTION_BLOCK PROGRAM VAR loc_var1:INT:=2; loc_var2:INT:=1; d : LREAL; END_VAR //Передача значений loc_var1 и loc_var2 //в функцию-блок. Переменной d присваивается //значение переменной result функции-блока. //Чтобы такое присвоение работало корректно, //переменная result должна быть определена в //функции-блоке оператором VAR_OUTPUT или //VAR_INOUT Sec_Degree(loc_var1, loc_var2, d); END_PROGRAM
Массив – это совокупность объектов одного типа, имеющая общее имя (идентификатор). Объекты, составляющие массив, называются элементами этого массива. Для задания массивов используются операторы определения переменных, для обращения к элементам массивов – оператор индексирования, в связи с чем элементы массивов в Техно STназываются также индексированными переменными. В Техно STопределены одномерные и многомерные массивы.
Одномерный массив – это массив переменных; для обращения к элементу одномерного массива достаточно указания одного индекса. В приведенном ниже примере показаны различные варианты задания одномерных массивов. Пример PROGRAM VAR //Массив 7 переменных типа REAL. //Элементы массива по умолчанию инициализируются //нулевыми значениями: nn: array [7] of REAL; //Массив 3 переменных типа REAL. //Первые два элемента инициализируются //заданными значениями //(n[0]=1.5, n[1] = 7), n[2] по умолчанию //инициализируется нулевым значением: n: array [3] of REAL := 1.5, 2*5; END_VAR VAR //Массив 4 строковых переменных. //Первые три элемента инициализируются //заданным значением //(m[0] = m[1] = m[2] = "OK"), m[3] по умолчанию //инициализируется пустой строкой: m: array [4] of STRING := 3("OK"); END_VAR //Задание значений элементам массивов: n[2] = 7*2.5; m[3] = "ERROR"; END_PROGRAM
Многомерный массив – это массив массивов. Определение многомерного массива в общем случае должно содержать сведения о типе, размерности и количествах элементов каждой размерности. Например, трехмерный массив, заданный конструкцией kk: array [4,3,2] of INT; представляет собой массив 4 элементов, каждый из которых – двумерный массив с размерами 3 на 2. Данный массив содержит 24 элемента типа INT, которые в приведенном ниже перечне расположены в порядке возрастания адресов (слева направо): kk[0,0,0], kk[0,0,1], kk[0,1,0], kk[0,1,1], kk[0,2,0], kk[0,2,1], kk[1,0,0], kk[1,0,1], kk[1,1,0], kk[1,1,1], kk[1,2,0], kk[1,2,1], kk[2,0,0], kk[2,0,1], kk[2,1,0], kk[2,1,1], kk[2,2,0], kk[2,2,1], kk[3,0,0], kk[3,0,1], kk[3,1,0], kk[3,1,1], kk[3,2,0], kk[3,2,1] Пример В данном примере показаны различные варианты задания многомерных массивов. PROGRAM VAR //двумерный массив переменных //INT с заданием начальных значений //(ll[0,0]=1, ll[0,1]=2, ll[0,2]=3, // ll[1,0]=4, [1,1]=5, ll[1,2]=6): ll: array [2,3] of INT := 1,2,3,4,5,6; END_VAR VAR //двумерный массив строковых //переменных с указанием диапазонов индексов и //заданием начального значения первых четырех //элементов //(pp[5,9]=pp[5,7]=pp[5,11]="OK", //pp[6,9]= "NO", //pp[6,7]= …=pp[7,11]=""): pp: array[5 .. 7, 9 .. 11] of STRING:=3("OK"), "NO"; END_VAR //задание значений элементов массивов ll[1,2] = 17*5; pp[6,7] = "ERROR"; END_PROGRAM
В отличие от массива, структура – это совокупность объектов, имеющих различный тип. Для создания структур нужно вначале с помощью табличных редакторов определить структурные типы, а также переменные, аргументы и функции, которые являются членами этих структурных типов. Для справки: во внутреннем представлении языка Техно STопределение структурного типа задается следующей конструкцией: type {имя_структурного_типа} : STRUCT //определения переменных – //членов структуры //(см. "Операторы определения //переменных") //определения функций – //членов структуры //(см. "Пользовательские функции //Техно ST") end_struct; end_type Параметр {имя_структурного_типа}, а также переменные и функции – члены структурного типа – задаются с помощью табличных редакторов. Определив структурный тип, можно определять конкретные структуры данного типа (объекты). Такими объектами могут быть переменные или функции. Объекты создаются с помощью табличных редакторов. Для этого в основной программе или ее компоненте создается переменная (функция) типа {имя_структурного_типа}. Для обращения к элементам объекта используется так называемое уточненное имя: {имя объекта}.{имя элемента} Пример Пусть в программе создан структурный тип с именем myType, членами которого являются следующие переменные и функция: mvar1: REAL:=3.14; mvar2: STRING := "OK"; FUNCTION SecondDegree: LREAL VAR_ARG xx: REAL; END_VAR RETURN xx**2; END_FUNCTION Создание и использование объекта типа myTypeиллюстрирует следующий код: PROGRAM VAR d: LREAL; myS : myType; //объект myS типа myType END_VAR d=myS.SecondDegree(25);//возвращает 625 d=myS.mvar1; //возвращает 3.14 //изменение значения mvar1 объекта myS myS.mvar1 = 7; END_PROGRAM Таким образом, структурный тип является только шаблоном структур. С именем типа не связан никакой конкретный объект, поэтому это имя нельзя использовать, например, для формирования уточненного имени элемента: //ошибочная конструкция myType.mvar1 Язык Техно FBD
На вход блоков этого раздела можно подавать числовые значения, а также значения типа BOOL. НЕ (!X) O = NOT X O=1, если X=0, во всех остальных случаях O=0. ИЛИ (X || Y) O = X OR Y O=0, если одновременно X=0 и Y=0, во всех остальных случаях O=1. И (X && Y) O = X AND Y O=1, если Xи Yодновременно отличны от нуля, во всех остальных случаях O=0. 4 НЕ (!) !A = NOT A; !B = NOT B; !C = NOT C; !D = NOT D Выход равен 1, если соответствующий вход равен 0, во всех остальных случаях выход равен 0. Если вход не определен, его значение принимается равным 0. Логическое сложение четырех элементов (||) O = A OR B OR C OR D O=1, если хотя бы один из входов отличен от нуля. O=0, если A=B=C=D=0. Если вход не определен, его значение принимается равным 0. Логическое умножение четырех элементов (&&) O = A AND B AND C AND D O=1, если все входы одновременно отличны от 0, во всех остальных случаях O=0. Если вход не определен, его значение принимается равным 0.
Побитовое НЕ (∼X) Если входу присвоено численное значение с помощью клавиатуры, блок выполняет 32-разрядную побитовую операцию NOT(16-разрядную, если это задано в настройках компилятора). Например, O=16#FFFFFFFE при X=1. Если вход привязан к переменной, то тип этой переменной определяет разрядность выхода. Побитовое ИЛИ (X | Y) Блок выполняет побитовую операцию OR. Например, O=3 при X=2 и Y=3. Побитовое И (X & Y) Блок выполняет побитовую операцию AND. Например, O=2 при X=2 и Y=3. Побитовое исключающее ИЛИ (X ^ Y) Блок выполняет побитовую операцию XOR. Например, O=1 при X=2 и Y=3. Сдвиг влево (X << Y) Блок смещает значение входа Xвлево на число разрядов, заданное значением входа Y. Справа число дополняется нулевыми разрядами. Например, O=16#30 при X=16#3 и Y=4. Сдвиг вправо (X >> Y) Блок смещает значение входа Xвправо на число разрядов, заданное значением входа Y. Слева число дополняется нулевыми разрядами. Например, O=16#3 при X=16#30 и Y=4.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (745)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |