Язык программирования ПЛК Structured Text (ST) и его применение
Большинство современных программируемых логических контроллеров ( ПЛК ) больше не ограничиваются одним языком программирования.
В настоящее время к наиболее распространенным языкам программирования ПЛК относятся: LD (лестничные диаграммы), FBD ( функциональные блоковые диаграммы ) , СFC (непрерывные функциональные схемы, как вариант языка FBD ), SFC (последовательные блок-схемы) и ST (структурированный текст) .
У каждого из них есть свои достоинства и недостатки. Выбранный язык может идеально подходить для отдельных приложений, но в другом случае работа с ним может быть настоящей головной болью.

У вас возникли проблемы с чтением и анализом вашей большой программы на языке релейных диаграмм (LD) ? Вы предпочитаете печатать на клавиатуре и тем самым воплощать свои творческие идеи программирования в программный код? В таком случае ST — идеальное решение для вас!
Начиная обучение программирования контроллеров чаще всего выбирают первым языком программирования язык релейных диаграмм (LD). Это относительно просто, особенно для тех, кто имеет опыт работы с различным электрооборудованием и схемами на электромагнитных реле и пускателях.
К сожалению, по мере роста приложения ваша программа может стать нечитаемой для других людей. Чтобы это исправить пригодится у добная для анализа структура языка ST (структурированный текст).
Что такое язык ST?
ST (Structured Text) — это язык программирования, определенный в третьем международном стандарте МЭК 61131-3 (IEC 61131-3) , который описывает графические и текстовые языки программирования для ПЛК.
В отличие от графических языков программирования, язык ST основан на тексте. В результате он занимает гораздо меньше места, чем графический язык программирования, является самым гибким из всех языков, а логику программы, написанной на ST легче декодировать и понимать.
Сейчас чаще всего функциональные блоки пишутся на языке ST, а основная программа — на графическом языке, например на языке функциональных блоковых диаграмм FBD.
На мой взгляд, ST — один из важнейших языков программирования для программируемых логических контроллеров! Мой опыт показывает, что программа, которую я написал ранее на графических языках, заняла у меня вдвое больше времени, чем написание той же программы на ST.

Фрагмент программы на языке ST :

Преимущества языка ST:
более простой анализ программы;
возможность более быстрого программирования.
Если у вас был опыт работы с языками высокого уровня, такими как Pascal или C, вы можете заметить сходство между ними и ST.
Синтаксис ST очень похож на синтаксис языка высокого уровня и включает переменные, условные операторы, циклы. Даже если у вас не было возможности программировать на языках высокого уровня, ST может стать отличным введением в изучение их синтаксиса. Я особенно рекомендую его людям, которые хотят быстро понять принцип обработки программ контроллером ПЛК.
Программа на ST анализируется с первой строки кода. Анализ кода выполняется построчно. Вся операция происходит циклически. В конце последней строки цикл контроллера перезапустится, и программа будет продолжать работать, пока контроллер находится в режиме RUN (выполнение программы ПЛК). То же самое верно для LD , FBD и любого другого языка программирования стандарта МЭК 61131-3.
Если вы раньше программировали другие микропроцессорные системы, вы знаете, что для выполнения цикла выполнения программы необходимо реализовать бесконечный цикл. При программировании ПЛК вам не нужно беспокоиться о реализации бесконечного цикла для выполнения программы. ПЛК сделает за вас это автоматически.
Structured Text // Определение переднего (R_TRIG) и заднего (F_TRIG) фронта сигнала в Codesys:
Синтаксис языка ST
Синтаксис языка программирования — это набор правил, определяющих его структуру. В языке ST много двоеточий, точек с запятой и других символов. Каждый символ имеет свое значение. Некоторые из них являются операторами, другие — функциями или переменными.
Международный стандарт МЭК 61131-3 , в котором описаны графические и текстовые языки программирования для ПЛК, также стандартизирует типы данных на две категории: элементарные типы данных и производные типы данных.
Элементарные типы данных:

В языке ST есть несколько основных синтаксических правил. Не обязательно всех запоминать, но запомните самое главное: объявления переменных заканчиваются точкой с запятой, можно использовать прописные и строчные буквы (компилятор не понимает разницу), пробелы между последовательными командами не имеют значения, они используются для улучшения читаемости кода .
Основные элементы языка ST — это выражения и команды. Выражения предоставляют значения, соответствующие указанному типу данных. Они состоят из операторов и операндов. Операнд может быть переменной, константой, функцией или другим выражением.
Основные языковые команды: инструкция присваивания, например a: = b и инструкции. В текстовой форме этот язык включает стандартные функции и функциональные блоки, определенные в стандарте.
Все среды разработки программ для ПЛК оснащены компилятор ами , которы е перевод ят ваш программный код в машинный код. Компилятор анализирует данный язык программирования. Если синтаксис неверен, компилятор сообщит об ошибках.
Важн о ! Если компилятор видит точку с запятой, то это означает для него конец выражения. Компилятор всегда читает все, пока не встретит точку с запятой, а затем выполняет выражение.
Пример программы управления светофором на языке ST:

Видеоурок по составлению программы на ST:
Обучение ST
Рекомендую изучать язык ST продвинутым и новичкам !
Лучшая книга по ST на русском языке — Сергей Романов «Изучаем Structured Text МЭК 61131-3»
Сергей Романов – достаточно известная и медийная личность в мире промышленной автоматики. Его книга покрывает практически все аспекты языка ST и включает как доступную информацию из справочных материалов и стандартов, так и множество дополнений из других источников.
Книга написана достаточно простым языком, который будет понятен даже читателям без профессионального образования в сфере программирования. Оформление книги тоже способствует удобному восприятию информации.

Книга состоит из двух разделов.
Первый – справочный, в нем рассмотрены основные возможности языка ST, приведено описание типов данных, синтаксиса, операторов, условий и циклов. В отличие от материалов, которые можно найти в среде разработки, дано очень подробное описание элементов языка, в книге много примеров, приближенных к реальности, и готовых решений.
Второй раздел, получивший название «Рецепты», посвящен решению определенных задач и применению на практике всех знаний, которые можно почерпнуть из первого раздела. Например, в нем содержатся статьи об обработке аналоговых и дискретных сигналов (как входных, так и выходных), ошибках процессов, о запуске двигателя и др.
Это самая полная информация по языку ST когда либо изданная. 3 года работы, 320 страниц уникального материала собранного автором буквально по крупицам.
Подробности об языке программирования на ST в CoDeSyS

Прежде чем мы с вами будем рассматривать упрощённую графическую систему программирования для технологов, хотелось бы в двух словах рассказать о базисном языке программирования СИ. Язык ST CoDeSyS отличается от других своей гибкостью и адаптивностью под любые задачи. Он позволяет обрабатывать сложные решения и видеть всю картину в целом. Чаще всего применяется в функциональных блоках для обработки алгоритма той или иной части рабочего органа станка или линии.
Из этой статьи вы узнаете:
Здравствуйте уважаемые Дамы и Господа! Меня зовут Гридин Семён, и я являюсь автором этого блога. В данном посте я хочу обсудить с вами базовые понятия языка программирования CoDeSyS . Называется он ST CoDeSyS, очень сильно напоминает СИ.
Язык программирования ST и типы переменных
ST (Structured text) — это одна из составных частей комплекса CoDeSyS и представляет собой текстовый редактор высокого уровня. Он очень похож на Basic или Pascal. Такой способ программирования является идеальным инструментом для людей-программистов. Преимуществом языка является создание сложных математических и разветвленных алгоритмов.
ST позволяет без труда описывать сложные операции компактным и лёгким для восприятия текстом. Structured Text содержит в себе много конструкций, позволяющие присваивать переменные, использовать готовые библиотеки, функции и функциональные блоки.

