Язык ST CoDeSyS – самый гибкий язык программирования
Прежде чем мы с вами будем рассматривать упрощённую графическую систему программирования для технологов, хотелось бы в двух словах рассказать о базисном языке программирования СИ. Язык 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 позволяет выполнить различные группы выражений в зависимости от условий, выраженных логическими выражениями.
PROGRAM PLC_PRG VAR in:BOOL; out:INT; END_VAR IF in = TRUE THEN out:=1; ELSE out:=2; END_IF;
PROGRAM PLC_PRG VAR in:BOOL; out:INT; END_VAR
IF in = TRUE THEN out:=1; ELSE out:=2; END_IF; |
Оператор множественного выбора CASE позволяет выполнить различные группы выражений в зависимости от значения одной целочисленной переменной или выражения.
PROGRAM PLC_PRG VAR in:BOOL; test:INT; out:INT; END_VAR CASE test/2 OF 0,127: in:=TRUE; out:=123; 15..30: in:=FALSE; out:=456; ELSE out:=789; END_CASE;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | PROGRAM PLC_PRG VAR in:BOOL; test:INT; out:INT; END_VAR
CASE test/2 OF 0,127: in:=TRUE; out:=123; 15..30: in:=FALSE; out:=456; ELSE out:=789; END_CASE; |
Циклы WHILE и REPEAT обеспечивают повторение группы выражений, пока верно условное логическое выражение. Если условное выражение всегда истинно, то цикл становится бесконечным. Условие в цикле WHILE выполняется до начала цикла, а в REPEAT после тела цикла.
PROGRAM PLC_PRG VAR in:BOOL; test:INT:=64; out:INT; END_VAR WHILE test>1 DO out:=out+1; test:=test/2; END_WHILE
PROGRAM PLC_PRG VAR in:BOOL; test:INT:=64; out:INT; END_VAR
WHILE test>1 DO out:=out+1; test:=test/2; END_WHILE |
PROGRAM PLC_PRG VAR in:BOOL; test:INT:=64; out:INT; END_VAR REPEAT out:=out+1; test:=test/2; UNTIL test>1 END_REPEAT
PROGRAM PLC_PRG VAR in:BOOL; test:INT:=64; out:INT; END_VAR
REPEAT out:=out+1; test:=test/2; UNTIL test>1 END_REPEAT |
Цикл FOR обеспечивает заданное количество повторений группы выражений.
PROGRAM PLC_PRG VAR in:BOOL; test:INT; out:INT; END_VAR FOR test:=1 TO 10 DO out:=out+1; END_FOR
PROGRAM PLC_PRG VAR in:BOOL; test:INT; out:INT; END_VAR
FOR test:=1 TO 10 DO out:=out+1; END_FOR |
Советы по программированию ПЛК в среде CoDeSyS
Одно из значительных отличий написание алгоритмов для АСУТП от классического программирования — это меньший уровень абстракции. Для описания тех. процесса не требуется глубокое и огромное описание. Достаточно опираться на логику процесса и здравый смысл.
Не стремитесь использовать чужие библиотеки и чужой код в своих проектах.
Обращаю ваше внимание, чужие библиотеки, скачанные с форума на реальных объектах использовать категорически НЕ РЕКОМЕНДУЮ. Для этого есть куча готовых библиотек, такие как Standart, Utill, OSCAT. Фирма ОВЕН для своего оборудования пишет свои ПРОТЕСТИРОВАННЫЕ библиотеки.
У меня был такой горький опыт. Когда мы занимались автоматизацией ЦТП, а точнее контуром отопления и ГВС, я скачал с форума библиотеки для ПИД-регулирования задвижек. И что же в итоге получилось? Код тупо не сработал, вообще! Пришлось работать сутками, и днём и ночью допиливать программу в режиме цейтнота.
Пишите программы компактно, и оставляйте комментарии.
Когда пишите объёмную и сложную программу, пользуйтесь функциями, функциональными блоками и подпрограммами. Пишите комментарии возле каждого узла автоматизации. Это очень сильно упрощает жизнь. Особенно тогда, когда нужно через некоторое время что-то исправлять.
Пользуйтесь интерактивной справкой в среде разработки.
В данном каталоге вы можете найти ответы на многие ваши вопросы, особенно это актуально для новичков. Открывается справка по нажатию кнопки F1.
Плюсы языка ST-массивы и циклы.
Использование циклов и массив облегчают жизнь программисту и увеличивает читабельность кода. Циклы очень удобны при использовании сложных и ресурсоёмких функций, таких как ПИД-регуляторы, опрос аналоговых входов, связь между ПЛК.
На этом я с вами прощаюсь, дорогие друзья, пишите в комментариях, подписывайтесь, рассказывайте друзьям. До встречи в следующих статьях.
С уважением, Гридин Семён.
kip-world.ru
CODESYS для программирования встраиваемых систем
В системах промышленной автоматизации базовым интеллектуальным элементом является программируемый логический контроллер (ПЛК) [1, 2, 3, 6, 7]. С точки зрения программирования главная особенность ПЛК состоит в том, что для работы с ним не требуется образование в области информатики. Инструменты и языки программирования ПЛК должны быть максимально просты и в то же время эффективны. Упрощение использования не должно повлечь за собой ограничение круга решаемых задач.
Рис. Эволюционный набор для PLC Core модулей SYSTEC с системой исполнения и визуализацией CODESYS V3
Для удовлетворения этих противоречивых требований были созданы специальные языки программирования. В 1982 г. вышла первая редакция международного стандарта МЭК61131-3 (далее МЭК). В нем определено пять языков программирования ПЛК: три оригинальных визуальных и два, пришедших из мира компьютеров. Так, к первым относятся языки «релейных схем» (Ladder Diagram, LD), «функциональных блоковых диаграмм» (Function Block Diagram
Создание качественного транслятора языка программирования высокого уровня является сложной и трудоемкой задачей. Для графических языков объем работы увеличивается за счет необходимости создания соответствующего графического редактора и отладчика. Поэтому задача поддержать несколько разных языков в одной программной среде стала серьезной проблемой для многих изготовителей ПЛК. В итоге это привело к возникновению компаний, специализирующихся на создании универсальных сред программирования на языках МЭК. Одной из наиболее успешных оказалась немецкая 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++. Попробуем сравнить их технически (результаты сравнения приведены в таблице).
С++ | CODESYS |
1. Трансляция кода/Среда программирования | |
Компиляторы генерируют машинный код с качественной оптимизацией по размеру и быстродействию. Для разных семейств микропроцессоров обычно применяются разные компиляторы. Как правило, обновление версий компиляторов идет независимо от среды программирования. | Встроенные компиляторы генерируют машинный код с оптимизацией по надежности и переносимости. Тысячи разных устройств, на разных микропроцессорах, используют одинаковые компиляторы, что обеспечивает их качество. Обновление компиляторов идет вместе с обновлением среды программирования. Но есть опция выбора версии компилятора. Это позволяет исключить риск при правке старых проектов. |
2. Интерфейс с системным уровнем (API) | |
Функции чтения входов и записи выходов нужно писать в программе. На разных аппаратных платформах интерфейс с системным уровнем разный. Он меняется при замене процессора или ОС. | МЭК-программа работает с образом входов/выходов. Их обслуживает система исполнения. Доступ к специфическим устройствам выполняется через системные библиотеки. |
3. Переносимость | |
Многие функции прикладного кода могут быть использованы повторно. Системно-зависимые интерфейсы нужно адаптировать. | Если набор ресурсов (порты, полевые сети и др.) не изменился, то программа переносится без изменений. Необходимо переконфигурировать ввод/вывод и адаптировать системно-зависимые библиотеки. |
4. Удобство прикладного программирования | |
Естественная среда для компьютерных программистов, чего не скажешь о сервисном персонале. Модификации прикладного кода могут влиять на стабильности системы в целом. Должны выполняться только опытными программистами. | Семь различных языков программирования, включая графические, позволяют программисту создавать код так, чтобы он был понятен прикладным специалистам и обслуживающему персоналу. Программист может выбирать оптимальный язык для разных функций. |
5. Разделение между верхним/прикладным/пользовательским уровнем управляющей программы и системным уровнем | |
Не реализовано. Для понимания работы управляющей программы нужно предварительно иметь представление об организации программного обеспечения в целом. | Правильно организованное МЭК-приложение имеет два или более уровня с четким разделением. Верхний уровень отображает общую структуру и алгоритмы управления. Это позволяет понимать работу системы обслуживающему персоналу, не имеющему специальной подготовки. Внутренние детали приложения скрыты (защищены) в функциональных блоках и библиотеках. |
6. Объектно-ориентированное программирование (ООП) | |
Было сильнейшим аргументом в пользу выбора C++ до выхода CODESYS V3. | Поддержано в CODESYS V3 для всех языков. Позволяет использовать современную технологию организации приложений. |
7. Графический интерфейс оператора (HMI) | |
Возможен. Требует написания дополнительного кода или использования вспомогательных инструментов. Интерфейс отображения должен быть адаптирован для разных устройств вывода. | Встроенный графический редактор с набором типовых элементов отображения и ввода. Для управления графическим элементом нужно ввести наименования переменных программы в соответствующие поля. Визуализация отображается в среде программирования, на графической панели устройства или через Интернет. Способ отображения выбирается в диалоговом окне. |
8. Отладка | |
Среды программирования имеют встроенные отладчики. Дополнительные функции, типа графической трассировки, фиксации значений переменных, не практикуются. | Полная поддержка общепринятых отладочных функций (выполнение по шагам, условные точки останова, стек вызовов и т. д.) на всех языках МЭК. Дополнительные функции для отладки и обслуживания системы в целом (графическая трассировка, менеджер рецептов, фиксация переменных, визуализация). Возможно визуальное моделирование объекта управления. |
9. Реальное время | |
Определяется организацией программы. Зависит от ОС. Может вызвать ограничения при отладке. | Обеспечивается системой исполнения. В прикладной программе усилий не требует. |
10. Поддержка стандартных полевых сетей (Fieldbus) | |
Не включена. Требуется дополнительное ПО, реализующее стек протокола, и отдельный конфигуратор. Стеки аппаратно-зависимы. Конфигуратор (если есть) обычно не интегрирован в среду программирования. Символьное отображение входов/выходов проблематично. | Интегрированные конфигураторы и стеки полевых сетей. Стеки полевых сетей написаны в среде CODESYS и независимы от нижнего уровня. Нужный стек компилируется и линкуется с приложением автоматически. |
11. Специализированный инструментарий для прикладных областей | |
Нужно программировать самим или приобретать дополнительные инструменты. Интеграция обычно требует разделяемой памяти. Контроль движения и логика управляются разными процессами. | Интегрированный механизм сохраняемых переменных. Мониторинг входов и управление выходами без программирования. Специализированные прикладные библиотеки. Встроенная система управления движением (Soft Motion CAM/CNC), 3D-редактор перемещений, интерпретатор G-кодов (ЧПУ). Работает в одном процессе, единая адресация. |
12. Командная работа/управление версиями | |
Большинство сред разработки поддерживают контроль версий. | Поддерживается путем установки специального плагина для интеграции с Subversion. |
13. Быстрое создание/тиражирование однотипных систем | |
Существуют специальные приемы и инструменты, ускоряющие работу программиста. | Пакет CODESYS Application Composer позволяет конструировать приложения с автоматической генерацией надежного кода. Приложение составляется из готовых настраиваемых блоков без программирования. |
14. Поддержка новых стандартов на рынке систем управления | |
Нужно отслеживать и делать самостоятельно, заказывать или приобретать сторонние разработки. | Функционал, соответствующий новейшим мировым стандартам, наращивается постоянно. Например: FDT, OPC UA, EtherCAT, CANopen, PROFINET, ASi и т. д. |
15. Контроль целостности/защита копирования | |
Нет. Реализуется программно. | Встроенная защита модификации кода, уникальный идентификатор проекта. Опционально: шифрование проекта, многоуровневая система прав доступа, сохранение исходных текстов в памяти устройства. |
Как показано в таблице, для человека, имеющего образование по специальности программирование, C/C++ является естественным выбором. Переход к использованию МЭК-языков потребует некоторых усилий по освоению. Обычно начальный дискомфорт в CODESYS вызывает отсутствие главного цикла и функций ввода/вывода, которые полностью «спрятаны» в системе исполнения. Существенно отличается работа с таймерами. Ближе всего к языку C в CODESYS язык ST. Как правило, для его уверенного освоения программисту достаточно нескольких часов [5].
Использование МЭК-языков может не дать явных преимуществ мгновенно. Они проявляются ярко при необходимости пояснения прикладной программы другим людям. В этом смысле весьма эффективна связка языков SFC и ST. Диаграмма SFC визуально представляет интуитивно понятный алгоритм работы, буквально «оживающий» в онлайновом режиме. Действия шагов SFC описываются на привычном высокоуровневом языке ST.
Аспекты руководителя
Некоторые успешные практические применения CODESYS во встраиваемых системах инициировались не техническими специалистами, а менеджментом компании. Чаще всего главной причиной становилась одна из четырех, перечисленных ниже.
Проблема правильной организации работ
Как правило, в компании есть системный программист с соответствующим образованием. Он начинает с «оживления» платы, установки операционной системы (ОС) или самостоятельной разработки необходимого функционала нижнего уровня. Кажется логичным, чтобы он продолжил работу над системой далее, включая прикладные функции. Ему приходится потратить немало времени на то, чтобы разобраться с прикладной сферой. Будь то газовый котел, система управления яхты, пульт авиационного тягача или что угодно, постепенно он начнет ориентироваться в теме не хуже заказчика. Иногда даже лучше, поскольку вынужден разобраться с причинно-следственными связями и выстроить алгоритмы. В итоге компания приобретает абсолютно уникального специалиста. Работа успешно сдается. Далее становится ясным, что только этот специалист способен сопровождать систему. Его нельзя отвлекать или заменять, нельзя предоставить отпуск или уволить. Компания попадает в зависимость от специалиста.
Рис. Самолетный тягачком пании TREPEL. Вместо обычных рычагов управления он оснащен встраиваемым панельным PC c CODESYS компании Janz Tec
Вначале сам программист рад своей уникальной позиции. По прошествии нескольких лет он замечает, что «золотой фонтан» не забил, а работа стала утомительной. Он отстал от новых технологий по основной специальности. Сменить работу не реально. Проблема возникает с двух сторон.
CODESYS выручает благодаря свойствам 2 и 5 (см. таблицу). Нижним уровнем, включая установку системы исполнения CODESYS, занимаются системные программисты. Прикладной проект делается в CODESYS специалистами по прикладной области. Благодаря 4, им не требуется специальное образование. Системный и прикладной уровни четко разделены, как и требования к их исполнителям. При необходимости сопровождение ПО может быть передано заказчику. Специалистам заказчика достаточно пройти двухдневные учебные курсы.
Проблема развития универсальности системы и расширения рынка сбыта
Рис. Пульт управления яхтой, разработанный компанией Exor
Если устройство оказалось востребованным, то постепенно возникает необходимость специальных исполнений для разных заказчиков. Появляется несколько «прошивок» программы. Потом разрабатывается специальная компьютерная программа — конфигуратор системы. Она настраивает параметры устройства. Постепенно число параметров возрастает. Соответственно, разбухает документация. Но по-прежнему находятся заказчики, которым не хватает нужного именно им функционала. Рождается логичная мысль пойти дальше и дать заказчикам (дистрибьюторам, установщикам) возможности программирования системы. С языком C++ это нереально. CODESYS решает данную проблему. Существует ряд специализированных контроллеров для печатных машин, деревообрабатывающих станков, заправочных станций, дорожных машин, химических аналитических приборов и др., которые оснащены CODESYS и дополнены специализированными библиотеками. Изготовитель соответствующей машины сам адаптирует контроллер под разнообразные модели и наращивает функционал. Изготовитель встраиваемой системы выигрывает за счет унификации и расширения областей применения.
В простых устройствах выручает встроенная визуализация CODESYS (п. 7 таблицы). С ее помощью графические конфигураторы, включая веб-интерфейс, делаются «попутно» на ранних версиях прикладного проекта.
Проблема интеграции с устройствами других компаний
Обычно в успешно развивающейся системе возникает необходимость подключения приборов, датчиков и других устройств ведущих мировых изготовителей. Самостоятельная реализация стандартных полевых сетей значительна по трудоемкости. Покупка готового стека дорога. CODESYS (см. п. 10 таблицы) позволяет поддержать практически все стандартные сети. В нашей практике к использованию CODESYS во встраиваемых системах чаще других приводила необходимость поддержки стеков CANopen и EtherCAT.
Проблема замены ПЛК встраиваемой системой
В некоторых случаях, помимо базового серийного изделия, требуются особые исполнения. Пример: компактный холодильник и заказная холодильная установка, различные термокамеры, весы, сварочные автоматы, научное оборудование и др. Под специальное исполнение целесообразно применить готовый ПЛК с CODESYS. На нашем рынке доступны десятки таких ПЛК разных ценовых категорий. В разных применениях могут использоваться компактные, модульные или панельные ПЛК. Для серийных изделий изготавливается собственный встраиваемый контроллер. Если везде стоит CODESYS, то одна команда справляется с разработкой ПО и сопровождением всех вариантов. Практически везде применяется один проект с разной конфигурацией.
Установка к CODESYS
Для того чтобы устройство программировалось в CODESYS, в нем предварительно должна быть установлена так называемая система исполнения CODESYS Control. Она включает планировщик задач, загрузчик, функции отладки, обслуживает полевые сети, ввод/вывод и т. д. Именно благодаря ей МЭК-программа оказывается аппаратно-независимой. Набор ресурсов, которые должна обслуживать система исполнения, отличается у разных контроллеров. Речь идет не только о микроконтроллере, но и об устройстве в целом. По этой причине нельзя просто скопировать систему исполнения с одного устройства на другое. Она всегда требует некоторой индивидуальной адаптации. Все существующие встраиваемые системы с CODESYS созданы одним из трех способов:
- Бизнес-модель разработчиков CODESYS ориентирована на серийно выпускаемые изделия. Изготовитель ПЛК приобретает стартовый набор. Это комплекс из программного обеспечения и работ по обучению, помощи в адаптации и дальнейшему сопровождению. На выходе получается специальная «прошивка», «заточенная» под конкретную систему и готовая к тиражированию. Первая адаптация обычно занимает несколько месяцев. Выполнив ее, компания приобретает необходимый опыт и может самостоятельно устанавливать CODESYS на любые свои продукты достаточно быстро, даже если они построены на разных процессорах и в разных операционных системах.
- Существуют компании (Systec, Janz, Frenzel Berg и др.), предлагающие готовые встраиваемые устройства с CODESYS и системы под заказ. Заказчику остается только написать прикладное ПО. Обычно такие компании выпускают собственный ряд модулей-«полуфабрикатов». У них имеется надежное аппаратное ядро (встраиваемый компьютер, микропроцессорный модуль, PLC Сore), определенный набор плат или микросхем ввода/вывода, сетевые и другие модули. Из них компонуется нужная система. Они также предлагают несколько типов готовых встраиваемых компьютеров (контроллеров) с CODESYS и эволюционные наборы.
- Применение микросхем и модулей Beck IPC@CHIP. Это миниатюрный встраиваемый компьютер с ОС РВ на борту. Компании Beck удалось придумать технологию и создать специальный инструмент — Platform Builder (кстати, бесплатный). С его помощью в диалоговом режиме мы задаем требуемую конфигурацию системы исполнения CODESYS. Например, можно включить поддержку CANopen, веб-визуализации, описать входы/выходы, выбрать способ обслуживания энергонезависимой памяти, добавить собственные обработчики системных событий и т. п. Затем автоматически генерируются все необходимые файлы. Остается дописать по готовым шаблонам драйверы ввода/вывода под нашу периферию и собрать систему исполнения. Получается исполняемый файл, который копируется на встроенный диск IPC@CHIP. Технология выглядит простой, но пока никто из конкурентов не создал аналогов. Все они предлагают некие типовые сборки PLC Core ядер с фиксированным функционалом.
По требованию российских заказчиков Beck создала специальное исполнение чипов с расширенным температурным диапазоном (–40 °С). Существует исполнение для энергетики с поддержкой коммуникационной библиотеки МЭК 61850.
Первый путь выбирают крупные изготовители встраиваемых систем. Он оправдан при выпуске от нескольких сотен изделий в год и выше. В странах ЕС все более развивается практика заказа разработки. По числу применений в России лидирует технология Beck IPC@CHIP. В любом случае среда программирования CODESYS поставляется бесплатно. Никаких ограничений в функционале и числе установок в ней не предусмотрено. В CODESYS имеется встроенный эмулятор контроллера. Это позволяет начать работу без приобретения аппаратных средств.
Рис. «Беспилотный» транспортер E&K AUTOMATION на базе собственного встроенного контроллера и модулей ввода/вывода Wago IO
Заключение
Сегмент встраиваемых систем в суммарном годовом объеме применений CODESYS ежегодно увеличивается. CODESYS применяется во встраиваемых контроллерах компаний Bosh, Rolls-Royce Marine, Praxis, CC Systems, Moba и др. Это далеко не опытные прототипы, речь идет о десятках тысяч изделий. Примеры нескольких применений показаны на фотографиях.
Среди МЭК-систем программированиия CODESYS выделяется тем, что, подобно компиляторам С/С++, непосредственно генерирует надежный и компактный машинный код, пригодный для встраиваемых систем. Простые в освоении языки МЭК позволяют привлечь к разработке и сопровождению специалистов прикладной области. Интерес для разработчика встраиваемых систем может представлять богатый функционал комплекса CODESYS. Многозадачность реального времени, обработка событий, встроенная визуализация, развитый набор коммуникаций, «горячее» обновление кода, полевые сети, поддержка управления через Интернет, средства национальной локализации проектов и другие функции CODESYS могут быть не востребованы во встраиваемой системе изначально. Но необходимо учитывать, что все они создавались эволюционно, исходя из практических требований, возникавших у пользователей контроллеров в разных странах, разных условиях и на разных этапах работ. В процессе жизни встраиваемой системы неизбежно возникают аналогичные или близкие задачи. Например, задача настройки и тестирования оборудования заказчиком, интеграция с другим оборудованием, веб-интерфейс и т. п. Во многих случаях CODESYS даст готовое решение.
Вконтакте
Google+
Литература- Петров И. В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования. М.: СОЛОН-Пресс. 2004.
- Болл К. История возникновения программируемых логических контроллеров // Control Engineering Россия. 2009. № 1(36).
- Петров И. В. Выбор ПЛК: ставка на открытость и совместимость // Конструктор. Машиностроитель. 2013. № 1.
- Wagner R., Petrov I. Go to OOP // SPS-Magazin. № 9.
- Петров И. В. Язык ST для C программиста // Мир компьютерной автоматизации. 2006. № 1.
- Харазов В. Г. Интегрированные системы управления технологическими процессами. СПб.: Профессия. 2009.
- Денисенко В. В. Компьютерное управление технологическим процессом, экспериментом, оборудованием. М: Горячая линия–Телеком. 2009.
- Petry J. IEC61131-3 mit CoDeSys V3: Ein Praxisbuch f?r SPS-Programmierer . Kempten. Germany. 2011.
- Константинов А. Модульный ПЛК FASTWEL I/O — от замысла до реализации // Control Engineering Россия. 2012. № 4(41).
controlengrussia.com
Блог об АСУ ТП и КИПиА. Блоки CoDeSys
Советы конкретные и философские. С примерами и скриншотами. Буду дополнять.
Пользуйтесь реальностью процессовОдно из фундаментальных отличий программирования технологических процессов от классического программирования – это обычно значительно меньший уровень абстракции. Алгоритмы определяются технологией процесса, который в свою очередь часто опирается на здравый смысл и простую логику. Об этом часто забывают увлекаясь программированием ради программирования.
Не путайте причины и следствия
Например, пусть при падении давления нужно выключать насос, а при выключенном насосе какой-то клапан должен быть закрыт; предположим, никаких иных условий выключения и закрытия – нет. Ошибочно при этом (даже якобы в целях оптимизации кода) закрывать клапан при падении давления, т.к. алгоритм закрытия клапана строго привязан именно к состоянию насоса. При удлинении или изменении следственных цепочек это может привести к серьезным ошибкам в процессе или сложностям в модификации кода.
Настройка среды CODESYS 2.3
Некоторые настройки “по умолчанию” в CODESYS удивляют. Например, эта среда – единственная из виденных мной, в которой шрифт не моноширинный, т.е. символы в нем имеют разную ширину. Сразу же после установки среды заходите в Проект > Опции > Редактор > Шрифт и выбирайте Consolas (код на всех скриншотах) или хотя бы Courier New.
После этого отмените автообъявление (штука, появляющаяся когда вы вводите незнакомый Кодесису набор символов), этот адский источник всплывающих окон, которыми так любит радовать эта среда.
В настройках “Рабочего стола” уберите лишние галочки и уменьшите таймауты связи до 1000 мс – это сильно упростит вам жизнь, поверьте.
Чтобы перепроверить правильность кода – после каждого изменения жмите клавишу F11 для компиляции кода. После нажатия в нижней части экрана высветятся сообщения о текущих ошибках или их отсутствии. Чтобы скрыть лишнюю плашку с этими сообщениями – нажмите SHIFT+ESC.
Не стремитесь использовать чужой код
Вторичное использование чужого кода в классическом программировании – норма и необходимость, обусловленная множеством причин. В АСУ ТП же, по моему мнению, почти нет необходимости использовать сторонний код.
Я не считаю себя профессионалом и не писал особо сложных программ, но для тех что писал мне вполне хватало стандартных библиотек Util.lib и Standart.lib. Те же библиотеки Oscat (скачать + мануалы на англ) шикарны и всеохватывающи, но в них нет ничего сверхестественного и, мне кажется, лучше самому писать аналогичные функции. А на тот код, который обычно выкладывают на форумах, лучше вообще не смотреть. Даже с тем, что я выкладываю в блоге лучше просто ознакамливаться, а не использовать. Пишите свои алгоритмы и как можно больше)
Примеры правильного кода внутри библиотек
Чтобы понять как должен выглядеть грамотный код и узнать некоторые программистские приёмчки не нужно далеко ходить. Открывайте Кодесисом библиотеки Util.lib и Oscat.lib как обычные проекты и впитывайте мудрость строк.
NB Может я и негодяй, но с помощью этой проги вы можете взломать запароленные библиотеки.
Пользуйтесь интегрированной справкой CODESYS
Банально, но там есть ответы на большинство вопросов начинающих. Справка небольшая поэтому лучше пробежаться по ней всей чтобы познакомится с возможностями языков и функций.
Вызов справки по “F1” работает по большинству служебных слов и элементам библиотек Util.lib и Standart.lib. Иногда в CODESYS 2.3 вызов по “F1” не срабатывает, например для SEL и ARRAY, поэтому вручную открывайте справку и ищите нужный идентификатор во вкладке “Поиск”
Не повторяйте код
Это самый распространенный косяк у неопытных программистов независимо от платформы и языка программирования. Видите дублированный код – выносите его в отдельную функцию или функциональный блок, и/или же переводите переменные в элементы массивов и прогоняйте в цикле. Предыдущее предложение вам может быть непонятно, но подробности можно загуглить.
На скриншоте код, обрабатывающий данные с частотных преобразователей Danfoss. Переменные типа CWS1_FREQ созданы в Конфигурации ПЛК в разделе ModBus (Master). Слева представлена первая версия кода где каждый ПЧ представлен отдельным куском из восьми строк; код в каждом куске различается только данными, а логика одинакова.
Справа оптимизированная версия – логика вынесена в отдельную функцию GET_PUMP (с адресацией и указателями, о которых расскажу ниже), а код для конкретного ПЧ теперь занимает одну строчку. Если бы в Конфигурации можно было задавать переменные как элементы массива (типа FREQ_CWS[1]), то код обработки любого количества ПЧ свелся к одной строке, вложенных в два цикла (см. совет ниже).
кликните на скриншот чтобы увеличить его
Плюсы языка ST – массивы и циклы
Язык ST я использую из-за того, что моё знакомство с программированием началось с C/C++. В некоторых случаях удобно использовать CFC или что похуже, но в целом ST более ёмок, лаконичен и чёток. Но, чем действительно он отличается от других языков так это возможностью нормального использования массивов и циклов, которые мне сильно облегчают жизнь и увеличивают читабельность кода.
Не злоупотребляйте циклами
При том, что циклы FOR бывают крайне удобны, всегда помните, что код в ПЛК выполняется в суперцикле и часто можно обойтись простым инкрементированием с обнулением (см. скриншот ниже). Также большие циклы FOR и тем более WHILE могут сильно “затормозить” суперцикл ПЛК вплоть до срабатывания сторожевого таймера (об этом в следующем совете). Иногда, конечно, нужно сделать перебор в текущем суперцикле и тут уж лучше использовать FOR.
| j станет равным 25000 за 1 цикл, но |
Сторожевой таймер и сброс ПЛК
Если суперцикл выполняется слишком долго, то ПЛК производит аппаратный сброс на уровне микроконтроллера. Такое возникает при переходе в бесконечный цикл и других зависаниях. Отвечает за анализ времени выполнения цикла сторожевой таймер, или Watchdog.
Сброс по watchdog’у отличается от любого сброса через среду CODESYS. Этим можно пользоваться. В моей практике сторожевой таймер применяется в контроллерах ОВЕН. В этих ПЛК иногда происходит неприятный момент – созданный в Конфигурации модуль ModBus (Master) перестает вести опрос Слейвов (обычно это возникает после перезаливки программы). Поначалу это решали сбросом питания, но тут возникали трудности при удаленной закачке через интернет.
Позже я обнаружил, что проблему решает искусственное заведение программы в бесконечный цикл. Я вывел сброс на кнопку в визуализации. Или же можно анализировать изменение переменной “Опрашиваемый адрес” в ModBus (Master) – если Slave-устройств больше одного, то она должна меняться каждый цикл.
Расширенное использование функций
Помимо вывода одного-единственного значения любого стандартного типа функция способна возвращать значения пользовательского типа, например структуры, которые могут состояться из любого количества переменных разного типа.
Но что интереснее, имеется возможность изменения переменных, которые являются аргументами функции, внутри самой функции. Это возможно благодаря использованию указателей и адресации на эти переменные. Понять что к чему можно по скриншоту ниже, на котором приведен код функции, инициализирующий переменную если та равна нулю. Параметр внутри функции определяется как указатель на нужный тип, а при вызове функции в параметре используется не сама переменная, а её адрес (функция ADR).
Иногда SEL удобнее IF
В случае когда при каком-то условии переменная должна изменить своё значение, а в противном – иметь другое значение, применение IF может быть не лучшем решением. Если условие применимо только к этой единственной переменной – используйте функцию-селектор SEL. Она работает с переменными любого типа.
Буль не буль
Очень часто в чужом коде встречаю странное использование операций с булевыми величинами или, наоборот, игнорирование булевой логики.
Во-первых, операции типа сравнения или проверки равенства возвращают булевы значения.
Во-вторых нет необходимости явно сравнивать булеву переменную со значениями TRUE или FALSE.
Сравнение возвращает TRUE или FALSE | Нет необходимости явного сравнения |
Наглядная работа с булями
Мне очень часто для сокращения кода приходится использовать явные преобразования BOOL в целое число, например, в формулах. Для этого приходится использовать функцию приведения типов в её стандартном неуклюжем виде BOOL_TO_BYTE(). Но как-то раз наткнулся на блог Егора Петрова, где он придумал более простое и изящное решение – по сути переименовать эту функцию в более читаемую – WHEN(). Теперь пользуюсь, пользуйтесь и вы.
Удобное использование булевых переменных и функции WHEN | Код функции WHEN |
Получи +10 к карме — поделись в комментариях
своими фишками и замечаниями.
www.asutp-volgograd.com
Компоненты проекта CoDeSys – PLC
Проект
Проект включает следующие объекты: POU, типы данных, визуализации, ресурсы, библиотеки. Каждый проект сохраняется в отдельном файле.
POU (Program Organization Unit)
К программным компонентам (POU) относятся функциональные блоки, функции и программы. Отдельные POU могут включать действия (подпрограммы). Каждый программный компонент состоит из раздела объявлений и кода. Для написания всего кода POU используется только один из МЭК языков программирования (IL, ST, FBD, SFC, LD или CFC). CoDeSys поддерживает все описанные стандартом МЭК компоненты. Для их использования достаточно включить в свой проект библиотеку standard.lib. POU могут вызывать другие POU, но рекурсии недопустимы.
Функция
Функция – это POU, который возвращает только единственное значение (которое может состоять из нескольких элементов, если это битовое поле или структура). В текстовых языках функция вызывается как оператор и может входить в выражения.При объявлении функции необходимо указать тип возвращаемого значения. Для этого после имени функции нужно написать двоеточие и тип.
Имя функции используется как выходная переменная, которой присваивается результат вычислений.
Объявление функции должно начинаться с ключевого слова FUNCTION и заканчиваться ключевым словом END_FUNCTION.
В языке ST вызов функции может присутствовать в выражениях как операнд.
В SFC функция вызывается только из шага или перехода.
Функция не имеет внутренней памяти. Это означает, что функция с одними и теми же значениями входных переменных всегда возвращает одно и то же значение.
Функциональный блок
Функциональный блок — это POU, который принимает и возвращает произвольное число значений. В отличие от функции функциональный блок не формирует возвращаемое значение. Объявление функционального блока начинается с ключевого слова FUNCTION_BLOCK и заканчивается ключевым словом END_FUNCTION_BLOCK.
Ниже приведен пример функционального блока, написанного на IL, который имеет две входных и две выходных переменных. Значение выходной переменной MULERG равно произведению значений двух входных переменных, а значение VERGL определяется в результате сравнения значений входных переменных.
Экземпляры функционального блока
Определение функционального блока подобно определению типа данных. Для работы с функциональным блоком необходимо объявить (создать) его экземпляр. Один функциональный блок может иметь произвольное число экземпляров, каждый из которых имеет собственные независимые данные (память). Каждый экземпляр функционального блока получает свой собственный идентификатор (имя экземпляра) и свои данные, содержащие входные, выходные и внутренние переменные. Экземпляры функционального блока объявляются глобально или локально как переменные, имеющие тип соответствующего функционального блока.
Вызов экземпляра функциональный блока происходит с помощью его имени. Входные и выходные переменные доступны вне функционального блока, а внутренние переменные доступны только в самом блоке.
Экземпляры функционального блока могут быть объявлены в другом функциональном блоке или в программе. Объявлять экземпляр функционального блока в теле функции нельзя. Экземпляры функционального блока доступны в том POU, в котором они объявлены, если они не объявлены глобально.
Экземпляры функциональных блоков могут быть использованы в качестве входных переменных других функциональных блоков или функций.
Вызов функционального блока
Для обращения к входным и выходным переменным функционального блока извне необходимо указать имя экземпляра функционального блока, следующей за ней точкой и именем переменной:
<Имя экземпляра>.<Имя переменной >
Присваивание параметров при вызове:
В текстовых языках (IL, ST) задать актуальные параметры и считать значения выходов можно непосредственно при вызове экземпляра функционального блока. Для входных переменных применяется присваивание «:=», выходы считываются при помощи «=>». Этот процесс упрощается, если использовать ассистент ввода (<F2>) с включенной опцией вставки с аргументами (With arguments).
Программа
Программа – это POU, способный формировать произвольное значение во время вычислений. Значения всех переменных программы сохраняются между вызовами. В отличие от функционального блока экземпляров программы не существует. Программа является глобальной во всем проекте. Нельзя вызывать программу из функции.
Если вызвать программу, которая изменит значения своих переменных, то при следующем вызове ее переменные будут иметь те же значения, даже если она вызвана из другого POU.
В этом заключается главное различие между программой и функциональным блоком, в котором изменяются только значения переменных данного экземпляра функционального блока.
Объявление программы начинается ключевым словом PROGRAM и заканчивается ключевым словом END_PROGRAM.
Так же, как и для экземпляров функциональных блоков, в текстовых языках (IL, ST) задать актуальные параметры и считать значения выходов можно непосредственно при вызове программы. Для входных переменных применяется присваивание «:=», выходы считываются при помощи «=>».
PLC_PRG
Программа PLC_PRG – это специальный POU, который должен быть в каждом проекте. Эта программа вызывается один раз за цикл управления.
При создании нового проекта автоматически открывается диалог «Project» «Object Add», предлагающий создать новый POU — программу с именем PLC_PRG.
Не следует менять предложенные установки. Если определить последовательность выполнения задач в Task Configuration, то проект может не содержать PLC_PRG.
Действие
Программы или функциональные блоки могут быть дополнены действиями. Фактически действия – это дополнительный набор встроенных в POU подпрограмм. Действия могут описываться на языке, отличном от того, на котором выполняется соответствующий функциональный блок или программа. Действие оперирует с теми же данными, что и функциональный блок или программа, к которой оно принадлежит.
Вызов действия:
Действие вызывается с помощью идентификатора:
<Имя_программы>.<Имя_действия> или <Имя_экземпляра>.<Имя_действия >.
Если нужно вызвать действие из POU, к которому оно принадлежит, то в текстовых языках используется имя действия, а в графических – функциональный блок без указания имени экземпляра.
Ресурсы
Ресурсы отвечают за конфигурацию проекта, включая:
- Глобальные переменные, используемые во всем проекте.
- Менеджер библиотек (Library manager) для подключения необходимых библиотек к проекту
- Журнал записи действий во время исполнения
- Конфигуратор тревог (Alarm Configuration) для конфигурирования обработки тревог в проекте
- Конфигуратор ПЛК (PLC Configuration) для конфигурирования аппаратуры контроллера.
- Конфигуратор задач (Task Configuration) для управления задачами
- Менеджер рецептов (Watch and Receipt Manager) для просмотра и заказа наборов значений переменных
- Опции целевой системы (Target Settings)
- Рабочая область для отображения опций проекта
В зависимости от системы исполнения и ее опций могут подключаться дополнительные объекты:
Sampling Trace — для задания графической трассировки значений переменных.
ParameterManager — для взаимодействия с другими контроллерами в сети
PLC-Browser — монитор ПЛК
Tools – для вызова внешних, специфичных для каждой платформы инструментов
SoftMotion – компоненты системы управления движением (в соответствии с лицензией), редакторы CNC и CAM
Библиотеки
Проект может использовать несколько библиотек, в которые входят POU, необходимые им типы данных и глобальные переменные. Библиотечные POU можно использовать точно так же, как и определенные пользователем.
Библиотеки «standard.lib» и «util.lib» обязательно входят в стандартный комплект поставки.
Типы данных
Кроме стандартных типов данных, вы можете использовать определяемые пользователем типы данных. Ими могут быть структуры, перечисления и ссылки.
Визуализация
С помощью визуализации пользователь может создать графическое представление проекта. Форма и цвет графических элементов будут изменяться при работе программы в зависимости от значений переменных. Визуализация может исполнятся в системе программирования, в отдельном приложении CoDeSys HMI или как Web или целевая (в ПЛК) визуализация.
Мой блог находят по следующим фразам
plc24.ru
Условные операторы и операторы циклов языка ST – PLC
Инструкция RETURN
Инструкция RETURN позволяет выйти из POU, например, в зависимости от условия.
Инструкция IF
Используя инструкцию IF, можно проверить условие, и в зависимости от этого условия выполнить какие-либо действия.
Синтаксис:
IF <Boolean_expression1> THEN
<IF_instructions>
{ELSIF <Boolean_expression2> THEN
<ELSIF_instructions1>
.
.
.ELSIF <Boolean_expression n> THEN
<ELSIF_instructions n-1>
ELSE
<ELSE_instructions>}
END_IF;
Часть конструкции фигурных скобках не обязательна.
Если < <Boolean_expression1> возвращает истину, тогда <IF_Instructions> выполняется.
В противном случае будут выполняться остальные логические выражения одно за другим, пока одно из них не возвратит истину. Тогда выполняются инструкции, стоящие после этого логического выражения до следующего ELSIF или ELSE.
Если все логические выражения ложны, то выполняются инструкции, стоящие после ELSE.
Пример:
IF temp < 17
THEN heating_on: = TRUE;
ELSE heating_on: = FALSE;
END_IF
В этом примере нагревание (heating) включается, когда температура опустится ниже 17 . градусов, иначе оно останется выключенным.
Инструкция CASE
C помощью инструкции CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.
Синтаксис:
CASE <Var1> OF
<Value1>: <Instruction 1>
<Value2>: <Instruction 2>
<Value3, Value4, Value5>: <Instruction 3>
<Value6 .. Value10>: <Instruction 4>
…
<Value n>: <Instruction n>
ELSE <ELSE instruction>
END_CASE;
Инструкция CASE выполняется согласно следующим правилам:
· Если переменная <Var1> имеет значение <Value i>, то выполняется инструкция <Instruction i>
· Если <Var1> не принимает ни одного из указанных значений, то выполняется <ELSE Instruction>.
· Чтобы одна и та же инструкция выполнялась при различных значениях переменной <Var1>, необходимо перечислить эти значения через запятую.
· Чтобы одна и та же инструкция выполнялась для целого диапазона значений, необходимо указать начальное и конечное значения, разделенные двумя точками.
Пример:
CASE INT1 OF
1, 5: BOOL1 : = TRUE;
BOOL3 : = FALSE;
2: ВОOL2 : = FALSE;
BOOL3 : = TRUE;
10. 20: BOOL1: = TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;
Цикл FOR
С помощью FOR можно программировать повторяющиеся процессы.
Синтаксис:
INT_Var :INT;
FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <Step size>} DO
<Instructions>
END_FOR
Часть конструкции, заключенная в фигурные скобки, не обязательна.
<Instructions> выполняются, пока счетчик <INT_Var> не больше <END_VALUE>. Это условие проверяется перед выполнением <Instructions>, поэтому раздел <Instructions> не выполняется, если <INIT_VALUE> больше <END_VALUE>.
Всякий раз, когда выполняются <Instructions>, значение <INIT_VALUE>, увеличивается на <Step_size>. <Step_ size> может принимать любое целое значение. По умолчанию шаг устанавливается равным 1.
Пример:
FOR Counter: =1 TO 5 BY 1 DO
Var1: =Var1*2;
END_FOR;
Erg:=Var1;
В этом примере предполагается, что начальное значение Var1 равно 1. После выполнения цикла эта переменная будет равна 32.
Замечание: <END_VALUE>: не должно быть равно предельному значению счетчика <INT_VAR>. Например, если счетчик является переменной типа SINT и <END_VALUE> равно 127, то цикл становится бесконечным.
Цикл WHILE
Цикл WHILE может использоваться, как и цикл FOR, с тем лишь различием, что условие выхода определяется логическим выражением. Это означает, цикл выполняется, пока верно заданное условие.
Синтаксис:
WHILE <Boolean expression>
<Instructions>
END_WHILE
Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если <Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен ни разу. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно.
Пример:
WHILE counter<>0 DO
Var1: = Var1*2;
сounter := сounter-1;
END_WHILE
Цикл REPEAT
Цикл REPEAT отличается от цикла WHILE тем, что первая проверка условия выхода из цикла осуществляется, когда цикл уже выполнился 1 раз. Это означает, что независимо от условия выхода цикл выполняется хотя бы один раз.
Синтаксис:
REPEAT
<Instructions>
UNTIL <Boolean expression>
END_REPEAT
Раздел <Instructions> выполняется циклически до тех пор, пока <Boolean_expression> дает TRUE. Если<Boolean_expression> равно FALSE уже при первой итерации, то раздел <Instructions> не будет выполнен один раз. Если <Boolean_expression> никогда не примет значение FALSE, то раздел <Instructions> будет выполняться бесконечно.
plc24.ru
Codesys 2.3 – программирование на плк для новичков
Приветствую вас друзья, я надеюсь, что у вас сегодня хорошее настроение, наливайте себе зелёного чаю, берите печенье, всякие вкусняшки. В этой статье мы с вами поговорим об универсальной среде разработки программ для программируемых логических контроллеров (ПЛК) CODESYS 2.3
Итак, что же это за программа такая. Это среда разработки, то бишь некая программа, которая создает в себе другие программы для логических устройств. CoDeSyS разработан фирмой 3S Software, немецкими разработчиками. Это универсальный инструмент программирования контроллеров и встраиваемых систем. Комплекс программируется на стандартных языках МЭК 61131-3. О них буду говорить позже.
Из этой статьи вы узнаете:
Стандартные языки МЭК
Конфигуратор входов/выходов
Сама система реализована на языке С. Существует несколько модификации для различных микропроцессоров. Для привязки к конкретному контроллеру требуется конфигуратор, в настройках которого идет распределение памяти, интерфейс и привязка входов-выходов. Об этом будет ниже.
На рисунке выше я разместил рабочее окно проекта, чтобы показать как оно выглядит. Особенностями данного пакета являются:
- Прямая генерация машинного кода. В системе инструментов есть классический компилятор, который обеспечивает очень высокое быстродействие программы;
- Реализация МЭК языков;
- Редактор кода построен таким образом, что не позволяет программистам совершать типичные ошибки, и указывает на совершенные ошибки в коде;
- Встроенный эмулятор позволяет производить отладку программы без аппаратных средств, что бывает очень удобно;
- И да, комплекс CoDeSyS содержит в себе встроенный редактор визуализации;
Стандартные языки МЭК
Выбор стандарта языков программирования МЭК основан на том, что он является универсальным и удобным языком для программистов, инженеров и технологов. В течение времени язык программирования формировался и изменялся. Как вы думаете, было бы разумно делать мощный инструмент, опираясь на прошлый опыт разработок. В условиях конкурентного производства оборудования очень важно внедрять технологию быстро.
Всего таких языков из стандарта МЭК существует 5:
- Это язык IL – язык инструкций, напоминает Assembler;
- Язык ST – очень напоминает язык программирования С;
- Язык LD — релейные схемы, очень удобно для электриков;
- Язык FBD — графический язык, удобный для электронщиков;
- Язык SFC — структурный язык, удобен для пошагового программирования;
- CFC то же самое, что и FBD только расширенный функционал;
Какими языками удобнее всего пользоваться? Ну, это для кого как и кому как удобно, жёстких правил нету. Для программистов ближе будет ST, для электриков LD, для технологов скорее всего CFC.
Мне удобно пользоваться CFC и ST. На CFC языке всё наглядно видно, а это очень важно. Особенно когда идёт процесс наладки программы. А ST удобен своей гибкостью, и сложность программы ограничивается лишь вашей фантазией. А какие языки выбрали вы??
Кстати я чаще всего использую комбинацию различных языков. Я использовал такой трюк в проекте с холодильной камерой. Очень сложный проект, на написание программы у меня ушло 2 недели времени.
Конфигуратор входов/выходов
Теперь вернёмся к конфигуратору входов-выходов. О чем идёт речь? Предположим, у вас есть контроллер. У него много входов и выходов, аналоговых и дискретных. И, нам же к каждому входу и выходу нужно каким-то образом привязаться. Чтобы мы могли управлять, либо считывать данные.
Компания 3S Software реализовала в своём пакете CoDeSyS структуру дерева, в которой уже подготовлены некие ячейки памяти, отвечающие за каждый вход и выход контроллера. И мы просто присваиваем имя каждой ячейке, чтобы в дальнейшем управлять ими.
Очень большой плюс комплекса CoDeSyS в том, что среда разработки внедрена во многих логических контроллерах, как и в отечественных, так и в заморских.
Список контроллеров внушителен, поэтому я приведу те, которые знаю:
- ОВЕН ПЛК;
- WAGO;
- Beckhoff;
- Berghof;
- EMKO;
В целом CoDeSyS это мощный инструмент для реализаций технических задач. Для изготовления пультов управления технологическим процессом, от простых до сложных. Удобен для автоматизации умных домов. Минусом является стоимость подобных систем. Ну как говорится, в автоматике, чем надёжнее система, тем она дороже.
На этом у меня всё, успешных вам внедрений.
Как вам статья? Если понравилась, обязательно поделитесь ею в социальных сетях и подписывайтесь на новости блога.
P.S. Если вы вдруг задавались вопросом, как можно сделать баннер для сайта, заходите сюда.
С наилучшими пожеланиями, Гридин Семён.
kip-world.ru
Общие сведения о языке ST — Документация Beremiz
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 является именно строкой, а не массивом. Есть возможность сравнивать и копировать строки стандартными операторами. Например:
strA := strB;
Для работы со строками есть стандартный набор функций (см. приложение 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
ANY | |||
ANY_BIT | ANY_NUM | ANY_DATE | TIME STRING и другие типы данных |
BOOL BYTE WORD DWORD LWORD | ANY_INT | ANY_REAL | DATE TIME_OF_DAY DATE_AND_TIME |
INT SINT DINT LINT | UINT USINT UDINT ULINT | REAL LREAL |
К конструкциям языка ST относятся:
- арифметические операции;
- логические (побитовые) операции;
- операции сравнения;
- операция присвоения;
- конструкция IF – ELSEIF – ELSE;
- цикл FOR;
- цикл WHILE;
- цикл REPAET UNTIL;
- конструкция CASE.
При записи арифметических выражений допустимо использование скобок для указания порядка вычислений. При записи выражений допустимо использовать переменные (локальные и глобальные) и константы.
К арифметическим операциям относятся:
- «+» – сложение;
- «-» – вычитание;
- «*» – умножение;
- «/» – деление;
- «mod» – остаток от целочисленного деления.
Приоритет операций в выражениях указан в таблице 3.4 (чем выше приоритет, тем раньше исполняется операция).
Логические (побитовые) операции
К данным операциям относятся:
- «OR» – Логическое (побитовое) сложение;
- «AND» – Логическое (побитовое) умножение;
- «XOR» – Логическое (побитовое) «исключающее ИЛИ»;
- «NOT» – Логическое (побитовое) отрицание.
Операции сравнения
Поддерживаются следующие операции сравнения:
- «=» – сравнение на равенство;
- «<>» – сравнение на неравенство;
- «>» – сравнение на больше;
- «>=» – сравнение на не меньше;
- «<» – сравнение на меньше;
- «<=» – сравнение на не больше.
В качестве результата сравнения всегда используется значение типа BOOL.
Присвоение
Для обозначения присвоения используется парный знак «:=». В правой и левой части выражения должны быть операнды одного типа (автоматического приведения типов не предусмотрено). В левой части выражения (принимающая сторона) может быть использована только переменная. Правая часть может содержать выражение или константу.
В таблице 3.4 приведены приоритеты при выполнении описанных выше операций.
Таблица 3.4 – Приоритеты операций
Операция | Приоритет |
Сравнения | 1 |
Сложение, вычитание | 2 |
Умножение, деление | 3 |
OR | 4 |
AND, XOR | 5 |
NOT | 6 |
Унарный минус | 7 |
Вызов функции | 8 |
Конструкция IF – ELSEIF – ELSE
Для описания некоторых конструкций языка удобно использовать фигурные и квадратные скобки. Считается, что:
- выражение в фигурных скобках может использоваться ноль или больше раз подряд;
- выражение в квадратных скобках не обязательно к использованию.
Конструкция IF-ELSEIF-ELSE имеет следующий формат:
IF <boolean expression> THEN <statement list>
[ELSEIF <boolean expression> THEN <statement list>]
[ELSE <statement list>]
END_IF;
Например:
IF Var <> 0
THEN Var := 1
ELSEIF Var > 0
THEN Var := 0;
ELSE Var := 10;
END_IF;
Конструкция допускает вложенность, т.е. внутри одного IF может быть еще один и т.д. Например:
IF Var > 10 THEN
IF Var < Var2 + 1
THEN Var := 10;
ELSE Var := 0;
END_IF;
END_IF;
Цикл FOR
Служит для задания цикла с фиксированным количеством итераций. Формат конструкции следующий:
FOR <Control Variable> := <expression1> TO <expression2>
[BY <expression3>] DO
<statement list>
END_FOR;
При задании условий цикла считается, что <Control Variable>, <expression1> … <expression3> имеют тип INT. Выход из цикла будет произведен в том случае, если значение переменной цикла превысит значение <expression2>. Например:
FOR i := 1 TO 10 BY 2 DO
k := k * 2;
END_FOR;
Оператор BY задает приращение переменной цикла (в данном случае i будет увеличиваться на 2 при каждом проходе по циклу). Если оператор BY не указан, то приращение равно 1. Например:
FOR i := 1 TO k / 2 DO
var := var + k;
k := k – 1;
END_FOR;
Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для выхода из цикла (любого типа) может использоваться оператор EXIT. Например:
FOR i := 1 TO 10 BY 2 DO
k := k * 2;
IF k > 20 THEN
EXIT;
END_IF;
END_FOR;
Примечание 1: Выражения <expression1> … <expression3> вычисляются до входа в цикл, поэтому изменения значений переменных, входящих в любое из этих выражений не приведет к изменению числа итераций. Например:
01: k := 10;
02: FOR I := 1 TO k / 2 DO
03: k := 20;
04: END_FOR;
В строке 3 производится изменение переменной k, но цикл все равно выполнится только пять раз. Примечание 2: Значение переменной цикла может изменяться внутри тела цикла, но в начале очередной итерации значение данной переменной будет выставлено в соответствие с условиями цикла. Например:
01: FOR I := 1 TO 5 DO
02: I := 55;
03: END_FOR;
При первом проходе значение I будет равно 1, потом в строке 2 изменится на 55, но на втором проходе значение I станет равно 2 – следующему значению по условиям цикла.
Цикл WHILE
Служит для определения цикла с предусловием. Цикл будет исполняться до тех пор, пока выражение в предложении WHILE возвращает TRUE. Формат конструкции следующий:
WHILE <Boolean-Expression> DO
<Statement List>
END_WHILE;
Значение <Boolean-Expression> проверяется на каждой итерации. Завершение цикла произойдет, если выражение <Boolean-Expression> вернет FALSE. Например:
k := 10;
WHILE k > 0 DO
i := I + k;
k := k –1;
END_WHILE;
Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для досрочного завершения цикла используется оператор EXIT (см. пример в описание цикла FOR).
Цикл REPEAT UNTIL
Служит для определения цикла с постусловием. Завершение цикла произойдет тогда, когда выражение в предложении UNTIL вернет FALSE. Другими словами: цикл будет выполняться, пока условие в предложении UNTIL не выполнятся. Формат конструкции следующий:
REPEAT
<Statement List>
UNTIL <Boolean Expression>;
END_REPEAT;
Например:
k := 10;
REPEAT
i := i + k;
k := k – 1;
UNTIL k = 0;
END_REPEAT;
Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для досрочного завершения цикла используется оператор EXIT (см. пример в описании цикла FOR).
Конструкция CASE
Данная конструкция служит для организации выбора из диапазона значений. Формат конструкции следующий:
CASE <Expression> OF
CASE_ELEMENT {CASE_ELEMENT}
[ELSE <Statement List>]
END_CASE;
CASE_ELEMENT – это список значений, перечисленных через запятую. Элементом списка может быть целое число или диапазон целых чисел. Диапазон задается следующим образом BEGIN_VAL .. END_VAL.
Если текущее значение <Expression> не попало ни в один CASE_ELEMENT, то управление будет передано на предложение ELSE. Если предложение ELSE не указано, то никаких действий выполнено не будет.
Значение <Expression> может быть только целым. Например:
01: CASE k OF
02: 1:
03: k := k * 10;
04: 2..5:
05: k := k * 5;
06: i := 0;
07: 6, 9..20:
08: k := k – 1;
09: ELSE
10: k := 0;
11: i := 1;
12: END_CASE;
Строка 4 содержит диапазон значений. Если значение k принадлежит числовому отрезку [2, 5], то будут выполнены строки 5 и 6.
В строке 7 использован список значений. Строка 8 выполнится, если значение k будет равно 6 или будет принадлежать числовому отрезку [9, 20].
Строки 10 и 11 будут выполнены в том случае, если k < 1, или 6 < k < 9, или k > 20 (в данном случае сработает предложение ELSE).
При задании списка значений необходимо выполнять следующие условия:
- наборы значений внутри одного CASE не должны пересекаться;
- при указании диапазона значений начало диапазона должно быть меньше его конца.
В таблице 3.5 приведены примеры кода записи правильной и неправильной записи конструкции CASE.
Действия, предусмотренные для обработки каждого из случаев CASE, могут использовать циклы, операторы IF и CASE.
Таблица 3.5 – Запись конструкции CASE
Неправильная запись | Правильная запись |
01: CASE k OF 02: 1: 03: k := k * 10; 04: 2..5: 05: k := k * 5; 06: i := 0; 07: 5, 9..20: 08: k := k – 1; 09: ELSE 10: k := 0; 11: i := 1; 12: END_CASE; Диапазоны в строках 4 и 7 пересекаются | 01: CASE k OF 02: 1: 03: k := k * 10; 04: 2..5: 05: k := k * 5; 06: i := 0; 07: 6, 9..20: 08: k := k – 1; 09: ELSE 10: k := 0; 11: i := 1; 12: END_CASE; |
01: CASE k OF 02: 1: 03: k := k * 10; 04: 2..5: 05: k := k * 5; 06: i := 0; 07: 6, 20..9: 08: k := k – 1; 09: ELSE 10: k := 0; 11: i := 1; 12: END_CASE; В строке 7 диапазон значений задан неправильно. | 01: CASE k OF 02: 1: 03: k := k * 10; 04: 2..5: 05: k := k * 5; 06: i := 0; 07: 6, 9..20: 08: k := k – 1; 09: ELSE 10: k := 0; 11: i := 1; 12: END_CASE; |
При написании программ на ST возможно использование стандартных и пользовательских функций и функциональных блоков.
sm1820.github.io