Structured Text, или ST, - это текстовый язык программирования промышленных контроллеров. Он входит в семейство языков IEC 61131-3 и позволяет создавать алгоритмы управления с помощью переменных, условий, циклов, функций и функциональных блоков. В отличие от графических языков LD и FBD, программа на ST записывается в виде структурированного текста, поэтому особенно удобна для математических расчётов, обработки массивов, рецептур, диагностических сообщений и сложной логики.
Для начинающего специалиста Structured Text может показаться похожим на обычное программирование. Однако у него есть важная особенность: программа работает не сама по себе, а внутри циклической задачи ПЛК. Контроллер регулярно считывает входы, выполняет код и передаёт рассчитанные значения на выходы.
Почему инженеры изучают Structured Text
В простых системах управления можно использовать релейно-контактные схемы или функциональные блоки. Но по мере усложнения оборудования графическая программа начинает быстро разрастаться. Сотни контактов, соединений и блоков становятся трудными для чтения и сопровождения.
Structured Text позволяет компактно описывать:
- математические формулы;
- обработку аналоговых сигналов;
- массивы и структуры данных;
- последовательности технологических операций;
- конечные автоматы;
- алгоритмы диагностики;
- управление несколькими одинаковыми механизмами;
- обмен данными с HMI, SCADA и промышленными сетями.
Язык поддерживает условные конструкции IF...THEN...ELSE, многовариантный выбор CASE и циклы FOR, WHILE, REPEAT. Именно поэтому он подходит как для небольших программ, так и для сложных функциональных блоков.
Например, условие включения насоса можно записать так:
IF xStart AND xLevelOk AND xProtectionOk THEN
xPumpCommand := TRUE;
ELSE
xPumpCommand := FALSE;
END_IF;
Здесь контроллер включает насос только при наличии команды запуска, нормальном уровне и исправной защите.
Как работает программа ПЛК
ПЛК выполняет пользовательскую программу циклически. Упрощённо один цикл можно представить так:
- Контроллер считывает сигналы с входов.
- Значения входов передаются в программу.
- Выполняются инструкции Structured Text.
- Рассчитываются управляющие сигналы.
- Результаты передаются на физические выходы.
- Цикл повторяется.
Поэтому программа ПЛК отличается от обычного приложения для компьютера. Она не запускается один раз и не завершается после выполнения последней строки. Контроллер постоянно повторяет задачу с заданным периодом.
Например, если к входу подключён датчик уровня, программа в каждом цикле проверяет его состояние:
IF xLevelLow THEN
xPumpCommand := FALSE;
ELSE
xPumpCommand := TRUE;
END_IF;
Если уровень стал ниже допустимого, насос отключается. При этом важно учитывать не только синтаксис, но и физику процесса: задержки, инерционность оборудования, аварийные состояния и безопасное поведение при отказе датчика.
Переменные и типы данных
В Structured Text каждая переменная должна иметь тип. Это помогает компилятору обнаруживать ошибки ещё до загрузки программы в контроллер.
Наиболее распространённые типы:
|
Тип |
Назначение |
|
BOOL |
логическое состояние: TRUE или FALSE |
|
INT |
знаковое целое число |
|
DINT |
расширенное целое число |
|
UINT |
беззнаковое целое число |
|
REAL |
вещественное число |
|
LREAL |
вещественное число повышенной точности |
|
WORD |
16-битное слово для битовых операций |
|
DWORD |
32-битное слово |
|
STRING |
текстовая строка |
|
TIME |
интервал времени |
Пример объявления переменных:
VAR
xSystemEnable : BOOL := FALSE;
iStep : INT := 0;
rTemperature : REAL := 20.0;
tDelay : TIME := T#5s;
END_VAR
В этом примере:
- xSystemEnable хранит разрешение работы;
- iStep содержит номер текущего шага;
- rTemperature хранит температуру;
- tDelay задаёт временную задержку пять секунд.
Правильный выбор типа имеет практическое значение. Если для счётчика деталей выбрать слишком маленький тип, он может переполниться. Если аналоговое значение обрабатывать как целое число, можно потерять дробную часть.
Операторы и синтаксис
Основой ST является оператор присваивания:
xMotorOn := TRUE;
Важное правило: в Structured Text присваивание обозначается как :=, а одиночный знак = используется для сравнения.
xMotorOn := TRUE; // присваивание
xReady := xState = 3; // сравнение
Каждая завершённая инструкция обычно заканчивается точкой с запятой.
Пример математического расчёта:
rPower := rVoltage * rCurrent;
Пример логической проверки:
xReady := xPressureOk AND xTemperatureOk AND NOT xEmergencyStop;
Пример ограничения значения:
rOutput := LIMIT(0.0, rCommand, 100.0);
Такой подход полезен для аналоговых выходов: управляющий сигнал не выйдет за пределы от 0 до 100 процентов.
Условия и режимы работы
В промышленной автоматизации оборудование часто имеет несколько режимов: ручной, автоматический, наладочный или аварийный. Для их обработки удобно применять CASE.
CASE eMode OF
E_Mode.Manual:
xManualControl := TRUE;
xAutomaticControl := FALSE;
E_Mode.Automatic:
xManualControl := FALSE;
xAutomaticControl := TRUE;
E_Mode.Setup:
xManualControl := TRUE;
xAutomaticControl := FALSE;
ELSE
xManualControl := FALSE;
xAutomaticControl := FALSE;
END_CASE;
Такой код легче читать и расширять, чем длинную цепочку вложенных условий. Для каждого режима можно отдельно определить разрешения, блокировки и алгоритмы управления.
Таймеры и последовательности
Большинство промышленных процессов нельзя выполнить мгновенно. После открытия клапана необходимо подождать, пока заполнится трубопровод. После запуска двигателя может потребоваться задержка перед включением другого механизма.
Для таких задач используются стандартные функциональные блоки, например TON.
fbStartDelay(
IN := xStartCommand,
PT := T#3s
);
IF fbStartDelay.Q THEN
xMotorCommand := TRUE;
END_IF;
В этом примере двигатель включается через три секунды после появления команды запуска.
На практике таймеры используются для:
- задержки включения;
- задержки отключения;
- фильтрации сигналов;
- контроля времени операции;
- формирования импульсов;
- обнаружения зависания механизма;
- ограничения продолжительности аварийного режима.
Функции и функциональные блоки
Одна из сильных сторон Structured Text - возможность создавать повторно используемые программные компоненты.
Функция выполняет расчёт и возвращает результат:
FUNCTION ScaleSignal : REAL
VAR_INPUT
rRaw : REAL;
rInMin : REAL;
rInMax : REAL;
rOutMin : REAL;
rOutMax : REAL;
END_VAR
ScaleSignal :=
(rRaw - rInMin) /
(rInMax - rInMin) *
(rOutMax - rOutMin) +
rOutMin;
Такую функцию можно использовать для масштабирования сигналов давления, температуры, скорости или положения.
Функциональный блок отличается тем, что сохраняет внутреннее состояние между вызовами. Это удобно для двигателей, клапанов, фильтров, регуляторов и конечных автоматов.
Например, один функциональный блок управления двигателем можно создать для насоса, вентилятора и транспортёра, передавая ему разные входные сигналы и параметры.
Типичные ошибки начинающих
При изучении Structured Text чаще всего встречаются следующие ошибки:
- использование = вместо :=;
- отсутствие точки с запятой;
- смешивание несовместимых типов;
- деление целых чисел вместо вещественного расчёта;
- отсутствие защиты от деления на ноль;
- бесконечные циклы;
- неправильная обработка аварийного останова;
- повторная запись одного выхода в разных местах программы;
- отсутствие контроля обратной связи;
- прямое сравнение значений типа REAL.
Например, выражение:
iResult := iRawValue / 27648 * 100;
может привести к потере точности, если оба операнда деления имеют целочисленный тип. Надёжнее заранее выполнить преобразование:
rResult :=
TO_REAL(iRawValue) /
TO_REAL(27648) *
100.0;
При разработке реального проекта также необходимо проверять поведение алгоритма при обрыве датчика, потере связи, отключении питания, ручном вмешательстве оператора и переходе из аварийного состояния в рабочее.
Почему важно изучать ST на практике
Одного списка операторов недостаточно, чтобы научиться программировать ПЛК. Инженер должен понимать, как язык связан с технологическим процессом.
Важно уметь ответить на вопросы:
- когда именно обновляется входной сигнал;
- что произойдёт при пропадании датчика;
- как остановить двигатель при аварии;
- где хранится состояние механизма;
- как исключить повторное включение после отказа;
- как оператор узнает причину остановки;
- как расширить проект без переписывания всей программы.
Поэтому обучение лучше строить на практических примерах: насосной станции, конвейере, резервуаре, печи нагрева, вентиляционной установке или технологической линии.
Электронное учебное пособие
Если вы хотите изучить Structured Text последовательно, рекомендуем электронное учебное пособие:
«Structured Text с нуля: синтаксис, типы данных, операторы в CODESYS V3.5»
Пособие рассчитано на начинающих программистов ПЛК, студентов, электриков, наладчиков, инженеров АСУ ТП и преподавателей технических дисциплин.
В книге разобраны:
- устройство проекта в CODESYS V3.5;
- цикл выполнения программы ПЛК;
- синтаксис Structured Text;
- переменные и типы данных;
- арифметические и логические операторы;
- условия и циклы;
- массивы и структуры;
- функции и функциональные блоки;
- таймеры и счётчики;
- дискретные и аналоговые сигналы;
- типовые ошибки;
- практические примеры программ управления.
Материал построен по принципу «от простого к сложному»: сначала объясняются базовые конструкции, затем они объединяются в рабочие алгоритмы автоматизации.
Скачать электронное учебное пособие:
Structured Text с нуля: синтаксис, типы данных, операторы в CODESYS V3.5
Начать лучше с первых глав и сразу повторять примеры в учебном проекте CODESYS или совместимой среде. Так теория быстрее превращается в практический навык, необходимый для разработки программ ПЛК.
