Мегаобучалка Главная | О нас | Обратная связь


Вызов функции и функции-блока



2016-01-26 745 Обсуждений (0)
Вызов функции и функции-блока 0.00 из 5.00 0 оценок




Синтаксис:

{имя функции}({аргументы})

где {аргументы} – последовательность выражений, разделенных запятыми, или

{имя функции}()

если аргументы у функции или функции-блока отсутствуют.

Число аргументов в вызове функции (функции-блока) должно быть равно числу аргументов, заданных для этой функции (функции-блока).

Передача аргумента по значению или по ссылке задается определением аргумента функции. Строки и массивы всегда передаются по ссылке. В случае, когда соответствующий аргумент определяет передачу по значению, передача все равно осуществляется по ссылке, а аргумент считается константой.

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

Вызываемая функция или функция-блок может быть запрограммирована на любом из встроенных языков (функцию нельзя запрограммировать на Техно 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называются также индексированными переменными.

В Техно 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

В отличие от массива, структура – это совокупность объектов, имеющих различный тип. Для создания структур нужно вначале с помощью табличных редакторов определить структурные типы, а также переменные, аргументы и функции, которые являются членами этих структурных типов. Для справки: во внутреннем представлении языка Техно 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.



2016-01-26 745 Обсуждений (0)
Вызов функции и функции-блока 0.00 из 5.00 0 оценок









Обсуждение в статье: Вызов функции и функции-блока

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (745)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)