ПЛК, установленный на насосной станции или на линии упаковки, каждые несколько миллисекунд проходит один и тот же цикл: считать входы, посчитать логику, записать выходы. Раньше эту логику собирали релейными схемами на бумаге, а потом просто рисовали их же в виде Ladder Diagram.
Сегодня, когда контроллер должен считать PID-регулятор, фильтровать сигнал датчика и парсить пакет от SCADA-системы, релейная нотация начинает мешать - и именно здесь на первый план выходит Structured Text (ST).

ST в семье языков IEC 61131-3
Стандарт IEC 61131-3 описывает пять языков программирования ПЛК: Ladder Diagram (LD), Function Block Diagram (FBD), Sequential Function Chart (SFC), Instruction List (IL) и Structured Text (ST). ST - единственный из них текстовый и высокоуровневый, синтаксически близкий к Pascal, с элементами C-подобных традиций.
Все пять языков делят общий набор элементов стандарта - типы данных, правила объявления переменных, интерфейсы функций и функциональных блоков, поэтому в одном проекте ПЛК спокойно соседствуют модули на LD и на ST, обращающиеся к одним и тем же переменным.
По сути своей ST - доменно-специфический язык для промышленной автоматизации. Его синтаксис специально урезан и упрощён так, чтобы код было легко анализировать формально, чтобы исполнение оставалось детерминированным и чтобы программа помещалась в ресурсы контроллера, у которого нет ни операционной системы общего назначения, ни динамической памяти в привычном для десктопных языков смысле.
Синтаксис: блоки, операторы, точки с запятой
ST - блочно-структурированный язык: программа состоит из последовательности операторов, каждый завершается точкой с запятой. Основные конструкции:
- присваивание через оператор :=;
- условные конструкции IF ... THEN ... ELSE ... END_IF и CASE ... OF ... END_CASE;
- циклы FOR ... DO ... END_FOR, WHILE ... DO ... END_WHILE, REPEAT ... UNTIL ... END_REPEAT;
- вызовы функций и функциональных блоков с параметрами;
- операторы RETURN и EXIT, работа которых зависит от конкретной реализации ПЛК.
Важная деталь семантики: оператор CASE в ST не допускает "проваливания" между ветвями, как это иногда бывает в switch языков общего назначения. После выполнения нужной ветви управление сразу выходит из блока. Это упрощает верификацию логики - не нужно проверять, не забыл ли программист поставить break.
Типизация как страховка от ошибок
ST строго типизирован. Стандарт задаёт базовые типы - BOOL, SINT, INT, DINT, REAL, LREAL, STRING, TIME, DATE - и производные конструкции ARRAY и STRUCT.
Смешение типов без явного приведения запрещено на уровне компилятора: попытка сложить INT и REAL напрямую вызовет ошибку, а не тихое округление, как это часто случается в языках с более гибкой типизацией. Для перевода одного типа в другой используются системные функции, например INT_TO_REAL() и REAL_TO_INT().
Такая строгость не декоративна. Она даёт статический анализ типов ещё на этапе компиляции, предсказуемость вычислений на слабом процессоре контроллера и упрощает формальное описание программы для верификации.
Поддержка массивов и структур приближает ST к языкам общего назначения: на нём реально писать буферы данных, таблицы состояний, структуры для хранения параметров рецепта. Именно эта возможность отличает современный ST от простого набора логических условий - контроллер способен вести полноценную обработку данных, а не только переключать биты.
Функции и функциональные блоки: мини-ООП внутри ПЛК
ST использует две основные конструкции для организации кода (смотрите таблицу).
|
Конструкция |
Что хранит |
Типичный пример |
|
FUNCTION |
Не имеет собственного состояния между вызовами, возвращает значение |
Расчётная формула, преобразование единиц |
|
FUNCTION_BLOCK |
Имеет внутреннее состояние (instance data), входы и выходы |
Таймер, счётчик, PID-регулятор |
FUNCTION_BLOCK по сути реализует объектно-ориентированный подход в миниатюре: у блока есть экземпляр, хранящий состояние, и интерфейс из входных и выходных параметров. Именно на этой конструкции строятся стандартные библиотечные блоки таймеров и регуляторов, и именно она задаёт логику рефакторинга и построения иерархий управления в крупных проектах.
Цикл сканирования и требования реального времени
Программа ПЛК исполняется циклически: контроллер считывает физические входы, обновляет внутренние переменные, последовательно проходит код сверху вниз по задачам и программным блокам, затем записывает значения на физические выходы. ST-код должен вписываться в эту модель - учитывать порядок вычислений и зависимость результата от текущего состояния системы.
Отсюда вытекают практические ограничения написания ST-кода:
- рекурсивные вызовы функций обычно избегаются или прямо запрещены средой разработки;
- циклы WHILE без строгого условия выхода по счётчику считаются потенциально опасной конструкцией - зависший цикл сорвёт цикл сканирования;
- длинные алгоритмы разбиваются на шаги и распределяются по нескольким циклам сканирования через явные state-machine и таймеры.
Время исполнения каждой ветви кода должно оставаться предсказуемым и ограниченным, потому что ПЛК - система жёсткого реального времени, а не обычный компьютер, где задержка в несколько миллисекунд обычно проходит незамеченной.
Почему ST стал основным языком для сложной логики
Первые ПЛК заменяли релейно-контактные схемы, поэтому Ladder Diagram естественно совпадал с мышлением инженера-электрика. Но задачи автоматизации усложнились: появились сложные вычислительные алгоритмы (PID, MPC, фильтрация сигналов), интенсивная обработка данных (логирование, статистика, диагностика) и интеграция с IT-инфраструктурой - SCADA, MES, ERP, OPC UA, обмен по TCP/IP.
Текстовый язык оказывается заметно компактнее графического там, где нужна математика в явном виде, циклы по массивам, алгоритмы сортировки и фильтрации или обработка протокольных сообщений. Отсюда и практическое разделение труда между языками IEC 61131-3:
|
Язык |
Где сильнее всего |
|
LD |
Простые дискретные цепи, пуско-наладка, визуальный анализ аварий и цепей безопасности |
|
FBD |
Регуляторы, фильтры, блок-ориентированные технологические цепочки |
|
SFC |
Последовательные процессы, batch-процессы, сценарии |
|
ST |
Сложные вычисления, обработка массивов и строк, интеграционная логика, state-machine |
По данным сравнительных обзоров, ST также компилируется в более эффективный машинный код, чем эквивалентная логика на LAD - выигрыш по скорости исполнения оценивается в 10-30% для сложных алгоритмов, хотя на практике эту разницу часто перекрывает время реакции физического ввода-вывода.
Правильнее говорить не о том, что ST "победил" остальные языки, а о том, что он занял нишу основного текстового алгоритмического инструмента - там, где логика выходит за пределы простой релейной схемы.
SCL, CODESYS и другие диалекты: одна идея, разные реализации
Абстрактный ST из текста стандарта и то, что реально работает на контроллере, - две разные вещи. Siemens реализует свой вариант под названием SCL (Structured Control Language) для линеек S7-1200/1500 - синтаксис близок к ST, но есть особенности в обработке выражений и в реализации функций как функциональных блоков. Платформы на базе CODESYS - Beckhoff, WAGO, B&R и многие другие - поддерживают вариант ST, максимально близкий к стандарту, включая запись сложных выражений в одну строку. У Mitsubishi, Allen-Bradley и Omron - свои нюансы построения выражений и библиотек функций.
Одна практическая ловушка встречается почти во всех диалектах: математические функции типа ACOS или EXPT в ряде реализаций устроены не как функции, возвращающие значение напрямую, а как функциональные блоки с выходным параметром. Из-за этого сложное вычисление приходится разбивать на несколько отдельных операторов присваивания, и код разрастается сильнее, чем ожидал бы программист с опытом в C или Pascal.
Несмотря на диалектные различия, базовая структура сохраняется везде: понятия FUNCTION, FUNCTION_BLOCK и основной набор типов данных совпадают между вендорами. Это заметно облегчает перенос опыта программиста между экосистемами и позволяет строить учебные курсы, не привязанные к конкретному производителю ПЛК.
Что это значит для оценки сложности кода
Программы на ST изучают классическими метриками программной инженерии - метриками Холстеда, цикломатической сложностью. Компактность кода на ST не гарантирует его простоту: длинное выражение с несколькими вложенными условиями в одну строку может нагружать читателя сильнее, чем несколько ступенчатых блоков на FBD. Разбиение логики на функции и функциональные блоки помогает управлять этой сложностью, но требует дисциплины при проектировании интерфейсов между блоками.
Сильные стороны и ограничения ST
Ключевые плюсы ST складываются из трёх вещей: выразительность для математики и обработки данных, синтаксис, знакомый программистам с опытом в IT, и совместимость с остальными языками стандарта в рамках одного проекта.
Ограничения не менее реальны:
- меньшая наглядность для персонала, привыкшего читать релейные схемы - для быстрого анализа аварий LD часто удобнее;
- более высокий порог входа для техников без опыта программирования;
- неполная поддержка отдельных конструкций ST в некоторых линейках контроллеров и средах разработки;
- ошибки типа пропущенной точки с запятой или неверного приведения типов видны только через диагностику компилятора, без визуальных подсказок, характерных для LD и FBD.
Частые вопросы про Structured Text
Чем ST принципиально отличается от Ladder Diagram?
LD - графический язык для дискретной релейной логики, ST - текстовый язык для алгоритмов, вычислений и обработки данных; они решают разные задачи в одном проекте, а не конкурируют напрямую.
SCL и ST - это одно и то же?
SCL - это реализация ST от Siemens для контроллеров серий S7; базовая логика та же, но есть отличия в обработке выражений и в устройстве библиотечных функций.
Можно ли писать рекурсивные функции на ST?
Формально язык это не запрещает, но большинство сред разработки для ПЛК либо блокируют рекурсию, либо считают её нежелательной практикой из-за требований к предсказуемому времени исполнения в реальном времени.
Почему математические функции в ST иногда выглядят громоздко?
В ряде вендорских реализаций такие функции, как ACOS или EXPT, устроены как функциональные блоки с отдельным выходным параметром, а не как обычные функции с возвращаемым значением, поэтому вычисление приходится дробить на несколько строк.
Как интегрировать ST-модули с визуальными диаграммами (LD/FBD/SFC)?
ST-модуль обычно предоставляет функции и функциональные блоки, которые подключаются к графическим сетям как чёрные ящики; переменные и интерфейсы согласуются на уровне проекта, что даёт комбинацию наглядности для I/O и выразительности для алгоритмов.
Подходит ли ST для обработки сигналов в реальном времени (фильтрация, DSP)?
Да, ST подходит для простых и средних по сложности фильтров и цифровой обработки, если обеспечить предсказуемость времени исполнения и разбить тяжёлые расчёты на шаги; для высокопроизводительного DSP иногда используют специализированные модули или язык низкого уровня.
Как тестировать и верифицировать код на ST?
Стандартные практики включают модульные тесты функций, статический анализ типов и покрытие цикломатической сложностью; для критичных систем применяют формальную верификацию и моделирование поведения в средах с симуляцией циклов контроллера.
Как управлять конфигурацией и версиями библиотек ST в разных проектах?
Используют централизованные репозитории библиотек, семантическое версионирование и процедуры миграции API; в средах типа CODESYS и TIA Portal доступны инструменты импорта/экспорта библиотек для согласованности версий.
Какие паттерны проектирования полезны в ST?
Полезны state-machine (для долгих процессов), режимы работы через ENUM + CASE (для читаемости), инкапсуляция через FUNCTION_BLOCK и явная инициализация состояния; эти паттерны уменьшают побочные эффекты и упрощают тестирование.
Насколько портируем код ST между вендорами?
Базовая логика и структура хорошо переносятся благодаря стандарту IEC 61131-3, но детали (наименования системных функций, обработка типов времени, специфические библиотеки) требуют адаптации и тестирования при миграции.
Канал «ПЛК и автоматизация» - подписка ВИП
Это закрытое сообщество по углублённому изучению ПЛК и промышленной автоматизации, где главное - практическое применение Structured Text (ST), разбор реальных примеров, готовые библиотеки и анализ ошибок на реальном железе.
В канале публикуются глубокие разборы ST-шаблонов и паттернов проектирования для больших проектов, полные примеры функциональных блоков с тестами и инструкциями по встраиванию в проекты на CODESYS и Siemens S7, а также репозитории с готовыми рецептами для PID-регуляторов, фильтров, парсеров протоколов и систем логирования. Регулярные кейсы «что пошло не так» показывают типичные ловушки при миграции между вендорами и способы их обхода, а закрытые вебинары и сессии Q&A дают доступ к практикам и шаблонам CI/CD для библиотек ПЛК.
Все материалы основаны на собственных наработках авторов и ссылках на стандарты IEC 61131-3 и документацию вендоров.
Подписаться на ВИП-канал "ПЛК и автоматизация" в ТГ можно здесь:
https://t.me/tribute/app?startapp=sL0M
или здесь:
Андрей Повный
