Школа для Электрика. Все Секреты Мастерства. Образовательный сайт по электротехнике  
ElectricalSchool.info - большой образовательный проект на тему электричества и его использования. С помощью нашего сайта вы не только поймете, но и полюбите электротехнику, электронику и автоматику!
Электрические и магнитные явления в природе, науке и технике. Современная электроэнергетика, устройство электрических приборов, аппаратов и установок, промышленное электрооборудование и системы электроснабжения, электрический привод, альтернативные источники энергии и многое другое.
 
Школа для электрика | Правила электробезопасности | Электротехника | Электроника | Провода и кабели | Электрические схемы
Автоматизация | Тренды, актуальные вопросы | Обучение электриков | Вебинары и курсы | Калькулятор по электротехнике | Контакты



 

База знаний | Избранные статьи | Эксплуатация электрооборудования | Электроснабжение
Электрические аппараты | Электрические машины | Электропривод | Электрическое освещение

 Школа для электрика / Автоматизация производственных процессов / Основы языка ST для ПЛК: введение в Structured Text


 Школа для электрика в Telegram

Основы языка ST для ПЛК: введение в Structured Text



В мире промышленной автоматики существует множество языков программирования, но когда речь идет о программировании контроллеров согласно международному стандарту IEC 61131-3, язык Structured Text (ST) занимает особое место. Этот язык представляет собой мост между классической процедурной логикой программирования и специфическими требованиями промышленной автоматизации.

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

Основы языка ST для ПЛК

Почему именно Structured Text?

Когда Международная электротехническая комиссия (IEC) разрабатывала стандарт 61131-3 для программирования ПЛК, перед разработчиками стояла серьезная задача: создать язык, который был бы одновременно мощным, понятным и безопасным для использования в критичных промышленных приложениях. Structured Text был создан как ответ на эту задачу.

ST обладает синтаксисом, похожим на языки высокого уровня, такие как Pascal или Python, что делает его легким в освоении для программистов с опытом работы в других областях информатики. Однако в отличие от универсальных языков программирования, ST специально оптимизирован для решения проблем, возникающих в контексте промышленной автоматики: работа с дискретными сигналами, управление временем выполнения, обработка аналоговых значений датчиков.

Структура программы на ST: анатомия кода

Программа на Structured Text состоит из нескольких обязательных элементов. Давайте рассмотрим их на примере простой программы управления насосом.

PROGRAM PumpController
VAR
(* объявление переменных *)
pumpEnabled: BOOL := FALSE;
targetPressure: REAL := 10.0;
currentPressure: REAL := 0.0;
errorCount: INT := 0;
systemStatus: STRING := 'IDLE';
END_VAR

(* основной код программы *)
IF pumpEnabled THEN
IF currentPressure < targetPressure THEN
(* команда включения насоса *)
systemStatus := 'RUNNING';
ELSIF currentPressure > targetPressure + 1.0 THEN
(* отключение при превышении *)
pumpEnabled := FALSE;
systemStatus := 'STOPPED';
END_IF;
ELSE
systemStatus := 'IDLE';
END_IF;

END_PROGRAM

Любая программа на ST начинается с ключевого слова PROGRAM, за которым следует имя программы. Затем идет блок VAR, где объявляются все переменные, которые будут использоваться в программе. Каждая переменная имеет имя, тип данных (который мы изучали в предыдущей статье), и может иметь начальное значение (инициализацию). После блока VAR следует основной код программы, заканчивающийся ключевым словом END_PROGRAM.

Операторы и выражения: язык логики

Один из самых важных аспектов программирования на ST — это написание логических выражений и управление потоком выполнения программы. Для этого используются операторы.

Условный оператор IF (если)

Оператор IF позволяет выполнить код только при выполнении определенного условия. Синтаксис прост:

IF условие THEN
(* код, выполняемый если условие истинно *)
ELSIF другое_условие THEN
(* код, выполняемый если первое условие ложно,
но второе истинно *)
ELSE
(* код, выполняемый во всех остальных случаях *)
END_IF;

