Программирование в Trace Mode

SCADA–системы содержат специальные языки программирования, что позволяет разработчику описывать алгоритмы обработки измерительной информации, генерирования сигналов, управления процессом. Система Trace Mode поддерживает модифицированные языки стандарта IEC6113-3:

1. Texno ST (Structured Text);

2. Texno SFC (Sequential Function Chart);

3. Texno FBD (Function Block Diagram);

4. Texno LD (Ladder Diagram);

5. Texno IL (Instruction List).

 

 

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


значения в программу, следует выбрать тип IN, если для передачи из программы— OUT. В ряде случаев нужен аргумент, который будет передавать данный как в программу, так и из нее, тогда следует выбрать тип IN/OUT. Для обмена данными программой необходимо произвести привязку каждого аргумента программы к тому или иному каналу (аргументу канала). Помимо аргументов можно создать локальные и глобальные переменные.

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

 

Рис. 2.15. Окно редактирования программы

Для создания аргументов необходимо выделить строку аргументы в структуре программы. Откроется окно, изображенное на рис. 2.5. Создание аргументов описано выше (см. привязка аргументов). Для создания локальной или глобальной переменной необходимо выделить соответствующую строку в структуре программы. Откроется окно аналогичное созданию аргументов (аналогично рис. 2.5). Переменные создаются аналогично созданию аргументов. Отличие создания переменных заключается в невозможности привязки переменной к значению (атрибуту) канала.

Для написания программы необходимо выбрать строку программа в структуре программы. Будет предложен выбор языка(рис. 2.16). Следует выбрать необходимы язык и приступит к написанию программы.


 

Рис. 2.16 Выбор языка

 

 

Рассмотрим подробнее языки программирования Texno St и Texno FBD, TexnoIL, TexnoSFC..

 




Язык Texno ST

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

1. прописные и строчные буквы латинского алфавита;

2. цифры;

3. специальные знаки: + - * / < = >!: & | ^ ∼ % () [ ],; #.

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

Для данного языка характерны ключевые слова: 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.

В качестве разделителей используются лексемы: + - * ** / < <= <>

<< > >= >>!!= = ==::= & | ^ ∼ % () [ ]...,;.


Строчный комментарий начинается с «//» и продолжается до конца строки. Блочный комментарий начинается с «/*» и продолжается до «*/».

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

Выражение— последовательность операндов, разделителей и символьных операторов, задающая вычисление без присвоения результата.

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

В конце предложения обязательно должен стоять символ «;».

Исключением является определение переменной.

Программа на языке Texno ST можно представить в виде структуры:

 

 

PROGRAM

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

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

 

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

Язык Texno ST позволяет создавать константы. Рассмотрим их представление. Можно создать числовые и строковые константы.

Целочисленная десятичная константа начинается с цифры, отличной от нуля, после которой располагаются любые цифры. Можно привести следующие примеры целочисленных десятичных констант: 123, 350, 498.

Двоичная целочисленная константа начинается с префикса «2#», после которого приводится двоичное представление целого числа. Примеры: 2#1011, 2#0111, 2#1001.


Восьмеричные целочисленные константы начинаются с префикса «8#», после которого записывается восьмеричное представление числа. Примеры: 8#145, 8#0277, 8#756.

Шестнадцатеричные целочисленные константы начинаются с префикса

«16#», после которого приводятся шестнадцатеричные представления чисел. При записи шестнадцатеричного представления числа можно использовать как строчные символы a…f, так и прописные A… F. Примеры: 16#149, 16#A145E, 16#a145e.

Вещественная константа состоит из целой и дробной части. Допустимо наличие только целочисленной или дробной части. Примеры:.123, 0.456,

489.. Возможно представление в формате с плавающей точкой (используется префикс е или E с указанием порядка). Примеры: 1.23E-6, 6.7504E4, 6.798e-5.

Частным случаем числовой константы является временной интервал, дата, время дня. Временной интервал записывается в виде:

t#<дни>d<часы>h<минуты>m<секунды>s<миллисекунды>ms Возможна также запись в виде: time#<дни>d<часы>h<минуты>m<секунды>s<миллисекунды>ms

