Академический Документы
Профессиональный Документы
Культура Документы
И. В. Петров
Программируемые контроллеры.
Стандартные языки и приемы
прикладного проектирования
Москва
СОЛОН-Пресс
2004
УДК 681,5
ББК 32.96
ПЗО
Петров И. В. г
Предисловие научного редактора
t J
ПЗО Программируемые контроллеры. Стандартные языки и приемы Более тридцати лет прошло со знаменательного события — по-
прикладного проектирования / Под ред. проф, В. П. Дьяконова. явления первого микропроцессора корпорации Intel — 40.04. Ча-
— М.: СОЛОН-Пресс, 2004. — 256 с : ил. — (Серия «Библиотека ин- стота его работы была в тысячи раз меньше, чем частота элект-
женера») ронных устройств на уже, созданных тогда в СССР мощных СВЧ-
прлевых транзисторах. Однако микропроцессор обладал новым
ISBN 5-98003-079-4 удивительным в те годы качеством — он мог выполнять самые
i разнообразные функции, изменяемые пррграммно. И это обеспе-
Описана практика применения промышленных программируемых чило невиданные темцы, развития микропроцессорной техники.
контроллеров, широко применяющихся для автоматизации производст-
ва. Излагаются языки программирования иа основе действующего стан- Сейчас, когда череда процессоров для персональных компью-
дарта МЭК 61131-3 и многочисленные примеры подготовки программ теров (ПК) только одной кардор&цци Intel насчитывает ряд поко-
для промышленных программируемых контроллеров. лений (от ушедшего в истории 8086 до новейших Pentium 4, p<m-
Для специалистов по автоматизации производственных процессов и tium М (Centrino) и Inatium) Я сотни конкретных типов, у многих
производственного оборудования, а также для студентов и преподавате- создалось впечатление, что микропроцессоры это прежде всего
лей высших технических заведений. принадлежность персональных компьютеров. И впряли», взлету
роли и значимости ЦК трудно что-то противопоставить, А данные
о частотах работы современных процессоров в единицы Й^д
КНИГА — ПОЧТОЙ перспективе ТГц), о числе транзисторов в десятки миллионов
Книги издательства «СОЛОН-Пресс» можно заказать наложенным плате- Кристалле и о ничтожной Ьгже до долей. ватта) потребляемой
жом по фиксированной цене. Оформить заказ можно одним из двух способов: мощности этих сложнейших устройств даже специалисты воспри-
1) выслать открытку ИЛИ ПИСЬМО ПО адресу: 123242, Москва, а/я 20; нимают как фантастику наших дней.
2) передать заказ по электронной почте по адресу: fnaga2iit@eQlon-r.ru
И тем не менее не стоит забывать, что изначально ;
При оформления заказа следует правильно и полностью указать адрес, по
которому должны быть высланы книги, а также фамилию, имя и отчество по-
цессоры были созданы не столько для работы в пк» сколько в ка-
лучателя. Желательно указать дополнительно свой телефон и адрес электрон- честве программно-управляемых устройств .для автоматизации
ной почты. 1 _ •..•/'• промышленности и бытовой техники. На их основе были
Через Интернет вы можете в любое время получить свежий каталог издате- программцруемые логические контроллеры (П.ЦЩ -т- ,ул_,____„___,
льства «СОЛОН-Пресс». Для этого надо послать пустое письмо на робот-автоот- автоматизирующие работу как отдельных аппаратов» например
ветчик по адресу: станков с программным управлением или стиральных машин и
микроволновых печей^ так и огромных производственных компт
Получать информацию о новых книгах нашего издательства вы сможете, лексов. Сегодня в своей квартире мы, увы, не всегда, встретим
подписавшись на рассылку новостей по электронной почте. Для этого пошлите
письмо по адресу:
персональный компьютер, но, даже не подозревая об этом, поль-
news@8olon-r.ru
зуемся работой доброго десятка программируемых микроконтрол-
В теле письма должно быть написано слово SUBSCRIBE. леров. Таким образом, программируемые логические контролле-
ры — даже более распространенные устройства, чем ПК, количе-
ство которых во всем мире недавно превысило магическую цифру
в 1 миллиард.
ISBN 5-98003-079-4 Макет и обложка «СОЛОН-Пресс», 2004
По микропроцессорам и ПК у нас написаны и изданы сотни
to Петров И. В., 2004 книг. А вот литературы по программируемым логическим контт
роллерам сейчас практически нет. Отчасти это обусловлено об-
Предисловие научного редактора Предисловие научного редактора
щим крайне неблагоприятным для нашей науки и техники поло- обобщает многолетний опыт его практической работы в области
жением» возникшим после распада СССР и ввода ряда явно не- программирования и применения программируемых логических
продуманных и неприемлемых для нашего менталитета и состоя- контроллеров, В области» безусловно, актуальной, интересной и
ния промышленности рыночных реформ. В результате навязан- для нас новой.
ной нам экономической политики произошел распад занятых ав- Автор книги опытный программист. И ему удалось описать
томатизацией промышленности коллективов ученых и техниче- все важнейшие аспекты программирования таких массовых
ских специалистов, устройств, как программируемые контроллеры. Приятно отме-
К счастью» наука и техника принадлежат к отраслям деятель- тить, что это описание сделано хорошим и ясным языком, впол-
ности человечества, которые, испытывая отдельные спады в той не понятным не только опытным специалистам, но и студентам
или иной конкретной стране, в целом непрерывно развиваются и технических вузов и университетов. Книга хорошо иллюстриро-
совершенствуются- Сложившееся у нас положение имеет и свои вана. Она компактна, но содержит практически весь необходи-
положительные стороны. Прежде всего надо отметить интегра- мый материал по программированию ПЛК с рядом интересных
цию нашей промышленности с мировой промышленностью, без примеров. Уважительное отношение автора к стандартам также
чего создание конкурентно-способных изделий и товаров невоз- является ее достоинством, как и отражение новейшего програм-
можно- Пал «железный занавес» как в общении специалистов много инструментария.
разных стран, так и в обмене конструктивными идеями и разра-
ботками. В итоге на наш рынок стали поступать новейшие микро- Все это позволяет надеяться на то, что данная книга найдет
электронные изделия и программные продукты ведущих запад- своего читателя в лице специалистов в области автоматизации
ных корпораций и фирм. Ширится их применение в наших раз- промышленности, а также преподавателей и студентов техниче-
работках и товарах как внутреннего потребления» так и идущих ских вузов соответствующего книге профиля.
на экспорт.
Но, пожалуй, самое главное состоит в том, что созданный в Дьяконов В. II.,
годы СССР научный, технический и промышленный потенциал в ^ доктор технических наук,
наше время вновь стал расти, причем на качественно новом уров- профессор
не — интеграции с мировым промышленным потенциалом. К сча-
стью, далеко не все наши специалисты, окончившие технические
вузы, ринулись в торговлю, коммерцию и юриспруденцию или в
поисках лучшей доли эмигрировали на Запад. Многие остались
верными выбранному пути и, несмотря на его временные трудно-
сти, влились в ряды разработчиков новейшей аппаратуры и тех-
нических средств автоматизации производства- Разумеется, те-
перь уже использующей мировые достижения в науке и технике.
К таким специалистам относится и автор этой книги — Игорь
Петров. Это, безусловно, человек новой формации, понимающий
нынешние рыночные реалии и вовсе не пасующий перед ними.
Будучи моим студентом и аспирантом, Игорь Петров выбрал путь
как по своему образованию (промышленная электроника), так и
по призванию. Он является техническим директором компании
«Пролог*, успешно разрабатывающей и внедряющей современ-
ные программируемые логические контроллеры в наше производ-
ство. И вот теперь он решился на подготовку этой книги, которая
Введение
ции, без подключения внешнего оборудования. Технически контроллеры реализуются по-разному. Это может
быть механическое устройства, пневматический или гидравличе-
ский автомат, релейная или электронная схема или даже компь-
ютерная программа.
В случае, когда контроллер встроен в машину массового выпу-
ска, стоимость его проектирования распределена на большое чис-
ло изделий и мала в отношении к стоимости изготовления. В слу-
чае машин, изготавливаемых в единичных экземплярах, ситуа-
ция обратная. Стоимость проектирования контроллера доминиру-
ет по отношению к стоимости его физической реализации.
- i
При создании машин, занятых в сфере промышленного произ-
водства, как правило, приходится иметь дело не более чем с еди-
ницами однотипных устройств. Кроме того, очень существенной
здесь является возможность быстрой перенастройки оборудова-
ния на выпуск другой продукции.
Контроллеры, выполненные на основе реле или микросхем с
«жесткой» логикой, невозможно научить делать другую работу
без существенной переделки. Очевидно, что такой возможностью
обладают только программируемые логические контроллеры
(ПЛК). Идея создания ПЛК родилась практически сразу с появле-
нием микропроцессора, т, е- 30 лет назад.
1 2 Глава 1. Программируемые контроллеры Определение ПЛК 13
Физически, типичный ПЛК представляет собой блок, имею- Изначально ПЛК предназначались для управления последова-
щий определенный набор выходов и входов, для подключения тельными логическими процессами, что и обусловило слово «ло-
датчиков и исполнительных механизмов (рис. 1.1). Логика управ- гический» в названии ПЛК. Современные ПЛК помимо простых
ления описывается программно на основе микрокомпьютерного логических операций способны выполнять цифровую обработку
ядра. Абсолютно одинаковые ПЛК могут выполнять совершенно сигналов, управление приводами, регулирование, функции опе-
разные функции. Причем для изменения алгоритма работы не раторского управления и т. д. В стандарте МЭК и очень часто в
требуется каких-либо переделок аппаратной части. Аппаратная литературе для обозначения контроллеров применяется сокраще-
реализация входов и выходов ПЛК ориентирована на сопряжение ние ПК (программируемый контроллер). Поскольку в России
с унифицированными приборами и мало подвержена изменениям. обозначение ПК устойчиво связано с персональным» компьюте-
о
рами, мы будем использовать сокращение ПЛК.
в В Конструкция ПЛК может быть самой разнообразной — от
ы стойки, заполненной аппаратурой, до миниатюрных ПЛК, подоб-
ПРОГРАММНАЯ X ных показанному на рис. 1.2.
II о ОБРАБОТКА
о
д д
ы ы
t
тем АСУ. Это объясняется тем, что необходимость автоматизации написали и отладили автономный проект на контроллере при по-
отдельного механизма или установки всегда наиболее очевидна* мощи системы подготовки программ CoDeSys. Как теперь нужно
Она дает быстрый экономический эффект, улучшает качество доработать программу, чтобы связать ПЛК с системой диспетчер-
производства, позволяет избежать физически тяжелой и рутин- ского управления» базой данных,или Интернет-сервером? Ответ:
ной работы. Контроллеры по определению созданы именно для никак. Никакого программирования далее вообще не потребует^
такой работы. ся. В комплекс программирования ПЛК входит ОРС-сервер, Он
•ч
Далеко не всегда удается создать полностью автоматическую умеет получать доступ к данным ПЛК также прозрачно, как и
систему. Часто «общее руководство» со стороны квалифицирован- отладчик. Достаточно обеспечить канал передачи данных ПЛК —
ОРС-сервер. Обычно такой канал уже существует, вы использова-
ного человека — диспетчера необходимо. В отличие от автомати-
ли его, при отладке. Вся дальнейшая работа сводится к определе-
ческих систем управления такие системы называют автоматизи-
нию сциска доступных переменных, правильной настройке сети,
рованными. Еще 10 — 15 лет назад диспетчерский пульт управле-
конфигурированию ОРС-сервера и SCADA-системы. В целом, опе-
ния представлял собой табло с множеством кнопок и световых рация очень н&помияает настройку общедбступных устройств ло-
индикаторов. В настоящее время подобные пульты применяются кальной сети ПК*
только в очень простых случаях, когда можно обойтись несколь-
кими кнопками и индикаторами. В более «серьезных» системах Второй часто возникающей задачей является интеграция не-
применяются ПК. скольких ПЛК с целью синхронизации их работы. Здесь по^вдя-
ются сети, обладающие рядом специфических требований. В це-
Появился целый класс программного обеспечения реализую-
щего интерфейс человек—машина (MMI). Это так называемые си- Машина! Машина N
стемы сбора данных и оперативного диспетчерского управления
(Supervisory Control And Data Acquision System — SCADA). Совре- Органы Объект
Датчики
менные SCADA-системы выполняются с обязательным примене- воздействия управления
лом это требования, аналогичные требованиям к ПЛК: режим ре- Существенный минус такого решения — большое время выхот
ального времени, надежность в условиях промышленной среды, да на рабочий режим после включения питания или зависания
ремонтопригодность, простота программирования. Такой класс компьютера. Особенно опасно, если перезапуск произвел «сторо-
сетей получил название промышленных сетей (fieldbus). Сущест- жевой таймер» в автоматическом режиме, в то время как состоя-
вует масса фирменных реализаций и достаточно много стандартов ние исполнительных механизмов не соответствует исходным пози-
таких сетей (Bitbus, Modbus, Profibus, CANopen, DeviceNet), по- циям. Загрузка операционной системы может отнимать несколько
зволяющих интегрировать аппаратуру различных фирм, но ни минут, все это время система оказывается неуправляемой. Для
один из них нельзя признать доминирующим. ПЛК время «холодного» запуска измеряется миллисекундами.
Благодаря продуктивному развитию средств сетевой интегра- Для достижения сравнимых с ПЛК технических показателей
ции появилась возможность создания распределенных систем по надежности компьютер, конечно, должен быть промышленно-
управления. В 80-х гг. XX в, доминировали ПЛК с числом вхо- го исполнения (на базе магистралей РС/104 или VME), а не деше-
дов-выходов десколько сотен. В настоящее время большим спро- вый офисный «no name».
сом пользуются микроЙЛК с количеством входов-выходов до 64.
В распределенных системах каждый ПЛК решает локальную за-
дачу» Задача синхронизации управления выполняется компьюте- 1.8. Рабочий цикл
рами среднего звена АСУ. Распределенные системы выигрывают
по надежности, гибкости монтажа и простоте обслуживания. Задачи управления требуют непрерывного циклического конт-
роля. В любых цифровых устройствах непрерывность достигается
за счет применения дискретных алгоритмов, повторяющихся че-
рез достаточно малые промежутки времени. Таким -образом, вы-
1.6. Доступность программирования числения в ПЛК всегда повторяются циклически, Одна итерация,
Главным требованием к ПЛК всегда была и остается возмож- включающая замер, обсчет и выработку воздействия, называется
ность его эксплуатации существующим техническим персоналом рабочим циклом ПЛК. Выполняемые действия зависят от значе-
и возможность быстрой замены старого оборудования- Поэтому ния входов контроллера, предыдущего состояния и определяются
языки программирования компьютеров и встраиваемых микро- пользовательской программой.
процессорных систем управления плохо подходят для программи- По включению питания ПЛК выполняет самотестирование и
рования ПЛК. Здесь нужны более простые и наглядные языки, настройку аппаратных ресурсов, очистку оперативной памяти
позволяющие излагать задачу в близких к применяемым техно- данных (ОЗУ), контроль целостности прикладной программы по-
логиям категориях. Привлечение же к программированию специ- льзователя. Если прикладная программа сохранена в памяти,
ализированной фирмы неизбежно порождает зависимость, если ПЛК переходит к основной работе, которая состоит из постоян-
реализация не является достаточно прозрачной. Сложный язык ного повторения последовательности действий, входящих в рабо-
программирования ПЛК снижает его шансы на конкурентном чий цикл.
рынке существенно больше, чем массогабаритные показатели. Рабочий цикл ПЛК состоит из нескольких фаз.
1. Начало цикла.
1*7. Программный ПЛК 2. Чтение состояния входов.
3. Выполнение кода программы пользователя.
Программные приложения, имитирующие технологию ПЛК 4. Запись состояния выходов.
на компьютере (оснащенном платами ввода-вывода), получили 5. Обслуживание аппаратных ресурсов ПЛК.
название программный ПЛК (soft PLC). Программная эмуляция
6. Монитор системы исполнения.
ПЛК удобна тем, что благодаря наличию многозадачной операци-
онной системы можно совместить в одном месте контроллер, сре- 7. Контроль времени цикла.
ду программирования и систему диспетчерского управления. 8. Переход на начало цикла.
2 2
Глава 1. Программируемые контроллеры Время реакции 23
В самом начале цикла ПЛК производит физическое чтение входов. Например, АЦП обычно требуют определенного времени
входов. Считанные значения размещаются в области памяти вхо- с момента запуска до считывания измеренного значения. Часть
дов. Таким образом, создается полная одномоментная зеркальная работы системное программное обеспечение контроллера выпол-
копия значений входов. няет по прерываниям. Грамотно реализованная система исполне-
Далее выполняется код пользовательской программы. Пользо- ния нигде и никогда не использует пустые циклы ожидания го-
вательская программа работает с копией значений входов и выхо- товности аппаратуры. Для прикладного программиста все эти
дов, размещенной в оперативной памяти. Если прикладная про- детали не важны. Существенно только то, что значения входов
грамма не загружена или остановлена, то данная фаза рабочего обновляются автоматически исключительно в начале каждого
цикла, естественно, не выполняется. Отладчик системы програм- рабочего цикла.
мирования имеет доступ к образу входов-выходов, что позволяет
управлять выходами вручную и проводить исследования работы Общая цродолжительность рабочего цикла ПЛК называется
датчиков. временем сканирования. Время сканирования в значительной сте-
пени определяется длительностью фазы кода пользовательской
После выполнения пользовательского кода физические выхо- программы. Время, занимаемое прочими фазами рабочего цикла,
ды ПЛК приводятся в соответствие с расчетными значениями
практически является величиной постоянной. Для задачи средне-
(фаза 4). го объема в ПЛК с системой исполнения CoDeSys время распреде-
Обслуживание аппаратных ресурсов подразумевает обеспече- лится примерно так: 98% — пользовательская программа, 2% —
ние работы системных таймеров, часов реального времени, опера- все остальное.
тивное самотестирование, индикацию состояния и другие аппа-
ратно-завиеимые задачи. Существуют задачи, в которых плавающее время цикла суще-
Монитор системы исполнения включает большое число функ- ственно влияет на результат, например это автоматическое регу-
ций, необходимых при отладке программы и обеспечении взаимо- лирование. Для устранения этой проблемы в развитых ПЛК пре-
действия с системой программирования, сервером данных и се- дусмотрен контроль времени цикла. Если отдельные ветви кода
тью. В функции системы исполнения обычно включается: загруз- управляющей программы выполняются слишком быстро, в рабо-
ка кода программы в оперативную и электрически перепрограм- чий цикл добавляется искусственная задержка. Если контроль
мируемую память, управление последовательностью выполнения времени цикла не предусмотрен, подобные задачи приходится ре-
задач, отображение процесса выполнения программ, пошаговое шать исключительно по таймерам.
выполнение, обеспечение просмотра и редактирования значений
переменных, фиксация и трассировка значений переменных, кон-
троль времени цикла и т. д. 1.9. Время реакции
Пользовательская программа работает только с мгновенной ко- к
пией входов. Таким образом, значения входов в процессе выпол- Время реакции — это время с момента изменения состояния
нения пользовательской программы не изменяются в пределах системы до момента выработки соответствующей реакции. Оче-
одного рабочего цикла. Это фундаментальный принцип построе- видно, для ПЛК время реакции зависит от распределения момен-
ния ПЛК сканирующего типа. Такой подход исключает неодно- тов возникновения события и начала фазы чтения входов. Если
значность алгоритма обработки данных в различных его ветвях. изменение значений входов произошло непосредственно перед фа-
Кроме того, чтение копии значения входа из ОЗУ выполняется зой чтения входов, то время реакции будет наименьшим и рав-
значительно быстрее, чем прямое чтение входа. Аппаратно чтение ным времени сканирования (рис. 1.5). Худший случай, когда из-
входа может быть связано с формированием определенных вре- менение значений входов происходит сразу после фазы чтения
менных интервалов, передачей последовательности команд для входов. Тогда время реакции будет наибольшим, равным удвоен-
конкретной микросхемы или даже запросом по сети. ному времени сканирования минус время одного чтения входов.
Если заглянуть глубже, то нужно отметить, что не всегда ра- Иными словами, время реакции ПЛК не превышает удвоенного
бота по чтению входов полностью локализована в фазе чтения времени сканирования.
Устройство ПЛК
Глава 1. Программируемые контроллеры 25
Чтение код программы Установка Прочив Аппаратно ПЛК является вычислительной машиной. Поэтому
фазы
входов управления выходов архитектура его процессорного ядра практически не отличается
от архитектуры компьютера. Отличия заключены в составе пери-
Время реакции
ферийного оборудования, отсутствуют видеоплата, средства руч-
Событие
ного ввода и дисковая подсистема. Вместо них ПЛК имеет блоки
входов и выходов.
Рис. 1.6. Время реакции ПЛК
созданы на основе наиболее популярных языков программирова- Страшно подумать, что придется объяснять работу сложной
ния, наиболее распространенных в мире контроллеров. Если взять программы по ассемблерным или С листингам. Не исключайте
любой контроллер, работающий в современном производстве, то ситуации, что общаться придется не на родном языке. Современ-
его программу можно перенести в среду МЭК 61131-3 с минималь- ные системы программирования контроллеров позволяют выпол-
ными затратами- Речь не идет о том» что программу можно будет нить несколько распечаток программы с комментариями на раз-
использовать без какой-либо правки. Безусловно, потребуется не- ных языках — русском, немецком н т. д. Очевидно, это уже не
которая адаптация и отладка, но несравненно меньшая» чем при маркетинговый ход разработчиков, а реальное требование совре-
менного бизнеса. Неэффективно реализованную программу мож-
создании проекта с нуля.
но заставить работать быстрее увеличением быстродействия про-
После принятия стандарта появилась возможность создания
цессора. Доходчивостц представления достичь гораздо сложнее.
аппаратно-независимых библиотек. Это регуляторы, фильтры, Программу, в которой невозможно разобраться, придется рано
управление сервоприводом, модули с нечеткой логикой и т. д. или поздно выбросить.
Наиболее удачные, отработанные востребованные библиотеки ста-
новятся коммерческими продуктами,
2Л, Единые требования в подготовке
-и
Project [E:\SCj
> Library Pi
3.19
LD free
Рис. 3.2. Графический редактор релейных схем и панель ввода GT 0
AHO «ntr
MULTIPROG AND
OR
ST ope ion2»3.19
f* Close the entrap
Sm
i ua
l tor
assign - Stmt
RU
STN
OP
P
CFt
EO
RM
R
16#0000-
Рис. З.7. Эмуляция ПЛК в OpenPCS
16Й0001
• загрузку кода управляющей программы в оперативную па-
мять и электрически перепрограммируемую память ПЛК;
• автоматический контроль версий кода. Проверка соответст-
вия кода содержащегося в памяти ПЛК и кода полученного
FALSE Counter2=16#0000 после текущей компиляции;
• выполнение управляющей программы в режиме реального
времени;
Рис. З.6. LD-диаграмма в процессе исполнения и диалог изменения • режим останова. Останов означает прекращение выполнения
значения переменной (CoDeSys) только кода управляющей программы. Все прочие фазы ра-
4 2 Глава 3. Инструменты программирования ПЛК 1 Инструменты комплексов программирования ПЛК 43
бочего цикла выполняются. Способность наблюдать значе- просмотр последовательности вызовов компонентов в точке
ния входов и управлять выходами ПЛК вручную сохраняет- останова;
ся. В этом режиме можно проводить тестирование и настрой- графическую трассировку переменных. Значения нужных
ку датчиков и механизмов объекта управления; переменных запоминаются в циклическом буфере и пред-
сброс ПЛК. Может быть несколько видов сброса. В стандарте ставляются на экране ПК в виде графиков. Запись значений
МЭК предусмотрено два вида сброса «горячий» и «холод- можно выполнять в конце каждого рабочего цикла либо че-
ный». Первый включает перевод управляющей программы в рез заданные цериоды времени. Трассировка запускается
исходное состояние и выполнение начальной инициализа- вручную или синхронизируется с заданным изменением зна-
ции переменных. Во втором виде сброса добавляется началь- чения определенной (триггёрной) переменной;,
ная инициализация переменных, размещенных в энергоне- визуализацию — анимационные картинки, составленные из
зависимой области памяти. В CoDeSys предусмотрен еще и графических примитивов, связанных с переменными про-
«заводской» сброс (original), удаляющий пользовательскую граммы- Значение переменной может определять координа-
программу и восстанавливающий состояние контроллера, в ты, размер или цвет графического объекта. Графические
котором он поступает с завода изготовителя. Кроме того, в объекты включают векторные геометрические фигуры или
ПЛК может произойти аппаратный сброс путем выключения произвольные растровые изображения. Визуализация может
питания или перезапуска микропроцессора. Система про- содержать элементы обратной связи» например кнопки, пол-
граммирования должна адекватно реагировать в случае ап- зунки и т. д. (см. рис. 3.8» 3.9). С помощью визуализации
паратного сброса» Детальная реакция на команды сброса создается изображение, моделирующее объект управления
определяется системой исполнения. Поэтому здесь возмож- или систему операторского управления.
ны некоторые отличия для разных ПЛК, даже в одной среде
программирования;
мониторинг и изменение мгновенных значений всех пере-
менных проекта» включая входы-выходы ПЛК. Для удобства
работы значения представляются в заданной пользователем
системе счисления;
i
фиксацию переменных, включая входы-выходы. Фиксиро-
ванные переменные будут получать заданные значения в
каждом рабочем цикле независимо от реального состояния
ПЛК и действий управляющей программы. Данная функция
позволяет имитировать элементарные внешние события в ла-
бораторных условиях и избегать нежелательной работы ис-
полнительных механизмов при отладке на «живом» объекте
управления. Неуправляемая работа механизмов может при-
вести к поломке и представлять опасность для окружающих
людей;
выполнение управляющей программы шагами по одному ра-
бочему циклу. Применяется при проверке логической прави-
льности алгоритма;
пошаговое выполнение команд программы и задание точек
останова; Рис. 3.8. Визуализация в iCon-L
44 Глава 3. Инструменты программирования ПЛК Инструменты комплексов программирования ПЛК 45
3.2.5. Средства управления проектом Средства восстановления проекта. В реальной жизни нель-
зя исключать ситуацию, что исходные файлы проекта окажутся
Все программные комплексы обязательно содержат средства утраченными. В это время обязательно возникнет необходимость
управления проектом. Эту задачу решает менеджер проекта, в внести поправки в работу готовой программы- Эта задача имеет
обязанности которого входит: три решения.
• представление всех элементов проекта и общей его структу- 1. Декомпиляция кода. Исполняемый код считывается из
ры в удобном виде (см. рис. 5.10). Создание, удаление, пере-
памяти ПЛК и преобразуется в МЭК-программы. Для систем ге-
именование и копирование компонентов. Автоматический
вызов соответствующих редакторов для любой глубины вло- нерирующих машинный код эта задача практически невыполни-
жения программных компонентов. Настройка ресурсов; ма. Безусловно, можно дизассемблировать код в IL или ST. Но
это ненамного лучше, чем обычное машинно-зависимое дизассем-
• управление процессом трансляции и сборки кода. Настройка
блирование. Структура программы получится отличной от исход-
опций транслятора; ного представления. Как правило, разобраться в такой программе
• сравнение и выборочное слияние нескольких проектов или сложнее, чем написать заново. Для интерпретирующих систем
их версий; ситуация значительно лучше. Так, OpenPCS способен восстано-
• управление библиотеками. Здесь существуют две задачи. вить программу из исполняемого кода IL абсолютно адекватно,
Первая — это включение необходимых библиотек в состав естественно, с потерей комментариев. Декомпиляция — это край-
проекта, а вторая — это создание и сопровождение новых няя мера. Важное практическое значение она имела во времена
библиотек; преобладания автономных пультов программирования ПЛК и при
• документирование проекта. Документирование проекта в отсутствии надежных устройств хранения информации.
комплексах МЭК-программирования предусматривает распе-
чатку всех данных проекта, включая: 2. Сжатие всех файлов проекта и сохранение в памяти ПЛК.
Современные мощные алгоритмы компрессии и существенное уде-
• текстовое описание, дата создания и авторские права;
шевление памяти делают такой подход все более популярным
• описание переменных и реализацию всех компонентов (MULTIPROG, CoDeSys), Безусловно, при наличии достаточного
проекта; объема памяти ПЛК это наиболее удобный способ архивации.
• ресурсы проекта — конфигурацию ПЛК, описание гло-
3. Правильная организация работы. В комплекс разработчи-
бальных переменных, настройки задач, список и состав
ка включается утилита для периодической архивации проектов и
библиотечных модулей;
сохранения на сервере, сменных носителях, в печатном виде и от-
• таблицу перекрестных ссылок и стек вызовов;
правки по электронной почте. В архив помещаются исходные
• окно трассировки. файлы, включенные в проект библиотеки, объектные файлы, тек-
Естественно, нельзя ожидать от системы программирования стовое описание архива и любые другие нужные файлы. Проме-
полного комплекта документации в соответствии с требованиями жуточные версии проекта не перезаписываются, а хранятся неза-
ЕСКД. Под словами «полная документация» в руководстве по висимо, что позволяет осуществить быстрый откат при выборе не-
применению системы понимается только то, что по данному пе- удачного решения. В связи с появлением накопителей большой
чатному документу можно полностью и однозначно восстановить емкости и надежных перезаписываемых оптических носителей
проект. такой подход не имеет технических препятствий.
CoDeSys позволяет составить специальные файлы комментари-
Средства обеспечения безопасности* Возможность просмотра
ев на разных языках (русский, английский и т. д.). Благодаря
и модификации проекта закрывается парольным доступом или
этому можно распечатать несколько разноязычных вариантов до-
аппаратным ключом. Посторонний человек не должен иметь воз-
кументации одного и того же проекта без изменения в тексте про-
можности читать, распечатывать и модифицировать проект. \
грамм» Кроме того, система предоставляет возможность настрой-
ки формата страницы документа, включая колонтитулы с вашим Сквозной (по всем программам проекта, разделам объявлений,
фирменным логотипом. конфигурации и др.) контекстный поиск и замена.
4 6 Глава 3. Инструменты программирования ПЛК Комплекс CoDeSys 47
i •• • — • •
64 VAR
ULINT 0 2 -1 | 3
— - • • • ^ ^ ^ i и g r r r ^ ^ — Щ Д Ы
Ш Д И Ш М Р — H P W — ^ P i ^ ^ ^ = III "
wVarO, wVarl: WORD; (*2 переменных типа WORD*)
Нижний предел диапазона целых без знака 0, верхний предел byVar3: BYTE; (*тип BYTE начальное значение 0*)
определяется как (2П)- 1, где п — число разрядов числа. Для чи- byVar2: BYTE := 16#55; (*тип BYTE начальное
а 1 1
сел со знаком нижний предел ~-(2 ~ ),верхний предел (2"" ) - 1. значение 55h*)
Наименования целых типов данных образуются с применени- END VAR -
ем префиксов, выражающих отношение размера к 16-разрядным
byVar2 : - 2#1_0_0_0_1_0_0_0; (*равносильно2#1000_1000*)
словам: S (short *l/2) короткое, D (double *2) двойное, L (long *4)
длинное. Префикс U (unsigned) указывает на представление це- ЬуУагЗ := 2#1_0_0_0__1_0_0_0; (*ошибка*)
лых без знака.
Переменные типов BYTE, WORD, DWORD и LWORD опреде- 4.2.2. тип
ляются стандартом как битовые строки ANY_BIT. Говорить о
диапазоне значений чисел для этих переменных вообще некор- Логические переменные объявляются ключевым словом BOOL
Это означает их принадлежность к алгебре Буля. Они могут при
ректно. Они представляют строки из 8, 16 и 32 бит, соответствен-
нимать только значение логического нуля FALSE (ЛОЖЬ) или ло
но. Помимо обращения с такими переменными как к единым це-
гической единицы TRUE (ИСТИНА). При начальной инициализа
лым, их можно использовать побитно.
ции логическое значение по умолчанию — ЛОЖЬ.
Целые числа могут быть представлены в двоичной, восьмерич-
ной, десятичной или шестнадцатеричной системе счисления. Чис- VAR
ловые константы, отличные от десятичных, требуют указания bVarl: BOOL := TRUE;
основания системы счисления перед знаком «#». Например:
wVar2: WORD;
END VAR
двоичное 2#0100_1110
При преобразовании значения логической переменной в целую
восьмеричное 8#116
FALSE дает 0, a TRUE 1.
шестнадцатеричное 16#4Е
wVar2:= BOOL_TO_WORD(bVarl); (*результат 1 *)
десятичное 78
При обратном преобразовании любого целого в логическую пе-
ременную истину образует любое ненулевое значение:
Для обозначения шестнадцатеричных цифр от 10 до 15 испо-
льзуются латинские буквы от А до F. wVar2 := 0;
Символ подчеркивания «_» не влияет на значение и использу- bVarl := WORD _TO_ BOOL (wVar2); ('результат FALSE*)
ется исключительно для улучшения зрительного восприятия чис-
Результаты операций, дающих логическое значение, можно
ла. Например: 10_000, 16#01_88. Подчеркивание можно приме- присваивать переменным типа BOOL:
нять только между цифрами или в конце числа. Два или более
подчеркивания подряд применять нельзя. bVarl : - wVar2 > 5000;
Глава 4. Данные и переменные Элементарные типы данных
Объявление в программе переменной Telegal типа Trolley и са элементов при компиляции. Естественно, это не относится к
начальная инициализация структуры выглядит так: массивам структур. Чтобы не иметь проблем при использовании
нескольких различных переменных одной структуры, применять
Telegal: Trolley := (Агис1:='Пустой*); прямые адреса в структуре нельзя.
Состояние элементов после начальной инициализации Telegal
показано на рис. 4.2. 4.3.3. Перечисления
Перечисление позволяет определить несколько последователь-
B-Teleoal ных значений переменной и присвоить им наименования. Пере-
—.Start = TtOms числение — это удобный инструмент, позволяющий ограничить
—.Distance = О
—.Load = множество значений переменной и усилить контроль при транс-
~-.0n =
—JUtfd = 'Пустей'
ляции. Как и структура, перечисление создает новый тип дан-
ных, определение которого выполняется на уровне проекта:
Рис. 4.2. Результат начальной инициализации Telegal TYPE <Имя перечисления^
При начальной инициализации не обязательно задавать значе- (<Элемент 0>, < Элемент ,... < Элемент п>);
ния для всех элементов. Элементы, не имеющие явно указанных ENDJTYPE
начальных значений, по умолчанию получат нулевые значения.
Для доступа к элементам структуры используется следующий Объявленная позднее переменная типа <Имя перечисления>
синтаксис: может принимать только перечисленные значения. При инициа-
лизации переменная получает первое из списка значение. Если
<Имя_переменной>.<Имя_элемента> числовые значения элементов перечисления не указаны явно, им
присваиваются последовательно возрастающие числа начиная с 0.
Например: Фактически элемент перечисления — это число типа INT с огра-
Telegal.On := True; ниченным набором значений. Если необходимо, значения элемен-
там можно присвоить явно при объявлении типа перечисления.
Структуры могут включать другие структуры, массивы и сами Например:
образовывать массивы. Пример объявления и инициализации
массива структур: TYPE TEMPO: (Adagio := 1,Andante : - 2,Allegro := 4);
ENDJTYPE
TrolleySet: ARRAY[0..2] OF Trolley := (Articl := 'T 1'),
(Articl := 'T 2'), (Articl := *T 3'); Идентификаторы элементов перечисления используются в про-
TrolleySet[i].On := TRUE; грамме как значения переменной:
Если структура содержит вложенную структуру, то доступ к VAR
элементам вложенной структуры осуществляется с применением LiftTemp : TEMPO := Allegro;
составного имени, содержащего две точки: END_VAR
train*wagon[5]. weight; (*wagonQ вложенный массив структур*)
Если в разные перечисления включены элементы с одинаковы-
Поскольку физический размер элементов структуры известен ми именами, возникает неоднозначность. Для решения этой проб-
транслятору заранее, обращение к элементу структуры не дает лемы применяется префикс, содержащий перечисление:
каких-либо накладных расходов в сравнении с простой перемен- TEMPO#Adagio. В CoDeSys все наименования элементов перечис-
ной. Транслятор имеет возможность рассчитать абсолютные адре- ления обязаны быть уникальными.
ГлаЬа 4. Данные н переменные Пользовательские типы данных 63
6 2
используются нультерминированные (как в С-компиляторах) обычно применяется символ подчеркивания. Символ подчеркива-
строки- То есть под строку всегда заранее выделяется область па* ния является значимым. Так имена 'Varl', *Var_l' и *__VarV яв-
мяти заданного максимального размера- Любая строка оканчива- ляются различными. Два подчеркивания подряд использовать не-
ется нулевым байтом, который не входит состав строки» а служи* льзя. Регистр букв не учитывается. Так 'VAR1' и *Varl' одно и то
исключительно для определения конца строки функциями, опе- же. Как минимум, 6 первых знаков идентификатора являются
рирующими со строками. Пустая строка состоит из единственного значимыми для всех систем программирования.
нулевого байта. При объявлении строки необходимо задавать рав- В CoDeSys такого ограничения нет — все символы наименова-
мер на единицу больше необходимого для символа «конец стро- ния являются значимыми. Символы кириллицы (русского языка),
ки». Такая форма представления наиболее компактна (всего 1 к сожалению, в идентификаторах применять нельзя. Это ограни-
вспомогательный байт), но, очевидно, не оптимальна в плане бы- чение характерно для всех программных систем.
стродействия. Если, например, нужно слить две строки, то функ-
ция конкатенации строк обязана сначала найти, где кончается Аналогичные требования относятся и к любым идентификато-
первая строка. В других системах программирования можно рам МЭК-программ (компоненты, метки, типы и т. д.).
встретить реализацию строк в виде структуры, содержащей мак-
симальный размер, текущую длину строки и саму строку (массив 4.4.2. Распределение памяти переменных
байт). Вообще же работа со строками в ПЛК требуется не часто.
Контроллер с точки зрения МЭК программы, имеет несколько
Для поддержки проверки значений переменных с ограничен- областей памяти, имеющих разное назначение. ,
ным диапазоном во время работы система исполнения должна 1. Область входов ПЛК.
предоставлять средства контроля. В CoDeSys эта задача решается
2. Область выходов ПЛК.
достаточно изящно — действия, которые выполняются, при по-
пытке выхода за диапазон определяются программистом. Для 3. Область прямо адресуемой памяти.
этого служат специальные функции (CheckRangeSigned, Check- 4. Оперативная память пользователя (ОЗУ).
RangeUnsigned), которые необходимо включить в проект. На вхо- Аппаратные ресурсы ПЛК присутствуют в МЭК-проектах в не-
де функции получают три параметра: две границы диапазона в; явной форме. Размещение переменной в одной из трех первых об-
значение. Любая необходимая реакция на нарушение границ, ластей приводит к ее связи с определенной аппаратурой — входа-
(ограничение переменной, индикация ошибки и т. д.) описывает- ми, выходами или переменными системы исполнения (диагности-
ся в теле функций контроля. . л ка модулей, настройка параметров ядра и т. д.). Распределение пе-
i ременных в этих областях определяется изготовителем ПЛК. При-
. i вязка к конкретным адресам задается при помощи прямой адреса-
4.4. Переменные ции. Для обеспечения переносимости программного обеспечения
прямые адреса нужно использовать только в разделе объявлений.
Каждая переменная обязательно имеет наименование и тип. В языках программирования стандарта не предусмотрено опера-
Сущность переменной может быть различной. Переменная может ций прямого чтения входов-выходов. Эту работу выполняет систе-
представлять вход или выход ПЛК, данные в оперативной или. ма исполнения. При необходимости для низкоуровневого обраще-
энергонезависимой памяти. Далее мы рассмотрим правила объяв- ния изготовителем ПЛК поставляются специальные библиотеки.
ления и некоторые практические сложности и тонкости, возника-
ющие при работе с переменными. Объявление переменной без префикса AT физически означает
выделение ей определенной памяти в области ОЗУ. Распределение
л доступной памяти ОЗУ транслятор осуществляет автоматически.
4*4*1. Идентификаторы
Переменные принято разделять на глобальные и локальные по
Имя переменной (ее идентификатор) должно быть составлено* области видимости. Глобальные переменные определяются на
из печатных символов и цифр. Цифру нельзя ставить на первое: уровне ресурсов проекта (VAR_GLOBAL) и доступны для всех про-
место. Пробелы в наименовании использовать нельзя. Вместо них* граммных компонентов проекта. Локальные переменные описыва-
• - -—•ЛЬ Г | -, • i
6 6
Глава 4. Данные и переменные Переменные 67
ются при объявлении компонента и доступны только внутри него. Символ Область памяти
Описание любого программного компонента содержит, как мини-
мум, один раздел объявления локальных переменных VAR, пере- В Байт
менных интерфейса VABJNPUT, VAR_OUTPUT, VAR__IN_OUT W Слово
и внешних глобальных переменных VAR_EXTERNAL (см. по-
дробнее «Компоненты организации программ»). D Двойное слово
Наименования разделов объявления переменных могут содер- L Длинное слово
жать дополнительные ключевые слова, уточняющие способ при-
менения. Завершает прямой адрес число — составной иерархический ад-
• Я М 1 Ш » * И ^ И - ^ - ™ 1 1 И 1
•
*
рес, поля которого разделены точкой. В простейшем случае испо-
Ключевое слово Применение переменной льзуется два поля адреса: номер элемента и номер бита.
Переменные нужно разместить в энергонезависи- В конце объявления, как и для автоматически размещаемых
мой памяти, сохраняющей значения при выклю- переменных, необходимо указать тип неременной. При указании
RETAIN ченном питании. Такая память не является обяза- адреса одного бита тип переменной может быть только BOOL.
тельной и присутствует далеко не во всех ПЛК В прямом адресе указывается именно номер элемента. Это ко-
CONSTANT Константы, доступные только для чтения ренным образом отличается от физических адресов микропроцес-
— сора. Если прямой адрес определяет байт, то номер Элемента —
это номер байта. Бели прямой адрес определяет слово, то номер
4.4.3. Прямая адресация элемента — это номер слова, и, естественно, один элемент зани-
мает два байта. Так, следующие три объявления адресуют один и
Для создания прямо адресуемой переменной используется сле- тот ate байт:
дующее объявление:
dwHeat AT%MD1: BYTE;
имя переменной АТ% прямой адрес тип;
wbHeat AT%MW2: BYTE;
Прямой адрес начинается с буквы, определяющей область па- byHeat AT %MB4: BYTE;
мяти:
Нумерацию элементов памяти для данного примера иллюстри-
рует следующая таблица.
Символ Область памяти
I Область входов D | 1 •'
•
Q Область выходов
1 1 3
М Прямо адресуемая память в 11 1 2 з !\ 5 6 7
во целых чисел- При одинаковой разрядности максимальное по- Еще один существенный факт состоит в том, что множество
ложительное число для знаковых типов вдвое меньше (на 1 раз*- целых чисел незамкнуто относительно операции деления. Иначе
ряд), чем для беззнаковых. говоря, при делении двух целых образуется рациональное число,
Наибольшее распространение для представления отрицатель- которое неизбежно приходится округлять для представления его
ных чисел получил дополнительный код. Для данных в дополни- на множестве целых чисел. За редким исключением, когда воз-
тельном коде описанные выше математические закономерности можно деление без остатка, деление в целочисленных выражени-
остаются в силе, В знаковых типах с применением дополнитель- ях образует операционную погрешность.
ного кода выбирается определенная граница, разделяющая поло- Для достижения минимальной вычислительной ошибки преж-
жительные и отрицательные числа. Так, для типа SINT граница де всего необходимо попытаться преобразовать формулу с целью
положительных чисел 127, для INT это 32767. Отрицательные минимизации количества операций деления. Рассмотрим пример.
числа образуются путем вычитания модуля числа из границы-
Ноль в дополнительном коде один, в области положительных чи- Допустим, необходимо вычислить выражение:
сел. Превышение границы является также обратимым, как и пе-
реполнение: sint#127 + 1 = -128, sint# -128 - " 1 - 127.
Представление значений типов SINT и USINT, закодирован-
ных одинаковыми 8-битными последовательностями в десятичной Здесь, очевидно, можно выполнить приведение дробей к обще-
и двоичной форме, показано в таблице: . -' му знаменателю. В результате вместо двух операций деления
останется только одна. Программа, выполняющая вычисление «в
лоб» и с преобразованием, выглядит так:
USINT S I N T B I N
0 0 0 0 0 0 _ 0 0 0 0
a,b,c,d: INT;
ч
1 1 0 0 0 0 _ 0 0 0 1
* • *
b := 3; d := 3;
J ,
При работе с числами в формате с плавающей запятой макси- Для этого может использоваться специальная запись имей- Пе-
мальное и минимальное (машинный ноль) значения переменных ременных, Впервые такая запись имен была предложена Чарль-
являются абсолютными. Так, при попытке увеличить максималь- зом Симони (Charles Simonyi) и обоснована в его докторской Дис-
но допустимое значение оно не изменится. Алгебраические аксио- сертации. Возможно, потому что Симони родился в Будапеште и
мы за этими пределами уже не выполняются (см. рис. 4.3). образованные по его системе наименования причудливы (на пер-
вый взгляд), как венгерский язык, за его методикой записи за-
крепилось название «венгерская запись». В настоящее время Си-
гА = В.е-009
гВ = 4.е-009
мони является ведущим инженером Microsoft; а венгерская за-
гС = 1.е-037 пись стала общепризнанной при программировании под Windows.
тХ1 := [гА 4 гХ1 =1.401298(^645 Идея венгерской записи заключается в прибавлении к иденти-
rXZ := гА"гС:
фикаторам коротких префиксов» определяющих тип и некоторые
гХЭ :* гв*гС: другие важные характеристики переменной. Префиксы принято
записывать строчными буквами» а имя переменной с заглавной
буквы. Поскольку венгерская запись «работает» для любых типи-
зированных языков, имеет смысл применить ее и при программи-
Рис. 4.3. Эффект потери значимости в операциях с действительными ровании ЦЛК.
числами Для базовых типов МЭК можно предложить следующие пре-
фиксы типов.
Еще один момент, на который необходимо обратить внимание,
это использование констант. Когда транслятор встречает кон-
Префикс Тип
станту, он выделяет под нее минимально необходимый тип дан-
ных. При вычислении выражений константы принимают тип по b BOOL
результату. Для разрешения возможной неоднозначности стан-
by BYTE, USINT
дартом предусмотрено явное указание типа констант. Для этого
используется префикс типа отделенный от константы значком г
si SINT
«#». Например, вы присваиваете целочисленной переменной р е - | w WORD, UINT
зультаты выражения составленного и коротких целых и кон- »
стант. Преобразование типов будет происходить неявно. Вопрос INT
. L
только в том — когда? До вычисления выражения все операнды dw DWORD, UDINT
преобразуется в INT, или сначала вычисляется выражение, а уже
затем преобразуется. Допустим, нужно заставить транслятор вы- di DINT
числить выражение в коротких целых. Это можно сделать, на- r REAL
пример, так: iVar := USINT#100 - byVar.
lr LREAL
st STRING
4.6. Венгерская запись
t TIME
При наличии строгой типизации данных очень полезной ока-
зывается возможность узнавать тип переменной по ее наименова- td TIME_OF_DAY
нию непосредственно в тексте программ, В этом случае некоррек- d DATE \
тное применение переменных бросается в глаза и позволяет избе-
жать многих сложно локализуемых ошибок. dt DATE_AND_TIME
7 6 Глава 4. Данные и переменные Формат BCD 77
Примеры обозначений ветствующих входами ПЛК, начинаются символом подчеркива-
bStop: BOOL; ния. Подчеркивание в конце имени указывает — только запись.
Идентификаторы выходов заканчиваются символом подчеркива-
bySet: BYTE; ния. Например, _blnpl, byOut2_.
wSize UINT:
Если система обозначений хорошо продумана, то ее примене-
«Венгерские» имена сами говорят о корректности их применен ние не вызывает сложности. Единый подход к наименованию
ния. Очевидно, следующее выражение является бессмысленным: очень здорово облегчает чтение программы и позволяет отказать-
bStop ;= wSize * 2; а выражение bStop ;= wSize > 2; вполне допус- ся от излишних комментариев. Уникальные префиксы удобны не
тимым. только для базовых типов, но и для широко используемых в про-
Уточнить назначение переменной можно добавлением еще од* екте собственных типов данных и функциональных блоков. Стан-
ного символа перед префиксом типа: дарт МЭК не содержит рекомендаций по составлению имен пере-
менных и компонентов программы. Никакого стандартного набо-
ра префиксов венгерской записи также нет. Вы можете использо-
.1 -Ч
FUNCTION_BLOCK и PROGRAM. За ним следует идентификатор Поясним их различия на примере. Возьмем стандартный блок
(имя компонента). Далее определяется интерфейс POU. К интер- RJTRIG, Он имеет вход с названием С1ЛС. Мы будем использовать
фейсу компонента относятся входы VAR_INPUT, выходы его в программе, в которой определена некая подходящая пере-
VAR_OUTPUT и переменные типа вход-выход VAR_IN_OUT. За- менная» например bPulse. При вызове блока из нашей программы
вершают раздел объявлений локальные переменные VAR. мы подаем bPulse на вход CLK. Далее программа компилируется
В функциях разделы VAR__OUTPUT и VAR_IN_OUT отсутст- и загружается в контроллер- Переменная bPulse приобретает не-
вуют. Выходом функции служит единственная переменная, сов- которое значение, например TRUE. Вход CLK, естественно, тоже
падающая с именем функции. Тип возвращаемого значения ука- будет иметь значение TRUE. Здесь отличия уже практически оче-
зывается при определении идентификатора через двоеточие. видны. CLK — это формальный параметр, bPulse — актуальный
параметр, a TRUE — фактическое значение* С формальными пара-
Например: FUNCTION iNearby : INT метрами приходится иметь дело при проектировании POU и опи-
Структура раздела объявлений POU доказана в таблице. сании его интерфейса. Актуальные параметры работают при ис-
пользовании компонента. Текущие значения рождаются только в
«железе» в процессе выполнения.
Функциональный
ТипРОи Функция Программа
блок
FUNCTION FUNCTION BLOCK PROGRAM 5.1.3. Параметры и переменные компонента
имя: ТИП имя имя При объявлении POU вы можете встретить следующие заго-
Интерфейс VARJNPUT VAR_INPUT VAR_INPUT ловки:
— VAR_OUTPUT VAR_OUTPUT Формальные входные параметры VAR__INPUT
— Передаются POU по значению путем копирования. При вызове
VAR_IN_OUT VARJNJ3UT
блока такой переменной можно присвоить значение другой пере-
Локальные менной (совместимого типа), константы или выражения. Любые
VAR VAR VAR
переменные изменения такой переменной внутри POU никак не отображаются
на данные вызывающего компонента. Применяется в любых
Все разделы переменных являются не обязательными; Так нет P0U. Могут иметь значения по умолчанию. Отражаются в графи-
ничего удивительного в программе, которая не требует, координа- ческом представлении с левой стороны компонента.
ции работы с другими программами. Интерфейс ей |№ нужен, и Формальные выходные параметры VARJOUTPUT
раздел объявлений будет содержать только локаль#ь1е перемен- Отражают результаты работы компонента. Передаются из POU
ные VAR. . ' ; . ' • по значению путем копирования. Чтение значения выходов обыч-
j но имеет смысл после выполнения блока. Вне компонента пара-
5.1-2. Формальные и актуальные параметры метры VAR_OUTPUT доступны только по чтению. Не использу-
ются в функциях, поскольку функция имеет только одно возвра-
Интерфейс компонента образуется входными и выходными пе- щаемое значение. Могут иметь начальные значения. Отражаются
ременными. Интерфейсные входные переменные называют фор- в графическом представлении справа.
мальными параметрами. При использовании компонента его
формальные параметры связываются с актуальными параметра- Параметр типа VARJNJOUT
ми. И наконец, при вызове параметры компонента приобретают Этот параметр одновременно является входом и выходом. Пе-
актуальные или текущие значения. Эти понятия необходимы для редача переменной экземпляру блока выполняется по ссылке. Это
избежания двусмысленности при описании техники работы с означает, что внешняя переменная как бы сама работает внутри
компонентами* блока на правах внутренней переменной. В компонент передается
8 2 Глава 5. Компоненты организаций программ (POU) Функции 83
только адрес ее расположения в памяти данных. Для переменной льзоваться в математических выражениях наряду с операторами
VAR_IN_OUT нельзя: и переменными.
• использовать ее в функциях; Функция не имеет внутренней памяти. Это означает, что фун-
• присваивать начальное значение; кция с одними и теми же значениями входных параметров все-
• обращаться как к элементу структуры данных, через точку; гда возвращает одно и то же значение. Функция — это чистый
код. Многократное использование функции не приводит к по-
• присваивать константу, как актуальный параметр.
вторному включению кода функции при компоновке. Реализа-
Присваивание внешней переменной для VAR_IN_OUT можно ция функции присутствует в коДё проекта только один раз. Вся-
производить только при вызове блока. кий раз при вызове функции процессор исполняет один и тот же
Важнейшим свойством VAR_IN_OUT является отсутствие ко? поименованный код. Функция может иметь локальные (времен-
пирования внешних данных. Параметры VAR INPUT и ные) переменные. Но при окончании своей работы функция
VAR_OUTPUT могут оперировать с массивами и структурами, но освобождает локальную память.
всякий раз при обращении к компоненту будет происходить пол- Тип функций (тип возвращаемого значения) может быть лю-
ное копирование данных. Это может отнимать много времени.
бым из числа стандартных типов данных или типов созданных
Присваивание одного массива другому для VAR_IN_OUT означа-
пользователем. Тело функции может быть описано на языках IL,
ет фактически переключение компонента с одного массива на
ST, LD или FBD. Использовать SFC нельзя. Из функции можно
другой. Локальная копия данных в этом случае не создается.
вызывать библиотечные функции и другие функции текущего
Как и глобальные переменные, параметры VAR_IN_OUT на- проекта. Вызывать функциональные блоки и программы из функ-
рушают идеологию независимости компонентов. Правильный ций нельзя.
компонент не должен иметь возможности испортить чужую па-
мять. Поэтому применять их нужно очень аккуратно и только в
случаях, когда это действительно необходимо. 5.2.1. Вызов функции с перечислением значений
параметров
Локальные переменные VAR
В прародителях языка S T — языках Паскаль и С вызов функ-
Доступны только внутри компонента, вне компонента доступа ций производится по имени с перечислением в скобках списка ак-
нет. Могут иметь начальные значения. Для функций локальные туальных входных параметров, через запятую, слева направо.
переменные размещаются в динамической памяти (обычно в сте- Аналогичный способ приемлем и в языке ST. Например:
ке). По окончании работы функции память освобождается и может
использоваться в других функциях. В программах и экземплярах у := MUX(O, x l , х2); (•Возвращает нулевой вход
функциональных блоков переменные VAR сохраняют свои значе-
ния между вызовами программ и экземпляров. В графическом Здесь интересно обратить внимание на то, что наименования па-
представлении компонента локальные переменные не отражаются. раметров нам не нужны. При перечислении параметров важно толь-
ко соблюсти правильную последовательность в соответствии с опре-
делением в объявлении функции. В графических языках порядок
5.2. Функции входных параметров задан направлением сверху вниз (рис. 5.1).
входных параметров*)
у := МАХ(х2, x l ) ; (*Результат тот же*)
Рис 5.2. Соединение Рис. 5.3. Расширяемая
двухвходовых AND реализация AND
5*2.2. Присваивание значений параметрам функции
Второй способ вызова функции предусматривает непосредст-
венное присваивание значений параметрам функции по именам: На рис. 5.2 представлена не очень красивая конструкция.
Было бы значительно удобнее иметь «расширяемую» функцию,
stHhello :« CONCAT(STRl:=^o6pbm \ 8ТК2:='день>); которая могла бы адаптироваться под переменное число парамет-
Это равносильно: ров. Такая реализация показана на рис. 5.3.
Стандарт МЭК действительно предусматривает такую возмож-
stHhello : - СО1ЧСАТ0До6рый \ 'день'); ность. В текстовых языках расширение производится добавлени-
или: ем переменных в конец списка параметров:
ret_in2
ций сложна для трансляции и спорна. Перегрузка операторов J M P C
SUB •
LT SEL (некоторые процессоры имеют очень маленький стек) для функ-
ki1 —
ABS
Neartyjnt ции будет отведено постоянное место в статической области дан-
in2- ных. Тогда может получиться, что локальные переменные будут-
pattern — I
•
inl- сохранять свои значения между вызовами. Это экзотическое иск-
•4 лючение из общего правила, и использовать его крайне опасно.
S U B
ABS
in2- — Компоненты SFC требуют некоторой памяти данных для запо-
pattem — минания своего текущего состояния. Поэтому запрет на их испо-
льзование в функциях не удивителен. .
Рис. 5.4. Реализа ЦП[я функи(ии Nearby Jnt в FBD С экземплярами функциональных блоков ситуация похожая.
Если экземпляр функционального блока создать в локальной па-
мяти функции, то его переменные будут принимать начальные
5.2.7. Ограничение возможностей функции значения при каждом вызове функции. Иногда это не существен-
но. CoDeSys не ограничивает такую возможность, следуя закону
Можно ли создать функцию с внутренней памятью? Можно, Кейсэра: «Можно сделать защиту от дурака, но только от неизоб-
если пойти на хитрость — использовать в функции глобальную ретательного».
переменную, ее значение будет сохраняться при повторном вы-
По определению, функция возвращает одно значение, но это
зове. При этом сама функция будет обладать уникальностью
очень легко обойти. Тип функции может быть составным, напри-
глобальной переменной. Так, можно сделать функцию счетчик,
мер структурой. Здесь необходимо иметь в виду, что, прежде чем
подсчитывающую число вызовов функции в глобальной пере-
использовать данные этой структуры, ее придется присвоить не-
менной. Создать несколько независимых счетчиков на основе которой однотипной переменной. Такое присвоение выполняется
такой функции невозможно. Кроме того, можно обратиться из транслятором, путем побайтного копирования. Фактически это
функции к неким аппаратным средствам, посредством прямо цикл, скрытый от программиста за простым знаком равенства.
адресуемых переменных. Например, к системному таймеру. Понятно, что при копировании структура или массив требуют
В этом случае функция будет возвращать разные значения для времени пропорционально своему размеру. Аналогичная ситуа-
одинаковых входных данных. Но на самом деле, любой аппа- ция складывается и при передаче составных типов в качестве па-
ратный ресурс или глобальная переменная не принадлежат са- раметра функции.
мой функции. По сути, для функции это те же формальные па-
раметры. Разница только в том, что законные параметры для Функция обязательно должна иметь хотя бы один входной па-
функции готовит вызывающий код, а значения глобальных пе- раметр и обязана возвращать значение. Пустой тип, обозначаю-
ременных она добывает сама. щий отсутствие передачи значений (тип VOID в C++), стандартом
не предусмотрен. Если возвращать все же нечего, используйте
Локальные переменные функции, имеющие явно заданные
тип BOOL. Вы можете даже не присваивать значения выходной
начальные значения, получат их всякий раз в начале работы
переменной функции. По умолчанию функция будет возвращать
функции. Если начальные значения не заданы, ситуация может
FALSE. Возврат BOOL дает мизерные затраты кода для любого
быть различной. Транслятор может обнулять их принудительно
типа процессора.
или не тратить на это время и оставлять случайные значения.
Это зависит от реализации. Некоторые генераторы кода имеют Определенные трудности с применением функций возникают в
специальный флажок в настройках, предоставляющий выбор языке LD. Здесь иногда приходится искусственно дополнять фун-
программисту — скорость или дополнительная страховка от слу- кцию дополнительным входным параметром BN <ENable), разре-
чайных ошибок. шающим или запрещающим выполнение функции. Подробнее см.
раздел «Расширение возможностей LD».
Обычно транслятор размещает локальные переменные и пара-
метры функции в стеке. Но это не -всегда так. Возможно, что из Среди компонентов МЭК, функция представляет «легкую весо-
соображений оптимизации или в силу аппаратных ограничений вую категорию». Примером хороших функций являются стандар-
Функциональные блоки 91
9 0
Глава 5. Компоненты организации программ (POU)
тные функции и операторы. Число их входных параметров обыч- 5.3. Функциональные блоки
но не превышает трех. Функциональный блок — программный компонент, отобража-
Если при реализации функции возникли вышеописанные ющий множество значений входных параметров на множество
сложности, обычно лучшим решением является перевод ее в бо- выходных. После выполнения экземпляра функционального бло-
лее «серьезную» весовую категорию ~ функциональный блок. ка все его переменные сохраняются до следующего выполнения.
Следовательно, функциональный блок, вызываемый с одними и
5.2.8. Функции в логических выражениях теми же входными параметрами, может производить различные
Применение функций в логических выражениях имеет одну выходные значения. Сохраняются все переменные, включая вход-
тонкость. Логическое выражение не всегда обязательно вычис- ные и выходные. Так, если мы вызовем экземпляр функциональ-
лять целиком. Возможно, что по некоторой начальной части вы- ного блока, не определяя значения некоторых входных парамет-
ражения уже можно сделать вывод об итоговом значении. Опти- ров, он будет использовать ранее установленные значения. Воз-
мизирующий компилятор достаточно «разумен» для таких дейст- можность задания переменного числа входных значений заложе-
вий. То есть, если логическое выражение содержит функции, то на по определению и не требует каких-либо дополнительных уси-
нельзя гарантировать, что все они будут вызваны. лий. Извне доступны только входы и выходы функционального
блока, получить доступ к внутренним переменным блока нельзя.
Например:
С позиций объектно-ориентированного программирования
IF funcl(x) OR func2(x) THEN ... (ООП) функциональные блоки — это объекты, великолепно реа-
Если funcl(x) возвращает TRUE, то func2(x) вызываться не бу- лизующие инкапсуляцию, т. е. сокрытие деталей реализации.
Объединение кода и данных в «одном флаконе» роднит функцио-
дет.
нальные блоки с классами ООП. Возможность наследования и по-
Еще один наглядный пример на языке FBD показан на лиморфизм, к сожалению, пока отсутствуют.
рис. 5.5.
5.3.1. Создание экземпляра функционального блока
NORMA AND
ЬХ
ш Прежде чем использовать функциональный блок, необходимо
создать его экземпляр. Эта операция аналогична по смыслу объ-
NORMA
in явлению переменной. Описав новый блок, мы фактически созда-
ли новый тип данных подобный структуре. Каждый функциона-
Рис. 5.5. Функция в логическом выражении льный блок может иметь любое количество экземпляров. Так,
различные экземпляры блока «таймер» совершенно независимы
друг от друга. Каждый из них имеет собственные настройки и
Здесь нельзя гарантировать, что функция NORMA будет вы-
живет собственной жизнью.
звана 2 раза. Если первый вызов дает FALSE, то понятно, что
дальше логическое выражение можно не проверять. Каждый экземпляр функционального блока имеет свой собст-
венный идентификатор и свою область в статической памяти дан-
Когда функции, участвующие в логических выражениях, не
ных. Объявление еще одного экземпляра блока приводит к выде-
делают никакой посторонней работы, ничего страшного в описан-
лению еще одной области в памяти данных. Код, очевидно, как и
ном нет. Поэтому крайне не желательно в логических функциях
для функции, остается общим (рис. 5.6).
выполнять запись выходов ПЛК или глобальных переменных. Не
игнорируйте данное предупреждение, поскольку «отловить» та- Экземпляр функционального блока создается в разделе объяв-
кую ошибку очень сложно. Если даже описанный эффект не про- лений переменных функционального блока, программы или в
является, нет гарантии, что ошибка не возникнет в другой про- разделе глобальных переменных проекта. Как и переменные, он
граммной среде или с новой версией компилятора. должен получить уникальный идентификатор. Например, созда-
Глава 5. Компоненты организации программ (POTJ) Функциональные блоки 93
9 2
ctuTimeMeter.RESET := FALSE;
Память данных Память программ ctuTimeMeter.PV := 100;
x :— ctuTimeMeter.CV;
Экземпляр 1
Входы экземпляра блока доступны для записи и чтения извне.
Выходы — только для чтения. Изменять значения выходов мож-
но только из тела блока, извне нельзя. Транслятор отслеживает
Экземпляр 2 Кодфункционального
блока
такие попытки и выдает сообщение об ошибке.
5.3.2. Доступ к переменным экземпляра Рис. 5.7. Вызов экземпляра функционального блока (FBD)
После создания экземпляра функционального блока можно В языке ST при отсутствии параметров пустые скобки в ST по-
сразу начать работать с его данными. При этом совсем не обязате- еле имени экземпляра ставить не нужно:
льно вызывать его. Обращаться к переменным экземпляра можно
так же, как к элементам структуры данных, через точку: ctuTimeMeterQ; (*Лишние скобки*)
9 4
Глава 5. Компоненты организации программ (POU) Функциональные блоки 95
Использовать экземпляры функциональных блоков в выраже- Теперь переменная SyncSwl.Sync получит начальное значение
ниях нельзя, но можно использовать их входы и выходы: FALSE, несмотря на значение, указанное в объявлении блока.
X := ctuTimeMeter.PV - ctuTimeMeter.CV + 1; Физически начальные значения переменные получают еще до
первого использования экземпляра. Операция начальной инициа-
Вы можете определить значения входов заранее и вызвать эк- лизации переменных производится по сбросу, который выполня-
земпляр функционального блока вообще без параметров: ется непосредственно после загрузки проекта в память ПЛК, по
На языке ST: команде отладчика или при перезапуске контроллера.
ctuTimeMeter.RESET := FALSE; Некоторые трансляторы имеют опцию отключения инициали-
зации по умолчанию с целью ускорения запуска ПЛК. В этом
ctuTimeMeter; случае полагаться на то, что переменные, не имеющие явно ука-
На языке IL: занных начальных значений, будут получать одинаковые значе-
ния при перезапуске системы, нельзя.
LD FALSE
Возможны случаи, когда экземпляру функционального блока
ST ctuTimeMeter. RESET нужна разумная инициализация. Например, для настройки блока
CAL ctuTimeMeter необходимо провести некоторые вычисления. Специальной проце-
Нужно обратить внимание на то, что МЭК не поощряет испо- дуры инициализации в функциональных блоках не предусмотре-
льзование элементов данных отдельно от вызова экземпляра бло- но. Здесь придется потратить на инициализацию один или не-
ка, поскольку это может привести к проблемам при использова- сколько первых циклов выполнения экземпляра. Окончание
сложной процедуры инициализации индицируют обычно выхо-
нии экземпляра блока в многозадачных проектах. С другой сторо-
дом готовности (ENO). Часто удобно применить для инициализа-
ны, многократное повторное присваивание входных значений
ции действие (см. ниже) и сосредоточить контроль над инициали-
увеличивает размер кода и снижает эффективность программы.
зацией в одном месте (обычно в шаге Init SFC диаграммы). Такой
метод позволяет проводить инициализацию данных, экземпляров
5.3.4. Инициализация данных экземпляра блоков и программ в необходимой последовательности и взаимо-
При описании блока в разделе объявлений можно явно присво- связи- В большинстве же практических случаев для блоков, тре-
ить начальные значения переменным. Например: бующих определенной настройки, оказывается достаточным ввес-
ти несколько специальных входов (уставок). Так сделано во всех
FUNCTION_BLOCK SyncSwitch стандартных блоках.
VAR INPUT
•»• •*• ••* 5.3.5* Тиражирование экземпляров
Sync: BOOL := TRUE;
При необходимости получить копию экземпляра функциона-
При создании экземпляра функционального блока SyncSwitch льного блока можно использовать оператор присваивания:
входная переменная Sync получит значение TRUE. Если началь-
ные значения не заданы, используются нулевые значения. SyncSw, SyncSw2: SyncSwitch;
Экземпляр функционального блока может потребовать инди- (•работаем с экземпляром SyncSwl*)
видуальной инициализации, отличной от той, которая определена
••* •*• *»*
при реализации. Установку начальных значений переменных]
проще всего выполнить при создании экземпляра. Значения, за- На языке ST:
данные при создании экземпляра, сильнее значений, заданных
при реализации блока. SyncSw2 := SyncSwl;
SyncSwl: SyncSwitch := (Sync := FALSE); На языке LD реализация этого примера показана на рис. 5.8.
9 6 Глава 5. Компоненты организации программ (POU) Функционалъные блоки 97
5.3.8. Пример функционального блока отражать интервалы, когда мгновенное значение сетевого напря-
В качестве простого примера реализуем блок синхронного пе- жения близко к нулю. Тогда переключение силовой цепи с выхо-
реключателя SyncSwitch. Алгоритм его работы следующий: вы- да SyncSwitch будет происходить без броска тока.
ход переключателя Q принимает значения, равные входу Start, Конечно, практическое значение нашего нового блока несколь-
но переключение выхода разрешено только при Sync :— TRUE. ко меркнет, если вспомнить о стандартном доминантном пере-
Графически это отражено на рис. 5.9. ключателе — SR. С ним задача решается в одну строчку (ST):
SR_1(SET1:= Start AND Sync, RESET:= Sync, Ql=> Q);
нием действия обязаны SFC. В CoDeSys действия можно исполь- зация компонента представляется в отдельном окне. Окна базиру-
зовать как подпрограммы. ются на соответствующем редакторе, текстовом или графическом,
в зависимости от языка реализации компонента. Выбор необходим
мого редактора происходит автоматически.
5.4. Программы
Программа — глобальный программный элемент, отображаю- и FuncBbckJ ffB)
идентификатор
щий множество значений входных параметров на множество вы- В Function,! [FUN) тип компонента
ходных. Программа очень похожа на функциональный блок. Из Function^ (FUNJ
языкреализации
Й PLC_PRG [PRO]
всех программных компонентов МЭК-программа самый крупный.
При помощи программ определяется верхний уровень проекта и
реализуется управление многозадачностью. Программы являются
глобальными компонентами и объявляются на уровне ресурсов. Рис. 5.10. Список компонентов проекта CoDeSys
тетом не будет работать вовсе» При одинаковом приоритете управ- При работе на ПЛК, имеющим время рабочего цикла около
ление получает задача, имеющая большее время ожидания. То 55 мс (такой цикл дает Windows эмулятор, привязанный к тикам
есть две равно приоритетные задачи будут работать поочередно. системного таймера компьютера), временная диаграмма исполне-
В системе исполнения CoDeSys реализована невытесняющая ния вышеописанных задач будет выглядеть, как показано на
многозадачность. Это означает, что любая задача, даже более рис. 6.2.
приоритетная, дает доработать текущей задаче до конца одного
220 ms
рабочего цикла. Работа циклических задач является аппаратно
независимой. Механизм управления задачами ПЛК всегда опира-
ется на аппаратный системный таймер, поэтому нельзя гаранти-
ровать, что система исполнения обеспечит точность вызова задач
до миллисекунды. Как правило, минимальная дискретность вре-
менного интервала, на которую вы можете рассчитывать, — Рис. 6.2. Временная диаграмма исполнения задач Т1» Т2, ТЗ
10 мс. Когда речь идет о медленных для ПЛК задачах, интервалы
времени измеряются десятыми долями секунды. При таких ин- Обратите внимание, что тестирование многозадачных проектов
тервалах время одного рабочего цикла несоизмеримо мало, поэто- требует осознанной работы с отладчиком. Отладчик должен быть
му механизма невытесняющей многозадачности оказывается до- настроен на необходимую задачу (в CoDeSys команда «Set Debug
статочно для обеспечения высокой относительной точности рабо- Task*). Только тогда точки останова будут корректно работать,
ты циклических задач. т. е. останов будет происходить именно при работе данной задачи.
N
l l d T C R V A L : f J i r a g p m s ]
L. PRG 3
Сюда же включаются и дополнительные фирменные инстру-
менты, зависящие от особенностей реализации конкретной систе-
-.'•
? • < ? " • . % * * ' ; , - - , ; ,
значений выходов не отображаются на аппаратные средства. Ко- дов и текущим состоянием. Реакция автомата зависит только от
нечно, значение переменной будет изменяться многократно» но текущего состояния без предыстории, т. е. не важно, как он при-
определяющим выход станет только последнее значение. шел в данное состояние- Вместе с тем текущее состояние также из-
Что еще плохо для ПЛК в данном алгоритме, так это задержка меняется по тактам, автомат переходит в новое состояние (функ-
времени. Вполне вероятно, что, кроме мерцания одним выходом, ция переходов 6). В теории автоматов описанные шесть объектов
ПЛК должен будет выполнять еще и другую работу. То есть про- А = {X, Y, S, sOt Ху 6} принято называть конечным автоматом Мили,
грамму необходимо будет дополнять. Но если контроллер занят Мы не будем более подробно углубляться в теорию автоматов.
ожиданием, то в данном алгоритме это означает, что ничего иного Достаточно понять принцип работы конечного автомата. Класси*
он делать не сможет. Значит, выдержку времени необходимо ор- ческая сфера применения ПЛК — это программная реализация
ганизовать иначе. Достаточно засечь время и заняться другими автоматов. Именно это и обусловило подход к программированию
делами, контролируя периодически часы. Здесь нет ничего осо- ПЛК. Контроллер вычисляет программно заданную функцию вы-
бенного- Так поступает обычно и большинство людей в ожидании ходов и функцию переходов. В каждом раббчем цикле ПЛК вы-
назначенного часа. полняет расчет новых значений для выходов, которые необходи-
С учетом приведенных соображений алгоритм мерцающего ин- мо изменить. В итоге классическая прикладная программа ПЛК
дикатора для ПЛК должен быть таким: оказывается более похожей на вычисление по формуле.
1. Проверить таймер, если время паузы вышло, то: Типовым вводным примером дискретных автоматов с памятью
а. Инвертировать выход (включить, если выключен, и на- является блок управления стиральной машиной. Базовые меха-
оборот); J низмы машины включают: клапан подачи воды, нагреватель,
привод барабана, помпу слива воды и таймер. Каждому механиз-
б. И начать отсчет новой паузы;
му можно сопоставить логическую переменную. Все возможные
2. Конец программы. L состояния машины определяются, таким образом, множеством
Несмотря на описанные сложности, алгоритм получился в ито- значений переменных. Переход из одного состояния в другое про-
ге проще. Так и должно быть. Технология ЩЕК специально ори- исходит под воздействием входных сигналов. Заметьте, что тай-
ентирована на подобные задачи. мер здесь является самостоятельным блоком. Сигнал окончания
Одна из возможных практических реализаций мерцающего выдержки времени является обычным входом.
индикатора (с двумя таймерами) будет представлена в главе
Несколько расширив понятие автомата, мы можем рассматри-
«Примеры программирования», пример «Генератор импульсов».
вать переходы как функции событий. События не обязательно
должны быть связаны с входами, это достаточно абстрактное по-
7.1.1. ПЛК как конечный автомат нятие. Тогда окончание таймау-
Чтобы писать хорошие программы для ПЛК, нужно научиться та можно будет просто понимать
думать определенным образом. Секрет состоит в том, чтобы пред- как событие, причем совершен-
ставлять себе контроллер не как машину, последовательно вы- но не важно, как конкретно реа-
полняющую команды программы, а как конечный автомат. лизован сам таймер. Модель та-
В любом автомате существует множество входов (X), множество кой системы удобно изобразить
выходов (Y) и множество возможных состояний (S), В нашем слу- в виде направленного графа со-
чае это конечные множества, поскольку число входов-выходов стояний (state charts). Состоя-
ПЛК ограничено, так же как и объем памяти переменных (опреде- ния отображаются овалами, со- Рис. 7.1. Граф состояний для
ляющих возможные состояния). Начальное состояние (s 0 e S) од- держащими значения набора пе- двух переменных
нозначно определено. Автомат работает по тактам, для ПЛК это ременных, а переходы — на-
рабочий цикл. В каждом такте значения входов известны. Значе- правленными дугами (рис. 7.1). Диаграммы состояний очень эф-
ния выходов определяются (функция выходов X) значениями вхо- фективный инструмент проектирования и анализа автоматов.
1 1 0 Глава 7. Языки МЭК Семейство языков МЭК 111
Техническая база для построения автоматов весьма широка* нии языков ПЛК и комплексов программирования является воз-
Это механические узлы, пневматические элементы» реле или логи- можность реализовывать прототипы без применения дополните-
ческие микросхемы и т. д. Но в отличие от любых других реализа- льных средств. Причем это должен быть действующий прототип,
ций автоматов технология ПЛК обеспечивает быстрое и исключи-» а не просто картинка. Высокоуровневая модель, пусть созданная
тельно гибкое решение. Безусловно, при построении автоматов на даже из пустых блоков, должна работать так, чтобы ее можно
базе программируемых логических матриц и микропроцессоров было продемонстрировать заказчику, обсудить и отработать. Да-
перепрограммирование также возможно, но значительно более тру* лее прототип должен непосредственно стать скелетом готовой
доемко. Это можно сделать только при наличии соответствующего программы, без какой-либо специальной переделки. Только так
оборудования и специальной подготовки. программист получит возможность сразу писать правильную и
Реально возможности ПЛК существенно превышают конечные красивую программу, а не переписывать ее вплоть до превраще-
автоматы. Далеко не все, что можно сделать на ПЛК, вписывает- ния в * лоскутное одеяло».
ся в рамки конечных автоматов. Это функции управления по вре-
мени, математическая обработка данных, регулирование и т. д.
Тем не менее применение формализма конечных автоматов позво-
7.2. Семейство языков МЭК
ляет значительно упростить процесс проектирования.
7.2.1. Диаграммы SFC
Причем это относится не только к ПЛК, Подобный подход ле-
жит в основе универсального моделирующего языка Unified Mo- В семействе МЭК-языков SFC (Sequential Function Chart)
deling Language (UML) [37]. Пакет расширения Stateflow матрич? диаграммы стоят особняком, а точнее, выше по отношению
ной системы компьютерной математики MATLAB обеспечивает к остальным четырем языкам. Диаграммы SFC являются
построение анимационных диаграмм состояния моделей различи высокоуровневым графическим инструментом. Благодаря SFC
ных устройств и систем [34]. Он позволяет выполнять ситуацион- идея превращения модели системы в законченную программу ста-
ное моделирование в дополнение к имитационному моделирова- ла реальностью. В отличие от применения вспомогательных
нию, выполняемому мощным пакетом расширения системы МАТ- средств моделирования SFC дает действующий непосредственно в
LAB-Simulink [35]. ПЛК прототип.
Только хорошо проработанные технические спецификации
Сети Петри
проекта позволяют программисту выполнить свою работу качест-
венно и в срок. Неточности в техническом задании или плохо Оригинальный метод формального описания дискретных сис-
проработанная модель системы неизбежно выливаются в много- тем был предложен Карлом Адамом Петри в 1962 году. Он опира-
кратные переделки и затяжную отладку. Описание задачи в виде ется на разделение системы или отдельных ее частей на множест-
словесного алгоритма и рисунков на бумаге всегда оставляет воз* во простых позиций. Позиция описывает состояние части систе-
можность упустить детали. Самое обидное» что, как правило, де- мы. Причем состояние понимается здесь достаточно гибко, это
тали эти внешне очень просты, но приводят к пересмотру всей может быть состояние оборудования, процесса или программы.
структуры построения управляющей программы. Например, за- Переходы между позициями происходят при выполнении опреде-
были кнопку аварийной блокировки или фиксацию промежуточ- ленных условий. Графически позиция отображается в виде
ных положений для настройки механики и т. д- Для выявления окружности (см. рис. 7.2). Переходам соответствуют отрезки, сое-
подобных тонкостей необходим действующий прототип системы и диненные с позициями направленными дугами. Каждая позиция
соответственно средства, позволяющие его построить. способна обладать маркером и передавать его другим позициям по
Проектирование и отработка модели с применением вспомога- исходящим дугам. Маркеры отображается в виде жирной точки.
тельных CASE-инструментов, безусловно» решают эту проблему, Допускается одновременное присутствие нескольких маркеров.
но с ростом сложности проектов сроки реализации возрастают К переходу приходит одна или несколько дуг, идущих от разных
слишком резко. Поэтому одной из важнейших задач при созда- позиций. От перехода также могут отходить несколько исходя-
1 1 2 Глава 7. Языки МЭК Семейство языков МЭК 113
SFC-диаграммы
Рис. 7.2. Сеть Петри В отличие от сетей Петри дуги в SFC имеют выраженную на-
правленность сверху вниз и отражаются прямыми линиями. По-
щих дуг, ведущих к разным позициям. Проверка условия перехо- зиции в SFC называют шагами или этапами. На диаграмме они
да (разрешение) производится, только если хотя бы одна из его отражаются в виде прямоугольников. Благодаря такому •кубиз-
исходных позиций владеет маркером. му» существует возможность реализации диаграмм в символах
Существенным моментом сети Петри является то, что несколь- псевдографики (рис. 7.3). Задать несколько стартовых шагов в
ко позиций могут одновременно иметь маркеры. То есть сеть опи- SFC нельзя, только один шаг диаграммы является начальным.
сывает процессы, работающие параллельно и взаимосвязанно- Со-
стояние сети определяется совокупностью позиций, владеющих I
маркерами. +• ,1, -\
II
Описанная сеть позиций и переходов является простейшим ва- II Step 2
риантом сетей Петри. Именно она и послужила прототипом для Ьх1 Ii
разработки SFC. -\у т
I
Заслуга первой практической реализации языка этапов и пере- Л ^
Требование параллельности приводит к невозможности компакт- транслированный код. Благодаря чему, IL выигрывает там» где
но закодировать все состояния. То есть невозможно использовать нужно достичь наивысшей эффективности, К компиляторам это
одну переменную, которая содержит единственный номер актив- относится в полной мере. В системах исполнения с интерпретато-
ной позиции. Каждая позиция требует собственных признаков ром промежуточного кода выигрыш не столь значителен.
активности. Механизм кодирования может быть достаточно
изощренным, но, к счастью, его реализация ложится исключите- 7.2.3. Структурированный текст ST
льно на плечи разработчиков системы программирования. На
Язык ST (Structured Text) — это язык высокого уровня.
прикладном уровне задумываться о деталях реализации не при-
Синтаксически ST представляет собой несколько адаптиро-
ходится- Единственное, что нужно учесть, это небольшой допол-
нительный расход памяти данных и кода. ванный язык Паскаль. Вместо процедур Паскаля в ST испо-
льзуются компоненты программ стандарта МЭК.
Из-за необходимости внутренней памяти только функциональ-
Для специалистов, знакомых с языком С, освоение ST также
ные блоки и программы могут быть реализованы в SFC, функции
не вызовет никаких сложностей. В качестве иллюстрации срав-
такой возможности лишены.
ним эквивалентные программы на языках ST и С:
Целью применения SFC является разделение задачи на про-
стые этапы с формально определенной логикой работы системы. ST: C:
SFC дает возможность быстрого построения прототипа системы WHILE C o u n t e r o O DO while (Counter = 0)
без программирования. Причем для отработки верхнего уровня не
Counter := Counter-1;
требуется детальное описание действий, так же как и привязка к
конкретным аппаратным средствам. Varl := Varl*2; Varl * - 2;
7.2.2. Список инструкций IL IF Varl > 100 THEN if(Varl > 100)
Язык IL (Instruction list) дословно — список инструкций. Varl := 1;
Это типичный ассемблер с аккумулятором и переходами по Var2 := Var2 Varl - 1;
меткам. Набор инструкций стандартизован и не зависит от ENDJF ++Var2;
конкретной целевой платформы. Поскольку IL самый простой в END WHILE
реализации язык» он получил очень широкое распространение до }/*while*/
принятия стандарта МЭК. Точнее» не сам IL, а очень похожие на
него реализации. Практически все производители ПЛК Европы В большинстве комплексов программирования ПЛК язык ST
создавали подобные системы программирования, похожие на со-* по умолчанию предлагается для описания действий и условий пе-
временный язык IL. Существуют примеры реализации команд и реходов SFC. Это действительно максимально мощный тандем,
на основе русскоязычных аббревиатур [8]- Наибольшее влияние позволяющий эффективно решать любые задачи.
на формирование современного IL оказал язык программирова-
ния STEP контроллеров фирмы Siemens, Язык IL позволяет рабо-
7.2.4. Релейные диаграммы LD
тать с любыми типами данных, вызывать функции и функциона-
льные блоки, реализованные на любом языке. Таким образом, на Язык релейных диаграмм LD (Ladder Diagram) или релей-
IL можно реализовать алгоритм любой сложности, хотя текст бу- но-контактных схем (РКС) — графический язык, реализу-
дет достаточно громоздким. ющий структуры электрических цепей. РКС — это амери-
В составе МЭК-языков IL применяется при создании компакт- канское изобретение. В начале 70-х гг. XX в. релейные автоматы
ных компонентов, требующих тщательной проработки, на кото- сборочных конвейеров начали постепенно вытеснятся програм-
рую не жалко времени. При работе с IL гораздо адекватнее, чем с мируемыми контроллерами. Некоторое время те и другие рабо-
другими языками, можно представить, как будет выглядеть от- тали одновременно и обслуживались одними и теми же людьми.
1 1 6 Глава 7. Языки МЭК Язык линейных инструкций (IL) 117
Так появилась задача прозрачного переноса релейных схем в ПЛК. Сами блоки, представленные на схеме как «черные ящи-
ПЛК. Различные варианты программной реализации релейных ки», могут выполнять любые функции.
схем создавались практически всеми ведущими производителя- FBD-схемы очень четко отражают взаимосвязь входов и выхо-
ми ПЛК. Благодаря простоте представления РКС обрел заслу- дов диаграммы. Если алгоритм изначально хорошо описывается с
женную популярность, что и стало основной причиной включе- позиции сигналов, то его FBD-представление всегда получается
ния его в стандарт МЭК. нагляднее, чем в текстовых языках.
Слова «релейная логика» звучат сегодня достаточно архаично,
почти как «ламповый компьютер». Тем более в связи с созданием
многочисленных быстродействующих и надежных бесконтактных 7.3. Язык линейных инструкций (IL)
(в частности, оптоэлектронных) реле и мощных переключающих
приборов, таких как мощные полевые транзисторы, управляемые 7,3.1. Формат инструкции
тиристоры и приборы IGBT [36], Но, несмотря на это, релейная
техника все еще очень широко применяется. Текст на IL — это текстовый список последовательных инст-
рукций. Каждая инструкция записывается на отдельной строке.
Графически LD-диаграмма представлена в виде двух вертика- Инструкция может включать 4 поля, разделенные пробелами или
льных шин питания. Между ними расположены цепи, образован- знаками табуляции:
ные соединением контактов (см. рис. 7.5). Нагрузкой каждой
цепи служит реле. Каждое реле имеет контакты, которые можно Метка: Оператор Операнд Комментарий
использовать в других цепях.
Метка инструкции не является обязательной, она ставится то*
Логически последовательное (И), параллельное (ИЛИ) соедине- лько там» где нужно. Оператор присутствует обязательно. Опе-
ние контактов и инверсия (НЕ) образуют базис Буля. В результа- ранд необходим почти всегда. Комментарий — необязательное
те LD идеально подходит не только для построения релейных ав- поле, записывается в конце строки. Ставить комментарии между
томатов, но и для программной реализации комбинационных ло- полями инструкции нельзя. Пример IL-программы:
гических схем. Благодаря возможности включения в LD функций
и функциональных блоков» выполненных на других языках, сфе-
ра применения языка практически не ограничена. МЕТКАХ: LD Sync (*пример IL*)
AND Start
S Q
7,2*5* Функциональные диаграммы FBD
(*для красоты метку можно поставить в отдельную строку*)
FBD (Function Block Diagram) — это графический язык про-
граммирования. Диаграмма FBD очень напоминает принци- МЕТКА2:
пиальную схему электронного устройства на микросхемах LD 2
(см, рис. 7.16). В отличии от LD «проводники» в FBD могут про- ADD 2
водить сигналы (передавать переменные) любого типа (логиче- ST У
ский» аналоговый, время и т. д.). Иногда говорят, что в релейных
схемах соединительные проводники передают энергию. Провод- Для лучшего восприятия строки IL выравнивают обычно в ко-
лонки по полям.
ники FBD тоже передают энергию, но в более широком смысле.
Здесь слово- «энергия» применимо в том смысле, в котором им Редактор CoDeSys выравнивает текст автоматически. Помимо
оперируют не электрики, а экстрасенсы. Очевидно» что шины пи- этого, редактор «налету» выполняет синтаксический контроль и
выделение цветом. Так» корректно введенные операторы выделя-
тания и контакты здесь уже не эффективны. Шины питания на
ются голубым цветом. К сожалению» черно-белая печать книги
FBD диаграмме не показываются. Выходы блоков могут быть по- лишает читателя удовольствия наблюдать цветные выделения во
даны на входы других блоков либо непосредственно на выходы всех листингах программ этой книги.
1 1 8 Глава 7. Языки МЭК Язык линейных инструкций (IL) 119
Скобки могут быть вложенными. Каждое вложение требует ор- Оператор Модификатор Описание
ганизации некоего временного аккумулятора. Это вызывает неод-
X0R N, ( Поразрядное ИЛИ
нозначность при выходе из блока скобок командами JMP, RET,
CAL и LD. Применять эти команды в скобках нельзя. NOT Поразрядная инверсия аккумулятора
ADD ( Сложение
7.3.5. Модификаторы
SUB ( Вычитание
Добавление к мнемонике некоторых операторов символов —
модификаторов ' С и 'N* модифицирует смысл инструкции. MUL ( Умножение
Символ *N* (negation) вызывает диверсию значения операнда
DIV ( Деление
до выполнения инструкции. Операнд должен быть типов BOOL,
BYTE, WORD или DWORD. MOD ( Деление по модулю
Символ ' С (condition) добавляет проверку условий к командам
перехода, вызова и возврата. Команды JMPC, CALC, RETC будут GT ( >
выполняться только при значении аккумулятора ИСТИНА. До- GE (
бавление символа ' N ' приводит к сравнению условия с инверсным
значением аккумулятора. Команды JMPCN, CALCN, RETCN бу- QE ( =
дут выполняться только при значении аккумулятора ЛОЖЬ. Мо- NE < >
(
дификатор 'N' без ' С не-имеет смысла в данных операциях и не
применяется. LE ( <=
LT ( <
7.3.6. Операторы
JMP CN Переход к метке
Стандартные операторы IL с допустимыми модификаторами
представлены в таблице. CAL CN Вызов функционального блока
Х Г Т Ч Д Д ^ ^ ^ ^ ^ ^ ^ 1 Д | 1 III I II1I
Выход из POU и возврат в вызываю-
Оператор Модификатор Описание RET CN
щую программу.
Загрузить значение операнда в акку-
LD N
мулятор Операторы S и R применяются только с операндами типа
BOOL. Прочие операторы работают с любыми переменными базо-
Присвоить значение аккумулятора
ST N вых типов.
операнду
Приведенный список содержит операторы, поддерживаемые в
Если аккумулятор ИСТИНА, устано- обязательном порядке. Трансляторы кода CoDeSys для различных
S вить логический операнд (ИСТИНА) аппаратных платформ реализуют различные подмножества до-
полнительных операторов.
Если аккумулятор ИСТИНА, сбро-
R сить логический операнд (ЛОЖЬ)
7.3.7. Вызов функциональных блоков и программ
AND N, ( Поразрядное И
Вызвать экземпляр функционального блока или программу
OR N, ( Поразрядное ИЛИ в IL можно с одновременным присваиванием переменных. На-
,——^——• i i —
i ^-^—• пример:
Глава 7. Языки МЭК Язык линейных инструкций (IL) 123
1 2 2
L D C T D l . C V
яснение должно пояснять суть проблемы и идею решения, а не
S T описывать сами команды. Например: (*Игнорировать колебания
Аналогичный вызов можно выполнить с предварительным до 5 единиц*) — плохой комментарий- (*Колебания замеров до 5
единиц являются шумом*) — значительно лучше.
присваиванием значений входных переменных:
Транслятор IL CoDeSys допускает многострочные коммента-
LD TRUE рии. Целостное пояснение всегда воспринимается лучше, чем ко-
ST CTD_1.CD роткие обрывочные комментарии в строках инструкций.
LD FALSE Комментарии МЭК имеют один существенный недостаток.
ST CTD_1.LOAD Если при отладке понадобится временно отключить часть исход-
LD 10 ного текста, то проще всего его целиком закомментировать. Здесь
обычно и возникает проблема вложенных комментариев. Вложен-
ST CTD_1.PV
ные комментарии не столь страшны для транслятора CoDeSys,
CAL CTD_1 сколько доставляют неудобства при правке текста. Строковые
LD CTD_1.CV комментарии (вводимы^ с помощью ; в ассемблере и // в C++), к
ST У сожалению, стандартом МЭК не предусмотрены.
7.4. Структурированный текст (ST) (<, >, <=, >=); равенство (=); неравенство (<>); логические опе-
рации AND, XOR и OR.
7*4.1. Выражения Приоритет операций в выражениях очень важен. В первую
очередь с математической точки зрения:
Основой ST-программы служат выражения. Результат вычис
ления выражения присваивается переменной при помощи опера X :- 2 + 2 * 2; (* - 6*)
тора «:=», как и в Паскале. Каждое выражение обязательно за X :- (2 + 2) * 2; (* = 8*)
канчивается точкой с запятой *;». Выражение состоит из пере
Здесь результаты очевидны- Умножение имеет более высокий
менных констант и функций, разделенных операторами:
приоритет, чем сложение, и выполняется раньше. Скобки меняют
iVarl := 1 + iVar2 / ABS(iVar2); порядок вычислений, и результат оказывается другим.
При составлении выражений обязательно необходимо учиты-
Стандартные операторы в выражениях ST имеют символьное вать возможный диапазон изменения значений и типы перемен-
представление, например математические действия: +, -, *, Д ных. Ошибки, связанные с переполнением, возникают в процессе
операции сравнения и т, д. выполнения и не могут быть обнаружены транслятором.
Помимо операторов» элементы выражения можно отделять
пробелами и табуляциями для лучшего восприятия. В текст мо- iVarl: SINT;
гут быть введены комментарии. Везде, где допустимы пассивные siVar2: SINT : - 120;
разделители, можно вставлять и комментарии: siVarl : 120 - siVar2 + 20; (*120- 120 = 0, 0 + 20 = 20*)
iVarl := 1 + (*получить знак*) iVar2 / ABS(iVar2); (*проверка siVarl : : 120 - (aiVar2 + 20); (*120 + 20 = -116, 120 +116 = -20*)
на 0 была выше*)
Несколько выражений можно записать подряд в одну строку.
7.4.3. Пустое выражение
Но хорошим стилем считается запись одного выражения в строке. Пустое выражение состоит из точки с запятой «;» . Для точки
Длинные выражения можно перенести на следующую строку. Пе- с запятой транслятор не генерирует никакого кода. Если случай-
ренос строки равноценен пассивному разделителю. но поставить лишнюю *;», это не вызовет ошибки. Единственное
Выражение может включать другое выражение, заключенное осмысленное применение пустого выражения — это обеспечение
в скобки. Выражение, заключенное в скобки, вычисляется в пер- правильности языковых конструкций. Например, может потребо-
вую очередь. ваться оттранслировать проект, содержащий еще не реализован-
Тип выражения определяется типом результата вычислений: ный POU. Для корректной трансляции достаточно написать в
теле POU один пустой оператор. Еще один пример, где пустой
bAlarm := bylnpl bylnp2 AND bylnpl + bylnp2 <> 0 OR оператор оказывается весьма кстати» это условие IF, не содержа-
b Alarm 2; щее раздел THEN:
<выражения iVarl := 1;
ELSIF byLeft < 16 THEN
ELSIF <логическое выражение ELSEIF iVarl := 2;
THEN ELSIF byLeft < 32 THEN
iVarl := 3;
< выражения ELSEIF 1> ;
ELSIF byLeft < 64 THEN
iVarl := 4;
ELSIF <логическое выражение ELSEIF n> ELSE
THEN bReset ;= TRUE;
< выражения ELSEIF n> ; END_IF
ELSE 7.4.5. Оператор множественного выбора CASE
< выражения ELSE> ;
Оператор множественного выбора CASE позволяет выполнить
различные группы выражений в зависимости от значения одной
END_IF целочисленной переменной или выражения. Синтаксис:
Если <логическое выражение IF> ИСТИНА, то выполняются CASE <целочисленное выражение> OF
выражения первой группы — <выражения IF>. Прочие выраже- <значение
ния пропускаются, альтернативные условия не проверяются. <выражения
Часть конструкции в квадратных скобках является необязате-
льной и может отсутствовать. Оначение 2> , Оначение 3> :
Если <логическое выражение IF> ЛОЖЬ, то одно за другим <выражения 3> ;
проверяются условия ELSIF. Первое истинное условие приведет к
выполнению соответствующей группы выражений. Прочие усло- <значение 4>..оначение 5> :
вия ELSIF анализироваться не будут. Групп ELSIF может быть <выражения 4> ;
несколько или не быть совсем.
Если все логические выражения дали ложный результат, то
выполняются выражения группы ELSE, если, она есть. Если груп- ELSE
пы ELSE нет, то не выполняется ничего. <выражения ELSE>
В простейшем случае оператор IF содержит только одно
условие: END CASE
Глава 7. Языки МЭК Структурированный текст (ST) 129
1 2 8
Если значение выражения совпадает с заданной константой, то 7.4.6. Циклы WHILE и REPEAT
выполняется соответствующая группа выражений. Прочие усло- Циклы WHILE и REPEAT обеспечивают повторение группы вы-
вия не анализируются (<значение 1>: <выражения 1> ;). ражений, пока верно условное логическое выражение. Если услов-
Если несколько значений констант должны соответствовать ное выражение всегда истинно, то цикл становится бесконечным.
одной группе выражений, их можно перечислить через запятую Синтаксис WHILE:
(<значение 2> , <значение 3> : <выражения 3> ;).
Диапазон значений можно определить через двоеточие (<зна- WHILE <Условное логическое выражение> DO
чение 4>..<значение 5> : <выражения 4> ;). <Выражения — тело цикла>
Группа выражений ELSE является необязательной. Она вы- END_WHILE
полняется при несовпадении ни одного из условий (<выражения
ELSE> ;). Условие в цикле WHILE проверяется до начала цикла. Если
логическое выражение изначально имеет значение ЛОЖЬ, тело
Пример: цикла не будет выполнено ни разу.
CASE byLeft/2 OF Синтаксис REPEAT:
0,127: REPEAT
bReset := TRUE; <Выражения — тело цикла >
Varl := 0; UNTIL <Условное логическое выражение>
16..24:
END_REPEAT
Varl : - 1;
ELSE Условие в цикле REPEAT проверяется после выполнения тела
Varl := 2; цикла. Если логическое выражение изначально имеет значение
ЛОЖЬ, тело цикла будет выполнено один раз.
END_CASE
Значениями выбора CASE могут быть только целые констан- Пример:
ты, переменные использовать нельзя. Одинаковые значения в ci :— 64;
альтернативах выбора задавать нельзя, даже в диапазонах. Так,
WHILE ci > 1 DO
следующий пример обязан вызвать ошибку при трансляции:
Varl := Varl + 1;
CASE byLeft OF ci := ci/2;
20: Varl 0;
END_WHILE
16..24: Varl 1;
END CASE Правильно построенный цикл WHILE или REPEAT обязатель-
но должен изменять переменные, составляющие условие оконча-
Безусловно, оператор CASE «слабее» оператора IF, не имею-
ния в теле цикла, постепенно приближаясь к условию заверше-
щего подобных ограничений. Но формат CASE не только вырази-
ния. Если этого не сделать, цикл не закончится никогда.
телен для программиста, но и более эффективен. Использование
целочисленных констант позволяет транслятору выполнить опти- Старайтесь не использовать точное равенство и неравенство
мизацию кода, часто весьма существенную. для прекращения цикла. Иначе есть вероятность ошибочно про-
скочить граничное условие. Лучше использовать условия больше
и меньше. В следующем примере ошибка хорошо видна исключи-
тельно благодаря его простоте:
1 3 0 Глава 7. Языки МЭК Структурированный текст (ST) 131
Switch2 SwitchS
Контакт может быть инверсным — нормально замкнутым. Та-
кой контакт обозначается с помощью символа |/| и замыкается,
Рис. 7.5. Схема LD из одной цепи если значение переменной ЛОЖЬ, Происхождение этого обозна-
чения связано с русской буквой И (инверсия), которую американ-
В LD каждому контакту ставится в соответствие логическая цы вписывали в контакт (шутка). Инверсный контакт равнозна-
переменная» определяющая его состояние. Если контакт замкнут, чен логической операции НЕ.
то переменная имеет значение ИСТИНА. Если разомкнут — Переключающий контакт образуется комбинацией прямого и
ЛОЖЬ. Имя переменной пишется над контактом и фактически инверсного контактов (см. пример на рис. 7.6).
служит его названием.
Последовательное соединение контактов или цепей равноценно
логической операции И. Параллельное соединение образует мон-
тажное ИЛИ.
Цепь может быть либо замкнутой (ON), либо разомкнутой
(OFF). Это как раз и отражается на обмотке реле и соответственно
на значении логической переменной обмотки (ИСТИНА/ЛОЖЬ).
Рис. 7.6. Переключающий контакт
1 3 8
Глава 7. Языки МЭК Релейные диаграммы (LD) 139
Обмотки реле также могут быть инверсными, что обозначает- Контакт S_R1 включает, a R_R1 выключает реле R1, благода-
ся символом (/). Если обмотка инверсная, то в соответствующую ря контакту R1 реле получает питание после размыкания S R 1 .
логическую переменную копируется инверсное значение состоя- Применение SET/RESET-обмоток не дает ничего принципиально
ния цепи. нового, но делает LD-диаграмму проще и красивее.
О
R R1
И ( Р2 РЗ
импульсов. Пример такого построения дан на рис. 7.9. Период Специальный переход RETURN прекращает выполнение LD
импульсов на реле Р1 будет равен удвоенной длительности рабо- диаграммы. Если RETURN встречается в основной программе
чего цикла ПЛК. (PLC_PRG), рабочий цикл прерывается. В функциях и функцио-
нальных блоках происходит возврат в место вызова. Иными сло-
PI PI вами, использование перехода RETURN аналогично по смыслу
оператору RETURN в текстовых языках.
Идеологически переходы противоречат аналогии LD с релей- Рис. 7.11. Цикл на 10 повторов на базе функционального блока CTD
ными схемами, нарушая законы электрических цепей. В схеме
LD с переходами разобраться бывает сложно. Желательно не за- Для включения в диаграмму функций в них искусственно вво-
ниматься управлением порядком выполнения LD-диаграммы в дится добавочный логический вход, обозначаемый EN (Enable)
ней самой, а использовать для этого более выразительные средст- (см. пример на рис. 7.12). Логическое значение на входе EN раз-
ва. Например, разделить LD-диаграмму на модули (действия), а решает или запрещает выполнение функции. Сама функция не
порядок выполнения описать в SFC. терпит никаких изменений при добавлении входа EN.
1 4 2 Глава 7. Языки МЭК Релейные диаграммы (LD) 143
Помимо входа EN, стандарт предлагает определять для функ- ла входов и выходов и устанавливается графическим редактором
ций и дополнительный выход ENO (Enable Out), показывающий автоматически. Пример графического представления экземпляра
дальнейшее прохождение тока в цепи. Выход ENO появился в Blinker функционального блока BLINK дан на рис, 7.15.
редакции стандарта 1993 года, но не является обязательным.
В CoDeSys такая возможность не поддерживается. Выход ENO Blinker
должен служить для индикации ошибок в функции. В CoDeSys
контроль ошибок исполнения реализован иначе. BLINK
ENABLE OUT
По определению функция имеет только один выход. Благодаря
этому функции можно использовать в выражениях ST. Функции TIMELOW
с дополнительным выходом ENO решают одну проблему, но со- TIMEHIGH
здают другую.
Рис. 7.15* Графическое представление экземпляра функционального
блока
7.5*7. LD-днаграммы в р е ж и м е исполнения
Программа в FBD не обязательно должна представлять боль-
В режиме Online обмотки реле, контакты и проводники, нахо- шую единую схему. Как и в LD, диаграмма образуется из множест-
дящиеся в состоянии On (под током), окрашены голубым (цвета ва цепей» которые выполняются одна за другой.
по умолчанию) цветом. CoDeSys позволяет менять значения логи- В CoDeSys все цепи одного POU отображаются в едином графи-
ческих переменных (ИСТИНА/ЛОЖЬ) непосредственно в графи- ческом окне, пронумерованные и разделенные горизонтальными
ческой диаграмме двойным щелчком мыши на имени перемен- линиями (рис, 7.16). Значения переменных, вычисленные в од-
ной. Значения входов-выходов функциональных блоков отобра- ной цепи, доступны в последующих цепях сразу в том же рабочем
жаются числовыми значениями. цикле.
Точка останова может устанавливаться только целиком на
цепь. Для установки или сброса точки останова необходимо щел-
кнуть мышью по номеру цепи. В режиме останова номер цепи PROGRAM PLC_PRG
подсвечен красным. Пошаговое — по одной цепи выполнение до- AR
стигается командами «Step over» и «Step i Trig1:R_TR1G;
Trlg2:F TRIG;
7.6*2. Соединительные линии не окна редактора FBD. В CoDeSys ширина окна не ограничена,
поэтому соединители здесь не нужны.
Прямоугольники POU в FBD соединены линиями связи. Соеди- Стандарт не запрещает соединения, идущие с выхода блока
нения^ имеют направленность слева направо. Вход блока может на свой вход или вход ранее исполняемых блоков. Обратная
быть соединен с выходом блока, расположенного слева от него. связь не образует цикл, подобный FOR, просто некоторое вычис-
Помимо этого» вход может быть соединен с переменной или кон- ленное значение поступит на вход при следующем вызове диа-
стантой. Соединение должно связывать переменные или входы и граммы. Фактически это означает неявное создание переменной,
выходы одного типа. В отличие от компонента переменная изоб- которая сохраняет свое значение между вызовами диаграммы.
ражается на диаграмме без прямоугольной рамки. Ширина соеди- Для устранения неоднозначности необходимо присвоить безопас-
нительной линии в PBD роли не играет. Стандарт допускает испо- ное начальное значение переменной обратной связи. Но как это
льзование соединительных линий разной ширины и стиля для со- сделать для переменной, которая не объявлена в явной форме,
единений разного типа. непонятно?
В редакторе FBD CoDeSys обратные соединения запрещены.
7-6,3. Порядок выполнения FBD Для создания обратной связи используйте явно объявленную
Выполнение FBD-цепей идет слева направо, сверху вниз. Бло- внутреннюю переменную.
ки, расположенные левее, выполняются раньше. Блок начинает При необходимости переноса или разветвления соединения в
вычисляться только после вычисления значений всех его входов. другие цепи также необходимо использовать промежуточные ло-
Дальнейшие вычисления не будут продолжены до вычисления кальные переменные.
значений на всех выходах. Другими словами, значения на всех
выходах графического блока появляются одновременно. Вычисле- 7.6.6. Метки, переходы и возврат
ние цепи считается законченным только после вычисления значе-
ний на выходах всех входящих в нее элементов. Порядок выполнения FBD-цепей диаграммы можно принуди-
тельно изменять, используя метки и переходы, точно так же» как
В некоторых системах программирования пользователь имеет
и в релейных схемах.
возможность свободно передвигать блоки с сохранением связей.
В этом случае ориентироваться нужно исходя из порядка соедине- Метка ставится в начале любой цепи, являясь, по сути, назва-
ний. Редактор FBD CoDeSys автоматически расставляет блоки в нием данной цепи- Цепь может содержать только одну метку.
порядке выполнения. Имена меток подчинены общим правилам наименования иденти-
фикаторов МЭК. Графический редактор автоматически нумерует
7.6.4. Инверсия логических сигналов цепи диаграммы. Эта нумерация применяется исключительно для
документирования и не может заменять метки.
Инверсия логического сигнала в PBD изображается в виде Переход обязательно связан с логической переменной и выпол-
окружности на соединении, перед входом или переменной. Ин- няется, если переменная имеет значение ИСТИНА. Для создания
версия не является свойством самого блока и может быть легко безусловного перехода используется константа ИСТИНА, связан-
добавлена или отменена непосредственно в диаграмме- В CoDeSys ная с переходом. Метки и переходы в FBD представлены в приме-
это делается командой «Negate». На рис. 7.16 выход Q экземпля- ре, показанном на рис. 7.17. Обратите внимание на последнюю
ра функционального блока TOF инвертируется перед присвоением цепь на рис. 7.17 — она является пустой. Пустая цепь обознача-
его значения переменной Warning.
ется единственной константой TRUE.
Оператор возврата RETURN можно использовать в FBD так
7.6.5. Соединители и обратные связи же, как и переход на метку» т. е. в связке с логической перемен-
Соединители (connectors) представляют собой поименованное ной. Возврат приводит к немедленному окончанию работы про-
соединение, которое можно разорвать и перенести в следующую граммного компонента и возврату на верхний уровень вложений.
цепь. Такой прием может понадобиться при ограниченной шири- Для основной программы это начало рабочего цикла ПЛК.
1 4 8 Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 149
•i1".
State NEXTSTEP Рис. 7.18. Фрагмент FBD-днаграммы с выражениями
10-
„
7*7. Последовательные функциональные
loooz схемы (SFC)
7.7.1- Шаги
0- State
Любая SFC-схема составляется из элементов, представляющих
шаги и условия переходов (см. рис. 7.19)- Шаги показаны на схе-
ме прямоугольниками- Реальная работа шага (действия) описыва-
ется в отдельном окне системы программирования и не отражает-
TRUE ENDSTEP ся на диаграмме. О назначении шага SFC говорит только его на-
звание или, если этого не достаточно, краткое текстовое описание
(комментарий).
0004 NEXT STEP Шаги на схеме могут быть
пустыми, что не вызывает ошиб-
Нагревание
ки при компиляции проекта.
Пустые шаги являются нормой
State — State при применении программирова-
1 ния сверху вниз, характерного Т1>50
для SFC. Определить действия,
соответствующие шагу, можно в Дозревание
7*7.3. Н а ч а л ь н ы й шаг
t Jj Tiansilion
•* . и г - ' 1 Н * м н - "
TRUE
bDigEnd-
bXl- Нагревание
Рис. 7.21. Переход Ready (FBD) Рис. 7.24. Начальный шаг Reset
Последовательные функциональные схемы (SFC) 153
1 5 2 Глава 7, Языки МЭК
В данном примере (рис. 7.26) альтернатива Stop оценивается
7.7.4. П а р а л л е л ь н ы е ветви первой. Шаги Move_Dwn и MoveJUp имеют шанс стать активны-
Несколько ветвей SFC могут быть параллельными (рис. 7.25). ми, только если Stop равен FALSE.
Признаком параллельных ветвей на схеме является двойная го-
ризонтальная линия. Каждая параллельная ветвь начинается и
заканчивается шагом. То есть условие входа в параллельность -- Stop Down Up
всегда одно, условие выхода тоже одно на всех.
Mova_Up
Stop_motor
i
i
Рис. 7.26* Альтернативные ветви
- - Ready
При создании альтернативных ветвей желательно задавать
взаимоисключающие условия. В этом случае вероятность допус-
Ряс, 7.25- Параллельные ветви
тить ошибку при анализе или в процессе доработки диаграммы
Параллельные ветви выполняются теоретически одновремен- значительно ниже.
но. В жизни это означает — в одном рабочем цикле, слева на-
право. 7.7*6. Переход на произвольный шаг
Условие перехода, завершающее параллельность, проверяется В общем случае SFC-схема выполняется сверху вниз. Стандар-
только в случае, если в каждой параллельной ветви активны др:- том допускается создание переходов на произвольный шаг. Для
следние шаги. t этого применяются соединительные линии с промежуточными
В данном примере (рис. 7.25) Shaking будет выполнен одно- стрелками или поименованные переходы. То есть переход выпол-
кратно, далее Digestion и Mixing будут работать параллельно до няется на шаг, имя которого указано под стрелкой. В англоязыч-
выполнения условия Ready. ных источниках переход на произвольный шаг называется «пры-
жок» (jump).
7.7.5* Альтернативные ветви В примере, показанном на рис. 7.27, шаги Move_Dwn и Мо-
ve_Up последовательно активируют друг друга. Заметьте, что
Несколько ветвей SFC могут быть альтернативными ветвя- условие Stop при этом проверяться не будет, шаги Move__Dwn и
ми. Признаком альтернативных ветвей на схеме является одинар- Move_Up соединены в логическое кольцо, имеющее 2 варианта
ная горизонтальная линия. Каждая альтернативная ветвь начи- входа, но ни одной возможности выхода. Маркер активности бу-
нается и заканчивается собственным условием перехода. Провер- дет перемещаться исключительно в этом кольце.
ка альтернативных условий выполняется слева направо. Если
Прыжок из одной ветви параллельного блока наружу вызыва-
верное условие найдено, то прочие альтернативы не рассматрива- ет эффект размножения маркера. Прыжок внутрь параллельного
ются. В альтернативных ветвях всегда работает только одна из блока нарушает параллельность ветвей. Подобных трюков необхо-
ветвей, поэтому ее окончание и будет означать переход к следую- димо избегать.
щему за альтернативной группой шагу.
Глава 7- Языки МЭК Последовательные функциональные схемы (SFC) 155
1 5 4
4- stop -Ux<»0
-Lx<-10 4-x>20
Шаг Шаг
Ш_
г
Действие J L U I L Действие
. Р - импульс (Pulse, рис. 7.33). Действие выполняется один Рис. 7.36. Ограниченное по времени действие
раз при активации и второй раз после деактивации шага.
• SL — сохраняемое и ограниченное по времени (Stored and
time Limited, рис. 7.37). Действие активируется вместе с ша-
Шаг J гом и остается активным заданное время, вне зависимости
от активности шага. Действие можно деактивировать до-
Действие
срочно из другого шага с классификатором R.
Действие J L J l M l J L
• D — отложенное (Delayed, рис. 7.38). Действие активируется
через заданное время после активации шага и остается актив-
Рис. 7-34. Сохранение действия
1 6 0
Глава 7- Языки МЭК Последовательные функциональные схемы (SFC) 161
ным, пока активен шаг. Если шаг окажется активным мень- (в другом шаге с классификатором R), то активация не про-
ше заданного времени» то действие не будет активировано. изойдет. Активированное действие остается активным до
сброса.
Классификаторы L, D t SD, DS и SL требуют указания констан-
Шаг
ты времени в формате TIME. Например: D T#tOs,
Как видно из приведенных выше временных диаграмм, каж-
Действие дое активное действие выполняется еще один раз уже после деак-
тивации*
Время
шага На рис. 7.41 как раз показан момент, когда шаг Init уже утра-
тил активность, но действие А_0 выполняется последний раз. Это
Рис. 7.38. Отложенное действие необходимо для того, чтобы действия могли отработать потерю
активности и выполнить некоторые завершающие операции.
• DS — отложенное сохраняемое (Delayed and Stored,
рис. 7,39). Действие активируется через заданное время по-
сле активации шага и остается активным до сброса. Если
шаг активен меньше заданного времени, то действие не бу-
дет активировано. При параллельном выполнении сброса в
процессе отсчета времени (в другом шаге с классификатором
R) действие не будет активироваться. N
_п
END_IF
Шаг
7.7.10. Действие — переменная
Действие Ш1МШ Действие стандартного SFC не обязательно должно что-либо
делать. В качестве имени действия можно указать логическую пе-
ВрвМЯ
действия
ременную, внутреннюю или внешнюю. Переменная (на рис. 7.42
bMoveUp) будет соответствовать состоянию активности действия,
Рис. 7.40 Сохраняемое отложенное действие классификаторы будут работать.
1 6 2 Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 163
4- Step2.t
сунках должна быть для вас очевидной. Начнем с примера, пока-* Рис. 7.47. Пятнсекувдный шаг
занного на рис. 7.45.
Данная конструкция абсолютно бессмысленна. Выполнение Переменная X также доступна и для шагов с аналогичным
действия А_2 трижды разрешается, но само действие все равно смыслом. Фактически <ActionName>-x это общедоступная копия
будет выполнено один раз в рабочем цикле. выхода Q SFCActionControl.
1 6 6 Глава 7, Языки МЭК Последовательные функциональные схемы (SFC) 167
Расширенные отладочные функции реализуются в системах На рис. 7.49 показана SFC-диаграмма в режиме исполнения.
программирования различными способами и зависят от системы Шаг S1 по условию (вероятно, ошибочно) активен дольше, чем за-
исполнения. Поэтому мы не будем рассматривать их здесь деталь- дано атрибутами шага (не более T#0.75s). Атрибуты времени по-
но- Ограничимся одним простым примером мониторинга активно- казаны справа от шага серым цветом. Текущее время — черным
сти шагов в CoDeSys. цветом. В окне объявлений вы можете увидеть флаги, сигнализи-
Условия перехода могут зависеть от переменных, связанных рующие ошибку, шаг и диагноз — условие, задерживающее вы-
с различными входными воздействиями, датчиками, сообщени- полнение.
ями сети, логическими вычислениями и т. д. Если некоторый Флаги с точки зрения отладки, возможно, не являются са-
шаг «пролетает» слишком быстро или наоборот • тормозит», не мым удобным средством, но зато они универсальны. Анализ
всегда так просто понять причину сбоя. Тем более что это не флагов и управляющих переменных SFC-исполнителя позволяет
обязательно программная ошибка. Исходя из здравого смысла, при необходимости создать в прикладной программе собствен-
можно примерно оценить допустимые пределы времени актив- ный модуль контроля и ранней диагностики «разумности» систе-
ности шага. Так, процесс перемещения кабины лифта с одного мы управления.
этажа на другой не может занимать 100 мс, но и не должен за-
нимать несколько часов. В CoDeSys для каждого шага можно
задать временные границы. Нарушение границ возбуждает спе-
циальный флаг ошибки. Помимо этого, отладочная система по-
зволяет определить шаг, где произошла ошибка, и условие, при-
ведшее к нарушению.
N T#0.5s
T#0.75s
T#1s760ms
S1.t>T#2s
T#2s
T#0ms
Операция MOVE может иметь только один параметр совмести- 8.1.3. Логические битовые операторы
мого типа. В явном виде MOVE встречается только в графических
Битовые операторы применимы для типов ANY_BIT,
языках. В IL присваивание значения одной переменной или кон-
станты другой переменной выполняется парой инструкций LD,ST.
Оператор Действие
8.1.2. Операторы битового сдвига AND Побитное И
Операторы сдвига применимы для типов ANY_BIT. Все они
OR Побитное ИЛИ
имеют 2 параметра:
XOR Побитное исключающее ИЛИ
OUT := OIIEPATOP(IN,N);
NOT Побитное НЕ
Оператор Действие
Оператор NOT имеет только один параметр.
Побитный сдвиг операнда IN влейо на N бит, В FBD блоки AND, OR и XOR можно расширять, т. е. добав-
SHL
с дополнением нулями справа лять произвольное число входных параметров (см. раздел «Функ-
ции с переменным числом параметров*). Операция NOT для про-
Побитный сдвиг операнда IN вправо на N бит»
SHR водников типов BOOL (инверсия) обозначается в виде окружности
с дополнением нулями слева
(см. пример на рис. 8.3).
Циклический сдвиг операнда IN вправо на N бит»
ROR
старшие биты замещаются младшими
SHL OR
wY=16#55AA- wX=16#AA55
I—
SHR
6- -
Рис. 8.4. Блок голосования два из трех (IL) В CoDeSys MAX и MIN оперируют только с двумя параметра-
ми, стандартом предусматривается расширяемая реализация,
В выражениях ST логические операции записываются в виде Мультиплексор MUX является расширяемым (см. раздел «Функ
операторов: ции с переменным числом параметров» и пример на рис. 8.5),
tout := (bXl AND bX2) OR (bXl AND ЬХЗ) OR (bX2 AND LIMIT MUX
ЬХЗ); 1 Satisfaction
В IL логические операторы приобретают форму команд: Drinking
LD bXl 3 •Мало* —
'Норма1 —
AND bX2 "Много1 —
OR (bXl
AND ЬХЗ Рис. 8.5. Пример применения ограничителя и мультиплексора
ST bOut
Оператор Символ Действие
8Л .4* Операторы выбора и ограничения GT > Больше
Операторы выбора и ограничения представлены в таблице- GE >= Больше или равно
EQ - Равно
Типы
Текстовый формат Действие LE <= Меньше или равно
параметров
Бинарный выбор: LT < Меньше
OUT:- SEL(G, INO, INI) OUT:- INO при G - FALSE INO, INI: ANY NE О Не равно
OUT:- INI при G - TRUE G: BOOL
OUT :- MAX(IN0, INI) Наибольшее из значений ANY Интересно» что стандарт допускает расширение операторов
сравнения. Например, выражение bOut :« iXl > iX2 > iX3 вполне
1 7 6 Глава 8. Стандартные компоненты Операторы и функции 177
Рис. 8.6, Сравнение трех переменных iXl > iX2 > iX3 (FBD) 8.1.7. Строковые функции
Сравнение текстовых строк производится на основании значе Строковые функции представлены следующими инструкциями
ний кодов символов.
INT :=LEN(STR)
8*1.6. Математические функции Возвращает длину строки
Стандартные математические функции представлены следую- STR : - LEFT(STRING STR, INT SIZE)
щими операторами.
Возвращает левую часть STR размером SIZE
STR := RIGHT(STRING STR, INT SIZE)
Оператор Действие Типы параметров
Возвращает правую часть STR размером SIZE
ABS Абсолютное значение числа ANY_NUM
STR := DELETE(STRING STR.INT LEN.INT POS)
SQRT Квадратный корень числа ANY_REAL Возвращает STR, удалив LEN символов с позиции POS
1 7 8 Глава 8. Стандартные компоненты Стандартные функциональные блоки 179
держка. Все экземпляры функциональных блоков таймеров «за- в качестве генератора корот- Ьх — IN Q — Ьх
ле Ьх получит значение 1 благодаря инвертору NOT. Так форми- через заданное РТ время, если IN будет продолжать оставаться в
руется фронт запуска, который поступает на вход IN таймера в состоянии TRUE. Спад входа IN останавливает отсчет и сбрасыва-
третьем цикле. Инвертор формирует фронт запуска по каждому ет выход Q в FALSE. Таким образом, выход Q включается логиче-
спаду выхода таймера. ской единицей продолжительностью не менее РТ, а выключается
по спаду входа IN.
TOF таймер с задержкой выключения Временная диаграмма работы таймера TON показана на
рис- 8.10.
TOF
IN BOOL Q BOOL Вход IN
РТ TIME ET TIME
Выход Q
По фронту входа IN выход Q устанавливается в TRUE. Сброс Время Р Т — t
счетчика ЕТ и начало отсчета времени происходит по каждому
спаду входа IN. Выход Q будет сброшен через заданное РТ время Выход ЕТ
после спада входного сигнала. Если во время отсчета вход IN бу-
дет установлен в TRUE, то отсчет приостанавливается. Таким об- Рис. 8.10. Временная диаграмма работы таймера TON
разом, выход Q включается по фронту» а выключается логиче-
ским нулем продолжительностью не менее РТ, RTC часы реального времени
Временная диаграмма работы таймера TOF показана на
рис. 8.9. RTC
EN BOOL Q BOOL
Вход IN
PDT DATE_AND_TIME CDT DATE_AND_TIME
идти назад! Например, при коррекции или переходе на зимнее Блок SR имеет два устойчивых состояния Ql = TRUE и
время. В настоящее время функциональный блок RTC исключен Ql = FALSE. На языке ST работа блока описывается выражением:
из стандарта МЭК.
^ Ql = NOT RESET1 AND (Ql OR SET).
8.2.2. Триггеры Вход SET включает выход, вход RESET1 — выключает. При
одновременном воздействии обоих входов вход RESET1 является
Работу триггеров SR и RS легче всего понять по аналогии с
доминантным.
электрическими устройствами- Представьте себе электрический
пускатель. Для переключения ему нужны 2 кнопки «ПУСК» и
•СТОП». Кнопки не имеют механической фиксации, переключе- 8.2.3. Детекторы импульсов
ние выполняется коротким нажатием кнопок. Пускатель сам
Детекторы импульсов предназначены для применения в слу-
фиксирует свое состояние.
чае, когда требуется реакция не на состояние дискретного сигна-
Именно так работают триггеры SR и RS. Их поведение отлича- ла, а на его изменение.
ется только при одновременном нажатии обеих кнопок. В блоке
доминантной установки SR побеждает «ПУСК*. В блоке доминан- RJTRIG детектор переднего фронта
тного сброса RS побеждает «СТОП».
8.3.3. Пороговый сигнализатор Если новое значение входа по сравнению с предыдущим вы-
росло меньше, чем на ASCEND, или уменьшилось в пределах
Функциональный блок LIMITALARM отслеживает соответст- DESCEND, сигнал беспрепятственно передается на выход. В слу-
вие значения входа заданному диапазону. Результат формируется чае слишком быстрого роста или спада сигнала его изменение
с помощью логических выходов — меньше, больше» норма. Вели- ограничивается. TIMEBASE задает время, за которое определяет-
чина входного сигнала IN сравнивается с верхним HIGH и ниж- ся изменение. Мгновенное изменение выхода рассчитывается так,
ним LOW порогами. Все входные переменные целого типа со зна-
чтобы за заданный интервал не превысить установленные пороги.
ком (INT). Три логических (BOOL) выхода сообщают результат
Если TIMEBASE равен t#Os, то в качестве интервала использует-
сравнения:
ся один цикл вызова экземпляра функционального блока.
• выход О сигнализирует о повышенном значении (IN >
Сброс (RESET := TRUE) вызывает мгновенное присваивание
HIGH); выходу входного значения. После снятия сброса отслеживание
• выход U сигнализирует о пониженном значении (IN < LOW); изменений пойдет с текущего значения.
• выход IL сообщает о допустимом значении (LOW<= IN >= В библиотеке UTILS функциональный блок реализован дваж-
HIGH), ды: для сигнала типа INT (RAMP_INT) и REAL (RAMP_REAL)
На рис. 8.13 проиллюстрирована работа LIMITALARM. Здесь (см. пример на рис. 8.14).
амплитуда входного синусоидального сигнала равна 1000 единиц.
Верхний порог — 600, нижний порог — - 600.
HIGH
LOW \ \ \
О ^
п п
п п_ Рис. 8.14. График входного сигнала и выхода RAMP
Рис. 8.13. Иллюстрация работы функционального блока
LIMITALARM
8.3.5. Интерполяция зависимостей
8.3.4. Ограничение скорости и з м е н е н и я сигнала Функциональный блок CHARCURVE (рис. 8.15) выполняет
кусочно-линейную интерполяцию зависимостей, заданных векто-
Функциональный блок RAMP ограничивает скорость измене- ром значений узловых точек. Напоминаем, что интерполяция
ния сигнала. RAMP имеет 1 выход OUT и 5 входов: означает вычисление значений зависимости, заданной узловыми
точками в промежутках между этими точками.
IN входной сигнал
CHARCURVE
ASCEND
w максимальное нарастание IN OUT
J L
0 Ошибок нет
динат — уровень сигнала. Точки пронумерованы так, что боль- Функциональный блок DERIVATIVE имеет 3 входа:
ший индекс соответствует более старым значениям. Здесь Yo —
текущая ордината, Уг — предыдущая. Аналогично: Т о — это ин- IN REAL входное значение
тервал времени между Yx и Yo и т. д. Отклонение ординаты Yx
вверх имитирует на рисунке шум реального сигнала. Рассчитан- ТМ DWORD приращение времени (в мс)
ная по двум точкам Уг и Y2 производная примерно равна 2,03.
Прямая линия с таким тангенсом угла наклона обозначена на ри- RESET BOOL сброс
сунке цифрой (2). Прямая (4) соответствует расчету производной
по четырем точкам (tg — 0,99). Значение производной дает единственный выход OUT типа
Входящий в библиотеку утилит' CoDeSys функциональный REAL. Для приведенной выше формулы Yo это IN, а Т о соответст-
блок DERIVATIVE рассчитывает значение производной по следу- венно ТМ. Во время сброса (RESET = TRUE) и при начальной ини-
ющей формуле: циализации экземпляра (первом вызове) ординаты Y3, Y2 и Yx
(3T ЗТ 0 ). принимают значение IN, выход OUT равен 0.
OUT : = (3(Y 0 - Y3)
Применение функционального блока DERIVATIVE иллюстри-
Интервалы времени между замерами необязательно должны рует следующий пример. Результаты трассировки по циклам и
быть равными. окно текста примера (ST) показаны на рис- 8 Л 8- Как известно,
Ординаты точек запоминаются за четыре последних вызова эк- производная от функции синуса — косинус, что подтверждается
земпляра функционального блока. При каждом очередном вызове кривыми трассировки.
экземпляра значения сдвигаются: Малозаметная тонкость функционального блока DERIVATIVE
Y3 — Y2, Y2 — i, вызвана тем, что он опирается на формулу центрированной разно-
T2 = T l , T l = TO. сти. Фактически он вычисляет приближенное значение производ-
ной для точки соответствующей центру интервала Т ^ В резуль-
;
p_" Sampling Tface тате выход задержан по отношению к входу на один с половиной
цикл вызова экземпляра.
8.3.7. Интегрирование
PLC PRG.rSin
Функциональный блок INTEGRAL вычисляет приближенное
значение определенного интеграла входного сигнала (см.
PLC PRG.rD рис. 8.19).
Функциональный блок INTEGRAL имеет 3 входа:
PLC PRG.rCos
PLC PRG.tAC
8.3.8- ПИД-регулятор
Рис. 8.20. Принцип работы функционального блока INTEGRAL Пропорционально-интегрально-дифференциальный регулятор
(ПИД) — это наиболее широко применяемый тип автоматических
Работу функционального блока INTEGRAL иллюстрирует сле- регуляторов с обратной связью.
дующий пример. Проинтегрируем от 0 до 2п сигнал, заданный Рассмотрим кратко» как работает ПИД-регулятор. Предполо-
формулой АС — 10 + 4 sin x + 2 sin 2x. Реализация примера на жим, некоторый объект имеет вход» позволяющий управлять им,
языке ST и окно трассировки показаны на рис. 8.21. Интервал и датчик, измеряющий реакцию объекта (выходная переменная).
интегрирования [0,2я] разбит на 200 частей. Кроме того, на объект действуют различные возмущающие фак-
Обратите внимание, что функциональные блоки DERIVATIVE торы. В результате выходная переменная может изменяться даже
и INTEGRAL реализуют только математический алгоритм и не при постоянном входном задании. Разница задания (эталонного
занимаются самостоятельно замером приращения времени (как, входного сигнала) и выходной переменной образует ошибку
например, RAMP).' Эту операцию необходимо выполнять внешни- управления e(t). Задачей регулятора является автоматическое из-
1 9 6 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 197
менение входного воздействия y(t) так, чтобы свести последствия Пропорциональный канал регулятора формирует постоянное
возмущений к минимуму. управляющее воздействие при постоянном значении ошибки.
В зависимости от объекта управления выходной переменной Если же приложенное к объекту воздействие оказывается недо-
может быть напряжение, давление, температура, скорость переме- статочным» ошибка сохраняется бесконечно долго. На рис. 8.23
щения и т. д. В общем случае выходная переменная реагирует на показано регулирование объекта» обладающего трением, который
изменение воздействия по некоторому сложному закону с запазды- «трогается с места* только тогда, когда величина управления
ванием. Математическая модель такого объекта представляет со- превысит значение единицы. В данном же случае скачок управ-
бой систему дифференциальных уравнений. На основании модели ляющего задания вдвое меньше.
объекта можно найти оптимальный закон регулирования. Но это
достаточно сложная задача. В большинстве практических случаев
промышленной автоматики применяется универсальный ПИД-ре-
гулятор. Для него закон регулирования формируется настрой трех
констант, рассчитанных на основании модели объекта или подо-
бранных опытным путем. Уравнение ПИД-регулятора имеет вид:
Y_MAX REAL максимальное допустимое значение чески не регулируется. Если заданы пороги допустимого значе-
ния (YJV1AX > Y_MIN), регулятор автоматически ограничивает
MANUAL BOOL ручной режим значение управляющего воздействия и адаптирует рост интегра-
RESET BOOL сброс льной составляющей.
Пропорционально-интегральный (ПИ) регулятор получается из
и выходами; функционального блока ПИД при TV := 0. Для пропорционально-
го (П) и пропорционально-дифференциального (ПД) законов регу-
лирования библиотека утилит CoDeSys включает функциональ-
Y REAL управляющее воздействие ный блок PD.
LIMITS_ACTIVE BOOL признак достижения пороговых значений
OVERFLOW BOOL признак ошибки переполнения
SET,POINT-
ACTUAL -
ADD
CLOCK 1 INTEGRAL DIV 1
TMDIFF
TM л A
1
_ J 1Ы
•14
TM
OUT
OTHERFLOW - TN-
г • w 4"
- RESET
D
1 DERIVATIVE MUL
in uui
TV-
TM
— RESET
KP- Y OFFSET*
Таймер Impulse запускается по переднему фронту х и сбрасы- Рис. 9.2. Последовательное управление по времени в LD
вает х по окончании заданного времени, запуская, таким обра-
зом, таймер Pause. Конец паузы взводит переменную х, которая и По фронту входа Go одновременно запускаются все три тайме-
запускает новый импульс (в следующем рабочем цикле)- Пере- ра Т1 — ТЗ. Каждый таймер отмеряет момент окончания соответ-
менная х является выходом генератора. ствующей фазы. Три нижних цепи выделяют выходы Yl — Y3,
Безусловно, задачу формирования прямоугольных импульсов соответствующие фазам управления. Все переменные программы
можно решить с применением единственного таймера (см. при- должны быть объявлены как BOOL. Процесс работы схемы на-
мер ШИМ или стандартный блок BLINK CoDeSys). Путем дора- глядно отражает экран трассировки CoDeSys (рис. 9.3).
2 0 2 Глава 9, Примеры программирования Кодовый замок (PRG LD) 203
Go
Рис. 9.З. Трассировка схемы последовательного управления 9.3. Кодовый замок (PRG LD)
В данную схему несложно добавить цепь автоматического пе- Пример демонстрирует замену релейного автомата програм-
резапуска- Тогда схема будет работать циклически, как «бегущие мной реализацией на ПЛК без переработки алгоритма работы
огни». Если же вы настроены более серьезно, назовем нашу про- устройства.
грамму модулем управления двигателем с электронной коммута- На рис. 9.6 приведена К1 звонок Р38
16#66, 16#6D, 16#7D, 16#07, На рис. 9.10 показан рабочий момент тестовой программы для
16#7F, 16#6F, 16#77, 16#7C, проверки работы динамического индикатора- В окне Indicator
16#39, 16#5Е, 16#79, 16#71; изображена визуализация панели. Сегменты индикаторов окра-
шиваются красным цветом при единичных значениях соответст-
ENDJVAR вующих битов byLightl и byLight2. Так, например, первый сег-
Изображение нужного шестнадцатеричного знака дают коды мент (см. рис- 9.8) правого индикатора включается по переменной
таблицы LightCodes. Если в качестве индекса массива использо- PLC_PRG.byIightl.l. Кнопка *+» устанавливает в TRUE логиче-
вать число от 0 до F, то значение элемента обеспечит высвечива- скую переменную bAddButton, что вызывает последовательное
ние соответствующей цифры. Вся логика функции сводится к вы- увеличение значений х в тестовой программе.
делению нужной тетрады байта и использованию его в качестве
индекса LightCodes. Если нужна младшая цифра, то старшая тет-
рада числа просто обнуляется. Для выбора старшей тетрады со-
х- 16S4E
держимое байта сдвигается на 4 вправо. Реализация функции на
byUghtl - \6ffI9
языке ST будет выглядеть так: byUght2 - Ш66
bAddButton
IF HD THEN
IN := SHR (IN,4);
ELSE ylightl:- Dinlight7Cx, FALSE);
IN := IN AND 16#0F; bylighta ~ Dinlight7(x,TRUK);
END_IF INT_TO_ECD(J:);
DinLight7_ST : - LightCodes[IN];
Функцию DinLight7 также несложно реализовать в LD, если
использовать аналогичные блоки. Пример диаграммы дан на Рис. 9.10. Тестовая программа и визуализация индикатора
рис. 9.9.
Обратите внимание, что вместо отображения шестнадцатерич
0001 ного формата наша индикаторная панель способна отображать де
HD сятичные числа в диапазоне 0..99. Для этого достаточно преобра
зовать число формат BCD при вызове функции. Например:
byNum Light := DinLightTCINT^TO^BCDtbyNum), bPulse);.
0002
HD SHR 9*5* Целочисленное деление с симметричным
\\ EN
IN byNum округлением (FUN ST)
Реализованная ниже функция выполняет деление в целых чис-
0003 лах с симметричным округлением. Если точный результат деле-
MOVE ния ближе к большему целому, он округляется вверх, в против-
EN ном случае — вниз. Найдем, например, частное 18/10- Точный
DinLightZ
Lg
i htCodes [byNum] результат 1,8. Стандартное целочисленное деление дает резуль-
тат 1, относительная погрешность составляет 44%. Наша функ-
Рис. 9.9. LD-реализация функции DinLight7 ция дает результат 2, относительная погрешность составляет 1 1 % .
2 0 8 Глава 9. Примеры программирования Целочисленное деление с симметричным округлением (FUN ST) 209
Задача суммирования целочисленных значений, вычисленных Результат работы функции хорошо заметен на графиках (см.
по формуле, включающей деление встречается достаточно часто, рис. 9.11).
например, для определения среднего значения за заданный отре-
зок времени. При суммировании симметрично округленных
чисел точность суммы повышается- Происходит это за счет ком-
пенсации абсолютных погрешностей, которые равновероятно име-
ют положительное и отрицательное значения. Округление мето-
дом отбрасывания остатка всегда дает числа с недостатком. В ре-
зультате при суммировании ошибка накапливается.
Функция имеет 2 параметра — числитель и знаменатель.
FUNCTION ISMDIV INT
Рис. 9.11. График деления у := х/3, где х изменяется от -10 до +10
VAR_INPUT
iNum: INT; На рис- 9.11 показаны результаты деления на 3 пилообразного
iDen: INT; сигнала с амплитудой 10 единиц. Прямая отображает точное зна-
END_VAR чение, а лесенка — обычное целочисленное деление с округлени-
ем вниз. Четко видно, что график результатов смещен вверх в от-
VAR рицательной области и вниз в положительной.
iExcess: INT; Широкая горизонтальная полка нулевого уровня соответствует
bSign: BOOL; значениям -2, - 1 , 0, 1, 2 исходного сигнала. Графики получены
END VAR путем трассировки в CoDeSys. Если отражать только полученные
целые значения, то, естественно, никаких непрерывных линий
быть не должно. Должны быть точки, соответствующие входным
^определить знак результата*) и выходным значениям функции, как показано на рис. 9.12.
IF (iNum < 0) XOR (iDen < 0) THEN
я
bSign :=TRUE; я
ж
ж*
* *
ELSE
bSign := FALSE; •
• я ++
END_IF • и
+ +••
•
10
(*округлять проще абсолютные значения*)
ISMDIV := ABS(iNum / iDen); (*частное*) Рис, 9.12. Точечный график деления у :~ х/3 (х — точные значения,
iExcess : - ABS(iNum MOD iDen); + -У)
(*и остаток*)
С помощью трассировки нельзя непосредственно построить за-
IF iExcess >= ABS(iDen) - iExcess THEN висимости у = f(x). Трассировка — это развертка значений во вре-
ISMDIV := ISMDIV + 1; (*ост, не меньшеполовины*) мени. Поэтому приходится программно задавать приращение х на
единицу в каждом шаге- В результате х приобретает смысл диск-
END IF
ретного времени, и временная зависимость будет совпадать с фун-
кциональной. В окне трассировки CoDeSys намеренно выполняет
I F b S i g n T H E N I S M D I V : = ^ - I S M D I V ; E N D _ I F интерполяцию дискретных значений, имитируя непрерывность
Генератор случайных чисел (FB ST) 211
2 1 0 Глава 9. Примеры программирования
времени. В результате график (рис. 9.13) приближается к картин- ния последовательности определяется выбором констант а и &.
ке, которую можно получить на экране осциллографа, подклю- В нашем примере Ь является простым числом 251, константа а
ченного к аналоговым выходам реального ПЛК. равна 170. Выбранные константы очень удачны. Период нашего
генератора составляет 250. Фактически генератор перебирает поч-
ти все допустимые значения заданного интервала без повторов.
Формируемая последовательность зависит от начального значе-
ния X. При одинаковых начальных значениях генерируемые по-
следовательности совпадают. Начальное значение последователь-
ности может быть произвольным из интервала от 1 до 250.
Рис. 9.15. Графическое представление экземпляра функционального IF nWRPos > 14 THEN (•WRPos движется по кольцу*)
блока FIFO nWRPos := 0;
ELSE
На рис. 9.16. показано примене-
nWRPos := nWRPos + 1;
ние блока FIFO для временного
сдвига сигнала. Первые пять цик- END IF
лов чтение данных запрещено. Да- END IF
лее чтение разрешается, и в каж- IF nWRPos - nRDPos THEN (•FIFO пуст?*)
дом цикле вызова блока происхо- bReady :-• FALSE;
дит запись нового и чтение старого
byRD := 0;
значения отсчета сигнала. Верхняя
кривая — входной сигнал, нижняя ELSE
кривая — сигнал, задержанный на Рис. 9.16. Задержка сигнала bReady := TRUE;
5 рабочих циклов ПЛК. блоком FIFO
2 1 4 Глава 9. Примеры программирования Фильтр «скользящее среднее» (FB ST) 215
IF nRDPos > 14 THEN (*RDPos движется по кольцу*) IF bRDEn THEN (*чтение из FIFO*)
nRDPos := 0; byRD := byBuf[nRDPos];
ELSE nRDPos := nRDPos + 1;
nRDPos := nRDPos + 1; END_IF
END_IF Дальнейшего ускорения можно достичь, если выбросить входы
ENDJF разрешения bWREn и bRDEn, а запись и чтение выполнить отде-
END_IF льными действиями.
VAR
byBuf: ARRAY[0..255] OF BYTE;
где х[] — входной сигнал, у[] — выходной сигнал, N — ширина
nWRPos BYTE :— 0; (*позиция записи*)
фильтра или число усредняемых замеров.
nRDPos: BYTE := 0; (*позиция чтения*) Формула предполагает, что замеры сигнала собраны в массиве.
END VAR При вычислении значения y[i] используется x[i] и N - 1 предыду-
Выход готовности очереди ликвидирован в жертву быстродей щих значений- Очевидно, при обработке сигнала в режиме реаль-
ного времени, выходной сигнал будет запаздывать по отношению
ствию. О корректности применения блока должна заботиться вы
к входу.
зывающая программа.
Рисунок 9.18 демонстрирует действие фильтра. Верхняя кри-
IF bWREn THEN (*запись в FIFO*) вая — входной сигнал- Это прямоугольные импульсы, модулиро-
byBuf[nWRPos] : - byWR; ванные по амплитуде гармонической помехой, с периодом в два
Медианный фильтр (FB ST) 217
2 1 6 Глава 9. Примеры программирования
АЛЛЮЛМЦ ЛЛМЛЛАМ МЛЛЛЛАМ Обратите внимание, что при 8-разрядном входном сигнале для
цикла. Средняя и нижняя кри-
суммы используется переменная типа WORD. Ширина фильтра
вая — это результаты обработки
не должна превышать 257 исходя из максимально возможного
входного сигнала фильтром
значения BYTE входа (255 * 257 = 65535). В противном случае
«скользящее среднее», шириной
может произойти переполнение суммы. В нашем примере ширина
3 и 11 циклов:
фильтра ограничивается размером FIFO.
АУГЗ
Формула требует только N- 1
последних значений, более ста- IF byShif t < byLen THEN
рые значения интереса не пред- (*разогрев — начальный набор суммы*)
ставляют. Поэтому для реализа- byFIFO(byWR := byln);
ции алгоритма оказывается под-
Рис. 9.18. Фильтр «скользящее wSum := wSum + byln;
среднее»
ходящим буфер типа FIFO. Если
фильтр широкий» то вычисления byShift :=byShift + 1;
суммы в каждом цикле будут отнимать много времени. К счастью,
это легко преодолеть, если использовать предыдущее значение IF byShift = byLen THEN
суммы. Достаточно вычесть из старой суммы лишнее значение
X и (*очередь собралась достаточная*)
V " Щ прибавить новое #[/], все промежуточные значения уже
содержатся в сумме. Такой алгоритм называется рекурсивным. bReady := TRUE;
byFIFO.bRDEn := TRUE;
Функциональный блок фильтра имеет два входа: byln — вход-
ной сигнал, byLen — ширина фильтра и два выхода: byOut — END_IF
входной сигнал, bReady — готовность фильтра. Готовность появ- ELSE (*полет нормальный*)
ляется после накопления первоначальной суммы, необходимой byFIFOfbyWR : - byln);
для вывода фильтра в рабочий режим. Блок фильтра использует wSum := wSum - byFIFO.byRD + byln;
FIFO из примера, приведенного выше- Раздел объявлений выгля-
END_IF
дит так:
byOut : - WORD_TO_BYTE(wSum / byShift);
FUNCTION_BLOCK BYJVfOVAVR
Проверка byShift = byLen введена для оптимизации. Благода-
VAR_INPUT ря этому разрешение чтения из FIFO и установка готовности вы-
byLen: BYTE; полняется один раз. В рабочем режиме время на это не тратится.
byln: BYTE; До накопления полной очереди усредняется то, что есть. Благода-
ря этому фильтр включается плавно.
END^VAR
VARJKJTPUT
bReady: BOOL := FALSE; 9.10. Медианный фильтр (FB ST)
byOut: BYTE; Медианный фильтр по алгоритму реализации похож на
END_VAR фильтр «скользящее среднее», в нем также используется усредне-
ние нескольких последних значений сигнала. Но выходом филь-
VAR
тра является не само усредненное значение» а ближайшее к сред-
byShift: BYTE := 0; нему входное значение. Таким образом, фильтр выбирает наибо-
byFIFO: BY^FIFO := (bWREn : - TRUE , bRDEn : - FALSE); лее «подходящее» значение из нескольких последних. Медиан-
wSum: WORD; ный фильтр не формирует плавные изменения и используется в
случаях, когда важно сохранить крутизну фронтов сигнала.
END VAR
2 1 8 Глава 9. Примеры программирования Медианный фильтр (FB ST) 219
Ряд 2 =РДД(;Лист1!$С52:$О$9;ЛистШН$2:$Н$9;
2)
3D п г
50 1 Г
70 LJ ~LJ
Рис. 9.24. Выходы широтно-импульсного модулятора
SINT_TO_TIME
ST PERIOD.PT
JMP oscillation
pause:
LD FALSE (*пауза*)
ST bOUT
LD 100
SUB byRate
SINT_TO_TIME
ST PERIOD.PT
oscillation:
CAL PERIOD(IN := FALSE) (*для запуска таймера*)
CAL PERIOD(IN := TRUE) (*нужен импульс*) Рис. 9.25. схемы привода в CoDeSys
9.13. Управление реверсивным приводом торможения соответственно (по умолчанию 5 секунд). Блок имеет
4 выхода, управляемых вышеописанными силовыми элементами.
(FB SFC)
Функциональный блок ReversibleEngine реализован в виде
На рис. 9.25 показана схема реверсивного электропривода дви- SFC-диагрйммы (рис. 9.26). Шаги и условия переходов реализова-
гателя постоянного тока без обратной связи с управлением разго- ны на ST.
ном и торможением по времени. Схема содержит следующие эле*
менты управления: FUNCTION_BLOCK ReversibleEngine
• Pwr — силовой пускатель, подает напряжение питания; VAR INPUT
• Rew — блок реверса- Если блок реверса включен, то провода Direction, On: BOOL;
питания соединяются перекрестно» обеспечивая изменение tStart: TIME: :
(* время разгона*)
полярности. Изменять направление вращения можно только t#5s;
при остановленном двигателе и выключенном питании Pwr; tBrake: TIME := t#5s; (*время торможения*)
• Start — цепь разгона. Обеспечивает плавный старт двигателя ENDJVAR
без перегрузки. Включается на заданное время при пуске; VAR_OUTPUT
• Break — блок торможения- Подключает нагрузку к вращаю- Power, (•включение*)
щемуся в режиме генератора двигателю, обеспечивая элект-
ромагнитное торможение. Включается на заданное время по- Reversal, (*реверс*)
сле отключения питания. При включенном питании вклю- Starting* (•разгон*)
чать торможение нельзя. Braking: BOOL; (*тормоз*)
Как видно из-описания, алгоритм управления получается не ENDJVAR
слишком простым. Задача заключается в том, чтобы создать фун-
кциональный блок, имеющий два входа — включить привод (On) VAR
и реверс (Direction). Переключать входы можно в любое время и в Tm: TON; (*таймер разгона и тормоза*)
любом порядке. Входы tStart и tBrake задают время разгона и END VAR
2 2 8 Глава 9* Примеры программирования Управление реверсивным приводом (FB SFC) 229
Stop ENTRY_ACTION
Tm(IN : = FALSE, PT:= tStart); (*запуск таймера*)
On Tm.IN := TRUE;
Run Starting := TRUE;
Power := TRUE;
Tm.Q OR NOT On OR Reversal <> Direction Reversal := Direction;
END ACTION
Braking : = TRUE;
END_ACTION
EXIT_ACTION
Braking := FALSE;
ш(Ш:- FALSE.PT- tStwt);
mJN :- TRUE; END_ACTION
tarting ?• TRUE;
owtt:- TRUE; Благодаря применению входных и выходных действий алго-
eversal :=• Direction; ритм работы блока получился достаточно эффективным. Кроме
контроля таймера, шаги «Разгон» и «Торможение» не содержат
никаких действий, повторяющихся в каждом рабочем цикле.
Продолжительные шаги «Стоп» и «Движение» заняты только
- -Tm.Q проверкой условий перехода.
Печатное представление действий SFC-диаграммы выглядит
taitmg :- FALSE; несколько громоздко. В среде CoDeSys каждое действие отражает-
ся в отдельном окне без ключевых слов (END_ACTION,
EXIT_ACTION). Помимо этого, благодаря масштабированию диа-
- -HOT On t[>
граммы и выбору необходимого расположения окон анализиро-
* FALSEST tBnke); вать работу диаграммы достаточно удобно (рис 9.27).
-TRUE;
ower : = FALSE;
Bralan - TRUE;
- -Tm-Q 9.14. Сравнение языков с позиции минимизации
кода (IL, ST, FBD, LD)
Какой из языков программирования МЭК позволяет создавать
наиболее компактный код? Ответ на этот вопрос достаточно про-
ст. Размер кода не зависит от языка реализации.
I Перевод программы с одного языка на другой не имеет ника-
кого смысла с точки зрения оптимизации. Применение меток и
Рис. 9.27. Полное представление функционального блока
переходов в графических языках дает возможность формального
ReversibleEngine
(машинного) перевода разветвленных ST- и IL-программ в графи-
ческие языки. Конечно, такая графическая диаграмма более на-
шается шаг отключением торможения. По окончании шага все
поминает IL, где текстовые инструкции заменены картинками.
выходы выключены, что соответствует начальному состоянию.
Код, генерируемый такими программами, совпадает до бита.
STEP Braking: (*торможение*) Единственным исключением является SFC. Проверка условий
Tm; переходов, управление активностью шагов в общем случае требу-
END_STEP ет достаточного развитого механизма управления. Поэтому код с
применением SFC всегда имеет определенные* издержки. Но в
ENTRY_ACTION этом нет ничего удивительного. Язык SFC предназначен для бы-
Tm(IN := FALSE, PT := tBrake); строй разработки верхнего уровня. Дополнительный код являет-
Tm.IN := TRUE; ся платой за универсальность, наглядность и быстроту реализа-
Power : - FALSE; ции проекта.
2 3 2 Глава 9. Примеры программирования Сравнение языков с позиции минимизации кода (IL, ST, FBD, LD) 233
Более компактного кода можно достичь только за счет ручной Псевдокод программного компонента, реализующего (язык ST)
переработки алгоритма. Правильное использование разных язы- такой алгоритм, будет выглядеть так:
ков МЭК требует разного подхода и разного образа мыслей.
VAR
В результате эффективность кода зависит исключительно от ка-
чества проработки и от степени владения программистом данным state := 0; (*начальное состояние*)
языком. ENDJVAR
Безусловно, размер кода — это самое последнее требование к CASE state OF
ПЛК-программе. Необходимость минимизации может быть вы- 0: действие;
звана недостатком памяти программ ПЛК. Кроме того» переработ-
ка алгоритма, направленная на уменьшение кода, как правило,
приводит к поиску оптимального алгоритма и соответственно к если условие перехода не истина» то закрнчить
увеличению производительности системы. возврат (return) ;
Вышеизложенные утверждения не сложно проверить на прак- выходное действие;
тике. Давайте сделаем это на базе примера «Управление реверсив-
ным приводом». Попробуем реализовать пример на разных язы- 1: входное действие шага 2;
ках и разными способами без применения SFC.
Все примеры реализованы в CoDeSys (версия 2.2) и откомпи- 2: действие;
лированы для двух широко распространенных микропроцессор-
ных платформ: 8-разрядное семейство Intel 8051 и 16-разрядное
Infineon 16x. Приведенные данные о размере кода (в байтах) если условие ветвления истина, state = 'номер
включают только размер функционального блока и его модуля шага', возврат;
начальной инициализации переменных. Код тестовой программы,
вспомогательных функций генератора кода и библиотек не учи-
тывался. если условие перехода не истина, то закончить
возврат;
выходное действие;
9.14.1. Программирование последовательности состояний
(ST, IL)
ELSE
При реализации алгоритмов, базирующихся на последовате-
действие по умолчанию;
льных состояниях в универсальных языках (С, ассемблер), при-
ходится строить селектор состояний. Во многих случаях доста- state := 0;
точно иметь одну переменную, кодирующую состояние програм- возврат;
много модуля. Шаг, соответствующий определенному состоянию, END_CASE
должен включать проверку условия перехода и соответствующее
изменение селекторной переменной. Одновременно можно вы- Увеличить state на 1; (•выполняется, если не было
полнить выходное действие, если оно требуется. Входные дейст- возврата*)
вия (терминология SFC) потребуют отдельного состояния с безу- Используя описанный метод, переведем функциональный блок
словным переходом к основному шагу. При необходимости пере- Reversible Engine полностью на язык ST. Безусловно, в таком
хода к произвольному шагу селекторной переменной нужно преобразовании нет иного практического смысла, кроме нашего
присвоить необходимое значение. Если переход приводит к сле- «спортивного интереса* — достижения минимального кода.
дующему шагу, то достаточно увеличить селекторную перемен- Раздел объявлений переменных необходимо дополнить одной
ную на единицу. локальной переменной State целого типа. Пронумеруем по поряд-
2 3 4 Глава 9* Примеры программирования Сравнение языков с позиции м: 1Ции кода (IL, ST, FBD, LD) 235
ку все действия диаграммы. Переменная State будет отражать но- Power : TRUE;
мер активного действия. Алгоритм блока не изменится, если Reversal : Direction;
входные действия шагов выполнять в предыдущем цикле, что
ENDCASE
дает сокращение необходимых состояний. Соответствие ST тек-
ста и SFC-действий указано в комментариях. State : = S t a t e + 1 ;
RETC
(•EXIT Run*)
LD FALSE
ST Starting (*Starting := FALSE;*)
JMP NextState
case 2: (*STEP Motion*)
LD On (*IF On = T R U E A N D Reversal
Direction T H E N RETURN*)
AND ( Reversal Рис. 9.28. Размер кода Reversible Engine в последовательной
EQ Direction реализации
Раздел объявлений входных и выходных переменных опреде- Вторая цепь переключает выход реверса при отключенном пи-
ляет интерфейс функционального блока и неизменен для всех тании. За отключением питания при изменении направления сле-
реализаций. Объявление локальных переменных должно выгля- дит цепь 1.
деть так: Цепь 3 запускает таймер разгона по фронту питания. Если пи*
тание выключается, разгон будет также выключен.
VAR
Цепь 4 запускает таймер торможения по заднему фронту (вы-
TmRun: TON; ключению) питания. Элемент AND предотвращает возможность
TmBrake: TOF; включения тормоза при включенном питании.
END VAR Фактически диаграмма дословно выполняет условия задачи.
Метки и переходы не применяются» схема имеет очень компакт-
Будем использовать 2 независимых таймера: TmRun для ное представление.
разгона и TmBrake — для торможения (рис. 9.29). Данную FBD-схему несложно преобразовать в LD. Для того
чтобы LD-схема была более похожей на действительно релейную
0001 диаграмму, желательно не использовать функциональный блок
EQ AND сравнения (рис. 9.30). Хотя это, конечно, приведет к увеличе-
Direction Power нию кода.
Reversal On —
BraWng— 0001
On Braking Direction Reversal Power
0002 I \A \ I 1 \
Direction Reversal
0002 l/H
Reversal On Direction Reversal
H I-
0003 TmRun
T0N
0003 Power Power Starting
TmRun Щ 1
tStart- PT EH-
TmBrake
Starting Power Braking
- Power — ЧН
0004
TmBrake Рис. 9.30. Reversible Engine в LD
AND
Braking Также несложно преобразовать FBD-диаграмму в уравнения,
записанные на языке ST.
— Power
Power :»" (Direction = Reversal) AND On AND NOT Braking;
Рис. 9.29. Reversible Engine в FBD Reversal :~ On AND Direction;
TmRun(IN : - Power, PT := tStart);
Первая цепь определяет условие включения выхода питания
Starting : - NOT TmRun.Q AND Power;
Power. Питание подано, если направление не изменялось (Rever-
sal = Direction), присутствует сигнал включения (On) и торможе- TmBrake(IN := Power, PT := tBrake);
ние закончено (NOT Braking). Braking : - TmBrake.Q AND NOT Power;
2 4 0
Глава 9. Примеры программирования Сравнение языков с позиции минимизации кода (IL t ST t FBD, LD) 241
На языке IL функциональный блок будет выглядеть так: 9.14.3* Функциональный блок против программы
Результаты трансляции (рис. 9-31) подтверждают приведен- Рис. 9.32. Размер кода Reversible Engine для функционального блока и
ные выше утверждения о том, что размер кода не зависит от язы- программы
ка реализации. I
В CoDeSys программы не могут создавать экземпляры, благо-
даря чему адреса данных программ известны уже в процессе
трансляции и появляется возможность отказаться от косвенной
адресации. В результате преобразование функционального блока
в программу дает достаточно существенную экономию кода
(рис. 9.32).
MMI
Человеко-машинный интерфейс
Man Machine Interface
Modifier Модификатор
Приложение. Network Цепь
Перевод специальных терминов PC ПК
и сокращений Personal Computer Персональный компьютер
пид
Action Действие PID
Proportional Integral Derivative Пропорционально интегрально диф-
BCD Двоично-кодированный десятичный ференциальный регулятор
binary coded decimal формат представления чисел
ii PLC
ПЛК
Coil Обмотка реле
i Programmable Logic Controller
Программируемый логический конт-
роллер
Contact Контакт
POU
Current Result, CR, accumulator,Аккумулятор Program Organization Unit Компонент организации программ
accu
•• m* — Program Программа
FALSE Логический ноль, ЛОЖЬ
SCADA
FB Функциональный блок Supervisory Control And Data Ac-
Система сбора данных и оперативно-
Function block quision System
го диспетчерского управления
4.2.5. Строки . 56
1.4. Условия работы ПЛК . .- 1 6
. 57
4.2.6. Иерархия элементарных типов
1.5. Интеграция ПЛК в систему управления предприятием 1 7
4.3.1. Массивы . 57
1.7. Программный ПЛК 2 0
4.3.2. Структуры . 59
1.8. Рабочий цикл 2 1
4.3.3. Перечисления . 61
1.9. Время реакции. .• 2 3
4.3.4. Ограничение диапазона . 62
1.10. Устройство ПЛК . 2 5
4.3.5. Псевдонимы типов . 62
1.10.1. Системное и прикладное 4.3.6. Специфика реализации типов данных CoDeSys . . 63
программное обеспечение 2 7
4.4. Переменные . 64
1.10.2. Контроль времени рабочего цикла 2 7
4.4.1. Идентификаторы . 64
Глава 2. Стандарт М Э К 61131 2 8
4.4.2. Распределение памяти переменных . 65
2.1. Открытые системы 2 8
4.4.3. Прямая адресация . . . . . . . . . 66
2.2. Целесообразность выбора языков МЭК 2 9
4.4.4. Поразрядная адресация . 68
2.3. Простота программирования 4.4.5. Преобразования типов . 69
и доходчивое представление 3 0 4.5. Тонкости вычислений . 70
2.4. Единые требования в подготовке специалистов . . . 3 1 4.6. Венгерская запись . 74
4.7. Формат BCD . 77
Глава 3. Инструменты программирования ПЛК . . . 3 2
3.1. Комплексы проектирования МЭК 61131-3 3 2 Глава 5. Компоненты организации программ (POU) . 78
3.2. Инструменты комплексов программирования ПЛК . 3 5 5.1. Определение компонента . 78
3.2.1. Встроенные редакторы 3 6 5.1.1. Объявление POU . 79
3.2.2. Текстовые редакторы 3 6 5.1.2. Формальные и актуальные параметры . . . . . 80
3.2.3. Графические редакторы 3 7 5.1.3. Параметры и переменные компонента . . . . . 81
2 5 0 Оглавление Оглавление 251