Логическое выражение использует операторы сравнения: = (равно), <> (не равно), < (меньше), > (больше), <= (меньше или равно), >= (больше или равно). Условия могут объединяться с помощью логических операторов AND (и), OR (или), NOT (не):

IF (temperature > 80) AND (pressure < 5) THEN
(* выполнить действие *)
END_IF;

Циклический оператор FOR (для)

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

VAR
temperatures: ARRAY[0..9] OF REAL;
average: REAL;
sum: REAL := 0.0;
i: INT;
END_VAR

FOR i := 0 TO 9 DO
sum := sum + temperatures[i];
END_FOR;

average := sum / 10;

Переменная i в этом примере служит счетчиком, начиная с 0 и увеличиваясь на 1 с каждой итерацией, пока не достигнет значения 9. Оператор TO определяет верхнюю границу (включительно), а оператор BY (если он используется) позволяет задать шаг изменения счетчика.

Циклический оператор WHILE (пока)

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

VAR
buffer: ARRAY[0..99] OF INT;
index: INT := 0;
value: INT := 0;
END_VAR

WHILE (index < 100) AND (value <> 0) DO
value := buffer[index];
index := index + 1;
END_WHILE;

Цикл WHILE выполняется до тех пор, пока условие в скобках остается истинным. В данном примере цикл будет продолжаться, пока индекс не превысит 100 или пока в буфере не будет найдено значение, равное нулю.

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

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

VAR
machineState: INT := 0;
motorSpeed: INT := 0;
END_VAR

CASE machineState OF
0:
motorSpeed := 0; (* остановка *)
1:
motorSpeed := 500; (* половинная скорость *)
2:
motorSpeed := 1000; (* полная скорость *)
3:
motorSpeed := -500; (* обратное вращение *)
ELSE
motorSpeed := 0; (* неизвестное состояние *)
END_CASE;

Оператор CASE проверяет значение переменной machineState и выполняет соответствующий блок кода. Если значение не совпадает ни с одним из случаев, выполняется блок ELSE.

« Углубленное изучение программируемых логических контроллеров (ПЛК) и всех аспектов промышленной автоматизации в Telegram: ПЛК и автоматизация

Функции и функциональные блоки: повторное использование кода

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

Функции (FUNCTION)

Функция — это подпрограмма, которая выполняет определенное действие и возвращает результат. Например, функция для преобразования температуры из Цельсия в Фаренгейт:

FUNCTION CelsiusToFahrenheit : REAL
VAR_INPUT
celsius: REAL;
END_VAR

CelsiusToFahrenheit := (celsius * 9.0 / 5.0) + 32.0;

END_FUNCTION

Функция объявляется с ключевого слова FUNCTION, за которым следует ее имя и тип возвращаемого значения (в данном случае REAL). Блок VAR_INPUT определяет входные параметры. Функция должна присвоить свое имя некоторое значение перед завершением — это и будет возвращаемым результатом.

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

VAR
tempCelsius: REAL := 25.0;
tempFahrenheit: REAL;
END_VAR

tempFahrenheit := CelsiusToFahrenheit(tempCelsius);
(* tempFahrenheit теперь равен 77.0 *)

Функциональные блоки (FUNCTION_BLOCK)

Функциональные блоки — это более сложные конструкции, которые сохраняют состояние между вызовами. Это похоже на классы в объектно-ориентированном программировании, но адаптировано для требований ПЛК.

FUNCTION_BLOCK TimerWithMemory
VAR_INPUT
enable: BOOL;
timeout: TIME;
END_VAR

VAR_OUTPUT
timerFinished: BOOL;
END_VAR

VAR
startTime: DATE_AND_TIME;
isRunning: BOOL := FALSE;
END_VAR

IF enable AND NOT isRunning THEN
startTime := NOW();
isRunning := TRUE;
ELSIF enable AND isRunning THEN
IF (NOW() - startTime) >= timeout THEN
timerFinished := TRUE;
isRunning := FALSE;
END_IF;
ELSE
isRunning := FALSE;
timerFinished := FALSE;
END_IF;

END_FUNCTION_BLOCK

