Особенности программирования Scl-блоков
В пользовательской Scl-программе используются кодовые блоки и блоки данных. Кодовые блоки – это вызываемые для выполнения подпрограммы, а блоки данных – это описания атрибутов переменных, которые принимают участие в выполнении этих подпрограмм.
В языке программирования SCL используется стандартная структура и стандартный интерфейс блока. Поэтому отдельные блоки, запрограммированные с использованием SCL, можно вызвать, например, в Fbd-блоке и, наоборот, с Scl-блоков можно вызвать блоки, созданные с использованием, например, языка STL.
Система STEP 7 поддерживает функции FC и функциональные блоки FB как кодовые блоки. В отличие от функций FC функциональные блоки FB вызываются вместе с блоками данных, в которых хранятся локальные переменные блока (память блока).
Параметры блока
Параметры блока обеспечивают связь между вызывающим и вызываемым блоками. Эти параметры могут быть объявлены как входные (Input), выходные (Output) и входные-выходные (In/Out) параметры. Входные параметры могут быть только прочитаны, выходные параметры могут быть только записаны. Поэтому, если параметры должны быть сначала прочитаны, потом изменены и, в конце концов, снова записаны, то следует использовать тип In/Out.
В функциях FC параметры блока являются указателями на фактические параметры или на другие указатели.
В функциональных блоках FB параметры блока хранятся в экземплярных блоках данных. Доступ к этим данным требует определения блока данных и адреса данных.
Примеры:
Result := DB1.DW2;
Result := DB2.Total;
Result := Privod_data.Speed;
Формальные параметры
Для адресации блока используются формальные параметры. Они имеют такие же имена, как и параметры блока, и используются в выражениях программы в качестве операндов.
Формальные параметры параметрических типов TIMER и COUNTER могут быть обработаны с использованием функций таймеров и функций счетчиков. Значения формальных параметров могут быть переданы в вызываемые блоки.
С помощью формальных параметров типа BLOCK_xx можно получить доступ к адресам данных в блоке данных. Формальные параметры параметрических типов BLOCK_FB и BLOCK_FC при использовании языка программирования SCL могут только передаваться в вызываемые блоки, потому что команд для обработки формальных параметров такого типа в блоке нет.
Формальные параметры типов данных POINTER и ANY могут быть переданы в вызываемые блоки целиком. Исключения представляют временные локальные данные, передача которых не допускается.
Статические локальные данные
Статические локальные данные – это память функционального блока. Эти данные располагаются в экземплярном блоке данных. При этом значения данных хранятся до тех пор, пока не будут изменены программой. В статических локальных данных можно размещать также локальные экземпляры функциональных блоков и системных функциональных блоков.
Статические локальные данные объявляются с помощью ключевых слов VAR и END_VAR.
В качестве статических локальных данных допускается применять все простые, составные, пользовательские (UDT) типы данных, а также типы данных POINTER и ANY.
Если значение инициализации задавать не нужно, переменные можно сообщать списком.
Пример:
VAR
VAR1, VAR2, VAR3: INT;
VAR4: INT:=3;
END_VAR
Необходимо учесть, что при программировании на языке SCL статические локальные данные в функциональном блоке могут быть адресованы только символьным образом.
Предварительная инициализация параметров блоков
Предварительная инициализация параметров блоков не обязательна и допускается только в отношении таких функциональных блоков, параметры которых хранятся как значения. Это распространяется на любые параметры блоков с простыми типами данных, а также на входные (Input) и выходные (Output) параметры сложных типов данных.
Если инициализация параметров блоков не сделана, то редактор будет использовать, как начальные значения параметров, или нулевое значение, или наименьшее значение, или пробел (в зависимости от типа данных). Для параметров типа BLOCK_DB как значение по умолчанию принимается DB1 (DB0 не существует).
Вызов SCL-блоков
При программировании блоков на языке программировании SCL различают блоки с функциональным значением и блоки без функционального значения.
Функциональные блоки FB и функции FC без функционального значения есть просто "областями" программы, то есть подпрограммами.
Функции FC с функциональным значением могут использоваться в выражениях присваивания, а также в других выражениях в качестве операндов.
Системные функциональные блоки SFB вызываются точно так же, как и функциональные блоки FB, а системные функции SFC вызываются точно так же, как функции FC. Следует учесть, что системный функциональный блок SFB вызывается с блоком данных, который размещается в пользовательской программе.
При вызове блока его параметры инициируются фактическими параметрами, которые представляют собой константы, переменные или выражение. Именно с этими параметрами блок обрабатывается при выполнении программы, и именно в них хранятся результаты этой обработки.
При вызове функций FC и системных функций SFC все параметры блока должны быть инициированы. При вызове функциональных блоков FB и системных функциональных блоков SFB инициализация параметров блока не обязательна.
Выходные параметры при вызове функциональных блоков FB и системных функциональных блоков SFB инициируются с помощью прямого обращения к экземплярным данным.
Пример вызова функции FC без функционального значения:
FC291 (MAX:= Maximum, IN:= Inputvar, MIN:= Minimum, OUT:= Result);
При вызове используется или абсолютный, или символьный адрес блока. Список параметров приводится в скобках. Скобки должны быть указаны, даже если функция FC не имеет параметров.
Порядок инициализации параметров может быть произвольным. Если функция имеет единый входной параметр, то имя параметра при инициализации может быть опущено.
Пример инициализации с преобразованием Int-переменной Speed в String-переменную Display:
Display:= I_STRING(Speed);
Пример вызова функции FC с функциональным значением:
Result:= FC2 (MAX:= Maximum, IN:= Inputvar, MIN:= Minimum);
В данном примере глобальной переменной Result присваивается функциональное значение функции FC2. Функции FC с функциональным значением могут использоваться в качестве операндов в любых выражениях.
Если при вызове блока используется входной параметр EN, и если этот вход имеет значение FALSE, то функциональное значение не будет определено, то есть функциональному значению не будет присвоена никакая величина.
Экземплярный блок данных специфицируется при вызове функционального блока.
Пример вызова функционального блока с экземплярным блоком данных:
FB2.DB2 (IN:= Inputvalue);
Result:= DB2.OUT;
В записи вызова сначала записывается адрес функционального блока, а потом, отделенный точкой, адрес экземплярного блока данных. Дальше в скобках представляется список параметров.
Поскольку входные и выходные параметры сложных типов хранятся как указатели, они должны быть инициированы значащими величинами при первом вызове функционального блока. Если параметр блока не инициирован, то он сохраняет свое последнее определенное значение.
Все параметры блока данных могут быть адресованы как глобальные данные с указанием имени экземплярного блока данных и имени параметра. Они также могут быть инициированы при вызове функционального блока с помощью операторов присваивания:
DB2.MAX:= Maximum;
DB2.MIN:= Minimum.
Функциональный блок, как локальный экземпляр
Функциональные блоки могут быть объявлены как локальные экземпляры и вызванные в другом функциональном блоке. Такие функциональные блоки сохраняют свои локальные данные в экземплярном блоке данных.
Пример:
FUNCTION_BLOCK FB2
...
VAR
Delimiter : FB3;
END_VAR
BEGIN
Delimiter (IN := Inputvar);
Result := Delimiter.OUT;
...
END_FUNCTION_BLOCK
Объявление экземпляров выполняется в разделе статических локальных данных за ключевым словом VAR. Здесь локальному экземпляру (FB3) назначается имя, например, Delimiter. К моменту компилирования вызываемый функциональный блок должен уже существовать или в виде прежде скомпилированного блока в разделе Blocks (Блоки), или в виде исходной программы.
Аналогичные действия выполняются при вызове системного функционального блока SFB.
Применение механизма EN/ENO
При программировании на SCL пользователь имеет возможность проверить отдельные выражения (операции) на правильность их выполнения и в зависимости от этого принимать решение – выполнять следующий блок или не выполнять.
Для реализации этой возможности в языке программирования SCL существует переменная с именем "ОК" и типом данных BOOL. Эта переменная сообщает об ошибках, которые возникают при выполнении программы в Scl-блоке. В начале блока ОК-переменная имеет значение TRUE. При возникновении программной ошибки она сбрасывается в состояние FALSE. Результат проверки сообщается с помощью специального выхода блока ENO (Enable output – выход разблокирован) типа BOOL.
Проверять ОК-переменную можно с помощью соответствующих Scl-операций. Ниже приведен пример получения проверки результата арифметического выражения:
SUM:= SUM + IN;
IF OK
THEN (* не имеется ошибок *);
ELSE (* ошибка в операции добавления *);
END_IF;
Для того, чтобы вызываемый блок сохранил значение ОК-переменной на выходе ENO, необходимо предусмотреть следующие назначения:
FC15 (In1:= ..., In2:= ...);
OK:= ENO;
После вызова блока значения ENO может быть использовано для определения того, правильно ли был обработан блок. Если блок был обработан правильно, то ENO = TRUE. Если при обработке блока возникла ошибка, то ENO = FALSE.
Пример программирования анализа ENO:
FC5 (In1:= ..., In2:= ...);
IF ENO
THEN (* не имеется ошибок *);
ELSE (* возникла ошибка *);
END_IF;
Для управления вызовами блока используется вход EN типа BOOL. Если вход EN инициирован значениям TRUE, то блок будет вызван для выполнения, если EN инициированный значениям FALSE, то блок не будет вызван для выполнения. При этом будет выполнен переход к следующему оператору после вызова блока.
Пример вызова блока с указанием значения входа EN:
FC1 (EN:= I1.0, In1:= ..., In2:= ...); (*FC15 выполняется только в случае, когда I1.0 = "1" *)
Если EN не используется, блок будет выполняться всегда.
Пример программирования вызова блока FC2 в случае, если обработка FC1 успешно завершена:
FC1 (EN := I1.0, In1:= ..., In2:= ...);
FC2 (EN := ENO, In1:= ..., In2:= ...);
Дата добавления: 2016-12-09; просмотров: 4423;