Программирование алгоритмов управления в АСУ ТП с использованием TRACE MODE 6

Лабораторная работа № 4.

Программирование алгоритмов управления в АСУ ТП с использованием TRACE MODE 6

  1. Цель работы

Изучение принципов программирования алгоритмов управления в АСУ ТП с использованием языков FBD и ST. Использование SCADA-системы TRACE MODE 6 для программирования алгоритмов управления.

  1. Задачи

Изучение языка программирования Техно ST, представленного в SCADA-системе TRACE MODE 6. Изучение средств TRACE MODE 6 для составления и запуска программ. Моделирование системы программного управления с ПИД-регулятором с использованием TRACE MODE 6.

  1. Теоретическая часть

Задачи программирования современных промышленных контроллеров, работающих в АСУ ТП, достаточно специфичны и сложны и зачастую требуют для их эффективного решения соответствующих инструментальных средств автоматизации программирования. В настоящее время большинство фирм-производителей программируемых логических контроллеров (ПЛК) снабжают свою продукцию специализированным программным обеспечением для их программирования. Эти инструментальные средства программирования, как правило, поддерживают международный стандарт на языки программирования ПЛК – IEC 61131-3.

Стандарт IEC 61131-3 описывает два компонента: так называемые общие элементы (тип данных, переменные, стандартные функции и блоки и др.) и собственно языки программирования. Языки программирования для контроллеров определяются таким образом, что части прикладной программы могут быть запрограммированы на любом языке и скомпонованы в единую исполняемую программу.

Стандарт IEC 61131-3 описывает синтаксис и семантику пяти языков программирования ПЛК:

  1. Язык последовательных функциональных схем SFC (Sequential Function Chart) – графический язык, позволяет описать логику программы на основе чередующихся процедурных шагов и условных переходов, а также представить последовательно-параллельные задачи в понятной и наглядной форме. Основными элементами языка являются шаг и переход. Шаг представляет собой набор операций над переменными. Переход – набор логических условий, определяющий передачу управления к другому шагу. По внешнему виду описание на языке SFC напоминает хорошо известные логические блок-схемы алгоритмов, при этом SFC предоставляет возможности построения сложных распараллеленных алгоритмов. Язык SFC является наиболее важным из семейства языков стандарта IEC 61131-3. Однако SFC не имеет средств для описания шагов и переходов, и их содержание должно быть выражено средствами других языков стандарта.
  2. Язык функциональных блоковых диаграмм FBD (Function Block Diagrams) – графический язык, позволяет создать программу практически любой сложности с использованием библиотечных функций (арифметических, тригонометрических, строковых) и функциональных блоков (логических, ПИД-регулирования, мультиплексоров и др.). Программа на языке FBD выглядит как набор блоков, между входами/ выходами которых графически установлены связи. Программирование сводится к выбору необходимых библиотечных функций и блоков и соединению их соответствующих входов/выходов. В результате получается максимально наглядная и хорошо контролируемая программа.
  3. Графический язык релейных диаграмм или релейной логики LD (Ladder Diagrams) является стандартизованным вариантом класса языков релейно-контактных схем и применяется для описания логических выражений различного уровня сложности. Логические выражения на этом языке описываются в виде контактов и катушек реле, которые широко применялись в области автоматизации в 60 – 70-х гг. ХХ в. Ввиду своих ограниченных возможностей язык дополнен такими средствами, как таймеры, счётчики и др.
  4. Язык структурированного текста ST (Structured Text) относится к классу текстовых языков высокого уровня и предоставляет булевые и арифметические операторы, оператор ветвления if-then-else, операторы цикла. По мнемонике язык ST похож на Паскаль. На его основе можно создавать гибкие процедуры обработки данных. Язык структурированного текста является основным для программирования последовательных шагов и переходов языка SFC.
  5. Язык инструкций IL (Instruction List) – текстовый язык низкого уровня. Выглядит как типичный язык Ассемблера. Язык IL позволяет создавать эффективные, оптимальные по быстродействию программы.

Для программирования алгоритмов функционирования разрабатываемого проекта АСУ в TRACE MODE 6 включены языки Техно ST, Техно SFC, Техно FBD, Техно LD и Техно IL. Данные языки являются модификациями языков ST, SFC, FBD, LD и IL стандарта IEC61131-3.

Программы и некоторые их компоненты (функции, шаги и переходы SFC и т.п.) могут быть разработаны на любом из встроенных языков в соответствующем редакторе, при этом языки для программы и ее компонентов выбираются независимо.

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

TRACE MODE 6 имеет также средства для отладки программ.

Основным языком программирования TRACE MODE 6 является Техно ST. Программы, разработанные на языках Техно LD, Техно SFC и Техно FBD, перед компиляцией транслируются в Техно ST. IL-программы перед компиляцией частично транслируются в ST, частично – в ассемблер. Отсюда следует, например, что ключевые слова Техно ST являются таковыми и для всех других языков.