Важное отличие функционального блока от функции — наличие внутреннего состояния (переменные в блоке VAR сохраняют свои значения между вызовами), входных параметров (VAR_INPUT) и выходных параметров (VAR_OUTPUT). Функциональные блоки часто используются для создания переиспользуемых компонентов, таких как таймеры, счетчики, пропорционально-интегрально-дифференциальные (ПИД) регуляторы.

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

Оператор Назначение Пример
:= Присваивание значения speed := 100;
*+, -, , /, MOD Арифметические операции result := (a + b) * c;
=, <>, <, >, <=, >= Операторы сравнения IF value > 50 THEN
AND, OR, NOT Логические операции IF (flag1 AND flag2) THEN
& Конкатенация строк msg := 'Error: ' & errorCode;
[index] Доступ к элементу массива value := array[5];
. Доступ к полю структуры pump.speed := 500;
Практические примеры: от теории к практике

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

PROGRAM WaterPumpController
VAR
waterLevel: REAL; (* уровень воды в процентах *)
minLevel: REAL := 20.0; (* минимальный уровень *)
maxLevel: REAL := 80.0; (* максимальный уровень *)
pumpOn: BOOL := FALSE; (* статус насоса *)
cycleCount: INT := 0; (* количество циклов *)
lastState: BOOL := FALSE; (* предыдущее состояние *)
errorFlag: BOOL := FALSE; (* флаг ошибки *)
errorMessage: STRING := '';
END_VAR

(* Основной алгоритм управления *)
IF waterLevel < minLevel THEN
pumpOn := TRUE;
ELSIF waterLevel > maxLevel THEN
pumpOn := FALSE;
END_IF;

(* Подсчет циклов включения *)
IF (pumpOn AND NOT lastState) THEN
cycleCount := cycleCount + 1;
END_IF;

(* Проверка на ошибки *)
IF (waterLevel < 5.0) THEN
errorFlag := TRUE;
errorMessage := 'Critical: Water level critically low!';
pumpOn := TRUE; (* аварийное включение *)
ELSIF (waterLevel > 95.0) THEN
errorFlag := TRUE;
errorMessage := 'Critical: Water level overflow!';
pumpOn := FALSE; (* аварийное выключение *)
ELSE
errorFlag := FALSE;
errorMessage := '';
END_IF;

(* Сохранение предыдущего состояния *)
lastState := pumpOn;

END_PROGRAM

Этот пример демонстрирует несколько ключевых концепций: использование условных операторов для логики управления, отслеживание изменений состояния (переход из OFF в ON), обработку чрезвычайных ситуаций и ведение счетчиков событий. Это типовая структура, которая встречается во многих промышленных приложениях.

Комментарии и документирование кода

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

В ST используются два типа комментариев:

(* однострочный комментарий *)

(* многострочный комментарий
может занимать несколько строк
и используется для подробного описания *)

Хорошей практикой считается снабжать комментариями не очевидные логические шаги:

(* Проверяем, произошел ли переход из одного состояния в другое.
Это необходимо для подсчета количества циклов включения/выключения *)
IF (pumpOn AND NOT lastState) THEN
cycleCount := cycleCount + 1;
END_IF;

Типичные ошибки и как их избежать

При работе с Structured Text начинающие программисты часто допускают следующие ошибки:

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

2. Путают операторы сравнения и присваивания. В ST используется := для присваивания и = для сравнения. Это одна из наиболее частых причин логических ошибок:

(* Правильно *)
IF value = 100 THEN

(* Неправильно *)
IF value := 100 THEN

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

IF (i >= 0) AND (i < 100) THEN
value := buffer[i];
END_IF;

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

Особенности Structured Text в контексте ПЛК

В отличие от обычного программирования на высокоуровневых языках, Structured Text в контексте ПЛК имеет ряд специфических особенностей.

Синхронное выполнение. Код программы выполняется циклически с определенной частотой (обычно 10-100 мс). Это означает, что все переменные в программе обновляются синхронно, что облегчает отладку и делает поведение более предсказуемым.

Прямой доступ к входам и выходам. ПЛК имеют специальные переменные для доступа к физическим входам и выходам контроллера:

VAR
input1: BOOL AT %I1.0; (* вход 1 *)
output1: BOOL AT %Q2.1; (* выход 2 *)
END_VAR

Интеграция с графическими языками. Хотя мы говорим о Structured Text, в реальной практике инженеры часто комбинируют его с другими языками из стандарта IEC 61131-3, например с диаграммами функциональных блоков (Function Block Diagram) или контактными схемами (Ladder Diagram).

Оптимизация производительности в ST

В промышленных приложениях производительность критична. Часто ПЛК должна обрабатывать множество входных сигналов и выдавать выходные команды в жесткие временные рамки. Вот несколько рекомендаций для оптимизации кода:

Избегайте неэффективных циклов. Если возможно, пролучайте данные по индексам вместо прохода по всему массиву:

(* Неэффективно *)
FOR i := 0 TO 999 DO
IF temperatures[i] > 50 THEN
alarm := TRUE;
END_IF;
END_FOR;

(* Эффективнее, если нужен только конкретный датчик *)
IF temperatures[sensorID] > 50 THEN
alarm := TRUE;
END_IF;

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

Минимизируйте использование строк. Строковые операции обычно более ресурсоемки, чем операции с числами. Если возможно, используйте числовые коды вместо строковых описаний:

(* Менее эффективно *)
IF errorStatus = 'Temperature overflow' THEN
(* обработка *)
END_IF;

(* Более эффективно *)
IF errorCode = 1 THEN
(* обработка *)
END_IF;

Базовое учебное пособие по языку ST для ПЛК

Для погружения в тему рекомендую познакомиться с практическим туториалом по ST для ПЛК. Учебное пособие написано на русском языке, с кодом. Покрывает 12 глав: типы данных, I/O, функции, таймеры, FSM, отладку.

Что внутри:

  • Базис: Переменные (BOOL/INT/DINT/REAL/TIME), массивы, структуры, операции (+/-/MOD);
  • Логика: IF/CASE/FOR/WHILE, rising/falling edges с RTRIG;
  • Блоки: TON/TOF/TP/CTU/CTD, функции вроде ScaleAnalogInput, FB Timer;
  • Проекты: TrafficLight, ConveyorLine, TankControl с PID (Kp/Ki/Kd), safety-таймерами.

Книга делает ST доступным: копируйте код, тестируйте, автоматизируйте реальные машины за часы. Идеально для инженеров — хороший вариант для старта в программировании ПЛК на языке ST.

Базовое учебное пособие по языку ST для ПЛК по символической цене можно купить здесь или здесь.

Путь к мастерству: как глубже изучить ST

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

Для того чтобы углубить свои знания о Structured Text, функциональных блоках, оптимизации кода и лучших практиках в промышленной автоматике, рекомендуем подписаться на канал «ПЛК и автоматика» в Telegram — https://t.me/plcmasters.

Этот канал посвящен углубленному изучению программируемых логических контроллеров и всех аспектов промышленной автоматизации. Здесь вы найдете:

  • Детальные туториалы по различным аспектам ST и других языков IEC 61131-3;

  • Практические примеры из реальных производственных систем;

  • Советы по оптимизации и лучшим практикам проектирования;

  • Новости и обновления в области промышленной автоматики;

  • Ссылки на полезные ресурсы и инструменты для разработчиков.

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

Structured Text — это мощный и гибкий язык, и с правильным руководством и практикой вы сможете написать код, который будет эффективно управлять самыми сложными промышленными процессами. Начните свой путь к мастерству прямо сейчас!

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

Упростите расчеты электрических цепей с помощью удобного приложения:
Онлайн-калькулятор по электротехнике

Интерактивное веб-приложение: Обучение теоретическим основам электротехники (ТОЭ)

Онлайн-калькулятор освещения: Калькулятор освещения LED-светильниками

Интерактивный инструмент для изучения возобновляемой энергетики: Симулятор микросетей

Для повышения вашей продуктивности: Таймер по методу Pomodoro

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

Выбирайте удобный формат и темы!