Любая составляющая в приведенных представлениях временного интервала может быть опущена. Временной интервал равной 2 часам, 31 минута, 25 секундам и 10 миллисекунд может быть записан как t#2h31m25s10ms или в виде time#2h31m25s10ms.

Дата записывается в виде d#<год>-<месяц>-<день>, возможна также запись в виде date#<год>-<месяц>-<день>. 25 сентября 2001 года может быть записано в виде d#2001-9-2001 или date#2001-9-2001.

Время дня можно записать в формате tod#<час>:<минута>:<секунда> или time_of_day#<час>:<минута>:<секунда>. Время 19 часов 15 минут 42 секунды может быть записано как tod#19:15:42, так и time_of_day#19:15:42.

Константа «дата и время» может быть записана как dt#<год>-<месяц>-

<день>-<час>:<минута>:<секунда>, так и date_and_time#<год>-<месяц>-

<день>-<час>:<минута>:<секунда>. К примеру, 12 февраля 1995 года 13 часов 47 минут и 13 секунд можно записать в виде dt#1995-2-12-13:47:13 или date_and_time#1995-2-12-13:47:13.


Помимо числовых констант часто используются строковые константы, которые представляют собой набор символов заключенных в одинарные или двойные кавычки. Пример: “Первая строка символов”, `Вторая строка символов`. В строках не могут присутствовать управляющие символы, кавычки и символ $. Для размещения в строке произвольного символа, включая управляющие, используется механизм эскейп-последовательностей. Данный механизм позволяет разместить в строке следующие последовательности:

$r— возврат каретки;

$n— перевод строки;

$t— табуляция;

$uХХХХ— UNICODE символ, где ХХХХ— шестнадцатеричный символ;

$х— символ х («х»— любой символ).

 

 

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

1. имена констант;

2. имена переменных;

3. имена массивов с указанием индекса отдельного элемента;

4. вызов пользовательских функций;

5. вызов библиотечных функций;

6. выражения, заключенные в скобки;

7. имена элементов структур.

Арифметические операторы приведены в таблице 2.6, побитовые— в таблице 2.7, операторы сравнения— в таблице 2.8, логические— в таблице 2.9.


Таблица 2.6

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

 

Оператор Действие
Унарный «-» Смена знака
Унарный «+» Пустая операция
«+» Сложение чисел или конкатенация строк
«-» Вычитание
«*» Умножение
«/» Деление
«%» Получение остатка от деления
«**» Возведение в степень

 

 

Таблица 2.7

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

 

Оператор Действие
«&» Побитовое «И»
«|» Побитовое «ИЛИ»
«^» или xor Побитовое «исключающее ИЛИ»
Унарная «-» Поразрядная инверсия
«<<» или shl Сдвиг влево на указанное число разрядов
«>>» или shr Сдвиг вправо на указанное число разрядов
rol Циклический сдвиг влево на

  указанное число разрядов
ror Циклический сдвиг вправо на указанное число разрядов

 

 

Таблица 2.8

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

 

Оператор Проверяемое условие
«==» Равенство
«!=» или «<>» Неравенство
«<» Меньше
«>» Больше
«<=» Меньше или равно
«>=» Больше или равно

 

 

Таблица 2.9

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

 

Оператор Действие
«&&» или and Логическое «И»
«||» или or Логическое «ИЛИ»
«!» или not Логическое отрицание

 

 

Оператор присваивания позволяет произвести присваивание значения переменной. Есть два синтаксиса оператора присваивания:

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

и


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

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

В таблице 5 приводится приоритет символьных операторов. Первыми будут выполняться выражения, заключенные в скобках, а затем в порядке возрастания номера строки в таблице 2.10.

 

Таблица 2.10

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

 

1 **
2 !, not, -, унарный –, унарный +
3 <<, >>, shl, shr, rol, ror
4 &, |, ^, xor
5 *, /, %, mod
6 +, -
7 ==,!=, <>, <, <=, >, >=
8 &&, and
9 ||, or
10 =,:=

 

 

В ST- программе можно использовать стандартные функции языка С: sin, cos, tan, asin, exp, log. Для работы с портом и каналом есть специальные функции в среде Trace Mode, о которых можно найти информацию в справке системы.