Использование программы возможно только после ее успешной компиляции. Для компиляции программы нужно выполнить одно из следующих действий:

  • выполнить команду Компилировать из меню Программа (или нажать клавишу F7 или нажать ЛК на иконке панели инструментов отладчика) – по этой команде создается только код для отладки программы в интегрированной среде. Отладочный код сохраняется в поддиректории, создаваемой в директории %TRACE MODE 6 IDE% \ tmp. Если компилятор обнаруживает ошибки, он выводит соответствующие сообщения в окне, которое в этом случае открывается автоматически. Если компиляция прошла успешно, окно сообщений не открывается;
    • выполнить экспорт проекта – по этой команде в папке узла, содержащего канал вызова программы, создается как отладочный, так и исполняемый код. При обнаружении ошибок в программе выводится сообщение о невозможности ее экспорта.

Для выполнения программы в реальном времени в узле должен быть создан канал класса CALL с типом вызова Program, настроенный на вызов шаблона программы.

Подобный канал CALL типа INPUT отрабатывается со своим периодом пересчета в соответствующем потоке монитора реального времени.

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

Лексическая структура языка Техно ST.

В алфавит языка входят:

  • прописные и строчные буквы латинского алфавита;
  • цифры 0,1,…9;
  • специальные знаки: + - * / < = > ! : & | ^ % ( ) [ ] , ; #

Из символов алфавита формируются лексемы языка:

  • идентификаторы;
  • ключевые слова;
  • числовые и строковые константы;
  • символьные операторы (знаки операций);
  • разделители;
  • комментарии.

Идентификаторы Техно ST.

Идентификаторы могут состоять из заглавных и строчных латинских букв, цифр и знака подчеркивания ’_’. Первым символом идентификатора не может быть цифра. Длина идентификатора не ограничена.

Идентификаторы не чувствительны к регистру, т.е. ’AAA’ и ’aaa’ являются идентичными идентификаторами.

Имена констант, переменных, функций и т.п., задаваемые пользователем, должны удовлетворять правилам задания идентификаторов.

Ключевые слова Техно ST.

Ключевые (служебные) слова – это идентификаторы, зарезервированные в языке для специального использования.

Список ключевых слов языка Техно ST:

and, array, bool, break, by, byte, case, constant, continue, date, date_and_time, dint, do, dt, dword, else, elsif, end_case, end_for, end_function, end_function_block, end_if, end_program, end_repeat, end_struct, end_type, end_var, end_while, exit, false, for, function, function_block, goto, handle, if, int, lreal, mod, not, of, or, program, real, repeat, return, rol, ror, shl, shr, sint, string, struct, time, time_of_day, to, tod, true, type, udint, uint, until, usint, var, var_arg, var_global, var_inout, var_input, var_output, while, word, xor.

Кроме того, к ключевым словам относятся имена функций языка C, которые могут быть использованы в ST-программе.

Ключевые слова нечувствительны к регистру, т.е. while и WHILE являются идентичными ключевыми словами.

Разделители Техно ST.

В качестве разделителей, или знаков пунктуации, в языке Техно ST используются следующие лексемы:

+  -  *  ** / <  <=  <>  <<  >  >=  >>  !  !=  =  ==  :  :=  &  |  ^  ~  %  ( )  [ ]  .  ..  ,  ;

Комментарии Техно ST.

Комментарии бывают двух видов: строчные и блочные. Строчный комментарий начинается c символов // и продолжается до конца строки. Блочный комментарий начинается с символов /* и продолжается до символов */. Вложенные комментарии не допускаются.

Синтаксис Техно ST.

Для описания структуры программы и операторов в Техно ST приняты следующие терминологические соглашения:

  • выражение – последовательность операндов, разделителей и символьных операторов, задающая вычисление без присвоения результата;
  • предложение – последовательность лексем, определяющая выполнение логически законченного промежуточного действия. Таким действием может быть присвоение переменной результата вычислений, вызов функции-блока и т.п. Операторы (кроме символьных) также образуют предложения.

На основании этих соглашений программа или ее компонент на языке Техно ST определяется как последовательность предложений.

Каждое предложение должно завершаться точкой с запятой. Исключением из этого правила являются операторы определения переменных, для завершения которых точка с запятой не используется.

Длина строки программы не ограничивается, лексемы разделяются произвольным числом пробелов, знаков табуляции или символов перевода строки.

Основная точка входа в программу.

Основная точка входа в программу определяется следующей конструкцией:

program

{определение аргументов}

{список предложений}

end_program

Необязательное выражение {определение аргументов} задается аналогично выражению {определение переменной} для операторов определения переменной. В дальнейшем конструкция program…end_program называется основной программой.

Функции, глобальные переменные и структурные типы не могут быть определены в основной программе.

Основная точка входа создается автоматически при создании программы. Если для программы выбран язык ST или IL, конструкция program ... end_program  отображается в листинге. Если для программы выбран язык SFC, LD или FBD, основная точка создается во внутреннем представлении и недоступна для просмотра. 

Переменные и константы Техно ST.

