Программирование на ST: пошаговая вводная инструкция с примерами
Вам тоже трудно читать свои и чужие лестничные диаграммы?
Дело в том, что, хотя LD и является простым языком программирования для начинающих, ее бывает очень трудно читать и понимать. Вот почему некоторые считают структурированный текст лучшим языком программирования ПЛК – и вы можете узнать об этом в этом учебнике.
В большой программе ПЛК, написанной на лестничной логике, практически невозможно найти голову и хвост. Поэтому то, что может показаться простым для изучения (особенно для техников и электриков), не всегда является лучшим для программирования. Ваша лестничная диаграмма будет сложна для понимания не только для вас.
Как я могу быть в этом уверен? Попробуйте сами. Взгляните на один из примеров LD и посмотрите, сколько времени потребуется, чтобы понять ее. Понимаете, к чему я клоню?
К счастью для нас, существует лучший язык программирования ПЛК. Он называется структурированный текст.
Что такое ST программирование?
Язык программирования ST или структурированный текст – это язык программирования ПЛК, определенный PLCOpen в стандарте IEC 61131-3. Этот язык программирования является текстовым, по сравнению с графическими лестничными диаграммами (LD) или FBD блоками. Язык по синтаксису очень похож на Паскаль, но видоизменен конкретно под промышленное применение.
Поначалу может показаться, что для программирования ПЛК лучше использовать графический язык программирования. Но, на мой взгляд, это верно только для небольших программ ПЛК. При использовании текстового языка программирования ПЛК ваша программа займет гораздо меньше места, а ее логику будет легче прочитать и понять. Например, вы можете масштабировать аналоговый вход или выход ПЛК с помощью всего одной строки кода или установить сигнал тревоги для решения системы SCADA.
Еще одно преимущество заключается в том, что вы можете комбинировать различные языки программирования. Вы даже можете иметь функциональные блоки, содержащие функции, написанные на языке структурированного текста. Тот факт, что это стандартизированный язык программирования, также дает нам возможность программировать с помощью структурированного текста ПЛК различных марок. Вероятно, самым распространенным ПЛК (по крайней мере, в Европе) является ПЛК Siemens S7. Их можно программировать с помощью структурированного текста, и вы можете начать уже сейчас с помощью стартового набора Siemens S7-1200, который также является отличным набором для знакомства с ПЛК Siemens.
Не забудьте ознакомиться с моими обзорами лучших курсов по программированию ПЛК. Это отличный способ узнать, как программировать различные типы ПЛК.
Языки программирования высокого уровня
Если вы уже знакомы с языками программирования высокого уровня, такими как PHP, Python и C, ST покажется вам знакомым. Синтаксис структурированного текста разработан таким образом, чтобы быть похожим на синтаксис языка программирования высокого уровня с циклами, переменными, условиями и операторами.
Но, с другой стороны, если вы никогда не сталкивались с языками программирования высокого уровня, структурированный текст может стать отличным введением в эти языки и используемый в них синтаксис. Иногда бывает полезно начать с более простого языка программирования, чтобы понять, как работает логика и ПЛК. Например, Siemens LOGO Starter Kit – это программируемое реле с очень простым визуальным языком программирования.
Прежде чем читать этот учебник, я рекомендую вам кратко ознакомиться с этой программой ПЛК, написанной на языке структурированного текста. Попробуйте проверить, сможете ли вы понять функции этой программы. Знакомый ли вам структурированный текст?
PROGRAM stexample
VAR
x : BOOL;
END_VAR
x := TRUE;
REPEAT
x := FALSE;
UNTIL x := FALSE;
END_REPEAT;
END_PROGRAM;
Потоки в ST
Первое, что вы должны изучить, – это структуру или синтаксис структурированного текста. Когда вы поймете структуру, вы поймете, как работает поток вашей программы.
Начиная с примера выше, вы видите, что вся программа начинается с PROGRAM и заканчивается END_PROGRAM. Все, что находится между ними, является вашей программой ПЛК. Эти два слова являются разделительными ключевыми словами для деклараций программ. Подробнее о ключевых словах позже.
Пусть вас не смущает END_PROGRAM, потому что ваша программа на этом не заканчивается. Когда ПЛК достигнет END_PROGRAM, цикл сканирования ПЛК начнется заново, и ваша программа будет повторяться.
Это так же, как лестничная логика или любой другой язык программирования ПЛК – он будет запускаться снова и снова. А если вы привыкли программировать микроконтроллеры вроде Arduino UNO, то PROGRAM/END_PROGRAM будет похож на бесконечный цикл в C.
ПРИМЕЧАНИЕ: Следует добавить, что при программировании в структурированном тексте вы часто не будете использовать конструкцию PROGRAM/END_PROGRAM. Это уже будет сделано программным обеспечением ПЛК, и код, который вам придется написать, будет тем, что вы хотите получить внутри этой конструкции.
Управление потоком программ ПЛК, написанных на языке структурированного текста, такое же, как и в лестничной логике: выполнение по одной строке за раз.
Начнем с синтаксиса ST
Синтаксис языка программирования – это определение того, как он написан. Точнее, какие символы используются для придания языку формы и смысла.
Как видно из примера, структурированный текст полон двоеточий, точек с запятой и других символов. Все эти символы имеют определенное значение и используются для представления чего-либо. Некоторые из них являются операторами, некоторые – функциями, операторами или переменными.
Все подробности синтаксиса будут объяснены по мере изучения этого учебника. Но есть несколько общих правил синтаксиса структурированного текста, о которых вы должны знать. Пока что вам не нужно запоминать все правила синтаксиса (вот хорошая статья из хабра на эту тему), так как это произойдет, когда вы приступите к программированию:
Все подробности синтаксиса будут объяснены по мере изучения этого учебника. Но есть несколько общих правил синтаксиса структурированного текста, о которых вы должны знать. Пока что вам не нужно запоминать все правила синтаксиса, так как это произойдет, когда вы приступите к программированию:
- Все утверждения разделяются точками с запятой. Структурированный текст состоит из утверждений и точек с запятой для их разделения.
- Язык не чувствителен к регистру. Несмотря на то, что использование верхнего и нижнего регистра является хорошей практикой для удобства чтения, это не обязательно.
- Пространства не имеют никакой функции. Но их следует использовать для удобства чтения.
Здесь важно понять, что, когда вы пишете программу ПЛК на языке структурированного текста, ваш компьютер переводит ее на язык, понятный ПЛК.
Когда вы загрузите программу ПЛК со структурированным текстом в ваш ПЛК, используемое вами программное обеспечение для программирования скомпилирует вашу программу. Это означает, что она переведет код в машинный код, который может быть выполнен ПЛК.
Компилятор использует синтаксис языка программирования, чтобы понять вашу программу.
Например, каждый раз, когда компилятор видит точку с запятой, он понимает, что достигнут конец текущего оператора. Компилятор будет читать все, пока не дойдет до точки с запятой, а затем выполнит это утверждение.
Синтаксис комментария
В текстовых языках программирования есть возможность писать текст, который не выполняется. Эта возможность используется для создания комментариев в коде.
Комментарии – это хорошо, и новичкам следует всегда комментировать свой код. Это облегчает понимание кода в дальнейшем.
В структурированном тексте вы можете делать как однострочные, так и многострочные комментарии.
Однострочный комментарий:
// comment
Комментарий после конца строки ST:
<expression>; /* comment */
или
<statement>; (* comment *)
Многострочный комментарий:
/* start comment
...
end comment */
или
(* start comment
...
end comment *)
Стоит ли все подряд комментировать?
По мере того как вы будете становиться все лучше и лучше, вы должны делать все меньше и меньше замечаний по поводу функциональности. Причиной этому является “Дао программирования” – книга о программировании, вдохновленная старым китайским “Дао те цзин”. Или, на самом деле, причина в принципе, лежащем в основе книги.
Возьмем эту маленькую историю из главы 2.4:
Один новичок спросил Мастера: “Вот программист, который никогда не разрабатывает, не документирует и не тестирует свои программы. Но все, кто его знает, считают его одним из лучших программистов в мире. Почему так?”
Мастер ответил: “Этот программист постиг Дао. Он вышел за пределы необходимости проектирования; он не злится, когда система дает сбой, а безропотно принимает вселенную. Он вышел за пределы необходимости документирования; его больше не волнует, увидит ли кто-то еще его код. Он вышел за пределы необходимости тестирования; каждая его программа совершенна сама по себе, безмятежна и элегантна, ее цель очевидна. Воистину, он приобщился к тайне Дао”.
Из книги “Дао программирования”
Несмотря на то, что это можно поставить на первое место, вы всегда должны писать код так, чтобы его было как можно проще понять. Даже без комментариев. Для этого достаточно просто сделать код легко читаемым с помощью пробелов
Но пока не стоит беспокоиться о комментариях. Делайте их столько, сколько хотите, пока вы еще новичок.
Создание утверждений (заявлений) в ST
Итак, структурированный текст состоит из утверждений. Но что такое эти утверждения?
Вы, вероятно, знаете, что заявления – это нечто, исходящее от людей. Вы можете сделать заявление, президент или даже компания может сделать заявление. И в программировании ПЛК заявления – это почти то же самое.
Заявление - это ваше указание PLC, что делать.
Возьмем для примера первое утверждение:
X : BOOL;
Компилятор прочитает это как одно утверждение, потому что, когда он дойдет до точки с запятой, он поймет, что это конец этого утверждения. Помните, что утверждения разделяются точками с запятой. Это главное правило синтаксиса данного языка.
В этом операторе вы указываете ПЛК создать переменную X, и эта переменная должна быть типа BOOL.
Переменные в ST
Прежде чем мы углубимся в это утверждение, позвольте мне вернуться к ключевым словам, которые я уже упоминал. Как видите, переменная X определена между двумя другими ключевыми словами – VAR и END_VAR.
Конструкции PROGRAM/END_PROGRAM и VAR/END_VAR являются конструкциями, то есть они отделяют определенную область в вашей программе для чего-то конкретного. Конструкция PROGRAM – это место, где находится вся ваша программа ПЛК, а конструкция VAR – место, где вы определяете переменные.
Все эти четыре слова называются ключевыми, потому что они являются зарезервированными словами. Вы не можете использовать эти слова ни для чего другого, когда программируете в структурированном тексте. Имя вашей программы не может быть PROGRAM или даже program (STL не чувствителен к регистру), потому что это слово может использоваться только для создания конструкции, разграничивающей вашу программу ПЛК.
Вернемся к переменным…
Если вы знаете другие языки программирования, то, скорее всего, вы уже знакомы с переменными.
Но если вы не знаете, то вот введение в переменные, которое вам наверняка понравятся(смотреть можно через переводчик для видео от Яндекс):
Переменная – это место, где вы можете хранить данные.
В зависимости от типа информации, которые вы хотите хранить, существует несколько типов данных. Различные типы данных называются типами данных. Например, если у вас есть переменная, в которой вы хотите хранить либо TRUE, либо FALSE, вы можете объявить ее как тип BOOL.
Тип BOOL является булевым типом данных, что означает, что он может содержать булевое значение, а именно TRUE или FALSE.
Итак, это две вещи о переменных. Они имеют определенный тип данных и содержат значение этого типа данных. Но есть еще одна вещь, которую вы можете контролировать в своих переменных. Имя переменной.
Чтобы вам было проще использовать переменные в программе ПЛК, все они имеют имена. Когда вы определяете переменную в конструкции VAR, вы начинаете с того, что даете ей имя:
X : BOOL;
Этот оператор создаст переменную X с типом данных BOOL.
Имейте в виду, что при программировании с помощью некоторых программ для ПЛК, например Siemens STEP 7 или Rockwell, вы не будете использовать для объявления переменных символы VAR/END_VAR. Вместо этого переменные часто называют тегами или символами, и даже если вы программируете в структурированном тексте, вы объявляете их визуально (как на рисунке ниже) или в функциональном блоке.Имейте в виду, что при программировании с помощью некоторых программ для ПЛК, например Siemens STEP 7 или Rockwell, вы не будете использовать для объявления переменных символы VAR/END_VAR. Вместо этого переменные часто называют тегами или символами, и даже если вы программируете в структурированном тексте, вы объявляете их визуально (как на рисунке ниже) или в функциональном блоке.
Имейте в виду, что при программировании с помощью некоторых программ для ПЛК, например Siemens STEP 7 или Rockwell, вы не будете использовать для объявления переменных символы VAR/END_VAR. Вместо этого переменные часто называют тегами или символами, и даже если вы программируете в структурированном тексте, вы объявляете их визуально (как на рисунке ниже) или в функциональном блоке.
Переменные, теги или символы?
Переменные, теги или символы?
И последнее, что следует добавить: в программировании ПЛК переменные часто называют тегами. В программе программирования ПЛК Studio 5000 Logix Designer для ПЛК Allen Bradley переменные называются тегами. Но если вы программируете в старых версиях программного обеспечения SIMATIC STEP 7 для ПЛК Siemens, переменные называются символами. В более новых версиях STEP 7 (начиная с TIA Portal версии 11) переменные называются тегами.
Но как бы ни назывались переменные, они всегда выполняют одну и ту же функцию. А в программном обеспечении для программирования по стандарту IEC 61131-3, таком как STEP 7, Codesys или Studio 5000, стандартные типы данных всегда будут доступны.
Типы данных в структурированном тексте
В зависимости от марки используемого ПЛК вам будут доступны различные типы данных. В ПЛК Siemens в STEP 7 доступны типы данных, аналогичные стандартным в IEC 61131-3. Но у вас также будут другие типы данных, используемые только в ПЛК SIEMENS, например S5TIME.
Все стандартные типы данных определены организацией PLCOpen и являются частью языков программирования ПЛК. Каждое программное обеспечение для программирования ПЛК со структурированным текстом имеет в своем составе эти типы данных. В стандарте IEC типы данных делятся на две категории: Элементарные типы данных и производные типы данных.
Элементарные типы данных:
- Integers – целые числа
- Floating points – с плавающей точкой
- Time – время
- Strings – строки
- Bit strings – битовые строки
Под каждым элементарным типом данных имеется несколько типов данных IEC. Это типы данных, определенные в IEC 61131-3:
Дальше по мировым стандартам буду называть типы данных на английском языке, т.к. даже в отечественных средах разработки именно так вы и будут выглядеть.
Целые числа:
Тип данных МЭК | Формат | Диапазон |
SINT | Short Integer | -128 … 127 |
INT | Integer | -32768 … 32767 |
DINT | Double Integer | -2^31 … 2^31-1 |
LINT | Long Integer | -2^63 … 2^63-1 |
USINT | Unsigned Short Integer | 0 … 255 |
UINT | Unsigned Integer | 0 … 2^16-1 |
LDINT | Long Double Integer | 0 … 2^32-1 |
ULINT | Unsigned Long Integer | 0 … 2^64-1 |
С плавающей запятой:
Тип данных МЭК | Формат | Диапазон |
REAL | Real Numbers | ±10^±38 |
LREAL | Long Real Numbers | ±10^±308 |
Время:
Тип данных МЭК | Формат | Применение |
TIME | Duration of time after an event | T#10d4h38m57s12ms TIME#10d4h38m |
DATE | Calendar date | D#1989-05-22 DATE#1989-05-22 |
TIME_OF_DAY | Time of day | TOD#14:32:07 TIME_OF_DAY#14:32:07.77 |
DATE_AND_TIME | Date and time of day | DT#1989-06-15-13:56:14.77 DATE_AND_TIME#1989-06-15-13:56:14.77 |
Строки:
Тип данных МЭК | Формат | Диапазон |
STRING | Character String | ‘My string’ |
Битовые строки:
Тип данных МЭК | Формат | Диапазон |
BOOL | Boolean | 1 bit |
BYTE | Byte | 8 bits |
WORD | Word | 16 bits |
DWORD | Double Word | 32 bits |
LWORD | Long Word | 64 bits |
Еще существуют производные типы данных:
- Структурированные типы данных
- Перечислимые типы данных
- Типы данных поддиапазонов
- Типы данных массивов
Производные типы данных – это ваши собственные пользовательские типы данных. Все производные типы данных строятся путем создания конструкции из ключевых слов TYPE и END_TYPE. Между ключевыми словами находится тип производного типа данных, который вы хотите объявить.
Все эти различные типы данных могут показаться вам немного подавляющими. Особенно если вы раньше не использовали текстовые языки программирования. Но не стоит беспокоиться.
Пока для начала программирования на основе структурированного текста достаточно запомнить лишь некоторые из них. По мере совершенствования и усложнения программ Вы будете постепенно узнавать о большем количестве типов данных по мере их использования. Важно, чтобы вы не двигались вперед слишком быстро. Для тех кто знает анлийский язык – вот качественная статься, которая расскажет как выучить язык программирования быстрее. В первое время важно набить руку на основах, понять базу и основы. Важно не смешить на первых этапах, а заниматься регулярно.
Как видите, различные типы данных могут содержать разные форматы данных и, соответственно, разные значения.
Но как поместить значения в переменные? И как использовать переменные?
С помощью утверждений и операторов.
Операторы и выражения в STL
Следующее, о чем вы должны знать, – это операторы. Операторы используются для манипулирования данными и являются частью практически любого языка программирования. Это приводит нас ко второй вещи, о которой вы должны знать, – выражениям.
Как и операторы, выражения являются важнейшей частью языков программирования.
Выражение – это конструкция, которая при оценке дает значение.
Это означает, что когда компилятор компилирует выражение, он оценивает его и заменяет утверждение результатом. Возьмем пример с двумя переменными A и B.
В A содержится значение 10, а в B – 8.
A+B
Результат этого выражения равен 18. Поэтому вместо A+B компилятор подставит значение 18.
Выражение состоит из операторов и операндов.
Так что же такое операторы и операнды?
Поскольку вы только что видели пример выражения, вы только что увидели и оператор, и два операнда. A и B – оба операнда, а + – оператор.
Помните, что операторы используются для манипулирования данными. Именно это и делает оператор +. Он берет значение переменной A и добавляет его к значению в B.
Оператор + также называют оператором сложения, потому что его действие заключается в сложении.
Операторы
В структурированном тексте доступно несколько операторов. Опять же, в IEC 61131-3 описаны все стандартные операторы языка структурированного текста:
Операции | Символы | Приоритет |
Parenthesization | (expression) | Highest |
Function Evaluation | MAX(A,B) | |
Negation Complement | – NOT | |
Exponentiation | ** | |
Multiply Divide Modulo | * / MOD | |
Add Subtract | + – | |
Comparison | <, >, <=, >= | |
Equality Inequality | = <> | |
Boolean AND Boolean AND | & AND | |
Boolean Exclusive OR | XOR | |
Boolean OR | OR | Lowest |
Приоритет операций – это порядок, в котором выполняются или вычисляются операции. Взгляните на это выражение:
A + B * MAX(C, D)
Как это выражение будет оценено компилятором?
Как вы можете видеть в таблице операторов, оператор с наивысшим старшинством – это скобка. Это означает, что первым будет оценено все, что заключено в скобки – в данном примере: (C, D).
Но поскольку MAX(C, D) на самом деле является функцией, мы можем перейти к оценке функции на одну строку вниз в таблице.
Итак, в приведенном выше выражении первой будет оценена функция: MAX(C, D). Эта функция выдаст (заменит функцию) ответ. В данном случае это наибольшее значение из двух переменных C и D.
Изобразим C в качестве результата. Теперь выражение будет выглядеть следующим образом:
A + B * C
Теперь вы можете спускаться вниз по таблице, пока не дойдете до строки со следующим оператором, используемым в этом выражении.
Осталось две операции: умножение и сложение. Но так как умножение имеет более высокий приоритет, оно будет оценено первым.
Сначала выполняется B * C, а затем результат прибавляется к A.
Каждый раз, когда выражение оценивается, оценка следует в порядке старшинства, как показано в таблице выше.
4 типа операторов, 4 типа выражений
Операторы, используемые для выражений в структурированном тексте, можно разделить на четыре группы. Каждая группа операторов выполняет определенную функцию и выдает определенный тип данных.
- Арифметические операторы
- Реляционные операторы
- Логические операторы
- Побитовые операторы
Арифметические операторы
Все арифметические операторы часто называют просто математическими операторами, потому что они представляют математику. Результатом всегда будет математический результат выражения.
- + (прибавить)
- – (вычесть/отрицание)
- * (умножить)
- ** (экспонента)
- / (деление)
- MOD (деление по модулю)
Пример:
15 MOD 4
Результат:
3
Реляционные операторы
Чтобы сравнить или найти связь между двумя значениями, можно использовать один из реляционных операторов. Они используются для сравнения, а результатом будет булево значение (тип BOOL), либо TRUE, либо FALSE.
- = (равно)
- < (меньше, чем)
- <= (меньше или равно)
- > (больше, чем)
- >= (больше или равно)
- <> (не равно)
Пример:
TEMPERATURE := 93.9;
TEMPERATURE >= 100.0
Результат:
FALSE
Логические операторы
Если вы хотите сравнить булевы значения (BOOL) и вывести из этого логику, вам придется использовать логические операторы. Эти операторы также дают в результате выражения булево значение TRUE или FALSE.
- & or AND
- OR
- XOR
- NOT
Пример:
LIMIT_SWITCH1 := TRUE;
LIMIT_SWITCH2 := FALSE;
LIMIT_SWITCH1 OR LIMIT_SWITCH2
Результат:
TRUE
Побитовые операторы
Последняя группа операторов называется побитовыми, потому что операции выполняются побитово. Это означает, что для каждого бита двух чисел выполняется логическая операция. Результатом является новое число – суммарный результат побитовых операций.
- & or AND
- OR
- XOR
- NOT
Пример:
15 AND 8
Результат:
15
Поскольку эта операция побитовая, вычисления будут производиться для каждого бита. Поэтому, чтобы понять, что здесь происходит, нужно преобразовать числа в двоичные значения:
15 = 1111
8 = 1000
Теперь каждый бит в числе 1111 (15) может быть использован в логической операции с другим числом 1000 (8):
1111 AND 1000
Номер бита | 1111 (15) | 1000 (8) | Результат |
0 | 1 | 1 | 1 |
1 | 1 | 0 | 0 |
2 | 1 | 0 | 0 |
3 | 1 | 0 | 0 |
Операторы и утверждения
Итак, в предыдущем разделе вы узнали, что в выражениях происходит оценка. Это означает, что все выражения дают результат, и компилятор заменяет выражение результатом.
Но что, если вы хотите, чтобы ПЛК (компилятор) не оценивал что-то, а ДЕЛАЛ что-то?
Заявления – это ответ на вопрос.
Как я уже говорил в этой статье, утверждения – это то, что вы говорите ПЛК, что делать. Это инструкция, которую вы даете ПЛК для выполнения действия.
Если вы составите выражение, которое даст результат, это мало что даст. Выражения – это все вычисления, и если вы не используете результаты этих выражений в некоторых действиях (операторах), это будет все равно что купить продукты, но не приготовить еду.
Давайте посмотрим на действия или утверждения, которые вы можете выполнять в структурированном тексте.
Оператор присваивания
В структурированном тексте есть несколько утверждений. Все они представляют собой действие или условие.
Начиная с действий, наиболее фундаментальным утверждением в структурированном тексте является утверждение присваивания. Утверждения также описаны в стандарте IEC, разработанном PLCOpen, и первым из них является утверждение присваивания.
Вот как выглядит оператор присваивания:
A := B;
Что это утверждение предписывает компилятору?
Взять значение переменной B и поместить его в переменную A.
ПЛК присваивает переменной значение. Вот еще более простой пример:
A := 10;
Это утверждение примет значение 10 и поместит его в переменную A. Или, говоря по-другому, переменной A будет присвоено значение 10.
Поскольку значение A теперь равно 10, мы можем сделать еще одно утверждение, но на этот раз с выражением:
B := A + 2;
Когда эта строка кода будет скомпилирована, выражение A + 2 будет оценено в 12. Компилятор заменит это выражение результатом 12. Теперь оператор будет выглядеть для компилятора следующим образом:
B := 12;
Теперь компилятор присвоит переменной B значение 12.
Как оператор присваивания с выражением будет оценен компилятором.
И последнее: символ := называется оператором присваивания. Да, это такой же оператор, как и операторы, используемые в выражениях. Часто эти два типа операторов путают друг с другом и используют неправильно.
Частая ошибка – использовать оператор равенства (=) вместо оператора присваивания (:=). Но даже если они похожи друг на друга, между ними есть огромная разница. Возьмем эти два примера:
A = B
A := B;
Первая строка – это выражение. Поскольку это выражение, для оценки строки будет использоваться оператор. Оператор равенства оценивает следующим образом:
Если правая и левая части равны, он принимает значение TRUE или 1. В противном случае он принимает значение FALSE или 0.
По сравнению с некоторыми другими операторами оператор равенства является реляционным оператором. Все реляционные операторы имеют значение TRUE или FALSE.
Во второй строке вы увидите утверждение. На этот раз оператор будет использоваться не для оценки, а для действия. Действием является присваивание, и здесь значению A будет присвоено значение B.
Наконец, вы всегда можете определить утверждение по точке с запятой. И снова точка с запятой – это способ, с помощью которого компилятор узнает, что конец высказывания достигнут.
В операторах присваивания можно использовать самые разные выражения, от простых значений, таких как числа, до переменных и функций. Потому что все выражения сначала будут оценены, а затем результат этой оценки будет использован в операторе присваивания.
Условные операторы
Оператор присваивания был довольно прост: Возьмите значение правой части и поместите его в то, что находится в левой части.
Но давайте немного увеличим масштаб и подумаем о программах ПЛК. Программа ПЛК – это часть логики, и поэтому она должна принимать некоторые решения. Вот почему мы используем ПЛК или любой другой контроллер. Чтобы принимать решения и действовать в зависимости от текущего состояния.
Упрощенно: ПЛК просматривает состояния всех входов и с помощью вашей программы принимает решение о том, какие выходы установить.
Поэтому в программе ПЛК вам нужен способ принимать решения. Это приводит нас к условным операторам.
Условные операторы используются именно для этого: Для принятия решений.
В структурированном тексте есть два способа выполнения условных операторов: операторы IF и операторы CASE.
Операторы IF
Думаю, Билл Гейтс лучше меня объясняет оператор IF. По крайней мере, он может объяснить его чуть более чем за 1 минуту в этом замечательном видео с сайта code.org. Вы можете пропустить это видео, если вы знакомы с операторами IF, хотя я бы честно, тем кто понимает английский рекомендовал бы его посмотреть.
Операторы IF – это решения с условиями.
Но даже несмотря на то, что IF-выражения довольно просты для понимания, вы все равно должны знать, как передать PLC условные выражения. Это возвращает нас к синтаксису.
Для операторов IF существует специальный синтаксис. Это означает, что вы должны написать его определенным образом, чтобы компилятор понял его. Потому что так же, как точка с запятой используется для завершения операторов, есть специальные ключевые слова для создания оператора IF.
Вот как выглядит синтаксис операторов IF в STL:
IF [boolean expression] THEN
<утверждение>;
ELSIF [boolean expression] THEN
<утверждение>;
ELSE
<утверждение>;
END_IF ;
Обратите внимание, что синтаксис операторов IF очень похож на обычный английский. Первая строка содержит два ключевых слова: IF и THEN. Между этими двумя ключевыми словами находится условие, которое представляет собой выражение. Но не просто выражение. Это булево выражение.
Булевы и числовые выражения
Вы можете разделить выражения на две группы в зависимости от того, что они дают.
Вот пример булевого выражения:
1 = 1
Это выражение будет оцениваться как TRUE или выдавать TRUE. Булево выражение также может выглядеть следующим образом:
1 > 2
Но на этот раз булево выражение будет иметь значение FALSE, поскольку 1 не больше 2.
Числовое выражение может выглядеть так же просто, как и это:
13.2 + 19.8
Это выражение оценивается в число с плавающей точкой 33.0 и, следовательно, является числовым выражением.
Булевы выражения используются в операторах IF в качестве условий.
IF оценивает булевое вырежение как TRUE, то будут выполняться следующие операторы.
ПЛК будет выполнять операторы после ключевого слова THEN только в том случае, если выражение оценивается как TRUE. Это иллюстрирует следующий пример:
A := 0;
IF A = 0 THEN
B := 0;
END_IF ;
Строка под номером 3 будет выполнена только в том случае, если A равна 0. В данном случае так и будет. Значение 0 присваивается переменной A в операторе, расположенном непосредственно перед оператором IF.
Видите, что я только что сделал?
В приведенном выше примере решение принималось в зависимости от значения переменной. Теперь, несмотря на то что это было довольно простое решение, мы уже можем перевести его в реальное программирование ПЛК.
Допустим, вы хотите создать программу, которая устанавливает выход ПЛК в зависимости от состояния входа. С помощью простого оператора IF вы можете сделать это в структурированном тексте:
IF INPUT1=TRUE THEN
OUTPUT1 := TRUE;
END_IF;
Хотя этот пример является лишь частью более крупной программы (переменная INPUT1 представляет вход, а OUTPUT1 – выход), он иллюстрирует, как может быть принято решение о выходе ПЛК. Переменная OUTPUT1 будет установлена в TRUE только в том случае, если переменная INPUT1 будет TRUE.
Поскольку обе переменные INPUT1 и OUTPUT1 имеют тип BOOL, первая строка в операторе может выглядеть следующим образом:
IF INPUT1 THEN
Просто записав выражение как “INPUT1”, вы все равно оцените его как TRUE, когда переменная будет TRUE.
А вдруг ELSE IF не подходит?
Пока что вы видели простой оператор IF, в котором операторы выполняются только в том случае, если выражение равно TRUE. Если это выражение оценивается как FALSE, операторы просто не будут выполняться.
Но что, если ваша программа ПЛК требует выполнения нескольких условий?
Конечно, это можно записать в виде нескольких отдельных операторов IF. Но у структурированного текста есть больше возможностей для операторов IF.
Как и в большинстве других языков программирования, вы можете использовать ключевые слова ELSIF и ELSE для нескольких условий в одном операторе IF.
Оба слова ELSIF и ELSE являются необязательными в операторах IF, но вот как выглядит их синтаксис:
IF [boolean expression] THEN
<утверждение>;
ELSIF [boolean expression] THEN
<утверждение>;
ELSE
<утверждение>;
END_IF ;
Если булево выражение в строке 1 равно FALSE, то приведенные ниже операторы просто не будут выполнены. Вместо этого компилятор проверит булево выражение после ключевого слова ELSIF.
Здесь все работает так же, как и с ключевым словом IF: если булево выражение после ключевого слова истинно, то следующие операторы будут выполнены.
И наконец, ключевое слово ELSE. Оно работает как вариант по умолчанию для оператора IF. Если все булевы выражения IF и ELSIF будут оценены как FALSE, будут выполнены утверждения после ключевого слова ELSE.
Как ПЛК будет выполнять операторы IF в структурированном тексте.
Комбинирование операторов для получения дополнительных условий
Помимо создания нескольких условий, вы можете расширить условия, включив в них несколько переменных. Вы можете объединить несколько выражений, обычно это делается с помощью логического оператора, чтобы получить более крупное выражение.
Что, если вы хотите, чтобы не один, а два входа были TRUE, прежде чем будет установлен выход. Выражение будет выглядеть следующим образом:
IF (INPUT1) AND (INPUT2) THEN
OUTPUT1 := TRUE;
END_IF;
Теперь выражение будет оцениваться как TRUE, только если INPUT1 и INPUT2 – TRUE.
Оператор CASE
Второй способ принятия решений в структурированном тексте – это операторы CASE.
По сути, операторы CASE и IF – это одно и то же. Но в операторах CASE вместо булевых выражений используются числовые выражения. Кроме того, у операторов CASE немного другой синтаксис, что делает их более подходящими для определенных целей.
Вот как выглядит синтаксис операторов CASE в структурированном тексте:
CASE [numeric expression] OF
result1: <утверждение>;
resultN: <утверждение>;
ELSE
<утверждение>;
END_CASE;
В операторах CASE есть только одно выражение. Результат этого выражения используется для принятия решения о том, какие операторы будут выполнены.
По умолчанию в операторах CASE также присутствует ключевое слово ELSE. Операторы после этого ключевого слова выполняются только в том случае, если ни один из результатов (или случаев) не совпадает с результатом числового выражения.
Вот очень простой пример:
PROGRAM_STEP := 3;
CASE PROGRAM_STEP OF
1: PROGRAM_STEP := PROGRAM_STEP+1;
2: PROGRAM_STEP := PROGRAM_STEP+2;
3: PROGRAM_STEP := PROGRAM_STEP+3;
ELSE
PROGRAM_STEP := PROGRAM_STEP+10;
END_CASE;
Хотя это очень простой пример (переменная имеет фиксированное значение), он показывает, как принимать решение в зависимости от результата числового выражения. В данном примере числовое выражение – это просто значение переменной 3. If может быть любым выражением, которое оценивается в целое число или значение с плавающей точкой.
Итерация с Повторяющимися Циклами
Вероятно, одна из самых мощных функций структурированного текста – это возможность создавать циклы, повторяющие строки кода.
И снова Сode.org сделал одно из лучших введений в повторяющиеся циклы. На этот раз основатель Facebook Марк Цукерберг использует чуть больше минуты для объяснения повторяющихся циклов.
Тем кто плохо понимает анлийский язык, рекомендую пользоваться расширением, которое поверх видео наложит автоматический голосовой перевод.
Применительно к ПЛК циклы программирования могут использоваться для самых разных целей. У вас может быть функция или набор операторов, которые вы хотите выполнять определенное количество раз или до тех пор, пока что-то не остановит цикл.
В структурированном тексте вы найдете 3 различных типа повторяющихся циклов:
- FOR
- WHILE
- REPEAT
Общим для всех типов циклов является наличие условия для повторения или остановки цикла. Условие в циклах FOR и WHILE loops решает, повторять цикл или нет. А в цикле REPEAT loop условием является условие UNTIL, и оно решает, останавливать цикл или нет.
Циклы FOR
Первый цикл – это цикл FOR, который используется для повторения определенного количества раз. У циклов FOR есть и другие ключевые слова. TO, BY, DO и END_FOR.
Это синтаксис циклов FOR в структурированном тексте:
FOR count := initial_value TO final_value BY increment DO
<утверждение>;
END_FOR;
На первый взгляд, первая строка выглядит немного сложной, но это не так, если разделить ее на части:
FOR
Ключевое слово, с которого начинается оператор цикла FOR.
count := initial_value
В этой операции присваивания задается начальное значение, от которого нужно вести отсчет. Count – это имя переменной, а initial_value – значение, от которого вы хотите начать отсчет.
TO
Ключевое слово перед значением, до которого нужно вести отсчет.
конечное_значение
Это значение, до которого вы хотите считать. Поместите сюда 100, и ваш цикл будет считать до 100.
BY
Ключевое слово для использования пользовательского инкрементального значения.
increment
Значение, на которое вы хотите увеличивать счет при каждом запуске цикла. Если вы установите инкремент в 10, а счет – в 100, цикл будет выполняться 10 раз.
DO
<статья>;
END_FOR;
Последняя часть между ключевыми словами DO и END_FOR – это утверждения, которые вы хотите выполнять при каждом запуске цикла. Эти операторы будут выполняться столько раз, сколько раз повторяется цикл.
Поскольку циклы FOR могут повторяться только заданное количество раз, именно для этого они и используются. В программировании ПЛК это может быть что-то простое, например, элемент, который нужно покрасить/высушить четыре раза. Здесь отлично подойдет цикл FOR, который считает до четырех.
Наконец, вы можете использовать оператор IF с ключевым словом EXIT, чтобы остановить цикл до окончания счета. Вы можете добавить булево условие, которое, если TRUE, остановит цикл.
IF [boolean expression] THEN
EXIT;
END_IF;
Циклы WHILE
Цикл while немного отличается от цикла FOR, потому что он используется для повторения цикла до тех пор, пока некоторые условия TRUE. Цикл WHILE будет повторяться до тех пор, пока булево выражение оценивается как TRUE.
Вот синтаксис циклов WHILE:
WHILE [boolean expression] DO
<statement>;
END_WHILE;
Между ключевыми словами WHILE и DO находится булево выражение. Если это булево выражение оценивается как TRUE, то все операторы до ключевого слова END_WHILE будут выполнены.
Когда будет достигнуто END_WHILE, булево выражение будет оценено снова. Это будет происходить снова и снова, пока выражение не перестанет оцениваться как TRUE. Но чтобы цикл остановился в одной точке, необходимо изменить значение в булевом выражении. Только таким образом булево выражение может перейти от TRUE к FALSE.
Вот пример цикла WHILE в структурированном тексте:
counter := 0;
WHILE counter < 10 DO
counter := counter + 1;
machine_status := counter * 10;
END_WHILE;
Если вы посмотрите на третью строку, то увидите, как цикл в конце концов перестанет повторяться. Булево выражение использует переменную counter и проверяет, меньше или равно ли ее значение 10. Но поскольку значение счетчика устанавливается в 0 непосредственно перед циклом WHILE, булево выражение будет равно TRUE, пока счетчик не изменится.
Именно это и происходит в строке 3. Это первый оператор в цикле WHILE, и вместе с другими операторами он выполняется при каждом повторении цикла. В третьей строке значение переменной counter увеличивается на 1. Можно сказать, что инкрементное значение равно 1.
В приведенном примере цикл повторится 10 раз. Когда значение count достигнет 10, булево выражение будет оценено как FALSE (потому что 10 не меньше 10), и цикл остановится.
Вы также можете использовать ключевое слово EXIT в цикле WHILE, чтобы остановить повторение цикла до того, как булево выражение станет FALSE. Синтаксис представляет собой оператор IF с ключевым словом EXIT. Поместите его в любом месте между ключевыми словами DO и END_WHILE.
IF [boolean expression] THEN
EXIT;
END_IF;
Циклы REPEAT
Последний тип повторяющегося цикла в структурированном тексте – это цикл REPEAT. Он работает противоположно циклу WHILE. Этот цикл перестанет повторяться, когда булево выражение будет равно TRUE.
В ST синтаксис циклов REPEAT выглядит следующим образом:
REPEAT
<statement>;
UNTIL [boolean expression]
END_REPEAT;
Обратите внимание, что поскольку булево выражение в этом типе цикла находится после операторов, операторы всегда будут выполняться хотя бы один раз. Это полезно, если вы хотите, чтобы действие произошло один раз, а затем, с помощью условия, решить, должно ли это действие произойти снова.
Как и в случае с циклами WHILE, чтобы цикл перестал повторяться, необходимо изменить значение в булевом выражении. Это можно сделать, увеличивая значение переменной (для подсчета), или с помощью условного оператора, например оператора IF, внутри цикла.
В каком ПО я могу тренироваться программированию контроллеров на ST?
Даже если вы подробно прочитали эту статью, вы только начали изучать структурированный текст. Теперь вам следует запустить руки в грязь и начать использовать структурированный текст.
Вы должны написать несколько программ для ПЛК. Ведь именно так можно по-настоящему изучить структурированный текст и овладеть языком программирования.
MasterSCADA 4D
Полноценный обзор этой молодой среды сейчас делать на буду, но вынужден признать, что на момент 2024 года это одна из самых популярных сред для для разработки систем автоматизации и диспетчеризации в России от разработчиков из компании “ИнСАТ” и велика вероятность, что они еще долго будут сохранять лидерство в этом сегменте. Важно, что среда имеет в себе встроенный полноценный редактор кода стандартов МЭК IEC 61131-3.
Плюсы:
Полностью бесплатная полноценная среда разработки полного цикла. Это означает, что на ней можно как удобно писать код для ПЛК так и разрабатывать полноценную SCADA.
Важно, что ПО доступно для скачивания всем, платная только версия среды исполнения (Run-time), но есть и бесплатные варианты RT с довольно неплохими опциями, такие как 32 точки опроса или рантайм в течении 1 часа. Кроме того, есть довольно подробная (относительно других продуктов на рынке РФ) документация и даже вводный бесплатный MasterSCADA 4D курс на STEPIC.
Минусы:
Среда довольно тяжелая и требует значительных мощностей компьютера, но даже если у вас последний core i9, как у меня, это все равно не гарантирует, что программа будет быстрой и отзывчивой в больших проектах (!!!), т.к. она задействует мало ядер процессора, но в маленьких проектах все в полном порядке.
Прикладываю короткий простой видеоурок по Masterscada4d от разработчиков, чтобы понять основные концепции среды и что где нажимать необходимо пройти все части (они короткие и легкие) видеоуроков на официальном yt канале.
Codesys
Это один из мировых лидеров специализирующийся именно на программировании ПЛК. Огромное количество компаний в РФ используют именно эту среду разработки, тк она очень удобная и имеет обширнуб
Это программная среда с открытым исходным кодом для программирования ПЛК по стандарту IEC 61131-3. Открытый исходный код означает, что его можно скачать бесплатно, что делает его идеальным для студентов.
Beckhoff TwinCat 3
Одним из лучших программных продуктов для программирования ПЛК, если вы хотите изучить ST это программное обеспечение от Beckhoff TwinCat 3, оно полностью совместимо со всеми языками программирования ПЛК стандарта IEC 61131-3, включая лестничные диаграммы (LD) и структурированный текст (ST). В свой практике я с ним не встречался, но в англоязычном сообществе это ПО пользуется успехом.
Для обучающихся самым большим преимуществом TwinCat 3 является наличие симулятора. Вам не нужно покупать ПЛК, вы просто используете виртуа ПЛК.
На YouTube есть бесплатная серия видео от SquishyBrained. Вы должны следить за ним! Он даже снял серию видео о своем DIY 3D-принтере. Это отличный видеоурок, который поможет вам начать программировать ПЛК со структурированным текстом в TwinCat 3.
Заключение
Изучение нового языка программирования может оказаться довольно сложной задачей. Но для начинающих есть несколько основных моментов, о которых всегда следует помнить:
- Обучение требует времени. Вы только начали. Дайте себе время на изучение языка (синтаксис, функции, …)
- Практикуйтесь как можно больше. Постарайтесь сделать как можно больше программ и решений для ПЛК в структурированном тексте…
- Учитесь на своих неудачах.
Каждый раз, когда вы совершаете ошибку, не расстраивайтесь. Учитесь на ней и становитесь лучшим программистом. - Продолжайте учиться. Никогда не прекращайте читать, смотреть учебники и другие обучающие материалы.
- Общайтесь с другими программистами ПЛК.
И последнее, но не менее важное – это обсуждение на форумах и задавание вопросов. Участвуйте и учитесь у других программистов ПЛК.
Я думаю, что последняя часть – самая важная. Обучение у других людей с опытом может быть самым эффективным способом узнать не только о языке программирования, но и о том, как его использовать.
Присоединяйтесь к обсуждению ниже: Задайте свой первый вопрос о ST и общайтесь с другими программистами ПЛК.
Что вы узнали из этой обучающей статьи? Поделитесь в комментариях.