- •Оглавление
- •Общая структура системы Trace Mode 6
- •Инструментальная система
- •Языки программирования Trace Mode 6
- •Промышленная база данных реального времени
- •Исполнительные модули Trace Mode6.
- •Последовательные порты
- •Словари сообщений
- •Шаблоны
- •Источники/Приемники
- •Наборы ресурсов и графические объекты
- •Описание fbd блоков.
- •Описание языка TehnoIl:
- •If {выражение} then {последовательность предложений} end_if
- •If {выражение} then {последовательность предложений1}
- •If {выражение1} then {последовательность предложений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
Числовые константы |
Десятичные целочисленные константы состоят из ненулевой цифры, за которой следует последовательность десятичных цифр:
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 января 1971 года до 0 часов заданной даты.
Время дня состоит из префикса tod# или time_of_day#, за которым следует запись в виде hh:mm:ss (час, минута, секунда). Приводится к целочисленному виду, означающему количество секунд, прошедшее с 0 часов текущего дня.
Константа "Дата и время" состоит из префикса dt# или date_and_time#, за которым следует запись в виде yyyy-mm-dd-hh:mm:ss (год, месяц, день, час, минута, секунда). Приводится к целочисленному виду, означающему количество секунд, прошедшее с 0 часов 1 января 1971 года до заданных даты и времени.
Строковые константы |
Строковые константы представляют собой набор символов, заключенных в одинарные или двойные кавычки: ’первая строка’, "вторая строка". В строке недопустимы управляющие символы, включая переводы строки, а также кавычки и символ $.
Для размещения в строках произвольных символов применяется механизм эскейп-последовательностей, начинающихся с символа $. Определены следующие последовательности:
$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