В чём преимущество данного способа программирования? давайте с вами перечислим:
- Наглядность. Вы можете на одном листинге оценить всю последовательность действий и выполнение условий
- Программа на ST может быть создана в любом текстовом редакторе
- Читабельность. За счёт символьного представления текста и выделения блоков разными цветами
С этим мы разобрались, но, прежде чем переходить к непосредственному изучению азов программирования, необходимо ознакомиться с элементом языка — тип данных . Хочу обратить внимание, этот элемент практически схож во многих си-подобных языках (Питон, Ардуино IDE, СИ# т.д.)

Тип данных переменной определяет род информации, диапазон представлений и множество допустимых операций. Языки МЭК используют строгую идеологию в этом отношений. Любую переменную можно использовать только после её объявления. Присваивать значения одной переменной другой можно, только если они одного типа. В другом случае используются преобразователи типов.
В таблице ниже я представлю типы данных, которые используются чаще всех:
| Тип | Название | Предел | Размер в байтах |
| BOOL | Логическое | 1 бит | 1 бит |
| BYTE | Целочисленое | 8 бит | 1 байт |
| WORD | Целочисленое | 16 бит | 2 байта |
| INT | Целочисленое | -32768-32767 | 2 байта |
| UINT | Целочисленое | 0-65535 | 2 байта |
| FLOAT | Вещественное | ±10³³ | 4 байта |
| DATE_AND_TIME | Дата и время | — | — |
| STRING | Строковое | — | — |
Перечень основных операторов
Операторы — это символы определённых операций. Но их можно определить и как функции, наделёнными определёнными привилегиями. Они имеют определённые ключевые слова и формы для представления на ST.
Оператор выбора IF позволяет выполнить различные группы выражений в зависимости от условий, выраженных логическими выражениями.
Язык st codesys команды + видео обзор

Языки
Общие сведения о языке ST¶
ST (Structured Text) – это текстовый язык высокого уровня общего назначения, по синтаксису схожий с языком Pascal. Удобен для программ, включающих числовой анализ или сложные алгоритмы. Может использоваться в программах, в теле функции или функционального блока, а также для описания действия и перехода внутри элементов SFC. Согласно IEC 61131-3 ключевые слова должны быть введены в символах верхнего регистра. Пробелы и метки табуляции не влияют на синтаксис, они могут использоваться везде.
Выражения в ST выглядят точно также, как и в языке Pascal:
Порядок их выполнения – справа налево. Выражения состоят из операндов и операторов. Операндом является литерал, переменная, структурированная переменная, компонент структурированной переменной, обращение к функции или прямой адрес.
Типы данных¶
Согласно стандарту IEC 61131-3, язык ST поддерживает весь необходимый набор типов, аналогичный классическим языкам программирования. Целочисленные типы: SINT (char), USINT (unsigned char), INT (short int), UINT (unsigned int), DINT (long), UDINT (unsigned long), LINT (64 бит целое), ULINT (64 бит целое без знака). Действительные типы: REAL (float), LREAL (double). Специальные типы BYTE, WORD, DWORD, LWORD представляют собой битовые строки длиной 8, 16, 32 и 64 бит соответственно. Битовых полей в ST нет. К битовым строкам можно непосредственно обращаться побитно. Например:
a.3 := 1; (* Установить бит 3 переменной a *)
Логический тип BOOL может иметь значение TRUE или FALSE. Физически переменная типа BOOL может соответствовать одному биту. Строка STRING является именно строкой, а не массивом. Есть возможность сравнивать и копировать строки стандартными операторами. Например:
Для работы со строками есть стандартный набор функций (см. приложение 2, раздел «Строковые операции с переменными типа STRING»).
Специальные типы в стандарте IEC определены для длительности (TIME), времени суток (TOD), календарной даты (DATE) и момента времени (DT).
В таблице 3.1 приведены значения по умолчанию, соответствующие описанным выше типам.
Таблица 3.1 – Значения по умолчанию для типов данных IEC 61131-3
| Тип(ы) данных | Значение |
| BOOL, SINT, INT, DINT, LINT | 0 |
| USINT, UINT, UDINT, ULINT | 0 |
| BYTE, WORD, DWORD, LWORD | 0 |
| REAL, LREAL | 0.0 |
| TIME | T#0S |
| DATE | D#0001-01-01 |
| TIME_OF_DAY | TOD#00:00:00 |
| DATE_AND_TIME | DT#0001-01-01-00:00:00 |
| STRING | ‘’ (пустая строка) |
По умолчанию, все переменные инициализируются нулем. Иное значение переменной можно указать явно при ее объявлении. Например:
str1: STRING := ‘Hello world’;
В определённых ситуациях при разработке программных модулей удобно использовать обобщения типов, т.е. общее именование группы типов данных. Данные обобщения приведены в таблице 3.2.
Таблица 3.2 – Обобщения типов данных IEC 61131-3
Таймеры и триггеры CODESYS. Еще один шаг Arduino к классическому ПЛК

Случается программировать контроллеры (ПЛК) в среде CODESYS. Все, кто имел дело с этой системой, знают, что в любом проекте присутствует библиотека Standard.lib, в которой реализованы базовые таймеры, триггеры, счетчики и некоторое кол-во других функций и функциональных блоков. Многие из этих блоков постоянно используются в программах для ПЛК. А сама библиотека, как и языки программирования CODESYS, является воплощением стандарта IEC 61131-3, т.е. призвана помочь при программировании классических ПЛК задач.
Одна из особенностей программ для ПЛК в том, что основной цикл программы должен выполняться без существенных задержек, в нем не должно быть внутренних циклов с неопределенным временем выхода или синхронных вызовов «задумчивых» функций, особенно это касается коммуникаций по медленным каналам. Обновление входных и выходным образов процесса происходит только на границе основного цикла, и чем дольше мы будем «сидеть» внутри одной итерации цикла, тем меньше мы будет знать о реальном состоянии объекта управления, в конечном итоге сработает watchdog переполнения времени выполнения цикла. Многие могут мне возразить, сказав, что современные ПЛК многозначны, есть с поддержкой аппаратных прерываний. Согласен, но разговор о таких системах не входит в мои планы, я же хочу поговорить о (квази, псевдо — выбирайте) ПЛК однозадачной реализации (без прерываний) на базе микропроцессорной платформы Arduino, в котором есть только один основной цикл. Кстати, не лишним будет сказать, что на написание данной заметки меня сподвигла статья Ардуино-совместимый ПЛК CONTROLLINO, часть 1 о попытке аппаратного воплощения Arduino в пром. ПЛК.
Несколько слов об Arduino. С точки зрения программиста ПЛК, Arduino — это типичный контроллер с одним очень быстрым или, наоборот, очень медленным циклом loop(). На время выполнения цикла не накладывается никаких ограничений, и он может отработать и один, и бесконечное кол-во раз — по замыслу программиста. Когда программа проста и сводится к выполнению последовательных операций, регуляторов, без параллельных событий, то достаточно чередовать операции бесконечными вложенными циклами проверки условий и синхронными задержками типа delay(). Последовательные шаги такой программы будут выполняться буквально построчно, просто и логично. Но, как только возникает необходимость в программировании параллельных операций, необходимо менять парадигму программы.
В однозадачной системе добиться видимой параллельности можно только очень быстрым последовательным сканированием параллельных состояний, не задерживаясь подолгу на каждом вызове функции или проверке условия. С физическими входами-выходами проблем нет, функции отрабатывают достаточно быстро, а вот delay() становится неоправданным тормозом. И вот тут на смену приходят неблокирующие таймеры, те самые, которые в программировании ПЛК являются классикой. Суть в том, что для их работы используется миллисекундный счетчик времени, и все действия привязаны к значениям этого глобального счетчика.
Видео: Вебинар «Основы программирования ПЛК1хх на языке ST»

Видео: Видео CoDeSys ПЛК Овен язык программирования ST Часть№1

А теперь давайте вспомним ту самую Standard.lib из CODESYS. В ней как раз реализованы МЭК-овские неблокирующие таймеры. Я взял ее за основу и портировал функции таймеров и триггеров в библиотечный код Arduino (С++). Т.е. попытался приблизить Arduino к классическому ПЛК.
Ниже я приведу краткое описание портированных функциональных блоков (FB) CODESYS и их аналоги в моей библиотеке plcStandardLib, все временные диаграммы верны для новой библиотеки Arduino. Подробнее описание исходных блоков можно посмотреть, например, в русскоязычной справке по CODESYS.
TON — функциональный блок «таймер с задержкой включения»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. Как только IN становится TRUE, начинается отсчет времени (в миллисекундах) на выходе ET до значения, равного PT. Далее счетчик не увеличивается. Q равен TRUE, когда IN равен TRUE, а ET равен PT, иначе FALSE. Таким
образом, выход Q устанавливается с задержкой PT от фронта входа IN.
В Arduino IDE:
Временная диаграмма работы TON:

TOF — функциональный блок «таймер с задержкой выключения»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Если IN равен TRUE, то выход Q = TRUE и выход ET = 0. Как только IN переходит в FALSE, начинается отсчет времени (в миллисекундах) на выходе ET. При достижении заданной длительности отсчет останавливается. Выход Q равен FALSE, если IN равен FALSE и ET равен PT, иначе — TRUE. Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN.
В Arduino IDE:
Очень похоже на TON, для краткости:
Временная диаграмма работы TOF:

TP — функциональный блок «импульс-таймер»
Входы IN и PT типов BOOL и TIME соответственно. Выходы Q и ET аналогично типов BOOL и TIME. Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени (в миллисекундах) на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.
В Arduino IDE:
Очень похоже на TON, для краткости:
Временная диаграмма работы TP:

R_TRIG — функциональный блок «дeтектор фронта»
Функциональный блок R_TRIG генерирует импульс по переднему фронту входного сигнала. Выход Q равен FALSE до тех пор, пока вход CLK равен FALSE. Как только CLK получает значение TRUE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из FALSE в TRUE.
Пример CODEDESYS на языке ST:
В Arduino IDE:
F_TRIG — функциональный блок «дeтектор спада»
Функциональный блок F_TRIG генерирует импульс по заднему фронту входного сигнала.
Выход Q равен FALSE до тех пор, пока вход CLK равен TRUE. Как только CLK получает значение FALSE, Q устанавливается в TRUE. При следующем вызове функционального блока выход сбрасывается в FALSE. Таким образом, блок выдает единичный импульс при каждом переходе CLK из TRUE в FALSE.
В Arduino IDE:
RS_TRIG — функциональный блок RS-триггер / SR_TRIG — функциональный блок SR-триггер
Переключатель с доминантой выключения, RS-триггер:
Переключатель с доминантой включения:
Входные переменные SET и RESET1 — как и выходная переменная Q1 типа BOOL.
Язык st codesys команды
Документальные учебные фильмы. Серия «Программирование на CODESYS».
Речь пойдет о логических операциях, то есть об операциях «И», «ИЛИ», «НЕ».

Они составляют основу любых дискретных алгоритмов. На использовании этих логических операций построена работа многих шкафов автоматики и релейных схем. Такие решения до сих пор массово используются на значительном числе производств. Это один из советов читателям, куда нужно применить информацию, полученную на этих страницах. Представьте, огромный шкаф релейной автоматики Вы можете заменить одним или несколькими маленькими ПЛК. При этом перестанете постоянно следить за состоянием вечно ломающихся реле.
Видео: Часть 14: Язык программирования ST

Видео: Лекция. Программирование на языке SFC (CoDeSys)

После этого переходим на вкладку ресурсы, выбираем пункт «Конфигурация ПЛК». Ранее я уже упоминал, что работа ПЛК происходит циклически. В программе мы описываем действия для одного цикла, одного повторения. А дальше, после загрузки проекта в ПЛК, котроллер постоянно повторяет подготовленный нами алгоритм. Именно в этом разница между программированием приложений для персонального компьютера, и работой с задачами АСУ ТП. Итак, нам необходимо задать контроллеру время цикла его работы (время цикла ПЛК). То есть определить, с какой частотой необходимо повторять обработку программы. Для этого в окне «Конфигурации ПЛК» выделяем верхний пункт «PLC 150 I». У Вас, в зависимости от вашей модели ПЛК, могут быть другие обозначения. Затем переходим на вкладку «Параметры модуля», расположенную в правой верхней части экрана.

По умолчанию, время цикла ПЛК1хх составляет 1 мс. То есть каждую миллисекунду ПЛК заново запускает обработку нашего алгоритма. И должен успеть ее завершить. Для тех простых программ, которыми мы занимаемся в рамках обучения, такая скорость обработки вполне допустима. С другой стороны, в более серьезных задачах полезно задать некоторый запас производительности ПЛК. То есть указать время цикла, скажем, 10 мс. Для 80% задач, решаемых ПЛК1хх, этого будет достаточно. Возьмите себе за правило сразу же после создания проекта задавать время цикла 10 мс. Для этого в первой строчке, в поле «Значение» вместо 1 мс поставьте 10 мс. Это время цикла, за которое контроллер будет обрабатывать нашу программу.
Для того чтобы разобраться с работой дискретной логики, нам понадобится несколько входов и выходов ПЛК. Для этого Вы раскрываете элементы конфигурации ПЛК и задаете шесть дискретных входов. Пусть это будут переменные x1, х2, хЗ и т.д.
Напомню, для того, чтобы определить имя переменной для того или иного входа или выхода, Вы два раза щелкаете ЛКМ на надписи «АТ» в нужной строчке. Затем вводите имя переменной (английскими буквами и цифрами без пробелов), нажимаете «Enter» на вашей клавиатуре. Таким образом, у нас получилось 6 дискретных входов. По аналогии задаем четыре дискретных выхода. Пусть это будут переменные у1, у2, уЗ и у4.

• Вы определились с target-файлом,
• создали главную программу и выбрали язык программирования,
• задали время работы цикла ПЛК,
• определились с необходимыми входами и выходами,
• сохранили проект на вашем компьютере.
Вернемся к нашей главной программе. Напомню, она находится на вкладке «POU». Переходим нее и два раза щелкаем ЛКМ на программу «PLC PRG»

Для того чтобы задать в вашем алгоритме ту или иную логическую операцию, поступаем следующим образом. В верхней части экрана, на панели быстрого доступа есть кнопка «Элемент» ( ).

. Нажимаем на нее, переносим курсор на рабочую область и нажимаем левой кнопкой мыши еще раз, устанавливая элемент в нужном месте рабочей области. По умолчанию блок, который мы добавили, будет выполнять операцию логического «И». Она задается ключевым словом «AND».

Аналогичный блок можно вызвать через контекстное меню, нажав в рабочей области ПКМ и выбрав пункт «Элемент».
На вход операции «AND» подаются переменные типа «BOOL». Как раз такими переменными являются наши дискретные входы. В нашей программе мы вызываем значение переменной,

Затем проводим линии связи.
На выходе операции логического «И» (блок AND) будет появляться сигнал TRUE или FALSE («ИСТИНА» или «ЛОЖЬ»), То есть значение типа BOOL. Это значение мы можем присвоить переменной того же типа, например, выходу y1. Для этого добавляем выход ( ) на рабочую область.

Вместо знаков вопроса прописываем имя переменной y1. Затем проводим линию связи между выходом операции AND и переменной y1.



Получили блок «ИЛИ». Принцип работы с ним абсолютно тот же самый. Мы вызываем в алгоритме значения дискретных входов ПЛК, на этот раз хЗ и х4. Затем подводим линии связи к нашему блоку OR. Результат работы этого блока мы будем передавать на второй дискретный выход контроллера, т.е. в переменную у2. На рисунке изображено то,

что должно было у Вас получиться.


Удерживая ЛКМ, перетаскиваем вторую линию связи на вход блока NOT

Видео: #1 — Structured Text // Определение переднего (R_TRIG) и заднего (F_TRIG) фронта сигнала в Codesys

Видео: ST в OwenLogic. Создаем функцию преобразования сопротивления в температуру на примере Pt1000.

, затем отпускаем ЛКМ. Полученный результат изображен на рисунке.

Тем же способом вы можете значение одной и той же переменной передавать на несколько блоков.



Вернемся к нашему алгоритму. Теперь, когда на выходе операции OR будет значение FALSE, у нас с Вами на выходе уЗ будет появляться сигнал TRUE, в то время как в переменной у2 он будет пропадать. И наоборот, когда на выходе OR появляется сигнал TRUE, он записывается в у2. В блоке NOT этот сигнал будет преобразовываться в FALSE и поступать в переменную уЗ. А в результате релейные выходы нашего ПЛК все время будут в разных состояниях.

На вход этой операции будем подавать значения переменных типа BOOL, например, переменные х5 и хб. Для того чтобы использовать повторно какие-то готовые части уже написанного алгоритма, мы можем воспользоваться стандартными операциями «Копировать» и «Вставить». При добавлении блока XOR используем их. Для начала, выделим цепь с оператором OR.



На экране появляется копия выбранной части алгоритма. Нажав и удерживая ЛКМ на выделенных частях появившейся копии, мы перетаскиваем ее на новое место в рабочей области.

Теперь нам необходимо поменять в заголовке элемента оператор OR на оператор XOR. В качестве входных данных мы будем использовать переменные х5 и хб. Для замены имени переменной Вы просто нажимаете на соответствующий блок входа ЛКМ. Затем с клавиатуры вводите новое имя. Результат работы блока XOR будем передавать в переменную у4.

Сейчас мы с Вами все это проверим, запустив программу непосредственно на ПЛК. Прежде чем это делать, еще несколько вещей, которые полезно себе записать и запомнить.
Перед загрузкой проекта на исполнение:
• Расставляем порядок обработки: нажимаем ПКМ на свободную область, выбираем «Порядок», а затем «В соответствии с потоком данных». Нумерация элементов, то есть порядок их обработки, станет более правильной.
• Сохраняем проект (Ctrl+s).
• Запускаем проект на проверку, т.е. компилируем. Для этого в меню «Проект» выбираем пункт «Компилировать все», либо нажимаем клавишу F11. Внизу, в окне сообщений, мы должны увидеть, что ошибок у нас «О». То есть можно этот простой алгоритм запускать на исполнение. Если ошибки все-таки есть, вам необходимо их исправить и снова запустить компиляцию.

Сразу же начинает действовать блок NOT. На вход у него приходит значение «ЛОЖЬ», на выходе мы видим сигнал «ИСТИНА», который передается на соответствующий дискретный выход уЗ.

Ну и теперь ваша задача заключается в том, чтобы просто проверить то, что Вы запрограммировали. То есть Вы подаете сигнал на переменную x1, на переменную х2, и у Вас появляется «ИСТИНА» в переменной у1.

То есть срабатывает первый выход. Если один из входных сигналов отключить, то в у1 будет «ЛОЖЬ» (FALSE).

В заключение этой части хочу показать одну полезную «фишку». Достаточно часто бывают ситуации, когда для операции AND или для операции OR Вам будет необходимо больше, чем два входных значения. Задать дополнительные входы можно следующим образом: Вы выделяете ЛКМ блок, в котором Вам необходимо добавить вход. Затем нажимаете на нем ПКМ, выбираете пункт «Вход блока». Появляется еще один вход.


Статья создана на основе книги Кирилла Гайнутдинова «Простое и понятное программирование в CODESYS».
CODESYS для программирования встраиваемых систем
В системах промышленной автоматизации базовым интеллектуальным элементом является программируемый логический контроллер (ПЛК) [1, 2, 3, 6, 7]. С точки зрения программирования главная особенность ПЛК состоит в том, что для работы с ним не требуется образование в области информатики. Инструменты и языки программирования ПЛК должны быть максимально просты и в то же время эффективны. Упрощение использования не должно повлечь за собой ограничение круга решаемых задач.

Рис. Эволюционный набор для PLC Core модулей SYSTEC с системой исполнения и визуализацией CODESYS V3
Для удовлетворения этих противоречивых требований были созданы специальные языки программирования. В 1982 г. вышла первая редакция международного стандарта МЭК61131-3 (далее МЭК). В нем определено пять языков программирования ПЛК: три оригинальных визуальных и два, пришедших из мира компьютеров. Так, к первым относятся языки «релейных схем» (Ladder Diagram, LD), «функциональных блоковых диаграмм» (Function Block Diagram, FBD) и «последовательных функциональных схем» (Sequential Function Chart, SFC). А «Список инструкций» (Instruction List, IL) — это аппаратно-независимый ассемблер. Высокоуровневый язык «структурированный текст» (Structured Text, ST) представляет собой модифицированный Паскаль. Отдельные программные компоненты можно описывать на разных языках МЭК даже в одном проекте. В зависимости от уровня подготовки, типа решаемой задачи и личных предпочтений прикладной МЭК-программист выбирает оптимальный язык.
Видео: Видео CoDeSys ПЛК Овен язык программирования ST Часть№2

Создание качественного транслятора языка программирования высокого уровня является сложной и трудоемкой задачей. Для графических языков объем работы увеличивается за счет необходимости создания соответствующего графического редактора и отладчика. Поэтому задача поддержать несколько разных языков в одной программной среде стала серьезной проблемой для многих изготовителей ПЛК. В итоге это привело к возникновению компаний, специализирующихся на создании универсальных сред программирования на языках МЭК. Одной из наиболее успешных оказалась немецкая 3S-Smart Software Solutions GmbH со своим комплексом CODESYS.
CODESYS включает в себя редакторы и трансляторы для всех пяти стандартных языков с рядом существенных расширений. Он также поддерживает значительное число специализированных отладочных и сервисных функций. На сегодня CODESYS — мировой лидер среди МЭК-комплексов. С его помощью ежегодно программируется более полумиллиона контроллеров. После долгих лет горячих споров 18.01.2013 г. была одобрена третья редакция стандарта МЭК 61131-3. В нее вошли оригинальные объектно-ориентированные расширения языков МЭК [4], впервые реализованные в комплексе CODESYS V3. Таким образом, CODESYS создал новый международный стандарт. Описанию его составляющих, приемам эффективной работы и практике применения посвящено несколько книг и множество статей [1, 3, 6, 7, 8, 9].
Аспекты программиста
Чаще всего программисты встраиваемых систем противопоставляют CODESYS интегрированным компиляторам языка С/C++. Попробуем сравнить их технически (результаты сравнения приведены в таблице).