Под объектом в Техно ST понимается некоторая область памяти, которой присвоено имя (идентификатор). Переменная (константа) – это частный случай объекта как именованной области памяти. Отличительной чертой переменной  (константы) является возможность связывать с ее именем различные значения, совокупность которых определяется типом переменной (константы).

При определении значения переменной в соответствующую ей область памяти помещается некоторый код. Если этот процесс происходит во время компиляции программы, он называется инициализацией переменной, если во время выполнения программы – присвоением значения.

Определение переменных и констант.

Вид константы или переменной (глобальная, локальная) задается оператором, с помощью которого данная переменная (константа) определяется. Синтаксис операторов определения переменных предполагает обязательное указание типа данных:

//определение локальной строковой

//переменной myVar

VAR myVar: STRING; END_VAR

Тип данных определяет размер выделяемой памяти. Для указания типа в Техно ST определены следующие ключевые слова (в круглых скобках указано соответствие типу данных C):

BOOL (bool) – булево значение размерностью 1 байт (true (1) или false (0));

SINT (__int8) – целое со знаком размерностью 1 байт (-128 ... 127);

USINT (unsigned __int8) – целое без знака размерностью 1 байт (0 ... 255);

INT (short) – целое со знаком размерностью 2 байта (-32768 ... 32767);

UINT (unsigned short) – целое без знака размерностью 2 байта  (0 ... 65535);

DINT (long) – целое со знаком (4 байта) (-2147483648 ... 2147483647);

UDINT (unsigned long) – целое без знака (4 байта) (0 ... 4294967295);

TIME, DATE, DATE_AND_TIME – соответствуют DINT. Значения переменных этих типов задаются аналогично соответствующим временным константам;

REAL (float) – вещественное число (4 байта) (максимальное значение 3.402823466e+38);

LREAL (double) – вещественное число (8 байт) (максимальное значение 1.7976931348623158e+308);

STRING (WCHAR*) – 256 символов в кодировке utf-8;

HANDLE – специальный тип, используемый для хранения внешних данных в виде числа, имеет размерность 4 байта, не может быть использован в арифметических, логических и т.п. операциях (если специальная отработка аргументов HANDLE отключена).

Кроме указанных типов, переменной может быть присвоен структурный тип, созданный пользователем. Такая переменная является конкретным объектом указанного типа. 

При определении переменной может быть задано ее значение:

VAR i: INT:=0; END_VAR

Если при определении переменной ее значение не задано, то этой переменной по умолчанию присваивается следующее начальное значение:

  • числовая переменная – 0;
  • переменная типа BOOL – FALSE;
  • переменная типа  STRING – пустая строка;
  • переменная типа HANDLE – 16#00000000 (0 в формате HEX);
  • переменная типа TIME, DATE или DATE_AND_TIME – 0.

При определении константы задание ее значения обязательно:

VAR CONSTANT myConst: INT:=13; END_VAR

В отличие от переменной, значение константы в программе изменять нельзя.

Особенности присвоения значений переменным.

При присвоении значения переменной типа TYPE1 переменной типа TYPE2 нужно учитывать следующее:

  • присвоение корректно только в том случае, если тип TYPE2 заключает в себе все числа типа TYPE1:

VAR a: REAL := -1564.343; END_VAR

VAR b: USINT := 50; END_VAR

a = b;  //корректная операция

b = a;  //некорректная операция

  • присвоение корректно, если один из типов – BOOL, а другой – любой численный. Логическое значение TRUE соответствует единице, FALSE – нулю; нуль соответствует FALSE, любое ненулевое значение, в том числе отрицательное, соответствует TRUE:

VAR a: BOOL; END_VAR

VAR b: SINT := -50; END_VAR

a = b; //a = TRUE, корректная операция

b = a; //b = 1, корректная операция

Числовые константы Техно ST.

Десятичные целочисленные константы состоят из ненулевой цифры, за которой следует последовательность десятичных цифр:

123, 456, 7890

Двоичные целочисленные константы начинаются с префикса 2#, за которым следуют цифры 0 или 1:

2#1001, 2#1100

Восьмеричные целочисленные константы начинаются с префикса 8#, за которым следуют цифры от 0 до 7:

8#777, 8#0123

Шестнадцатеричные константы начинаются с префикса 16#, за которым следуют цифры или буквы a...f. Буквы можно задавать как в нижнем, так и в верхнем регистре (A...F):

16#123, 16#EA7

Вещественные константы состоят из целой и дробной части, разделенной точкой. Либо целая, либо дробная часть может отсутствовать. Числа могут задаваться в формате с плавающей точкой, при этом они сопровождаются суффиксом E с указанием десятичного порядка:

1.23, 123., .123, 0.123E3, .123e-3, 123.E+5

Временные интервалы состоят из префикса t# или time#, за которым следует запись в виде

<дни>d<часы>h<минуты>m<секунды>s<миллисекунды>ms

Любая составляющая может быть опущена (например, запись t#1h10s является корректной и означает 1 час 10 секунд). Временной интервал приводится к целочисленному виду, означающему количество миллисекунд в заданном временном интервале, а возвращается целое число секунд.

Дата состоит из префикса d# или date#, за которым следует запись в виде yyyy-mm-dd (год, месяц, день). Приводится к целочисленному виду, означающему количество секунд, прошедшее с 0 часов 1 января 1970 года до 0 часов заданной даты.

Константа "Дата и время" состоит из префикса dt# или date_and_time#, за которым следует запись в виде yyyy-mm-dd-hh:mm:ss (год, месяц, день, час, минута, секунда). Приводится к целочисленному виду, означающему количество секунд, прошедшее с 0 часов 1 января 1970 года до заданных даты и времени.

Строковые константы Техно ST.

Строковые константы представляют собой набор символов, заключенных в одинарные или двойные кавычки: ’первая строка’, "вторая строка". В строке недопустимы управляющие символы, включая переводы строки, а также кавычки и символ $.

Для размещения в строках произвольных символов применяется механизм эскейп-последовательностей, начинающихся с символа $. Определены следующие последовательности:

$r – возврат каретки, код 16#0D;

$n – перевод строки, код 16#0A;

$t – табуляция, код 16#09;

$uXXXX – UNICODE-символ (’X’ – шестнадцатеричная цифра);

$x – символ x (’x’ – любой символ).

Пример:

"Строка с кавычкой: $’, символом $u0410 и переводом строки $n"

Особенности вычислений.

Целочисленность результата арифметических вычислений в программе имеет высший приоритет – даже в том случае, когда этот результат присваивается переменной с плавающей точкой.

Пусть, например, в программе объявлена переменная float:

VAR VAR_000 : REAL; END_VAR

Тогда:

VAR_000 = 2 / 10             //VAR_000 = 0 

VAR_000 = 2. / 10            //VAR_000 = 0.2 

VAR_000 = 2. / 10  + 2 /10   //VAR_000 = 0.2 

Символьные операторы.

Символьные операторы Техно ST представляют собой знаки операций, выполняемых над операндами. В качестве операндов могут выступать:

  • имена констант;
  • имена переменных;
  • имена переменных – элементов массивов;
  • вызовы пользовательских функций;
  • вызовы библиотечных функций;
  • выражения, заключенные в скобки;
  • уточненные имена элементов структур.

Арифметические операторы.

К данным операторам относятся:

унарный ’-’ – смена знака операнда;

унарный ’+’ – пустая операция;

’+’ – сложение; если один из операндов - строка, то другой операнд также преобразуется в строку, затем производится конкатенация строк;

’-’ – вычитание;

’*’ – умножение (только для числовых значений);

’/’ – деление;

’%’ или mod – взятие остатка (деление по модулю);

** – возведение в степень.

Побитовые операторы.

В данную группу входят следующие операторы:

’&’ – побитовое "И";

’|’ – побитовое "ИЛИ";

’^’ или xor – побитовое "исключающее ИЛИ".

унарная ’~’ – поразрядная инверсия;

’<<’ или shl – сдвиг влево на указанное число разрядов (только для целочисленных значений);

’>>’ или shr – сдвиг вправо на указанное число разрядов (без сохранения знака) (только для целочисленных значений);

rol – циклический сдвиг влево на указанное число разрядов (только для целочисленных значений);

ror – циклический сдвиг вправо на указанное число разрядов (без сохранения знака) (только для целочисленных значений).

Операторы сравнения.

Все операторы сравнения возвращают true, если условие выполняется, иначе – false:.

’==’ – проверка на равенство;

’!=’ или ’<>’ – проверка на неравенство;

’<’ – меньше;

’>’ – больше;

’<=’ – меньше или равно;

’>=’ – больше или равно.

Логические операторы.

К данным операторам относятся:

&& или and – возвращает true, если оба операнда не равны нулю, иначе - false. Если первый операнд ложен, второй операнд не вычисляется;

|| или or – возвращает true, если любой из операндов не равен нулю, иначе - false. Если первый операнд истинен, второй операнд не вычисляется.

унарный ! или not – возвращает true, если операнд ложен, иначе - false.

Операторы присваивания.

Синтаксис:

{операнд} = {выражение} 

или

{операнд} := {выражение} 

В качестве операнда может выступать:

  • имя переменной;
  • имя переменной-элемента массива (индексированная переменная);
  • уточненное имя переменной объекта.

Приоритет символьных операторов Техно ST.

В приведенном ниже списке символьные операторы расположены в порядке убывания приоритета:

**

!, not, ~, унарный ’-’, унарный ’+’

<<, >>, shl, shr, rol, ror

&, |, ^, xor

*, /, %, mod

+, -

==, !=, <>, <, <=, >, >=

&&, and

||, or

=, :=

Выражения, заключенные в скобки, вычисляются в первоочередном порядке.

Операторы Техно ST.

Определены следующие операторы, образующие предложения Техно ST:

return

if

case

while

repeat

for

break

exit

continue

операторы определения переменных;

оператор индексирования элементов массива;

goto

Оператор return

Определены 2 варианта задания данного оператора:

  • return {выражение}

Действие: выход из функции Техно ST. Значением функции является значение {выражения};

  • return

Действие: выход из функции-блока Техно ST.

Пример

RETURN (2 + ARG_000 ** 2);

Оператор if-then-else.

Данный оператор начинается с ключевого слова if и заканчивается ключевым словом end_if.  Определены 3 варианта задания данного оператора:

  • Вариант 1

if {выражение} then {последовательность предложений} end_if

Действие: если {выражение} истинно, выполняется {последовательность предложений}, иначе никаких действий не производится.

  • Вариант 2

if {выражение} then {последовательность предложений1}

else {последовательность предложений2} end_if

Действие: если {выражение1} истинно, выполняется {последовательность предложений1}, иначе выполняется {последовательность предложений2}.

  • Вариант 3

if {выражение1} then {последовательность предложений1}

elsif {выражение2} then {последовательность предложений2}

elsif {выражениеN} then {последовательность предложенийN}

else {последовательность предложений} end_if

Действие: выполняется первая по порядку {последовательность предложений}, для которой соответствующее {выражение} истинно. Если все {выражения} ложны, выполняется {последовательность предложений}, следующая за ключевым словом else.

Количество блоков "elsif {выражение} then {последовательность предложений}" не ограничено.

Пример

В результате выполнения следующего кода переменной VAR_000 присваивается значение 200. Выполняется только одно (первое по порядку) действие, для которого условие истинно, поэтому действие, следующее за конструкцией ELSIF...THEN, выполнено не будет, несмотря на то, что условие VAR_002  < 1 истинно:

VAR VAR_000 : INT; END_VAR

VAR VAR_002 : REAL := 0.5; END_VAR

IF VAR_002 < 2 THEN

VAR_000 = 200;

ELSIF VAR_002 < 1 THEN

VAR_000 = 500;

ELSE

VAR_000 = 300;

END_IF;

Оператор case.

Определены 2 варианта задания данного оператора.

Вариант 1

case {выражение} of

{список значений}: {последовательность предложений}

...

{список значений}: {последовательность предложений}

end_case

Вариант 2

case {выражение} of

{список значений}: {последовательность предложений}

...

{список значений}: {последовательность предложений}

else {последовательность предложений}

end_case

Список значений представляет собой набор целых чисел или набор диапазонов целых чисел, разделенных запятой. Диапазон задается в виде

{нижняя граница} .. {верхняя граница}

Действие: если результат вычисления {выражения} принадлежит множествам, заданным {списками значений}, выполняется соответствующая {последовательность предложений}. Если результат вычисления {выражения} не принадлежит ни одному из заданных множеств, выполняется {последовательность предложений}, следующая за ключевым словом else.

Пример

В результате выполнения следующего кода VAR_001=500:

VAR VAR_000 : INT; END_VAR

VAR VAR_001 : INT; END_VAR

CASE VAR_000 + 4 OF

0 .. 2 : VAR_001 = 200;

3, 4, 5 : VAR_001 = 500;

END_CASE;

Оператор while.

Синтаксис:

while {выражение} do {последовательность предложений} end_while

Действие: пока {выражение} истинно, выполняется {последовательность предложений}.

Пример

После выполнения следующего кода VAR_001=16:

VAR VAR_000 : INT := 10; END_VAR

VAR VAR_001 : INT; END_VAR

WHILE VAR_000 > 2 DO VAR_000 = VAR_000 - 1;

VAR_001 = VAR_001 + 2;

END_WHILE;

Оператор repeat.

Синтаксис:

repeat {последовательность предложений} until {выражение} end_repeat

Действие: пока {выражение} истинно, выполняется {последовательность предложений}. Если {выражение} ложно, {последовательность предложений} выполняется 1 раз.

Пример

После выполнения следующего кода VAR_001=20:

VAR VAR_000 : INT :=10; END_VAR

VAR VAR_001 : INT; END_VAR

REPEAT VAR_001 = VAR_001 + 2; VAR_000 = VAR_000 + 1; UNTIL VAR_000 < 20 END_REPEAT;

Оператор for.

Синтаксис:

for {инициализация переменной цикла} to {выражение1} by {выражение2} do {последовательность предложений}

end_for

Инициализация переменной цикла имеет вид:

{имя переменной}:={выражение}

Действие: пока значение переменной цикла меньше или равно значению {выражения1} выполняется {последовательность предложений}. По завершении каждого цикла к переменной цикла прибавляется значение {выражения2}; если оно не задано, прибавляется 1.

С помощью оператора for нельзя построить цикл с убывающим счетчиком. Для создания таких циклов нужно использовать операторы while и repeat.

Пример

После выполнения следующего кода VAR_001=22:

VAR VAR_000 : INT :=10; END_VAR

VAR VAR_001 : INT; END_VAR

FOR VAR_000 = 10 TO 20 DO VAR_001 = VAR_001 + 2; END_FOR;

Операторы break и exit.

Операторы break и exit эквивалентны.

Синтаксис:

break

exit

Действие: выход за пределы цикла. В случае вложенных циклов выход осуществляется только из текущего цикла и не затрагивает внешние.

Оператор continue.

Синтаксис:

continue

Действие: переход в конец цикла, т.е. выражения, следующие за оператором continue до конца цикла, не выполняются.

Операторы определения переменных.

Операторы определения переменных могут быть заданы вручную (кроме операторов определения глобальных переменных) или с помощью табличного редактора.

В языке ST определены следующие операторы данного типа:

var

{определение переменной}

...

{определение переменной}

end_var

 

var_global

{определение переменной}

...

{определение переменной}

end_var

 

var_arg

{определение переменной}

...

{определение переменной}

end_var

 

var_input

{определение переменной}

...

{определение переменной}

end_var

 

var_output

{определение переменной}

...

{определение переменной}

end_var

 

var_inout

{определение переменной}

...

{определение переменной}

end_var

После ключевого слова end_var точка с запятой не ставится.

Действие: определяет новую переменную. При использовании совместно с constant задает константу.

Оператор var ... end_var используется для создания локальных переменных и структур; может использоваться в основной программе или ее компоненте (функции).

Оператор var_global ... end_var используется для создания глобальных переменных; может использоваться вне основной программы и ее компонентов (функций).

Оператор var_arg(var_input) ... end_var используется для определения аргументов (основной программы или ее функций), передаваемых по значению. Определение аргумента с помощью этого оператора равнозначно заданию аргумента типа вход в табличном редакторе.

Оператор var_output(var_inout) ... end_var используется для определения аргументов (основной программы или ее функций), передаваемых по ссылке. Определение аргумента с помощью оператора var_output...end_var  равнозначно заданию в табличном редакторе аргумента типа выход, а определение аргумента с помощью оператора var_inout...end_var равнозначно заданию аргумента типа вход/выход.

Создание аргументов вручную с помощью указанных операторов может использоваться только в отладочных программах – для таких аргументов нельзя задать привязку. Аргументы рабочей программы следует создавать с помощью табличного редактора.

Выражение {определение переменной} имеет вид:

{имя переменной}: {тип переменной};

{имя переменной}: {тип переменной}:={выражение};

{имя переменной}: array [] of {тип переменной};

{имя переменной}: array [{размерности массива}] of {тип переменной};

{имя переменной}: array [{размерности массива}] of {тип переменной}:={начальные значения};

Выражения {размерности массива} задаются в виде диапазонов изменения индексов массива, разделенных запятой.

Диапазон изменения индексов массива имеет вид

{нижняя граница} .. {верхняя граница}

или

{размер массива}

обозначающий диапазон от 0 до {размер массива}-1. В случае, если размерность массива не указана, он считается пустым и ожидается его инициализация в ходе выполнения программы.

Выражения {начальные значения} имеют вид списка начальных значений элементов массива, разделенных запятой. Каждое начальное значение имеет вид выражения, вычисление которого дает реальное начальное значение, или конструкции

{целочисленная константа} ({выражение})

где {целочисленная константа} задает количество элементов, которым присваивается это значение. При присвоении начальных значений элементам массива первым изменяется последний индекс массива.

Область действия имени переменной определяется по следующим правилам:

  • глобальные переменные действуют в рамках программы и сохраняют свое значение между вызовами программы. В частности, глобальными являются переменные FBD- и LD-блоков;
  • локальные переменные и аргументы действуют в рамках объекта (программы, функции, структуры), в котором определены.

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

Оператор индексирования элементов массива.

Синтаксис:

{имя} [ {индекс 1}, ... {индекс N}]

где {имя} – имя переменной или функции, возвращающей массив, а {индекс k} – целое неотрицательное число или целочисленная переменная (кроме UINT и USINT). Количество индексов зависит от размерности массива.

Действие: возвращает ссылку на элемент массива, которая может быть использована в левой и правой части оператора присваивания.

Оператор goto.

Синтаксис:

goto {метка строки}

Действие: безусловный переход к строке кода с указанной меткой. Оператор goto и метка, на которую этот оператор ссылается, должны находиться в одном и том же программном компоненте (программе, функции и т.п.). Метка должна начинаться с буквы и отделяться от кода программы двоеточием:

goto myLabel2;

myLabel2:

END_PROGRAM

Стандартные функции C в ST-программе.

В ST-программе может быть использован ряд стандартных функций Си:

sin(), cos(), tan(), asin(), exp(), log()

Пользовательские функции Техно ST.

В Техно ST определены две разновидности пользовательских функций: собственно функция и функция-блок. Функция-блок играет роль подпрограммы, т.е. не возвращает значений.

Функции и функции-блоки создаются с помощью табличного редактора. Если при создании указан тип данного компонента, создается функция, в противном случае – функция-блок.

Определение функции и функции-блока.

Синтаксис:

function {имя} : {тип возвращаемого значения}

{определение аргументов}

{список предложений}

end_function

  

function_block {имя}

{определение аргументов}

{список предложений}

end_function_block

Эти конструкции создаются автоматически при создании функции и функции-блока в табличном редакторе.

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

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

Функция может возвращать значение структурного типа, а также массив.

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

Синтаксис:

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

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

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

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

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

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

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

Вызываемая функция или функция-блок может быть запрограммирована на любом из встроенных языков (функцию нельзя запрограммировать на Техно SFC).

Следующие функции (функции-блоки) могут быть вызваны в основной программе только однократно:

  • содержащие глобальные переменные программы;
  • содержащие FBD-блоки с внутренними переменными.

Другие функции могут вызываться в основной программе многократно.

Массивы Техно ST.

Массив – это совокупность объектов одного типа, имеющая общее имя (идентификатор). Объекты, составляющие массив, называются элементами этого массива.

Для задания массивов используются операторы определения переменных, для обращения к элементам массивов – оператор индексирования, в связи с чем элементы массивов в Техно ST называются также индексированными переменными.

В Техно ST определены одномерные и многомерные массивы.

Одномерные массивы.

Одномерный массив – это массив переменных; для обращения к элементу одномерного массива достаточно указания одного индекса. В приведенном ниже примере показаны различные варианты задания одномерных массивов.

Пример

PROGRAM

VAR

//Массив 7 переменных типа REAL.

//Элементы массива по умолчанию инициализируются

//нулевыми значениями:

nn: array [7] of REAL;

//Массив 3 переменных типа REAL.

//Первые два элемента инициализируются

//заданными значениями

//(n[0]=1.5, n[1] = 10), 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,10]=pp[5,11]="OK",

//pp[6,9]= "NO",

//pp[6,10]= …=pp[7,11]=""):

pp: array[5 .. 7, 9 .. 11] of STRING:=3("OK"), "NO";

END_VAR

//задание значений элементов массивов

ll[1,2] = 17*5;

pp[6,10] = "ERROR";

END_PROGRAM

Создание пользовательских функциональных блоков.

Для создания в TRACE MODE 6 пользовательского функционального блока достаточно создать в программе функцию или функцию-блок на любом из встроенных языков. Такая функция отображается в виде блока в разделе справки Пользовательские блоки навигаторов FBD- и LD-редакторов.

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

Ограничения по использованию пользовательских блоков в основной программе на языке Техно ST описаны выше.

Аргумент типа вход порождает вход пользовательского блока, аргумент типа выход – выход. Аргумент типа вход/выход порождает одновременно вход и выход пользовательского блока.

  1. Описание используемых программных комплексов

Запуск инструментальной системы TRACE MODE 6 производится двойным щелчком левой кнопки (ЛК) мыши по иконке рабочего стола Windows или из меню «ПУСК/Все программы/Trace Mode 6/TRACE MODE IDE 6».

Конечным результатом работы инструментальной системы TRACE MODE 6 является набор файлов, предназначенных для исполнения задач АСУ в мониторах реального времени на АРМах и в контроллерах. В лабораторной работе в качестве МРВ для АРМ будет использоваться профайлер с поддержкой графических экранов rtc.exe, расположенный в директории инструментальной системы TRACE MODE 6. Профайлер позволяет запускать на компьютере с установленной инструментальной системой один узел разработанного проекта.

  1. Меры безопасности

Во время выполнения лабораторной работы необходимо:

  • соблюдать правила включения и выключения вычислительной техники;
  • не подключать кабели, разъемы и другую аппаратуру к компьютеру;
  • при включенном напряжении сети не отключать, не подключать и не трогать кабели, соединяющие различные устройства компьютера;
  • в случае обнаруженной неисправности в работе оборудования или нарушения правил техники безопасности сообщить руководителю лабораторной работы;
  • не пытаться самостоятельно устранить неисправности в работе аппаратуры;
  • по окончании работы приведите в порядок рабочее место.

ВНИМАНИЕ! При работе за компьютером необходимо помнить: к каждому рабочему месту подведено опасное для жизни напряжение. Поэтому во время работы надо быть предельно внимательным и соблюдать все требования техники безопасности!

  1. Задание

6.1. Проект, созданный в ходе выполнения лабораторной работы № 3, подготовить для выполнения лабораторной работы № 4 и сохранить в виде нового проекта.

6.2. В программу на языке FBD, реализующую динамическую модель системы управления, добавить пользовательский блок формирования уставки. Он должен:

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

6.3. Уставка во времени должна непрерывно циклически изменяться, последовательно проходя четыре фазы, и затем повторяя их без ограничения по времени. Длительность каждой фазы задается количеством тактов пересчета. Каждая фаза представляет собой типовое управляющее воздействие – либо ступенчатое воздействие, либо типовую функцию времени. Варианты заданий на параметры изменения уставки во времени приведены в табл.1.

Таблица 1. Варианты заданий на фазы изменения уставки

Номер варианта

Фаза 1

Фаза 2

Фаза 3

Фаза 4

1

Ступенчатое воздействие: величина 40%; длительность 50 тактов

Ступенчатое воздействие: величина 100%; длительность 60 тактов

Линейно изменяющееся воздействие от 100% до 20%; длительность 70 тактов

Синусоидальное воздействие: амплитуда 60%; длительность 150 тактов; 1 период

2

Ступенчатое воздействие: величина 60%; длительность 50 тактов

Ступенчатое воздействие: величина 20%; длительность 75 тактов

Синусоидальное воздействие: амплитуда 50%; длительность 120 тактов; 1.5 периода

Линейно изменяющееся воздействие от 20% до 80%; длительность 80 тактов

3

Ступенчатое воздействие: величина 80%; длительность 50 тактов

Линейно изменяющееся воздействие от 80% до 10%; длительность 60 тактов

Ступенчатое воздействие: величина 0%; длительность 70 тактов

Экспоненциальное воздействие от 10% до 50%; длительность 80 тактов

4

Ступенчатое воздействие: величина 100%; длительность 50 тактов

Синусоидальное воздействие: амплитуда 50%; длительность 200 тактов; 2 периода

Ступенчатое воздействие: величина 40%; длительность 60 тактов

Линейно изменяющееся воздействие от 40% до 100%; длительность 100 тактов

5

Ступенчатое воздействие: величина 20%; длительность 50 тактов

Экспоненциальное воздействие от 80% до 50%; длительность 60 тактов

Линейно изменяющееся воздействие от 20% до 50%; длительность 70 тактов

Ступенчатое воздействие: величина 80%; длительность 80 тактов

6

Ступенчатое воздействие: величина 40%; длительность 50 тактов

Синусоидальное воздействие: амплитуда 50%; длительность 100 тактов; 1.5 периода

Логарифмическое воздействие от 10% до 90%; длительность 80 тактов

Ступенчатое воздействие: величина 0%; длительность 70 тактов

6.4. Программу функционирования пользовательского блока реализовать на языке Техно ST.

6.5. Реализовать функционирование системы управления в реальном времени, снять переходные процессы в системе управления как реакцию на программно-управляемое изменение уставки.

  1. Методика выполнения задания

7.1. Для выполнения п. 6.1. задания проделать следующее. Открыть проект, созданный в ходе выполнения лабораторной работы № 3. Для аргументов программы FBD изменить тип параметров ПИД-регулятора и уставки на IN/OUT. В программе FBD создать глобальные переменные:

  • для номера фазы – целого типа с начальным значением 0;
    • для номера такта – целого типа с начальным значением 0;
    • для значения уставки – действительного типа с начальным значением 0.

Сохранить проект под новым именем.

7.2. Для выполнения п. 6.2 задания выполнить следующее. Изучить раздел Справки Программирование алгоритмов в TRACE MODE 6 – Создание пользовательских функциональных блоков. Создать в программе FBD пользовательский функциональный блок типа функции, значение функции типа REAL, язык программирования ST. Разместить блок функции на поле программы FBD. Осуществить привязку выхода блока к аргументу программы – значению уставки. Перепривязать вход блока сравнения к выходу блока функции. Для блока функции создать аргументы типа OUT, REAL для коэффициентов ПИД-регулятора и ограничений, привязать их к соответствующим аргументам программы. Все действия выполнять с промежуточным контролем правильности функционирования.

7.3. Для выполнения пп. 6.3, 6.4 задания выполнить следующее. Изучить раздел Справки Программирование алгоритмов в TRACE MODE 6 – Описание языка Техно ST. Разработать алгоритм формирования значения уставки. Составить программу для блока функции на языке Техно ST, отладить ее и откомпилировать.

Все действия выполнять с промежуточным контролем правильности функционирования.

7.4. Для выполнения п. 6.5 задания запустить выполнение проекта с помощью МРВ. Убедиться в правильности функционирования системы управления. Сделать скриншоты переходных процессов.

  1. Требования к содержанию и оформлению отчета

Отчет по лабораторной работе должен содержать:

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

  1. Контрольные вопросы

9.1. Какие языки программирования описывает стандарт IEC 61131-3?

9.2. Что собой представляет язык программирования Техно FBD?

9.3. Как в языке Техно FBD создаются пользовательские функции?

9.4. Что собой представляет язык программирования Техно ST?

9.5. Какие основные типы данных используются в языке Техно ST?

9.6. Какие основные конструкции языка Техно ST используются для организации ветвления в программах?

9.7. Какие основные конструкции языка Техно ST используются для организации циклов в программах?

9.8. Какие стандартные функции используются в языке Техно ST?

  1. Критерии оценки выполнения лабораторной работы

Лабораторная работа считается выполненной в том случае, если:

  • студент выполнил все задания в соответствии с представленной методикой;
  • результаты выполнения работы, представленные в виде отчета, соответствуют предъявленным к ним требованиям;
  • студент правильно ответил на все контрольные вопросы и может интерпретировать полученные результаты.

  1. Литература

Рекомендуемая литература [1 - 4].

Программирование алгоритмов управления в АСУ ТП с использованием TRACE MODE 6