Помимо символьных операторов есть следующие операторы:

1. return

2. if


3. case

4. while

5. repeat

6. for

7. break

8. exit

9. continue

10. операторы определения переменных 11.операторы индексирования элементов массива 12.got

Для разветвления алгоритма используется оператор if. Данный оператор всегда начинается с ключевого слова if и заканчивается ключевым словом end_if Существует три варианта задания данного оператора. Первый вариант:

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

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

Второй вариант задания оператора if имеет вид:

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

end_if;

Во втором варианте задания оператора if проверяется выражение. Если оно истинно, то выполняется последовательность предложений 1, в противном случае— последовательность предложений 2.

Третий вариант оператора if имеет вид:

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


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

elseif {выражение N} then {последовательность предложений N}; else {последовательность предложений N+1};

end_if;

В последнем варианте оператора if выполняется i -ая последовательность предложений в том случае, если i -ое выражение истинно. Если все выражения ложны, то выполняется последовательность предложений, которая идет после ключевого слова else.

Язык Texno ST содержит оператор выбора case. Оператор начинается с ключевого слова case и заканчивается ключевым словом end_case. Первый вариант оператора сase можно представить следующим образом:

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

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

 

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

 

end_case;

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

Второй вариант оператора case можно представить следующим образом: case {выражение} of

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

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

end_case;


Отличие второй формы записи оператора case от первой заключается в том, что если результат вычисления выражения не найден ни в одном из списков значений, то выполняется последовательность предложений после ключевого слова else. В первом случае при отсутствии результата вычислений в списках значений приведенные в операторе последовательности предложений не выполняются.

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

{нижняя граница диапазона}.. {верхняя граница диапазона}

Язык Texno ST позволяет создавать циклы используя операторы while, repeat, for. Синтаксис оператора while имеет вид:

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

В данном операторе последовательность выражений выполняется пока выражение истинно. Каждый раз перед выполнением последовательности предложений производится проверка выражения.

Оператор repeat можно представить в виде:

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

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

Цикл for можно представить в виде:

for {имя переменной}:= {выражение 1} to {выражение 2} by

{выражение 3} do {последовательность предложений}; end_for;

Данный оператор сперва присваивает переменной цикла с указанным именем результат вычисления выражения 1, выполняет последовательность предложений, если вычисленная переменная цикла не превысит значение


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

Операторы break и exit позволяют выйти из текущего цикла.

Оператор continue служит для перехода в конец цикла. При его вызове все следующие за ним до конца цикла предложения не выполняются.

Рассмотрим создание программы на языке Texno ST. Допустим, созданы аргументы, глобальная переменная (рис. 2.17, 2.18) После выбора языка откроется окно, изображенное на рис. 2.19. Все созданные аргументы, и локальные переменные будут описаны в начале программы. Глобальные переменные в отличие от локальных в самой программе не описываются, но без проблем могут использоваться как операнды.

 

Рис. 2.17 Аргументы программы

 

Рис. 2.18 Глобальные переменные программы


 

Рис. 2.19 Окно для создания программы

 

 

Произведем деление аргумента X на аргумент Y, произведя проверку на равенство Y нулю. Результат присвоим аргументу Z. Аргументу Sum присваивается сумма всех результатов деления. Программа будет следующая:

PROGRAM

VAR_INPUT X: REAL; END_VAR VAR_INPUT Y: REAL; END_VAR VAR_OUTPUT Z: REAL; END_VAR VAR_INOUT Sum: REAL; END_VAR

 

if Y == 0 then Z = X / 1e-9; else Z = X / Y;

end_if;

Sum = S+ Z;

S = Sum; END_PROGRAM


После того, как написали текст программы необходимо проверить ее. Для этого нажмем на иконку «компиляция» . В окне «сообщения» будет выведен результат компиляции. Если окно «сообщения» закрыто, то следует щелкнуть по иконке  или выбрать в меню «вид» окно сообщения. Если, к примеру, не хватает запятой в программе, компилятор сообщит об ошибке (рис. 2.20). При отсутствии ошибок

 

Рис. 2.20 Пример ошибки

При отсутствии ошибок будет написано: «Программа#1.tms compiled successfully», к примеру.

 

 
















Язык Texno FBD

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

Функциональный блок— изображение вызова функции Texno ST. В качестве примера рассмотрим функциональный блок, производящий сложение. Изображение его приведено на рис. 2.21.

 

Рис. 2.21 Функциональный блок Texno ST

В верхней части блока указывается обозначение блока. Внизу выводится его номер. Номера блоком приписываются автоматически при их размещении в рабочем поле редактора программы. После двоеточия


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

Горизонтальные линии, расположенные слева, выступают в качестве входов, на которые подается та или иная описанная локальная или глобальная переменная, аргумент программы, выходы с других функциональных блоков. На вход можно подать аргументы, тип которых In или In/Out. У каждого входа указываются его название. В указанном примере названия: X, Y. Безымянный вход, расположенный сверху, управляет выполнением блока: блок выполняет действие (в данном случае сложение) в том случае, если подается 0 или вход не подключен, в противном случае функциональный блок не выполняется.

Горизонтальная линия справа обозначает выход, содержащий результат выполнения функционального блока. Выход можно соединить с входом другого функционального блока. Выход функционального блока можно привязать к описанной глобальной или локальной переменной, аргументу, тип которого Out или In/Out.

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

(рис. 2.22). В данном окне выбирается нужная закладка (логические, побитовые, арифметические) в соответствии с тематикой нужного блока. В окне отображается ряд блоков, относящихся к данной тематике. Среди этих блоков отыскивается нужный блок и перетаскивается на поле редактора программы с использованием механизма drag-and-drop. То есть, курсор наводится на необходимый функциональный блок. Нажимается левая клавиша мыши. Блок «перетаскивается» на рабочее поле в нужное место при нажатой левой клавише мыши. Когда курсор переведен в положение, где должен располагаться функциональный блок левая клавиша отпускается.


 

Рис. 2.22 Окно FBD блоки

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

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

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


 

Рис. 2.23 Привязка входа (выхода) функционального блока

Создание константы рассмотрим на примере создания константы равной 1e-9. Для этого следует выделить вход, на который необходимо подать константу, вызываем контекстное меню и выбираем привязать. Будет выведено окно, как указано на рис. 2.23. В появившемся окне вместо выбора аргумента или переменной вводится значение константы. В данном случае вводится «1е-9».

В качестве примера приведена реализация примера программы, написанной на языке Texno ST, используя язык Texno FBD (рис. 24).

 

Рис. 2.24 Пример FBD программы








ЯзыкTexno SFC

SFC язык позволяет создавать программу, оперируя шагами и переходами. Под шагом следует понимать подпрограмму, написанную на одном из языков, доступных в среде Trace Mode, и выполняющую то или иное действие. Переход— условие, при выполнении которого выполняется определенный шаг. На рис. 2.25 изображены условные графические изображения шага и перехода

     
 

а) шаг                                 б) переход

Рис. 2.25 Условные графические изображения шага и перехода Пример SFC программы приведен на рис. 2.26. Направление перехода от

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

 

Рис. 2.26 SFC программа

Каждый шаг и переход можно выделить. Выделенный шаг (переход) отображается синим цветом. При выделении перехода выделяется дополнительно линия перехода, на которую распространяется условие


перехода. Можно выделить линию перехода. Выделенная линия изображается красным цветом. Линия перехода выделяется вместе с переходом, действующим на данной линии перехода и расположенной выше других переходов на выделенной линии перехода. Шаг (переход) можно переименовать, выделив его и дважды щелкнув левой клавишей мыши по нему, после чего можно ввести новое имя шага (перехода).

Рассмотрим подробнее создание SFC диаграммы. Объект программа, аргументы и переменные программы создаются аналогично другим программам. Окно для создания SFC диаграммы представлено на рис. 2.27.

 

Рис. 2.27 Окно создания SFC диаграммы

Видно из рис. 2.27, что в новой SFC диаграмме присутствует один единственный шаг. Для создания нового шага надо выделить шаг, предшествующий ему. Можно либо щелкнуть левой клавишей мыши на иконке  или вызвать контекстное меню и выбрать создать шаг/переход. Будет создан новый шаг, выполняемый после выделенного ранее шага, и переход, определяющий условие перехода к вновь созданному шагу.

Результат создания нового шага приведен на рис. 2.28, а. Если существовал шаг, выполняемый после выделенного блока, то произойдет ветвление после создания нового шага (рис..2.28, б).

В ряде случаев необходимо зацикливание. Произведем зацикливание начального шага (рис. 2.28, а). Шаг 1 будет выполняться после выхода из цикла. Для зацикливания наведем курсор на нижний край блока, которым завершается тело цикла (в данном случае нижний край начального шага), нажмем на левую клавишу мыши. Наведем курсор мыши на верхний край блока, с которого начинается тело цикла (в данном случае верхний край начального шага) и отпустим клавишу мыши. Если все было правильно сделано, получится цикл (рис. 2.29). Условием выполнения цикла выступает переход, созданный вместе с циклом.


 

а) новый шаг               б) новый шаг с ветвлением Рис. 2.28 Результат создания нового шага

 

 

 

 

Рис. 2.29 Цикл на SFC диаграмме

Рассмотрим создание параллельного шага. Для создания шага, выполняемого параллельно какому-либо определенному шагу (параллельно шагу1, к примеру) следует выделить переход или линию выходящую из него, который определяет условие выполнения параллельных шагов (в данном случае переход 0— условие выполнение шага 1), щелкнуть левой клавишей мыши на иконке  или вызвать контекстное меню и выбрать создать шаг/переход. Будет создан новый шаг (рис. 2.30), выполняемый параллельно другому шагу, переход к которому был выделен при создании нового шага.

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


1. Тогда необходимо нажать левую клавишу мыши на нижнем крае шага, параллельного шагу 1 (шаг 2), переместить курсор, не отпуская клавиши мыши, на переход, определяющий условие вызова шага 3 или на линию перехода, отпустить клавишу мыши. Если все было правильно сделано, шаги 1 и 2 будут подключены параллельно.

После создания диаграммы необходимо описать каждый шаг или переход (произвести редактирование шага или перехода). Каждый шаг и переход— программа, написанная на одном из языков среды Trace Mode. Для редактирования шага (перехода) необходимо выделить соответствующий шаг (переход), щелкнуть левой клавишей мыши на иконке  или вызвать контекстное меню и выбрать редактировать. Будет предложен выбор программ, среди которых следует выбрать язык программирования, на котором будет описан данный шаг (условие перехода). Можно раскрыть раздел SFC диаграмма в навигаторе проекта. Появится раздел шаги и переходы, которые содержат все шаги и переходы программы. Раскрыв данные разделы и выбрав необходимый шаг (переход) можно произвести редактирование шага (перехода). После выбора шага или перехода в разделе шаги или переходы будет предложен выбор языка. После выбора языка можно приступить к написанию подпрограммы.

 

Рис. 2.30 Созданный параллельный шаг

В качестве примера рассмотрим деление суммы аргументов X0 и X1 на аргумент Y с проверкой на равенство аргумента Y нулю. В случае равенства


аргумента Y нулю произведем деление на константу 10-9,результат деления присвоим аргументу Z. Программы будет также вычислять сумму всех результатов деления Sum. Первый шаг будет заключаться в нахождении суммы аргументов X0 и X1. Второй шаг— деление на Z, при условии перехода: Z не равен нулю. Третий шаг— деление на константу, 10-9при условии: Z равен нулю. Аргументы программы приведены на рис. 2.31.

Поскольку необходимо передать результат сложения из первого шага, выполняющего сложение X0 и X1, то создадим локальную переменную шаг1 (рис. 2.32). Так как необходимо найти суммы всех вычисленных отношений, создадим глобальную переменную S, хранящую предыдущую сумму всех найденных отношений (рис. 2.33).

 

 

 

 

Рис. 2.31 Аргументы программы примера

 

Рис. 2.32 Локальная переменная примера

 

Рис. 2.33 Глобальная переменная примера

SFC диаграмма изображена на рис. 2.34. Каждый шаг и переход выполним, используя язык Texno ST.


 

Рис. 2.33 SFC диаграмма примера

Первый шаг, производящий сложение аргументов Х0 и Х1 примет вид: SFC_STEP "Сложение Х0 и Х1"

VAR_INPUT Y: REAL; END_VAR VAR_OUTPUT Z: REAL; END_VAR VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

Шаг1 = X0 + X1;

 

 

END_SFC_STEP

 

 

Переход к шагу, вычисляющему деление на Z примет вид: SFC_TRANSITION "Z!= 0" FROM(INITIAL_STEP) TO(STEP_1) VAR_INPUT Y: REAL; END_VAR

VAR_OUTPUT Z: REAL; END_VAR


VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

Z!= 0

 

 

END_SFC_TRANSITION

Внимание: следует обратить внимание на то, что после записанного условия точка с запятой не ставится!

Сам шаг, производящий деление на Z примет вид: SFC_STEP "(Х0+Х1)/Z"

VAR_INPUT Y: REAL; END_VAR VAR_OUTPUT Z: REAL; END_VAR VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

Sum = S + Шаг1 / Z; S = Sum;

 

END_SFC_STEP

 

 

Переход к шагу, производящему деление на константу 10-9 примет вид:


SFC_TRANSITION "Z == 0" FROM(INITIAL_STEP) TO(STEP_2) VAR_INPUT Y: REAL; END_VAR

VAR_OUTPUT Z: REAL; END_VAR VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

Z == 0

 

 

END_SFC_TRANSITION

Шаг, производящий деление на константу 10-9 примет вид: SFC_STEP "(X0+X1)/1e-9"

VAR_INPUT Y: REAL; END_VAR VAR_OUTPUT Z: REAL; END_VAR VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

Sum = S + Шаг1 / 1e-9; S = Sum;

 

END_SFC_STEP


















Язык Texno IL

Программа на языке Texno IL— последовательность инструкций. Каждая инструкция начинается с новой строки, содержит оператор с модификатором, в случае некоторых операторов приводится один или более операндов. Компилятор не чувствителен к регистру. Инструкции ADD 10 15 и Add 10 15 равнозначны.

В данном языке вводится понятие аккумулятора, под которым следует понимать хранилище текущего результата.

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

1. переменные;

2. константы (см. язык Texno ST);

3. имя метки;

4. имя функции.

Под модификатором следует понимать литеры N, C, X, которые приписываются справа к имени некоторых операторов. Модификатор N обозначает логическое отрицание операнда, С обозначает, что инструкция выполняется, если результат предыдущей операции сравнения истинен, модификатор X указывает на то, что инструкция выполняется, если аккумулятор содержит значение true.

Пример использования модификатора:

OR b//аккумулятор ИЛИ b

ORN b// аккумулятор ИЛИ НЕ b

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

Пример двухадресного режима:


ADD 10 15//сложение 10 и 15

Пример того же сложения при одноадресном режиме: LD 10//присвоение аккумулятору числа 10

ADD 15//сложение 10 и 15

Рассмотрим операторы языка Texno IL. Операторы для обмена с аккумулятором приведены в таблице 2.11.

 

Таблица 2.11

Операторы для обмена с аккумулятором

 

Обозначение оператора Синтаксис оператора Допустимые модификаторы Действие
  LD LD {операнд}   N присваивает аккумулятору значение операнда
ST ST {операнд} N присваивает операнду значение аккумулятора

 

 

Пример обмена данными с аккумулятором:

LD X//присвоение аккумулятору операнда Х

MULT K//Умножение X на K

ST X//присвоение операнду Х значения, хранящегося в аккумуляторе. Логические операторы приведены в таблице 2.12

Таблица 2.12

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

 

Обозначение оператора Синтаксис оператора Допустимые модификаторы Действие
S S {операнд} присваивает операнду значение

      true
  R   R {операнд}   — присваивает операнду значение false
AND AND {операнд 1} {операнд 2} N логическое «И»
OR OR {операнд 1} {операнд 2} N логическое «ИЛИ»
  XOR XOR {операнд 1} {операнд 2}   N Логическое «исключающее ИЛИ»

 

 

Пример логических операций:

S X//присвоение операнду X значения true R Y//присвоение операнду Y значения false AND X Y//X «И» Y

 

 


Арифметические операторы приведены в таблице 2.13.

 

 

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


 

 

Таблица 2.13


 

Обозначение оператора Синтаксис оператора Допустимые модификаторы Действие
  ADD ADD {операнд 1} {операнд 2}   — сложение операндов
  SUB SUB {операнд 1} {операнд 2}   — вычитание операнда 2 из операнда 1

  MUL MUL {операнд 1} {операнд 2}   — произведение операндов
DIV DIV {операнд 1} {операнд 2} Деление операнда 1 на операнд 2

 

 


Пример выполнения арифметических операций: MUL X K

ADD C

Операторы сравнения приведены в таблице 2.14.

 

 

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


 

Таблица 2.14


 

Обозначение оператора Синтаксис Допустимые модификаторы Действие
  GT GT {операнд 1} {операнд 2}   — возвращает true, если операнд 1 больше операнда 2
  GE GE {операнд 1} {операнд 2}   — возвращает true, если операнд 1 не меньше операнда 2
  EQ EQ {операнд 1} {операнд 2}   — возвращает true, если операнд 1 равен операнду 2
  NE NE {операнд 1} {операнд 2}   — возвращает true, если операнд 1 неравен операнду 2
  LE LE {операнд 1} {операнд 2}   — возвращает true, если операнд 1 не больше операнда 2

  LT LT {операнд 1} {операнд 2}   — возвращает true, если операнд 1 меньше операнда 2

 

 

Операторы перехода и вызова функций приведены в таблице 2.15.

Таблица 2.15

 

Операторы перехода и вызова

 

Обозначение оператора Синтаксис Допустимые модификаторы Действие
JMP JMP {метка} С, Х переход к строке с указанной меткой
  CAL CAL {имя функции (параметры)}   С, Х   Вызов функции
RET RET С, Х Выход из программы

 

Возможны следующие модификации операторов перехода и вызова:

JMPC— условный переход, выполняемый если результат предыдущей операции сравнения истинен;

JMPX— условный переход, выполняемый если аккумулятор содержит значение true;

CALC— условный вызов функции, выполняемый если результат предыдущего сравнения истинен;

CALX— условный вызов функции, выполняемый если аккумулятор содержит значение true

RETC— условный выход из программы, выполняемый если результат предыдущей операции сравнения истинен;


RETX— условный выход из программы, выполняемый, когда аккумулятор содержит значение true.

Пример выполнения сравнения и перехода:

EQ Z 0//проверка на равенство Z нулю

JMPC label//при равенстве нулю переход к строке с меткой label

label: LD 1e-9//присвоение аргументу Z значения 10-9 ST Z

 

Рассмотрим реализацию примера деления, приведенного на языке Texno SFC, с использованием языка Texno IL. Поскольку существует оператор S в языке Texno IL, глобальную переменную переименуем с S на Sum0. Тогда программа на языке Texno IL примет вид:

PROGRAM

VAR_INPUT Y: REAL; END_VAR VAR_OUTPUT Z: REAL; END_VAR VAR_OUTPUT Sum: REAL; END_VAR VAR_INPUT X0: REAL; END_VAR VAR_INPUT X1: REAL; END_VAR VAR Шаг1: REAL:= 0; END_VAR

 

ADD X0 X1//Сложение аргументов

ST Шаг1//присвоение результата сложения переменной Шаг1 NE Y 0//Проверка на равенство нулю

JMPC Деление_на_Y//Переход к делению на Z, если Z не равен нулю

//Деление на 1е-9


DIV Шаг1 1e-9

ST Z//присвоение аргументу Z вычисленного отношения

JMP Сложение//Переход к сложению Деление_на_Y: DIV Шаг1 Y//деление на Z

ST Z//присвоение аргументу Z вычисленного отношения

Сложение: ADD Z Sum0//Получение суммы всех результатов отношения

ST Sum0//присвоение суммы всех результатов сложения аргументу

Sumи глобальное переменной S и глобальное переменной S ST Sum

 

END_PROGRAM

 

 














Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: