Программа для программирования плк
Введение
Я занимаюсь автоматизацией зданий. Сложилось так, что в основном мы строим свои системы на базе ПЛК Beckhoff. Такой выбор был сделан прежде всего потому, что эти контроллеры являются свободно-программируемыми в полном смысле этих слов. Что это значит? Возьмите контроллер TAC Xenta, например, и попробуйте на нем реализовать обмен с внешним устройством через RS232 по собственному протоколу, на уровне «байт послал — байт принял». Не получится, эти контроллеры так не умеют — используйте только те протоколы, которые в них заложил разработчик. А Beckhoff умеет. Но прежде чем лезть в такие дебри, давайте посмотрим на среду разработки? На каком, собственно, языке, мы будем писать?
Стандарт МЭК 61131-3
Промышленные ПЛК программируются на языках стандарта МЭК 61131-3. Всего этих языков 5, некоторые производители добавляют свои. Языки друг на друга совсем не похожи, и, наблюдая за коллегами, могу предположить, что выбор того или иного языка связан прежде всего с тем, чем человек занимался до того, как он пришел в эту отрасль.
- IL, instruction list, список инструкций. Похож на ассемблер. Не видел никого, кто его использовал бы, но подозреваю, что олдскульные кодеры, пробивавшие перфокарты по памяти, оценят.
- LD, ladder diagram. Визуальный язык, для тех, кто занимался разработкой схем релейной автоматики.
- ST, structured text. Более всего напоминает «классические» языки программирования, чем-то похож на Паскаль. Оттого ценится теми, кто до ПЛК занимался программированием на других языках и платформах, в частности — мной.
- FBD, functional block diagram. Этакая блок схема, любим прежде всего технологами, решившими податься в программирование, за свою наглядность.
- SFC, sequential function chart. Графический язык, больше ничего не скажу. Ни разу не видел, чтоб его использовали.
Из не всеми поддерживаемых языков стоит отметить язык CFC (continuous flow chart), Beckhoff его поддерживает. Это дальнейшее развитие языка FBD, одним из наиболее существенных отличий, на мой взгляд, является поддержка явной обратной связи в схемах. Зачем это нужно? Например, вот такой генератор коротких импульсов на CFC будет работать, а на FBD – нет.
Блок TON — это стандартный блок, таймер с задержкой включения. Логика работы: выход Q становится TRUE, когда на входе IN сигнал TRUE в течение не менее времени PT.
Самая популярная, наверное, среда разработки под ПЛК — это CoDeSys. Многие производители берут ее за основу, и либо делают к ней библиотеку для работы со своим ПЛК, либо доделывают среду под себя.
Как работает ПЛК?
Программа ПЛК работает циклично. Время цикла может быть от единиц миллисекунд до единиц секунд, в зависимости от задач, которые на этот ПЛК возложены. Большинство ПЛК позволяют задавать время цикла разработчику программы, однако в некоторых моделях такой возможности нет. Многие ПЛК, в частности Beckhoff, позволяют в одной программе создать более одной циклически выполняемой задачи, и задать приоритет для этих задач. Что нам дает эта возможность?
Представим ситуацию: ПЛК управляет вентиляционной установкой, и к нему подключена панель управления через RS232. Температура в помещениях меняется не быстро, и запускать алгоритм управления вентиляцией чаще, чем раз в 50 — 100 мс просто нет смысла. Зато панель оператора опрашивает контроллер постоянно, и задержка ответа ПЛК более 10 мс уже выражается в «притормаживании» интерфейса пользователя, а при задержке 20 мс у нас переполнится аппаратный буфер COM-порта. Наличие нескольких задач позволяет нам решить эту проблему красиво: пусть «быстрая» задача работает с COM-портом, и вызывается каждые 2 мс, а «медленная» реализует логику работы вентиляции, и вызывается каждые 50 мс. Все работает хорошо, панель оператора не тормозит, пользователь доволен.
А что у этих железок внутри?
- Можно сделать «все в одной коробке» — голова, некий набор входов / выходов, несколько вариантов конфигурации — вот тут у нас входов побольше, тут поменьше, тут голова помощнее, тут послабее. Так делают, например, Carel, и много кто еще. На маленьком проекте такой подход себя в чем-то, может быть, и оправдывает.
- Но лично мне кажется, что большую гибкость дает другой подход. Голова отдельно, и к ней по шине подключается наборный «хвост» из модулей ввода-вывода. Мы ставим те модули, которые нам нужны, и в том количестве, которые нам нужно. Так делают Beckhoff и Siemens, например.
А вот другой вариант — голова Beckhoff серии CX9000 (слева на фото) с набором модулей ввода-вывода.
Помимо всего прочего, на голове еще имеется некая шина, позволяющая объединять ПЛК в сеть, а зачастую еще и менять его программу через эту же сеть. Какая это будет сеть — зависит от ПЛК. Это могут быть и незнакомые тем, кто не сталкивался с промышленными сетями EIA-485, Profibus, CAN, а может быть и вполне привычный Ethernet. Именно через эту сеть, называемую fieldbus, и осуществляется подключение ПЛК к верхнему уровню — к СКАДА-системе, например. На фото выше хорошо видны 2 разъема 8P8C на голове Beckhoff'а — это Ethernet, а у Carel сверху слева видны (плоховато, правда) 2 разъема 6P4C — так они сделали RS-485. У этого интерфейса, к сожалению, нет общепринятого разъема.
Так все же, как под него программы писать-то?
Вообще, это тема не статьи, а целой книги. Но расскажу то, что увидел на личном опыте, и пусть это будет ложкой дегтя.
Для профессиональных программистов освоение ПЛК во многом покажется деградацией. ООП? Их нет у нас, есть только структуры, перечисления, и некое подобие класса, которое называется «функциональный блок». Что такое Private, Public и прочее, тоже можно забыть сразу — не пригодится. Из любого места вашей программы можно получить доступ к любому другому месту.
Динамическое выделение памяти? Их нет у нас совсем. Не уверен, сколько тебе пришлют данных? Выделяй буфер с запасом, и забудь про эту память — освободить ее не получится. Либо проявляй чудеса скорости и обрабатывай данные на лету, если успеешь уложиться в заданное время цикла.
Исключения? Да что вы… видел я одно чудо, которое намертво висло при выполнении конструкции вида:
Понятно, что переполнение, не влазит foo * bar в 16 бит, но зачем же виснуть-то? Да еще так, что ничего, кроме сброса по питанию не помогает.
Среда разработки? Не у всех CoDeSys, многим хочется пооригинальничать и написать что-нить свое. Одна из таких самописных сред вылетала с runtime error при попытке записать число 86400 в 16-битный INT. А вы говорите, обработка исключений на ПЛК. Ее и в среде разработки-то не всегда нормально могут сделать.
НО! Зато для любителей той тонкой грани, которая отделяет железо от программного обеспечения, софта в просторечии — это очень интересная ветвь ай-ти, правда.
Надеюсь, что этот небольшой обзор будет полезен. Если хабрасообществу будет интересна эта тема, то расскажу про ПЛК подробнее.
Примеры простых программ для ПЛК в CodeSys на языке релейных диаграмм
В этой статье показан пример трех простых программ для программируемых логических контроллеров (ПЛК) . Все программы написаны для автоматизации систем управления различными установками в промышленности. Они носят учебный характер и могут использоваться для обучения программированию ПЛК.
Ранее по этой теме мы рассматривали несколько типовых решений в программах для ПЛК, которые могут использоваться для управления электродвигателями: Схемы пуска электродвигателя на языке лестничных диаграмм LD для ПЛК
В этой подборке рассмотрена автоматизация следующих процессов:
Автоматическая система для отбрасывания бутылок;
Автоматический выбор цвета краски;
Автоматизация вентиляционной системы.
Идеи и иллюстрации технологических технологических процессов взяты с сайта InstrumentationTools .
Все программы написаны в CodeSys на языке релейных диаграмм, в англоязычном варианте это язык Ladder Diagram, сокращенно LD.
Во всех примерах использованы только базовые элементы этого языка - контакты и катушки. Язык релейных диаграмм позволяет использовать также большое количесто дополнительных элементов - таймеры, счетчики, триггеры и т.п. Более серьезные программы со всеми этими элементами мы рассмотрим в следующих статьях.
Автоматическая система для отбрасывания бутылок
Принцип работы: данная система позволяет отбрасывать упавшие бутылки, которые затрудняют процесс производства.
Схема технологического процесса:
Ленточный конвейер используется для перемещения бутылок с одной станции на другую. Но прежде чем бутылки попадут на заправочную станцию, необходимо сделать все бутылки стоящими для дальнейшего их заполнения. Упавшая бутылка на конвейере может создать проблему в следующем процессе, поэтому здесь показана простая программа для ПЛК, которая обрабатывает с конвейера упавшую бутылку.
Этот процесс осуществляется с помощью датчиков и исполнительных механизмов. Когда конвейер работает, все бутылки перемещаются с одной станции на другую для последующего процесса. Для обнаружения стоящих и упавших бутылок используются два датчика и один пневматический цилиндр для выталкивания упавшей бутылки с конвейера.
Программа на языке релейных диаграмм для ПЛК в CodeSys автоматической системы отбраковки бутылок:
Программа в режиме эмуляции:
Описание работы программы:
Нажимаем кнопку «START» тем самым питая схему. Запускается цикл и конвейер. Во второй части цепи находится два индукционных датчика «Х1» и «Х2», с помощью которых и определяется положение бутылки на конвейере. Когда бутылка упала срабатывает датчик «Х2» и его контакт разрывает цепь тем самым, не пропуская упавшую бутылку.
Когда бутылки перемещаются по конвейеру, эти датчики определяют положение бутылок независимо от того, стоят они или упали. Датчик X2 определяет нижнее положение бутылки, а датчик X1 верхнее положение бутылки. Если датчик X2 определяет бутылку, а датчик X1 не определяет, то включается пневматический привод ( Cilinder ), и он отбросит бутылку с конвейера. После этого остальные бутылки попадут на станцию розлива воды и весь цикл будет завершен.
Процесс сброса бутылки:
Автоматический выбор цвета краски
Принцип работы: в данном процессе нужно было реализовать автоматический выбор краски нужного цвета для заполнения.
Схема технологического процесса:
Здесь мы должны заполнить различные краски в банке согласно требованию. Итак, рассмотрим 3 типа краски разных цветов (желтый, синий и зеленый). Два клапана используются для подачи краски.
Как мы знаем, смешивание желтого и синего - это зеленый цвет, поэтому нет необходимости в отдельном клапане для зеленого цвета. Когда желтый и синий цвета заполнены одновременно, он станет зеленым.
Селекторный переключатель используется для выбора цвета в системе, а переключатель ON/OFF используется для остановки системы.
Программа для ПЛК в CodeSys:
Описание работы программы:
Когда переключатель ВКЛ/ВЫКЛ (I2.0) находится в положении ВКЛ и нажата кнопка START, загорается лампа CYCLEON. Если цикл включен и выбрана краска желтого цвета ( YELLOWPIGMENTSELECTION ), клапан управления желтого цвета ( YELLOWCONTROLVALVE ) будет включен. Если цикл включен и выбрана краска синего цвета (BLUEPIGMENTSELECTION), клапан управления синим цветом (BLUECONTROLVALVE) будет включен. Если выбрана краска зеленого цвета (GREENPIGMENTSELECTION), оба клапана будут включены, а краска станет зеленого цвета.
Программа в режиме эмуляции (заполнение бутылки краской зеленого цвета):
Автоматизация движения механизма в функции пути
Курс по программированию контроллеров:
Автоматизация вентиляционной системы
Программа ПЛК для системы управления вентиляторами для промышленности.
Во время работы системы должны работать любые два вентилятора из трех. Для запуска любых двух вентиляторов - скажем, вентилятора 2 и вентилятора 3 - для каждого предусмотрены отдельные кнопки запуска и остановки.
Предположим, что вентилятор 2 и вентилятор 3 работают, и один из них выходит из строя, тогда вентилятор 1 должен включаться автоматически, т.е. в любой момент времени должны работать два вентилятора. В случае неисправности любых двух вентиляторов входное питание системы должно автоматически отключаться.
Состояние «ВКЛ» вентиляторов, а также состояние основного питания должно указываться соответствующим светодиодом. Если есть неисправность с более чем одним вентилятором, то это остсояние должно указываться мигающим светодиодом с частотой 5 Гц. Неисправность с одним вентилятором или отсутствие неисправности с вентилятором должны указываться постоянным светом на индикаторе состояния неисправности.
Это простой пример блока управления вентиляторами, используемый в промышленности.
Программа для ПЛК в CodeSys:
В программе используется схема запуска цикла - катушка CYCLEK. Его можно запустить, нажав START, и остановить, нажав STOP. Главный выключатель (MS) должен быть включен.
Когда цикл включен (CYCLEK) и неисправностей вентилятора 2 и вентилятора 3 нет, то вентилятор 2 (FAN2) и вентилятор 3 (FAN3) будут включены. Если вентилятор 2 или вентилятор 3 неисправен, то будет запущен вентилятор 1 (FAN1).
В системе, если какие-либо два вентилятора из трех неисправны, то лампа индикации неисправности (FIND) начнет мигать с частотой 5 Гц. Для этого нужно использовать специальный таймер, но чтобы не усложнять программу ограничимся пока в ней отдельным контактом. Индикаторные лампы для вентилятора 1, вентилятора 2 и вентилятора 3 включаются в соответствии с сигналом неисправности.
Программа в режиме эмуляции (случай поломки вентилятора 3):
Все приведенные выше программы являются очень простыми и в первую очередь предназначены для получения базовых знаний при изучении языка релйных диаграмм. В следующих статьях мы рассмотрим более сложные примеры.
Structured Text
Книга "Изучаем Structured Text МЭК 61131-3": Ссылка на книгу
Применение ПЛК Siemens:
Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!
Записывайтесь в онлайн-университет от GeekBrains:
Изучить C, механизмы отладки и программирования микроконтроллеров;
Получить опыт работы с реальными проектами, в команде и самостоятельно;
Получить удостоверение и сертификат, подтверждающие полученные знания.
Starter box для первых экспериментов в подарок!
После прохождения курса в вашем портфолио будет: метостанция с функцией часов и встроенной игрой, распределенная сеть устройств, устройства регулирования температуры (ПИД-регулятор), устройство контроля влажности воздуха, система умного полива растений, устройство контроля протечки воды.
Вы получите диплом о профессиональной переподготовке и электронный сертификат, которые можно добавить в портфолио и показать работодателю.
Как и было описано, в первой статье, ПЛК осуществляет циклическое чтение входов, выполнение прикладной программы и запись выходов. Потому написание программы для ПЛК отличается от традиционного написания программы для микроконтроллеров и ПК. К программам для ПЛК предъявляются жесткие требования по надежности, одно дело зависает текстовый редактор, а другое дело программа, управляющая ядерным реактором. Другое не менее важное требование – это своевременное реагирование на событие. А что значит, во время не прореагировать на событие в промышленности? Это значит потерять контроль над технологическим процессом. Что в некоторых случаях, примером с реактором, приведет к непоправимым последствиям.
Рассмотрим отличия написания программы для ПЛК и микроконтроллера. Для примера возьмем простейшую задачку для МК - мигающий светодиод. Подозреваю, что все начинали знакомство с МК именно с этой задачи. Алгоритм будет следующим
- Записать в порт лог. 1.
- Временная задержка
- Записать в порт лог.0.
- Временная задержка
- Переход по метке на начало программы.
По данному алгоритму программа на ПЛК работать не будет, она содержит бесконечный цикл. А в ПЛК вся прикладная программа выполняется от начала до конца в каждом рабочем цикле, и любая программа должна отдавать управление системной программе. Поэтому при такой организации алгоритма наш ПЛК зависнет. Даже если и убрать, переход по метке на начало, программа не будет работать, так как нам хочется. Порт всегда будет в состоянии лог.0, так как физическая установка выходов производиться только после выполнения всей прикладной программы. И поэтому промежуточные состояния это всего лишь программные переменные в памяти, и на аппаратной части она ни как не отображаются.
В дополнение задержку времени тоже хорошо бы организовать с помощью таймера, периодически проверяя его значение, а не ожидать в пустую пока это время пройдет, наверняка для контроллера найдется другая более важная работа.
С учетом выше сказанного, правильный алгоритм будет выглядеть следующим образом:
1. Проверить таймер, если время паузы вышло, то
а) инвертировать выход
б) начать новый отсчет
2. Конец программы
Реализуем данный алгоритм на практике ниже, а теперь рассмотрим основные особенности LAD (Ladder Diagram) языка.
Релейная схема представляет собой две вертикальные шины, между ними расположены горизонтальные цепи образованные контактами и обмотками реле. Пример на рисунке:
- нормально разомкнутый контакт
- нормально замкнутый(инверсный) контакт
- обмотка реле
Количество контактов цепи может быть разным, а обмотка одна.
Любому контакту ставится в соответствие логическая переменная, определяющая его состояние. Если нормально замкнутый контакт замкнут, то ИСТИНА, если размокнут – Ложь, для инверсного наоборот, он замкнут когда переменная имеет значение ЛОЖЬ. Имя переменной пишется над контактом и служит его названием.
Последовательно соединенные контакты равносильны логической операции И, а параллельно-монтажное ИЛИ. Инверсный контакт равносилен операции НЕ. Параллельное соединение обмоток допускается, а последовательное нет. Обмотка реле также может быть инверсной, тогда она копирует в соответствующую логическую переменную инверсное состояние цепи.
Идея релейных схем, такова, что все цепи работают параллельно, т.е. ток во все цепи подается одновременно. Но мы знаем, что программу процессор выполняет последовательно, и мы не можем это сделать одновременно. Так и в LAD программа выполняется последовательно слева направо, сверху вниз. Но цикл процессора мал, поэтому и получается эффект параллельности.
Любая переменная в рамках одной цепи имеет одно и то же значение. Если даже реле в цепи изменит переменную, то новое значение поступит на контакты только в следующем цикле. Цепи расположенные выше получают новое значение переменной сразу, а цепи расположенные ниже – только в следующем цикле. Строгий порядок выполнения очень важен, и благодаря ним LAD- диаграмма сохраняет устойчивость при наличии обратных связей.
Хоть это и противоречит аналогии LAD с релейными схемами, порядок выполнения LAD- программы можно нарушить с помощью меток и переходов. Это ухудшает читаемость программе, и в них бывает сложно разобраться, но как говориться если очень хочется, то можно. Для этого желательно разбить программу на модули, и делать переходы между модулями.
Возможности LAD программы можно расширить, вставляя функциональные блоки. Вставлять можно все стандартные функциональные блоки, которые содержаться в МЭК. Описание для функциональных блоков можно найти в справке.
Давайте составим нашу первую программу на LAD в среде CoDeSys. CoDeSys можно скачать в интернете, достаточно воспользоваться поисковиком
После установки, выбираем создать новый проект, и CoDeSys попросит выбрать целевую платформу для ПЛК. Указание целевой платформы необходимо, чтобы среда знала, для какого типа контроллера пишется программа. Выбираем 3S CodeSyS Sp PLCWinNT V2.4 и жмем OK.
Имя проекта оставляем по умолчанию, язык выбираем LD
Интерфейс программы на русском языке, и интуитивно понятен. При наведении на элемент всплывает имя. Советую рассмотреть все элементы, а также пункты главного меню.
Для добавления элемента в программу необходимо левой кнопкой мыши кликнуть в рабочее поле программы и потом ЛКМ кликнуть на элемент, который вы хотите поместить в программу. Например, нормально разомкнутый контакт, у вас должно получиться следующее.
Вместо вопросительных знаков пишем имя нашей переменной, например SB, и нажимаем Enter, выходит окно объявление переменной, выбираем Bool и нажимаем OК.
Рассмотрите, какие типы можно выбрать, а также какие классы переменных.
Давайте, реализуем программы для мигания светодиодом, а если говорить в общем, то программа для генератора одиночных импульсов
Для реализации программы используем функциональные блок таймер TP. Таймер TP – этой таймер одиночного импульса с заданной по входу PT длительностью.
Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.
Временная диаграмма работы TP:
Для вставки TP, на панели элементов выбираем:
И у нас всплывает ассистент выбора функционального блока.
Скачайте файл проекта, и давайте рассмотрим как он работает.
В начальный момент X= False , поэтому инверсный контакт X замкнут и таймер T2 запущен, выход Q= True, поэтому цепь включена. А так как обмотка в цепи инверсная, значит она копирует инверсное состояние цепи в X , и X остается False, после переполнения таймера Q = False , и инверсная обмотка переводит X в True. После этого запускается T1, после переполнения скидывает X в False и все повторяется. Переменная X является выходом генератора. Таймер T2 устанавливает паузу, а T1 длительность импульса.
Компилируем проект Проект -> Компилировать
В пункте онлайн выбираем Режим эмуляции , а затем Подключение и Старт. И видим, наша схема начинает переключаться, цепь где «протекает ток» выделяется синим цветом. Также в области объявления переменных видим текущее значение переменных.
Выход генератора можно поглядеть с помощью цифрового трассировщика, для этого переходим на вкладку Ресурсы в нижнем левом углу
Выбираем Цифровой трассировщик -> Дополнение -> Настройка трассировки, выйдет следующее окно
Цикличность записи поставим Вручную, нажимаем на менеджер и выбираем переменные X(Bool)
Нажимаем Ok . Выбираем перо для нашей переменной
Выбираем в онлайн Подключение, нажимаем Старт , далее Дополнительно -> Начать трассировку, также выберите пункт Автоматическая трассировка
Рассмотрим еще один пример управление двигателем с электронной коммутацией обмоток статора
Саму программу представлять не буду, скачайте проект. А об алгоритме работы расскажу.
Все таймеры запускаются по сигналу старт. Каждый таймер отмеряет момент окончания фазы. Переменные Y1-Y3 являются выводами соответствующей фазы управления. Каждый выход включается в том случае, если таймер еще не переполнен и выключен предыдущий выход. Последняя цепь, является цепью автоматического перезапуска.
Структурированный текст, ST
Язык ST является текстовым языком высокого уровня и очень сильно напоминает Паскаль:
Листинг 2. Пример программы на языке ST
IF Voltage>220 THEN
Current:=Current - 10; (*Если V>220 В, то уменьшить ток на 10*)
Current:=50; Speed:= ON;(*Установить ток 50А и включить мотор*)
Язык ST имеет много отличий от языка Паскаль и разработан специально для программирования ПЛК. Он содержит множество конструкций для присвоения значений переменным, для вызова функций и функциональных блоков, для написания выражений условных переходов, выбора операторов, для построения итерационных процессов.
Этот язык предназначен в основном для выполнения сложных математических вычислений, описания сложных функций, функциональных блоков и программ.
Язык релейно-контактных схем, LD
Графический язык релейной логики впервые появился в виде электрических схем, которые состояли из контактов и обмоток электромагнитных реле (Рис. 1).
Такие схемы использовались в автоматике конвейеров для сборки автомобилей до эры микропроцессоров.
Язык релейной логики был интуитивно понятен людям, слегка знакомым с электротехникой и поэтому оказался наиболее распространенным в промышленной автоматике. Обслуживающий персонал легко находил отказ в оборудовании, прослеживая путь сигнала по релейной диаграмме.
Однако язык LD проблематично использовать для реализации сложных алгоритмов, поскольку он не поддерживает подпрограммы, функции, инкапсуляцию и другие средства структурирования программ с целью повышения качества программирования. Эти недостатки затрудняют многократное использование программных компонентов, что делает программу длинной и сложной для обслуживания.
Инкапсуляция (от лат. in capsule — в оболочке) — это заключение данных и функционала в оболочку. В объектно-ориентированном программировании в роли оболочки выступают классы: они не только собирают переменные и методы в одном месте, но и защищают их от вмешательства извне.
Для выполнения арифметических функций в язык LD были добавлены функциональные блоки, которые выполняли операции сложения, умножения, вычисления среднего и т.д.
Сложные вычисления в этом языке невозможны. Недостатком является также то, что только маленькая часть программы умещается на мониторе компьютера или панели оператора при программировании.
Несмотря на указанные недостатки, язык LD относится к наиболее распространенным в мире, хотя используется для программирования только простых задач.
Диаграммы функциональных блоков, FBD
FBD является графическим языком и наиболее удобен для программирования процессов прохождения сигналов через функциональные блоки.
Язык FBD удобен для схемотехников, которые легко могут составить электрическую схему системы управления на «жесткой логике», но не имеют опыта программирования.
Функциональные блоки представляют собой фрагменты программ, написанных на IL, SFC или других языках, которые могут быть многократно использованы в разных частях программы и которым соответствует графическое изображение, принятое при разработке функциональных схем электронных устройств, см. Рис. 2.
Язык FBD может быть использован для программирования функций, функциональных блоков и программ, а также для описания шагов и переходов в языке SFC. Функциональные блоки инкапсулируют данные и методы, чем напоминают объектно-ориентированные языки программирования, но не поддерживают наследование и полиморфизм.
Все то, что во время компиляции или исполнения программы может содержать или обрабатывать значения различных типов — является полиморфным, например:
- переменные, меняющие свое значение на значение другого типа
- объекты, обладающие свойствами, которые могут менять значение текущего типа на значение другого типа
- функции, принимающие аргументы различных типов
Но пожалуй, самое лаконичное определение полиморфизма, можно найти в книге Бенджамина Пирса «Типы в языках программирования»: Термин «полиморфизм» обозначает семейство различных механизмов, позволяющих использовать один и тот же участок программы с различными типами в различных контекстах.
Под контекстом, грубо говоря, понимается набор всех доступных переменных в текущем участке программы.
Типичным применением языка FBD является описание «жесткой логики» и замкнутых контуров систем управления.
Язык функциональных блоков является удобным также для создания и пополнения библиотеки типовых функциональных блоков, которую можно многократно использовать при программировании задач промышленной автоматизации.
К типовым блокам относятся блок таймера, ПИД-регулятора, триггера, генератора импульсов, фильтра, и т. п.
Последовательные функциональные схемы, SFC
SFC называют языком программирования, хотя по сути это не язык, а вспомогательное средство для структурирования программ.
Он предназначен специально для программирования последовательности выполнения действий системой управления, когда эти действия должны быть выполнены в заданные моменты времени или при наступлении некоторых событий. В его основе лежит представление системы управления с помощью понятий состояний и переходов между ними.
Язык SFC предназначен для описания системы управления на самом верхнем уровне абстракции, например, в терминах «Старт», «Наполнение автоклава», «Выполнение этапа № 1», «Выполнение этапа № 2», «Выгрузка из автоклава».
Язык SFC может быть использован также для программирования отдельных функциональных блоков, если алгоритм их работы естественным образом описывается с помощью понятий состояний и переходов.
Например, алгоритм автоматического соединения модема с коммутируемой линией описывается состояниями «Включение», «Обнаружение тона», «Набор номер», «Идентификация сигнала» и переходами «Если длинный — то ждать 20 сек», «Если короткий — перейти в состояние «Набор Номера» и т.д.
Читайте также: