программирование ПЛКуроки

Операторы языка программирования ST

Опубликовано
CoDeSys и ОВЕН

Мы продолжаем изучать программирование ПЛК ОВЕН в универсальной среде программирования CoDeSys. В этой публикации описаны операторы языка программирования ST (структурированный текст). С предыдущей публикацией по программированию ПЛК, посвященной знакомству с модификаторами и операторами языка IL (список инструкций), можно ознакомиться здесь.

Язык ST (Structured Text) — это язык высокого уровня. Синтаксически ST представляет собой несколько адаптированный язык Паскаль. Вместо процедур Паскаля в ST используются компоненты программ стандарта МЭК.

Для специалистов, знакомых с языком С, освоение ST также не вызовет никаких сложностей.

В большинстве комплексов программирования ПЛК язык ST по умолчанию предлагается для описания действий и условий переходов SFC. Это наилучшее сочетание языков, позволяющее эффективно решать любые задачи.

Стандартные операторы и реализация последовательного управления

Основой ST-программы служат выражения. Результат вычисления выражения присваивается переменной при помощи оператора «:=», как и в Паскале. Каждое выражение обязательно заканчивается точкой с запятой «;». Выражение состоит из переменных констант и функций, разделенных операторами:

dblVar := 1 + intVar / abs(intVar);

Стандартные операторы в выражениях ST имеют символьное представление, например математические действия: +, *, /, операции сравнения и т. д.

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

dblVar := 1 + (*получить знак*) intVar / abs(intVar); (*проверка на 0 была выше*)

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

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

Тип выражения определяется типом результата вычислений:

blnAlarm := byInp1 > bylnp2 AND bylnp1 + bylnp2 <> 0 OR blnAlarm2;

Вычисление выражения происходит в соответствии с правилами приоритета операций. Первыми выполняются операции с наивысшим приоритетом.

ОперацияОбозначениеПриоритет
Выражение в скобках(выражение)Самый высокий
Вызов функцииимя_функции(список_параметров)
Возведение в степеньEXPT
Замена знаков
Числовое дополнениеNOT
Умножение*
Деление/
Деление по модулюMOD
Сложение+
Вычитание
Сравнение<, >, <=, >=
Неравенство<>
Равенство=
Логическое ИAND
Логическое исключающее ИЛИXOR
Логическое ИЛИORСамый низкий
Список ST операторов, расположенных в порядке приоритета

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

Пустое выражение состоит из точки с запятой «;». Для точки с запятой транслятор не генерирует никакого кода. Если случайно поставить лишнюю «;», это не вызовет ошибки.

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

Оператор IF

Оператор выбора (IF) позволяет выполнить различные группы выражений в зависимости от условий, выраженных логическими выражениями. Полный синтаксис оператора IF (если) выглядит так:

IF <логическое_выражение_IF> THEN
<выражения_IF>;
{
ELSIF <логическое_выражение_ELSEIF_1> THEN
<выражения_ELSEIF_1>;

ELSIF <логическое_выражение_ELSEIF_n> THEN
<выражения_ELSEIF_n>;
ELSE
<выражения_ELSE>;
}
END_IF;

Если <логическое_выражение_IF> ИСТИНА, то выполняются выражения первой группы — <выражения_IF>. Прочие выражения пропускаются, альтернативные условия не проверяются.

Часть конструкции в фигурных скобках является необязательной и может отсутствовать.

Если <логическое_выражение_IF> ЛОЖЬ, то одно за другим проверяются условия ELSIF. Первое истинное условие приведет к выполнению соответствующей группы выражений. Прочие условия ELSIF анализироваться не будут. Групп ELSIF может быть несколько или не быть совсем.

Если все логические выражения дали ложный результат, то выполняются выражения группы ELSE, если она есть. Если группы ELSE нет, то не выполняется ничего.

Например:
IF temp < 17
THEN heating_on: = TRUE;
ELSE heating_on: = FALSE;
END_IF
В этом примере нагревание (heating) включается, когда температура опустится ниже 17 º градусов, иначе оно останется выключенным.

Оператор выбора CASE

C помощью инструкции CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.

Полный синтаксис оператора CASE выглядит следующим образом:

CASE <переменная> OF
<значение1>: <выражения_1>
<значение2>: <выражения_2>
<значение3, значение4, значение5>: <выражения_3>
<значение6 .. значение10>: <выражения_4>

<значение_n>: <выражения_n>
ELSE <выражения_ELSE>
END_CASE;

Инструкция CASE выполняется согласно следующим правилам:

  • Если переменная <переменная> имеет значение <значение_i>, то выполняется инструкция <выражения_i>.
  • Если <переменная> не принимает ни одного из указанных значений, то выполняется <выражения_ELSE>.
  • Чтобы одна и та же инструкция выполнялась при различных значениях переменной <переменная>, необходимо перечислить эти значения через запятую.
  • Чтобы одна и та же инструкция выполнялась для целого диапазона значений, необходимо указать начальное и конечное значения, разделенные двумя точками.

Например:
CASE intVar OF
1, 5: blnVar1 : = TRUE; blnVar3 : = FALSE;
2: blnVar2 : = FALSE; blnVar3 : = TRUE;
10 .. 20: blnVar1: = TRUE; blnVar3:= TRUE;
ELSE
blnVar1 := NOT blnVar1;
blnVar2 := blnVar1 OR blnVar2;
END_CASE;

Операторы циклического управления

Цикл FOR

Цикл FOR обеспечивает заданное количество повторений группы выражений. Синтаксис:

FOR <целочисленный_счетчик> := <начальное_значение> ТО <конечное_значение> {BY <шаг>} DO
<выражения — тело цикла>
END_FOR

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

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

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

Пример:
intVar := 0;
FOR cw := 1 ТО 10 DO
intVar := intVar + 1;
END_FOR

Данный цикл будет выполнен 10 раз и соответственно intVar будет иметь значение 10.

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

Для построения правильного цикла достаточно соблюдать два простых формальных требования:

  • не изменяйте счетчик цикла и условие окончания в теле цикла. Счетчик и переменные, образующие конечное условие в цикле, можно использовать только для чтения;
  • не задавайте в качестве конечного условия максимальное для типа переменной счетчика значение. Так, если для однобайтного целого без знака задать константу 255, то условие окончания не будет выполнено никогда. Цикл станет бесконечным.

Цикл WHILE

Циклы WHILE обеспечивает повторение группы выражений, пока верно условное логическое выражение.

Синтаксис WHILE:
WHILE <условное_логическое_выражение> DO <выражения —
тело цикла>
END_WHILE

Условие в цикле WHILE проверяется до начала цикла. Раздел <выражения> выполняется циклически до тех пор, пока <условное_логическое_выражение> дает ИСТИНА (TRUE). Если логическое выражение изначально имеет значение ЛОЖЬ (FALSE), тело цикла не будет выполнено ни разу. Если <условное_логическое_выражение> никогда не примет значение ЛОЖЬ (FALSE), то раздел <выражения> будет выполняться бесконечно.

Пример:
ci := 64;
intVar := 0;
WHILE ci > 1 DO
intVar := intVar + 1;
ci := ci / 2;
END_WHILE

Цикл REPEAT

Циклы REPEAT также, как и цикл WHILE, обеспечивает повторение группы выражений, пока верно условное логическое выражение. Цикл REPEAT отличается от цикла WHILE тем, что первая проверка условия выхода из цикла осуществляется, когда цикл уже выполнился 1 раз. Это означает, что независимо от условия выхода цикл выполняется хотя бы один раз.

Синтаксис REPEAT:
REPEAT
<выражения — тело цикла >
UNTIL <условное_логическое_выражение>
END_REPEAT

Условие в цикле REPEAT проверяется после каждого выполнения тела цикла. Раздел <выражения> выполняется циклически до тех пор, пока <условное_логическое_выражение> дает ИСТИНА (TRUE). Если логическое выражение изначально имеет значение ЛОЖЬ (FALSE), тело цикла будет выполнено один раз. Если <условное_логическое_выражение> никогда не примет значение ЛОЖЬ (FALSE), то раздел <выражения> будет выполняться бесконечно.

Оператор EXIT и RETURN

Оператор EXIT, помещенный в теле циклов WHILE, REPEAT и FOR, приводит к немедленному окончанию цикла. Хороший стиль программирования призывает избегать такого приема, но иногда он
весьма удобен.

Оператор RETURN осуществляет немедленный возврат из POU. Это единственный способ прервать вложенные итерации без введения дополнительных проверок условий. Оператор RETURN выполняется очень быстро, фактически это одна машинная команда процессора.

Иногда бывает удобно создать безусловный цикл, а условия выхода формировать в теле цикла с использованием EXIT. Например, могут потребоваться несколько равновероятных, но невзаимосвязанных условий выхода из цикла. Создать безусловный (бесконечный) цикл в ST проще всего так:
WHILE TRUE DO

Вызов функционального блока в ST

Функциональный блок вызывается с помощью имени экземпляра функционального блока и списка входных параметров с присваиванием данных в круглых скобках. В следующем примере вызывается таймер с параметрами IN и PT. Значение выходной переменной Q присваивается переменной А.

К выходной переменной, как и в IL, можно обратиться с помощью имени экземпляра функционального блока, точки, следующей за ним и имени выходной переменной:

CMD_TMR (IN: = %IX5, PT: = 300);
A: =CMD_TMR.Q


В этой статье мы познакомились с операторами языка программирования ST (структурированный текст), используемыми в проектах CoDeSys. На следующем уроке начнем разбираться с операторами языка программирования LD (релейные диаграммы), используемыми в проектах CoDeSys.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *