Вы находитесь на странице: 1из 127

Серия «Библиотека инженера»

И. В. Петров

Программируемые контроллеры.
Стандартные языки и приемы
прикладного проектирования

Под ред. проф. В. П. Дьяконова

Москва
СОЛОН-Пресс
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.,
годы СССР научный, технический и промышленный потенциал в ^ доктор технических наук,
наше время вновь стал расти, причем на качественно новом уров- профессор
не — интеграции с мировым промышленным потенциалом. К сча-
стью, далеко не все наши специалисты, окончившие технические
вузы, ринулись в торговлю, коммерцию и юриспруденцию или в
поисках лучшей доли эмигрировали на Запад. Многие остались
верными выбранному пути и, несмотря на его временные трудно-
сти, влились в ряды разработчиков новейшей аппаратуры и тех-
нических средств автоматизации производства- Разумеется, те-
перь уже использующей мировые достижения в науке и технике.
К таким специалистам относится и автор этой книги — Игорь
Петров. Это, безусловно, человек новой формации, понимающий
нынешние рыночные реалии и вовсе не пасующий перед ними.
Будучи моим студентом и аспирантом, Игорь Петров выбрал путь
как по своему образованию (промышленная электроника), так и
по призванию. Он является техническим директором компании
«Пролог*, успешно разрабатывающей и внедряющей современ-
ные программируемые логические контроллеры в наше производ-
ство. И вот теперь он решился на подготовку этой книги, которая
Введение

рументы класса «High end». Мало того, понятие «программирова-


ние» для контроллеров все более вытесняется словом «проектиро-
Введение вание». И действительно, процесс перетаскивания мышью графи-
ческих объектов называть программированием сложно.
Книга описывает программирование систем управления про- Данная книга целиком посвящена проектированию систем на
мышленной автоматикой, построенных на базе программируемых базе ПЛК с помощью инструментов, ориентированных на языки
логических контроллеров (ПЛК). Основное внимание уделяется стандарта МЭК 61131-3. Приведенный материал носит достаточ-
технологии создания программного обеспечения для систем, по- но универсальный характер. Мы намеренно не будем подробно
строенных на базе ПЛК, и практическому программированию на описывать конкретные ПЛК и фирменные инструменты их про-
языках стандарта МЭК 61131-3. граммирования. При подготовке книги использовался комплекс
К сожалению, период широкого распространения стандарта CoDeSys фирмы 3S (Smart Software Solutions). Это означает, что
МЭК 61131-3 пришелся в России на годы перестройки. Отсутст- все примеры были реализованы в этой системе и тщательно про-
вие спроса промышленности на средства автоматизации производ- верены. Но с не меньшим успехом вы можете использовать дру-
ства привело к распаду большинства коллективов, занятых при- гие инструменты, кратко представленные в третьей главе книги.
менением ПЛК, что* естественно, отразилось и на уровне подго- Все они созданы известными мировыми лидерами рынка инстру-
товки специалистов. В настоящее же время наблюдается сущест- ментов программирования ПЛК. Там, где в тексте книги необхо-
венный рост потребности в современных инструментах производ- димо обратить внимание на особенности конкретной реализации,
ства и автоматики. Количество продаж ПЛК в Европе за 2002 год это указано в явном виде.
практически не изменилось, по данным же российских фирм, Для практического применения любого универсального комп-
спрос за год увеличился в несколько раз. Широкое распростране- лекса программирования МЭК 61131-3 с конкретным контролле-
ние и доступность персональных компьютеров привели к появле- ром необходима адаптация системного программного обеспечения
нию большого числа специалистов, профессионально владеющих ПЛК и определенная настройка комплекса. Эта работа требует вы-
компьютерными технологиями. Поэтому не удивительно, что се- сокой квалификации и не дешева. Но это проблема изготовителей
годня персональные компьютеры (ПК) массово применяют на и поставщиков контроллеров. Потребитель ПЛК всегда работает с
всех уровнях промышленной автоматизации, включая классиче- настроенным инструментом и не несет затрат по адаптации. Для
ские контроллерные задачи. знакомства с технологией ПЛК и обучения их программированию
Между тем во многих случаях применение промышленных ПК достаточно иметь бесплатную демонстрационную версию комплек-
не оправдано экономически и технически сложно. Даже там, где са. Книга намеренно не включает CD с подобными демо-версиями,
задача на ПЛК решается «в одно действие» и на два порядка де- поскольку благодаря Интернету (см. ссылки в конце книги) полу-
шевле, нередко применяют дорогостоящие промышленные ПК, чить необходимый пакет из первых рук не представляет сложно-
сти. Кроме того, вам не придется платить лишние деньги за диск с
операционные системы реального времени и заказное програм-
наверняка уже устаревшими программами.
мное обеспечение. Единственной причиной такого подхода явля-
ется наличие подготовленных специалистов. Однобокости реше- Предполагается, что читатель, как минимум, имеет представле-
ний немало сопутствует и почти полное отсутствие современной ние о работе с персональным компьютером и слова «бит», «байт»,
литературы по применению ПЛК на русском языке. При знаком- «шестнадцатеричная система счисления» не вызывают тяжелых
стве с доступными источниками 10 летней давности [7] создается воспоминаний. Глубокое знание математики, компьютеров, сетей,
впечатление, что применение ПЛК связано с примитивным и не- операционных систем, теории систем автоматического управления
уклюжим программированием при помощи специализированных и идеологии построения ПЛК не является необходимым для освое-
пультов, что выглядит чрезвычайно архаично. ния материала данной книги. В серьезной практической работе все
эти вопросы, безусловно, возникнут. В конце книги приведен спи-
В последнее десятилетие появился целый класс инструментов
сок литературы [1—38] и Интернет-источников, которые при необ-
визуального прикладного проектирования для ПЛК. Выражаясь
ходимости подскажут путь поиска решения.
языком специалистов звуковоспроизводящей техники, это инст-
8 Введение Введение 9
Многие книги и учебники по программированию содержат об- лью данной книги. Вероятность же того, что какой-либо пример
ширные вводные разделы. В них поверхностно излагается весь совпадет с практической задачей читателя, крайне низка. Поэто-
материал, далее изложение повторяется уже более подробно, ино- му примеры нацелены на решение сравнительно простых и разно-
гда даже несколько раз с различных точек зрения. Это не удиви- образных задач, причем не только специфичных для классиче-
тельно и объясняется значительной взаимосвязью всех материа- ских применений ПЛК. Примеры призваны служить источником
лов. В данной книге вся информация сразу излагается со всеми новых идей, а не набором шаблонных решений.
подробностями, иногда даже с краткими ссылками вперед на еще
не описанный материал. Это упрощает поиск информации, поско-
льку все, что касается одной проблемы, компактно сосредоточено
в одном разделе книги. Такой подход более характерен для спра-
вочников и ориентирован на экономию времени подготовленных
читателей, нацеленных на практическую работу и имеющих на-
вык чтения технической документации.
Если вам необходимо постепенное погружение в материал, ис-
пользуйте «двухпроходное» чтение. Сначала прочитайте всю кни-
гу «по диагонали», пропуская то, что покажется непонятным. Да-
лее просмотрите разделы, посвященные описанию языков про-
граммирования, выберете наиболее вам понятный, изучите раздел
подробнее и разберите один из примеров, реализованный на дан-
ном языке. На этом этапе необходимо включить компьютер и реа- J•
_' ,I J •

лизовать разобранный пример или еще лучше фрагмент собствен-
ной практической задачи. Подключать реальный ПЛК необязате-
льно, достаточно встроенного эмулятора системы программирова-
ния (можно использовать демо-версию). Пока вы не заставите
пример работать должным образом, дальнейшее чтение книги не
имеет смысла.
Следует сразу обратить внимание на то, что для программиро-
вания ПЛК не требуется знание всех пяти языков МЭК 61131-3.
Так, используя даже простейший, похожий на ассемблер язык IL
(список инструкций), можно реализовать проект любой сложно-
сти. В то же время выбор языка существенно влияет на способ
мышления. В результате существует много задач, красивое реше-
ние которых на одном языке получается практически без усилий,
а на другом языке требует применения малопонятных «трюков»
и, естественно, серьезной отладки. Овладение же приемами рабо-
ты на всех языках и возможность совмещения их в одной задаче
позволяют работать быстро и надежно.
Книга содержит большое число примеров реализации различ-
ных алгоритмов. Примеры преднамеренно не содержат описания
законченных проектов промышленных систем. Для объяснения
любого такого примера обязательно потребуется погружение в де-
тали технологии конкретного производства, что не является це-
Предупреждения
Практическое применение ПЛК в цеховых условиях сопряже-
но с повышенной опасностью. Ошибки во внешних электрических
Глава 1. Программируемые
цепях контроллеров, некорректный расчет устройств питания и контроллеры
силовых блоков, некачественное заземление, неправильно выпол-
ненная система аварийного отключения, отсутствие защиты меха- В этой главе объясняется, что такое программируемый конт-
нических узлов и прочие нарушения правил монтажа могут при- роллер, как он работает и для чего вообще он,нужен. Кратко будут
вести к тяжелым последствиям. Монтаж ПЛК и сопряженного с рассмотрены принципь! построения аппаратных средств и систем-
ним оборудования должен выполнятся только квалифицирован- ного программного обеспечения, основы систем реального времени
ным персоналом, имеющим соответствующие допуски. и важнейшие технические характеристики контроллеров.
Ошибки в прикладном программном обеспечении ПЛК способ-
ны приводить к потере синхронности работы механизмов, что мо-
жет стать причиной их поломки или привести к травмам обслу-
1.1. Определение ПЛК
живающего персонала. Правильно спроектированная система Любая машина, способная автоматически выполнять некото-
должна содержать элементы блокировки, исключающие такую рые операции, имеет в своем составе управляющий контроллер —
возможность. Детальное рассмотрение техники проектирования модуль, обеспечивающий логику работы устройства. Контрол-
безопасных систем автоматического управления не является лер — это мозг машины. Естественно, чем сложнее логика работы
предметом данной книги. Все примеры в книге построены таким машины, тем «умнее» должен быть контроллер.
образом, что их проработку можно выполнять в режиме эмуля- • * " г

ции, без подключения внешнего оборудования. Технически контроллеры реализуются по-разному. Это может
быть механическое устройства, пневматический или гидравличе-
ский автомат, релейная или электронная схема или даже компь-
ютерная программа.
В случае, когда контроллер встроен в машину массового выпу-
ска, стоимость его проектирования распределена на большое чис-
ло изделий и мала в отношении к стоимости изготовления. В слу-
чае машин, изготавливаемых в единичных экземплярах, ситуа-
ция обратная. Стоимость проектирования контроллера доминиру-
ет по отношению к стоимости его физической реализации.
- i
При создании машин, занятых в сфере промышленного произ-
водства, как правило, приходится иметь дело не более чем с еди-
ницами однотипных устройств. Кроме того, очень существенной
здесь является возможность быстрой перенастройки оборудова-
ния на выпуск другой продукции.
Контроллеры, выполненные на основе реле или микросхем с
«жесткой» логикой, невозможно научить делать другую работу
без существенной переделки. Очевидно, что такой возможностью
обладают только программируемые логические контроллеры
(ПЛК). Идея создания ПЛК родилась практически сразу с появле-
нием микропроцессора, т, е- 30 лет назад.
1 2 Глава 1. Программируемые контроллеры Определение ПЛК 13

Физически, типичный ПЛК представляет собой блок, имею- Изначально ПЛК предназначались для управления последова-
щий определенный набор выходов и входов, для подключения тельными логическими процессами, что и обусловило слово «ло-
датчиков и исполнительных механизмов (рис. 1.1). Логика управ- гический» в названии ПЛК. Современные ПЛК помимо простых
ления описывается программно на основе микрокомпьютерного логических операций способны выполнять цифровую обработку
ядра. Абсолютно одинаковые ПЛК могут выполнять совершенно сигналов, управление приводами, регулирование, функции опе-
разные функции. Причем для изменения алгоритма работы не раторского управления и т. д. В стандарте МЭК и очень часто в
требуется каких-либо переделок аппаратной части. Аппаратная литературе для обозначения контроллеров применяется сокраще-
реализация входов и выходов ПЛК ориентирована на сопряжение ние ПК (программируемый контроллер). Поскольку в России
с унифицированными приборами и мало подвержена изменениям. обозначение ПК устойчиво связано с персональным» компьюте-

о
рами, мы будем использовать сокращение ПЛК.
в В Конструкция ПЛК может быть самой разнообразной — от
ы стойки, заполненной аппаратурой, до миниатюрных ПЛК, подоб-
ПРОГРАММНАЯ X ных показанному на рис. 1.2.
II о ОБРАБОТКА
о
д д
ы ы
t

Рис. 1.1. Принцип работы ПЛК


i

Задачей прикладного программирования ПЛК является только


реализация алгоритма управления конкретной машиной. Опрос
входов и выходов контроллер осуществляет автоматически, вне
зависимости от способа физического соединения. Эту работу вы-
полняет системное программное обеспечение. В идеальном случае
прикладной программист совершенно не интересуется, как подсо-
единены и где расположены датчики и исполнительные механиз-
мы. Мало того, его работа не зависит от того, с каким контролле-
ром и какой фирмы он работает. Благодаря стандартизации язы- Рис. 1.2. Миниатюрный ПЛК фирмы SIEMENS, Германия
ков программирования прикладная программа оказывается пере-
носимой. Это означает, что ее можно использовать в любом ПЛК, Впервые ПЛК были применены в США для автоматизации
поддерживающем данный стандарт. конвейерного сборочного производства в автомобильной про-
Программируемый контроллер — это программно управляе- мышленности (фирма Модикон, 1969 г.). Сегодня ПЛК работа-
мый дискретный автомат, имеющий некоторое множество вхо- ют в энергетике, в области связи, в химической промышленно-
дов, подключенных посредством датчиков к объекту управления, сти» в сфере добычи, транспортировки нефти и газа, в системах
и множество выходов, подключенных к исполнительным устрой- обеспечения безопасности, в коммунальном хозяйстве» исполь-
ствам. ПЛК контролирует состояния входов и вырабатывает опре- зуются в автоматизации складов, в производстве продуктов пи-
деленные последовательности программно заданных действий, от- тания и напитков, на транспорте, в строительстве и т , д. Реаль-
ражающихся в изменении выходов. но сфера применения ПЛК даже шире сферы применения пер-
ПЛК предназначен для работы в режиме реального времени в сональных компьютеров. Хотя слава ПЛК значительно меньше.
условиях промышленной среды и должен быть доступен для про- Их работа происходит как бы «за сценой» и незаметна для
граммирования неспециалистом в области информатики [6]. большинства людей.
1 4
Глава 1. Программируемые контроллеры Режим реального времени в ограничения на применение ПЛК 15

1.2. Входы-выходы Они ориентированы на работу с конкретными специфическими


датчиками, требующими определенных уровней сигналов, пита-
На заре своего появления ПЛК имели только бинарные входы., ния и специальной обработки. Например, квадратурные шифра-
т. е. входы, значения сигналов на которых способны принимать торы, блоки управления шаговыми двигателями, интерфейсы
только два состояния — логического нуля и логической единицы. дисплейных модулей и т. д.
Так, наличие тока (или напряжения) в цепи входа считается Входы-выходы ПЛК не обязательно должны быть физически
обычно логической единицей. Отсутствие ток"а (напряжения) сосредоточены в общем корпусе с процессорным ядром. В послед-
означает логический 0. Датчиками, формирующими такой сиг- ние годы все большую популярность приобретают технические ре-
нал, являются кнопки ручного управления, концевые датчики, шения, позволяющие полностью отказаться от прокладки кабе-
датчики движения, контактные термометры и многие другие. лей для аналоговых цепей. Входы-выходы выполняются в виде
Бинарный выход также имеет два состояния — включен и вы- миниатюрных модулей, расположенных в непосредственной бли-
ключен. Сфера применения бинарных выходов очевидна: электро- зости от датчиков и исполнительных механизмов. Соединение
магнитные реле, силовые пускатели, электромагнитные клапаны, подсистемы ввода-вывода с ПЛК выполняется посредством одного
световые сигнализаторы и т. д. , общего цифрового кабеля. Например, в интерфейсе Actua-
В современных ПЛК широко используются аналоговые входы tors/Sensors interface применяется плоский профилированный
и выходы. Аналоговый или непрерывный сигнал отражает уро- кабель («желтый кабель») для передачи данных и питания всего
вень напряжения или тока, соответствующий некоторой физиче- по двум проводам.
ской величине в каждый момент времени. Этот уровень может от-
носиться к температуре, давлению, весу, положению, скорости,
частоте и т. Д; Словом, к любой физической величине. 1.3. Режим реального времени и ограничения
Аналоговые входы контроллеров могут иметь различные пара- на применение ПЛК
метры и возможности. Так, к их параметрам относятся: разряд-
Для математических систем характеристикой качества работы
ность АЦП, диапазон входного сигнала, время и метод преобразо-
является правильность найденного решения. В системах реально-
вания, несимметричный или дифференциальный вход, уровень
шума и Нелинейность, возможность автоматической калибровки, го времени ломимо правильности решения определяющую роль
программная или аппаратная регулировка коэффициента усиле- играет время реакции. Логически верное решение» полученное с
ния, фильтрация. Особые классы аналоговых входов представля- задержкой более допустимой, не является приемлемым.
ют входы, предназначенные для подключения термометров сопро- Принято различать системы жесткого и мягкого реального
тивления и термопар. Здесь требуется применение специальной времени. В системах жесткого реального времени существует вы-
аппаратной поддержки (трехточечное включение, источники об- раженный временной порог. При его превышении наступают не-
разцового тока, схемы компенсации холодного спая, схемы лине- обратимые катастрофические последствия. В системах мягкого ре-
аризации и т. д.). ального времени характеристики системы ухудшаются с увеличе-
В сфере применения ПЛК бинарные входы и выходы называ- нием времени управляющей реакции. Система может работать
ют обычно дискретными. Хотя, конечно, это не точно. Аналого- плохо или еще хуже, но ничего катастрофического при этом не
вые сигналы в ПЛК обязательно преобразуются в цифровую, т. е. происходит.
заведомо дискретную форму представления. Но в технических до- Классический подход для задач жесткого реального времени
кументах ПЛК любой фирмы вы встретите именно указание ко- требует построения событийно управляемой системы. Для каж-
личества дискретных и аналоговых входов. Поэтому и далее в дого события в системе устанавливается четко определенное вре-
книге мы сохраним устоявшуюся здесь терминологию. мя реакции и определенный приоритет. Практическая реализа-
Помимо «классических» дискретных и аналоговых входов-вы- ция таких систем сложна и всегда требует тщательной проработ-
ходов многие ПЛК имеют специализированные входы-выходы. ки и моделирования.
Глава 1. Программируемые контроллеры
1 6
Интеграция ПЛК в систему управления предприятием 17
Для ПЛК существенное значение имеет не только быстродей-
ствие самой системы, но и время проектирования, внедрения и
возможной оперативной переналадки.
Абсолютное большинство ПЛК работают по методу периодиче-
ского опроса входных данных (сканирования). ПЛК опрашивает
входы, выполняет пользовательскую программу и устанавливает
необходимые значения выходов. Специфика применения ПЛК
обусловливает необходимость одновременного решения несколь-
ких задач. Прикладная программа может быть реализована в
виде множества логически независимых задач, которые должны
работать одновременно.
На самом деле ПЛК имеет обычно один процессор и выполняет
несколько задач псевдопараллельно, последовательными порция-
ми. Время реакции на событие оказывается зависящим от числа
одновременно обрабатываемых событий. Рассчитать минимальное Рис, 1.3. Настройка оборудования
и максимальное значения времени реакции, конечно, можно, но (РААЗ, г. Рославдь, Смоленская обл.)
добавление новых задач или увеличение объема программы при- словливают жесткие требования, определяющие схемотехниче-
ведет к увеличению времени реакции. Такая модель более подхо- ские решения, элементную и конструктивную базу ПЛК. В про-
дит для систем мягкого реального времени. Современные ПЛК цессе серийного производства ПЛК обязательным является техни-
имеют типовое значение времени рабочего цикла, измеряемое. ческий прогон готовых изделий, включающий климатические,
единицами миллисекунд и менее. Поскольку время реакции боль- вибрационные и другие испытания.
шинства исполнительных устройств значительно выше, с реаль- ПЛК — это конструктивно законченное изделие, физическое
ными ограничениями возможности использования ПЛК по време- исполнение которого определяется требуемой степенью защиты,
ни приходится сталкиваться редко. начиная от контроллеров в легких пластиковых корпусах, пред-
В некоторых случаях ограничением служит не время реакции назначенных для монтажа в шкафу (степень защиты IP20), и до
на событие, а обязательность его фиксации, например работа с герметичных устройств в литых металлических корпусах, пред-
датчиками, формирующими импульсы малой длительности. Это назначенных для работы в особо жестких условиях.
ограничение преодолевается специальной конструкцией входов. Правильно подобранный по условиям эксплуатации контрол-
Так, счетный вход позволяет фиксировать и подсчитывать импу- лер нельзя повредить извне без применения экстремальных мето-
льсы с периодом во много раз меньшим времени рабочего цикла дов. Штатными для ПЛК являются такие аппаратные решения,
ПЛК. Специализированные интеллектуальные модули в составе как полная гальваническая развязка входов-выходов, защита по
ПЛК позволяют автономно отрабатывать заданные функции, на- току и напряжению, зеркальные выходные каналы, сторожевой
пример модули управления сервоприводом. таймер задач и микропроцессорного ядра.
F
1.4. Условия работы ПЛК 1.5. Интеграция ПЛК в систему управления

К негативным факторам, определяющим промышленную сре- предприятием


ду, относятся: температура и влажность, удары и вибрация, кор- Контроллеры традиционно работают в нижнем звене автома-
розионно-активная газовая среда, минеральная и металлическая тизированных систем управления предприятием (АСУ) — сис-
пыль, электромагнитные помехи (рис. 1.3). Перечисленные фак- тем, непосредственно связанных с технологией производства
торы, весьма характерные для производственных условий, обу- (ТП). ПЛК обычно являются первым шагом при построении сие-
1 8
Глава 1. Программируемые контроллеры Интеграция ПЛК в систему управления предприятием 19

тем АСУ. Это объясняется тем, что необходимость автоматизации написали и отладили автономный проект на контроллере при по-
отдельного механизма или установки всегда наиболее очевидна* мощи системы подготовки программ CoDeSys. Как теперь нужно
Она дает быстрый экономический эффект, улучшает качество доработать программу, чтобы связать ПЛК с системой диспетчер-
производства, позволяет избежать физически тяжелой и рутин- ского управления» базой данных,или Интернет-сервером? Ответ:
ной работы. Контроллеры по определению созданы именно для никак. Никакого программирования далее вообще не потребует^
такой работы. ся. В комплекс программирования ПЛК входит ОРС-сервер, Он
•ч

Далеко не всегда удается создать полностью автоматическую умеет получать доступ к данным ПЛК также прозрачно, как и
систему. Часто «общее руководство» со стороны квалифицирован- отладчик. Достаточно обеспечить канал передачи данных ПЛК —
ОРС-сервер. Обычно такой канал уже существует, вы использова-
ного человека — диспетчера необходимо. В отличие от автомати-
ли его, при отладке. Вся дальнейшая работа сводится к определе-
ческих систем управления такие системы называют автоматизи-
нию сциска доступных переменных, правильной настройке сети,
рованными. Еще 10 — 15 лет назад диспетчерский пульт управле-
конфигурированию ОРС-сервера и SCADA-системы. В целом, опе-
ния представлял собой табло с множеством кнопок и световых рация очень н&помияает настройку общедбступных устройств ло-
индикаторов. В настоящее время подобные пульты применяются кальной сети ПК*
только в очень простых случаях, когда можно обойтись несколь-
кими кнопками и индикаторами. В более «серьезных» системах Второй часто возникающей задачей является интеграция не-
применяются ПК. скольких ПЛК с целью синхронизации их работы. Здесь по^вдя-
ются сети, обладающие рядом специфических требований. В це-
Появился целый класс программного обеспечения реализую-
щего интерфейс человек—машина (MMI). Это так называемые си- Машина! Машина N
стемы сбора данных и оперативного диспетчерского управления
(Supervisory Control And Data Acquision System — SCADA). Совре- Органы Объект
Датчики
менные SCADA-системы выполняются с обязательным примене- воздействия управления

нием средств мультимедиа. Помимо живого отображения процесса


производства, хорошие диспетчерские системы позволяют накап-
ливать полученные данные, проводят их хранение и анализ, опре-
деляют критические ситуации и производят оповещение персона- Условия промышленной
среды
ла по каналам телефонной и радиосети, позволяют создавать сце-
Сеть fiekfbus
нарии управления (как правило, Visual Basic), формируют данные
для анализа экономических характеристик производства.
Создание систем диспетчерского управления является отдель-
ным видом бизнеса. Разделение производства ПЛК, средств про-
граммирования и диспетчерских систем привело к появлению Система программирования
и отладки
стандартных протоколов обмена данными. Наибольшую, извест-
ность получила технология ОРС (OLE for Process Control), базиру-
ющаяся на механизме DCOM Microsoft Windows. Механизм дина- Локальная сеть
мического обмена данными (DDE) применяется пока еще доста-
точно широко, несмотря на то что требованиям систем реального
времени не удовлетворяет. Сервер
данных ОРС
Все это * многоэтажное * объяснение призвано подчеркнуть
еще одно немаловажное преимущество ПЛК — средства систем- Рабочее место оператора АСУ
верхнегоуровня
ной интеграции являются составной частью базового програм-
много обеспечения современного ПЛК (рис. 1.4). Допустим, вы Рис. 1.4. Место ПЛК в АСУ ТП
Глава 1- Программируемые контроллеры Рабочий цикл 21
2 0

лом это требования, аналогичные требованиям к ПЛК: режим ре- Существенный минус такого решения — большое время выхот
ального времени, надежность в условиях промышленной среды, да на рабочий режим после включения питания или зависания
ремонтопригодность, простота программирования. Такой класс компьютера. Особенно опасно, если перезапуск произвел «сторо-
сетей получил название промышленных сетей (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.10, Устройство ПЛК


Цикл сканирования

Чтение код программы Установка Прочив Аппаратно ПЛК является вычислительной машиной. Поэтому
фазы
входов управления выходов архитектура его процессорного ядра практически не отличается
от архитектуры компьютера. Отличия заключены в составе пери-
Время реакции
ферийного оборудования, отсутствуют видеоплата, средства руч-
Событие
ного ввода и дисковая подсистема. Вместо них ПЛК имеет блоки
входов и выходов.
Рис. 1.6. Время реакции ПЛК

Помимо времени реакции ПЛК, существенное значение имеет


время реакции датчиков и исполнительных механизмов, которое
также необходимо учитывать при оценке общего времени реак-
ции системы.
Существуют ПЛК, которые реализуют команды непосредствен-
ного доступа к аппаратуре входов и выходов, что позволяет обра-
батывать и формировать отдельные сигналы с длительностью ме-
ньшей длительности рабочего цикла.
Для уменьшения времени реакции сканирующих контролле- Рис. 1.6. ПЛК MicroLogix 1000 производства Allen-Bradley (Rockwell
ров алгоритм программы разбивается на несколько задач с раз- Automation). США
личным периодом исполнения. В наиболее развитых системах по-
льзователь имеет возможность создавать отдельные программы, Конструктивно контроллеры подразделяют на моноблочные,
исполняемые по прерыванию, помимо кода, исполняемого в рабо- модульные и распределенные. Моноблочные, или одноплатные,
чем цикле. Такая техника позволяет ПЛК существенно форсиро- ПЛК имеют фиксированный набор входов-выходов. В модульных
вать ограничение реакции временем сканирования при небольшом контроллерах (рис. 1.7) модули входов-выходов устанавливаются
количестве входов, требующих сверхскоростной реакции. в разном составе и количестве в зависимости от требуемой конфи-
Время цикла сканирования является базовым показателем бы- гурации. Так достигается минимальная аппаратная избыточ-
стродействия ПЛК. При измерении времени рабочего цикла поль- ность. В распределенных системах модули или даже отдельные
зовательская программа должна содержать 1К логических входы-выходы, образующие единую систему управления, могут
команд. Для ПЛК, поддерживающих стандарт МЭК 61131-3, ис- быть разнесены на значительные расстояния.
пользуют команды на языке IL. Иногда изготовители приводят Характерным для современных контроллеров является испо-
несколько значений времени цикла, полученных при работе с пе- льзование многопроцессорных решений, В этом случае модули
ременными различной разрядности. ввода-вывода имеют собственные микропроцессоры, выполняю-
Ориентировочно о скорости обработки различных типов дан- щие необходимую предварительную обработку данных. Модуль
центрального процессора имеет выделенную скоростную магист-
ных можно судить по тактовой частоте и разрядности централь-
раль данных для работы с памятью и отдельную магистраль
ного процессора. Хотя нет ничего удивительного в том, что вось- (сеть) для общения с модулями ввода-вывода.
миразрядные ПЛК не редко оказываются быстрее 32-разрядных
при выполнении битовых операций. Объясняется это тем, что в Еще одним вариантом построения ПЛК является мезоны иная
8-разрядных микропроцессорах более распространена аппаратная технология. Все силовые цепи, устройства защиты контроллера
выполняются на несущей плате. Процессорное ядро контроллера,
поддержка работы с битами. Так, в PC-совместимых процессорах
включающее систему исполнения» выполнено на отдельной смен-
для выделения бита приходится использовать логические коман- ной (мезонинной) плате. В результате появляется возможность со-
ды и циклический сдвиг.
Глава 1. Программируемые контроллеры Устройство ПЛК 27
2 6

входов и 8 выходов, 4 аналоговых входа, 2 парных входа квадра-


турных шифраторов, интерфейсы RS232, SPI и обеспечивает ра-
боту сети CANopen.

1.10.1. Системное и прикладное


программное обеспечение
Системное программное обеспечение (СПО) непосредственно
контролирует аппаратные средства ПЛК. СПО отвечает за тести-
рование и индикацию работы памяти, источника питания, моду-
лей ввода-вывода и интерфейсов, таймеров и часов реального вре-
мени. Система исполнения кода прикладной программы является
составной частью СПО. Система исполнения включает драйверы
модулей ввода-вывода, загрузчик кода программ пользователя,
интерпретатор команд и отладочный монитор. Код СПО располо-
Рнс, 1.7. Модульная система МСТС производства ПК «Пролог», Россия жен в ПЗУ и может быть изменен только изготовителем ПЛК.
Код прикладное программы размещается в энергонезависимой
ставлять несколько комбинаций процессорного ядра и разных си- памяти, чаще всего это электрически перепрограммируемые мик-
ловых плат без необходимости корректировки программного обес- росхемы. Изменение кода прикладной программы выполняется
печения. При необходимости процессор можно заменить даже в пользователем ПЛК при помощи системы программирования и
готовой системе. может быть выполнено многократно.
На рис. 1.8 показано сверхминиатюрное ядро ПЛК Easy 215
(фирма Frenzel + Berg Electronic, Германия), выполненное в 1.10.2. Контроль времени рабочего цикла
виде модуля, рассчитанного на установку в стандартную колод-
Правильно составленная пользовательская программа не дол-
ку микросхем, имеющих корпус DIP40. Несмотря на скромные жна содержать бесконечных циклов. В противном случае управ-
размеры, модуль включает 16-разрядный процессор (Infineon ление системе исполнения не будет передано, и, соответственно,
С164), память данных, энергонезависимую память программ, нормальное функционирование контроллера будет нарушено. Для
встроенное ядро системы исполнения CoDeSys, 8 дискретных преодоления данной проблемы служит контроль времени цикла.
Контроль осуществляется при поддержке аппаратно реализован-
ного «сторожевого таймера». Если фаза пользовательского кода
выполняется дольше установленного порога, то ее работа будет
прервана. Таким образом, достигается предсказуемое поведение
ГЙ1К при ошибках в программе и при «зависании» по причине
аппаратных сбоев;
Обслуживание сторожевого таймера выполняется в рабочем
цикле ПЛК. Выполнять эту операцию по прерыванию нельзя, по-
скольку при «зависании» процессора система прерываний доста-
точно часто продолжает исправно работать.

Рнс. 1.8. Сверхминиатюрный ПЛК Easy215 с системой исполнения


CoDeSys
Целесообразность выбора языков МЭК 29

пертов по проблемам ПЛК, включая аппаратные средства, мон-


таж, тестирование, документацию и связь.
Первый вариант стандарта был опубликован в 1982 году. Вви-
ду сложности получившегося документа было решено разбить его
Глава 2. Стандарт МЭК 61131 на несколько частей- В настоящее время стандарт включает сле-
дующие части.
В данной главе раскрыты причины, приведшие к необходимо- Часть 1. Общая информация.
сти стандартизации ПЛК, кратко одисана структура МЭК 61131, Часть 2. Требования к оборудованию и тестам.
обоснован выбор языков программирования контроллеров вклю- Часть 3. Языки программирования.
ченных в стандарт МЭК 61131-3. Часть 4, Руководства пользователя.
Часть 5. Спецификация содбщений.
2.1. Открытые системы Часть 6. Промышленные сети.
Часть 7. Программирование с нечеткой логикой..
Привязать потребителей к своим изделиям — мечта любого Часть 8. Руководящие принципы применения и реализации
производства. С этой целью секреты технологии, позволяющие языков ПЛК,
получить высокие качественные показатели продукции» должны
Первоначально стандарт имел номер 1131, с 1997 года МЭК
тщательно охраняться. Это классический закрытый подход. Для
перешел на 5-цифровые обозначения. Теперь правильное наиме-
потребителя желательно иметь возможность совместно использо-
нование международной версии стандарта — МЭК 61131.
вать изделия разных фирм. Но с точки зрения производителя это
не выгодно» поскольку повышает вероятность того, что заказчик Далее мы сосредоточимся главным образом на языках про-
откажется от некоторых покупок в пользу конкурентов. граммирования, описанных в третьей части стандарта. Для крат-
кости, если в тексте употребляются слова «стандарт МЭК», следу-
На самом деле это поверхностное заключение справедливо не ет понимать МЭК 61131-3. При ссылках на другие документы бу-
всегда. Так, если продукция является достаточно технически дет дано полное наименование.
сложной и имеет широкую сферу применений, то удовлетворить , L
каждое конкретное пожелание индивидуального заказчика почти
невозможно и дорого. Недовольство даже одной малосуществен- 2.2. Целесообразность выбора языков МЭК
ной для большинства деталью может привести к отказу от про-
дукции данной фирмы вообще. При производстве же совместимой Если посмотреть на языки стандарта МЭК с точки зрения со-
продукции (подчиненной требованиям открытого стандарта) фир- временной информатики» то каждый их них можно подвергнуть
ма производитель может сконцентрироваться на развитии наибо- оправданной критике (особенно SFC). Вероятно, было бы более
лее удачных своих решений. Не опасаясь потерять заказчика, разумным, опираясь на опыт использования наиболее популяр-
производитель может отказаться от невыгодных для себя изделий ных языков, создать один хороший универсальный язык. Эта
или частей работы* Кроме того, благодаря совместимости появля- идея не нова. Все старое программное обеспечение для контролле-
ется возможность внедрять свои передовые изделия даже в полно- ров просто нужно будет переписать с нуля.ч В условиях конкурен-
стью захваченных областях рынка. Так начинающие коллективы тного производства очень важно проводить внедрение новой тех-
получаю* шанс проявить себя и найти свое, пусть даже не очень ники быстро- А для этого необходимо максимально задействовать
большое место среди промышленных гигантов. Тем самым расши- отработанные решения.
ряется и сам рынок. Выгоду открытого подхода наглядно доказа- Включение в стандарт пяти языков объясняется в первую оче-
ла фирма IBM на примере своих ПК. редь историческими причинами. Разработчики стандарта столкну-
В 1979 году в рамках Международной Электротехнической Ко- лись с наличием огромного количества различных вариаций похо-
миссии (МЭК) была создана специальная группа технических экс- жих языков программирования ПЛК. Вошедшие в стандарт языки
Глава 2. Стандарт МЭК 61131 Единые требования в подготовке специалистов 31
3 0

созданы на основе наиболее популярных языков программирова- Страшно подумать, что придется объяснять работу сложной
ния, наиболее распространенных в мире контроллеров. Если взять программы по ассемблерным или С листингам. Не исключайте
любой контроллер, работающий в современном производстве, то ситуации, что общаться придется не на родном языке. Современ-
его программу можно перенести в среду МЭК 61131-3 с минималь- ные системы программирования контроллеров позволяют выпол-
ными затратами- Речь не идет о том» что программу можно будет нить несколько распечаток программы с комментариями на раз-
использовать без какой-либо правки. Безусловно, потребуется не- ных языках — русском, немецком н т. д. Очевидно, это уже не
которая адаптация и отладка, но несравненно меньшая» чем при маркетинговый ход разработчиков, а реальное требование совре-
менного бизнеса. Неэффективно реализованную программу мож-
создании проекта с нуля.
но заставить работать быстрее увеличением быстродействия про-
После принятия стандарта появилась возможность создания
цессора. Доходчивостц представления достичь гораздо сложнее.
аппаратно-независимых библиотек. Это регуляторы, фильтры, Программу, в которой невозможно разобраться, придется рано
управление сервоприводом, модули с нечеткой логикой и т. д. или поздно выбросить.
Наиболее удачные, отработанные востребованные библиотеки ста-
новятся коммерческими продуктами,
2Л, Единые требования в подготовке

2.3. Простота программирования и доходчивое специалистов


представление Внедрение стандарта дало фундамент для создания единой
Инженер, спроектировавший машину, должен иметь возмож- школы подготовки специалистов. Человек, прошедший обучение
ность самостоятельно написать программу управления. Никто по программе, включающей стандарт МЭК 61131, сможет рабо-
тать с ПЛК любой фирмы. В то же время, если он имел ранее
лучше его не знает, как должна работать данная машина. Инже-
опыт работы с любыми ПЛК, его навыки окажутся полезными и
нер, привыкший работать с электронными схемами, гораздо лег-
существенно упростят изучение новых возможностей.
че сможет выражать свои мысли в LD или FBD. Если он знаком с
языками PASCAL или С, то использование языка ST не составит Программист не ограничен применением заданных в стандарте
для него сложности. типов данных и операций. Стандарт допускает возможность со-
За время развития ПЛК размер средней программы возрос бо- здания пользовательских типов данных и функциональных бло-
лее чем в 100 раз [21]. Многие решения» требовавшие раньше ап- ков. Функции и функциональные блоки великолепно реализуют
паратной поддержки, реализуются сегодня программно. Соответ- инкапсуляцию деталей реализации. Созданные пользователем
ственно, требования к качеству программного обеспечения очень библиотеки абсолютно равноправны стандартным. Новые ориги-
высоки. Поэтому сложную программу должны писать специали- нальные аппаратные решения изготовителей ПЛК могут быть
сты. Но для ответственных проектов очень важно, чтобы про- поддержаны собственными библиотеками. Причем при создании
грамма алгоритма была понятна техническому персоналу, осуще- внешних библиотек можно использовать любые инструменты
ствляющему настройку, сопровождение и ремонт оборудования. вплоть от ассемблера до C++.
Они не обязаны изучать программу досконально, но понимать, Вообще стандартные компоненты МЭК для программиста, как
что происходит, безусловно, должны. дороги для автомашин. Количество возможных путей всегда
Очень часто технологи описывают процесс примерно так: очень ограничено» Ближе полем, но по дороге быстрее.
«слегка перемешать, подогреть и довести до готовности». С аппа-
ратными средствами здесь фактически все понятно, а вот с алго-
ритмом управления значительно сложнее. Для более детальных
обсуждений технологии необходим некий общий язык, докумен-
тальный и наглядный. Диаграммы SFC справляются с этой ролью
не хуже специализированных инструментов (например, UML), яв-
ляясь притом действующей программой, а не просто моделью.
Глава 3. Инструменты программирования ПЛК 33

Открытость МЭК-стандарта — с одной стороны* и сложность


реализации высококлассных комплексов программирования — с
другой, привели к появлению специализированных фирм, заня-
тых исключительно инструментами программирования ПЛК. Во
Глава 3. Инструменты Франции такие фирмы называют *дом программирования». Как
и изделия домов мод системы программирования отличаются
программирования ПЛК своим фирменным почерком, имеют* свой стиль и собственных
стойких поклонников. Но, к счастью, отличия комплексов сосре-
В этой главе рассказывается о наиболее известных комплексах доточены в реализации интерфейса, в стиле графики, наборе
программирования МЭК 61131-3, описываются общие их свойства, сервисных функций, дополнительных библиотеках и в реализа-
инструменты проектирования и отладки прикладного програм- ции системы исполнения, т. е. в том, что не касается примене-
много обеспечения ПЛК. Более подробно рассмотрен комплекс Co- ния стандарта.
DeSys, на который будет опираться дальнейшее изложение. Наибольшей известностью в мире пользуются следующие ком-
плексы.
3.1. Комплексы проектирования МЭК 61131-3 CoDeSys

Контроллеры, программирование которых осуществляется со 3S Smart Software Solutions http://www.3s-software.com


встроенного или выносного пульта, встречаются сегодня доста- CoDeSys это один из самых развитых функционально полных
точно редко. Как правило» это простые специализированные инструментов программирования МЭК 61131-3. Все дальнейшее
ПЛК, предназначенные для управления освещением по расписа- изложение в данной книге опирается на CoDeSys. Это не означа-
нию, регулировки температуры и т. д. Все программирование та- ет, что приведенная информация непригодна для других систем
ких контроллеров сводится обычно к заданию набора констант. программирования. Везде, где есть существенные отличия или
Для программирования ПЛК универсального назначения приме- тонкости реализации, это будет особо подчеркнуто* Опора на Co-
няются ПК. Процесс разработки и отладки программного обеспе- DeSys означает, что все примеры реализованы и протестированы
чения происходит при помощи специализированных комплексов именно в этой системе, если на это указано специальна. Далее мы
программ, обеспечивающих комфортную среду для работы про- рассмотрим данный комплекс более подробно!
граммиста ^ ISaGRAF
Традиционно все. ведущие изготовители программируемых
ПЛК имеют собственные фирменные наработки в области инстру- CJ International http://www.isagraf.com/
ментального программного обеспечения. Безусловно, большинст- Наиболее яркая особенность ISaGRAF — это аппаратно незави-
во из них представляют удобные инструменты, оптимизирован- симый генератор TIC кода (Target Independent Code), благодаря
ные под конкретную аппаратуру. Понятно, что в разработке уни- чему, система исполнения интерпретирующего типа очень проста
версальных систем программирования, приемлемых для своих в адаптации. Какие-либо ограничения на аппаратную платформу
ПЛК и для ПЛК конкурентов, изготовители не заинтересованы. практически отсутствуют. Помимо генерации TIC-кода, в ISaG-
Кроме того, это достаточно сложная задача. Системы программи- RAF существует возможность трансляции проекта в С текст.
рования ПЛК небольших фирм в лучшем случае реализуют один
из языков МЭК с некоторыми расширениями, призванными со- MULTfPROG wt
хранить совместимость со своими же более ранними (нестандарт-
KlbpperUnd Wiege Software GmbH http: / /www.kw-software.de /
ными) системами. Крупнейшие лидеры рынка ПЛК предлагают!
сегодня очень мощные комплексы с поддержкой МЭК-языкав,' Исключительно продуманный, красивый и удобный инстру-
также сохраняющие преемственность и фирменные традиции^ мент с широкими возможностями моделирования и визуализа-
(«Concept» Schneider Electric, «S7» Siemens). ции. Система исполнения базируется на собственной операцией-
3 4
Глава 3. Инструменты программирования ПЛК Инструменты комплексов программирования ПЛК 35
"i
ной системе реального времени ProConOS (Programmable Control- ность анимации. Непосредственно в диаграмме можно выполнить
ler Operating System), управляющей исполнением пользователь- визуализацию не только самогоалгоритма, переменных, контрол-
ских задач. Первая версия MULTIPROG вышла еще в начале лера, но и даже управляемого объекта (см- рис. 3-8). Компактная
80-х гг. XX в. под операционную систему СР/М. В настоящее вре- переносимая (ANSI-C) система исполнения* Объемная библиотека
мя MULTIPROG ориентирован на Windows, о чем говорит суф- блоков, включая элементы нечеткой логики. Есть возможность
фикс wt (windows technology) в названии. создавать собственные функциональные блоки на языке С.
Каждый из представленных комплексов оснащен полным на-
OpenPCS бором средств быстрой разработки и отладки программ, но имеет
Infoteam Software GmbH http: //vyww.infoteam.de/ и достаточно много фирменных «изюминок*. Все комплексы име-
Уникальная особенность комплекса OpenPCS заключается в ют демонстрационные версии, содержащие много полезных при-
использовании языка IL в качестве промежуточного кода. Эле- меров. Вы можете также проводить собственные опыты в про-
менты программы, выполненные на любом МЭК-языке, можно граммировании и проводит^ тестирование в режиме эмуляции.
копировать в буфер обмена Windows и вставлять в программу на Естественно, использовать ознакомительные версии при создании
другом языке с автоматическим перекодированием. Для достиже- I коммерческих проектов нельзя.
ния высокого быстродействия в составе комплекса присутствуют Детальное использование экранных интерфейсов и меню
компиляторы машинного кода для ряда распространенных про- команд комплексов в книге описываться
1
1 не будет. Предполагает-
цессоров. Симулятор ПЛК SmartSIM позволяет проводить обуче- ся, что читатель знаком с «прелестями» Windows-интерфейса.
ние и отладку без внешней аппаратуры. Приемы редактирования программ и способы ввода команд отно-
сятся к индивидуальным характеристикам и достаточно подробно
SoftCONTBOL изложены во всех без исключения руководствах по применению и
Softing GmbH http: / /www.softing.com/ оперативных подсказках комплексов, чего, к сожалению, нельзя
Фирма Softing — крупный поставщик систем промышленной сказать о смысле и приемах применения самих команд. Поэтому
автоматики. По всей видимости, комплекс SoftCONTROL созда- далее мы рассмотрим более подробно инструментарий и наиболее
вался специалистами фирмы для себя, но благодаря удачному по- яркие общие характеристики комплексов, позволившие им за-
строению перерос в универсальный инструмент. Комплекс имеет нять первые позиции на рынке программного обеспечения ПЛК.
сравнительно аскетический интерфейс. Тем не менее, это не отра-
жается на качестве реализации транслятора и отладочного инст-
рументария. Таким образом, SoftCONTROL более напоминает вы-
3.2. Инструменты комплексов
веренный годами инструментарий опытного автомеханика, чем программирования ПЛК
подарочный набор. Благодаря такому подходу комплекс имеет Главная задача инструментов комплекса программирования
минимальные требования как к ПК, так и к ПЛК. Язык С интег- ПЛК состоит в автоматизации работы разработчика прикладной
рирован в систему и может применяться в пользовательских про- системы. Он должен быть избавлен от рутинной работы и посто-
граммах равноправно МЭК-языкам. янного «изобретения велорипеда». Хорошо организованная среда
программирования сама толкает к созданию надежного, читабе-
iCon-L льного и пригодного для повторного применения кода.
ProSign (Process Design) GmbH http://www.pro-sign.de/ В интегрированных комплексах программирования ПЛК сло-
Строго говоря, iCon-L не является инструментом МЭК 1131 жился определенный набор возможностей, позволяющий отно^
программирования. Этот инструмент базируется на графическом сить их к средствам быстрой разработки. Многие приемы являют-
представлении, функциональных блоков. Содержит элементы, по- ся общими и для систем программирования компьютеров и, веро-
зволяющие создавать последовательные (SFC) диаграммы. Уника- ятно, покажутся вам знакомыми. Сервисные функции систем
льным свойством iCon-L является чрезвычайно развитая возмож- программирования не являются требованием стандарта. Но от
3 6
Глава 3. Инструменты программирования ПЛК Инструменты комплексов программирования ПЛК

полноты набора доступных программисту инструментов сущест-


венно зависит скорость и качество его работы.

3.2.1. Встроенные редакторы Ф + subtraction

Классические (с командной строкой) ассемблеры и компилято- Company mten


| insert function Mock
ры обрабатывают текст файла, содержащего программный мо- 11
дуль, и формируют объектный код. Исходный текст программы Keywords

записывается в любом .текстовом редакторе. Интегрированная


среда предполагает наличие встроенного редактора.
i ^ as

3.2.2. Текстовые редакторы if n o t [ C t x p r o d u c t J t h e n r e t u r n ; end_if;

Интеграция в единую среду программирования предполагает на- if step = 0 then ротображениеЧ


Display := Product:
личие у текстовых редакторов нескольких существенных свойств: step := 1;
• возможность быстрого ввода стандартных текстовых элементов-
Комбинаций клавиш быстрого ввода, или контекстно-зависи-
мые меню команд, предлагают мгновенную вставку в текст one-
Рис. 3.1. Панель быстрого ввода ISaGRAF
раторов, функций, функциональных блоков (см. рис. 3.1). При-
чем речь идет не только о стандартных элементах, но и о со-
зданных программистом в текущем проекте; • автоматическая нумерация строк — упрощает описание и
сопровождение.
возможность быстрого автоматического дополнения ввода
Эти возможности в существенной мере способствуют автомати-
(CoDeSys). Например, строка: «INP1 I 3;Вход 1» по оконча-
зации процесса подготовки программ и способствуй^ уменьше-
ний ввода преобразуется в соответствии с требованиями МЭК: нию числа ошибок в программах.
«INP1: INT := 3; (* Вход 1 *)»;
3.2.3. Графические редакторы
автоматическое объявление переменных. Если при вводе
текста программы вы используете новую переменную, систе- Графические редакторы еще более тесно связаны с контекстом
ма автоматически поместит необходимое описание в разделе конкретных языков. Они должны обеспечивать следующие воз-
объявлений- Тип переменной и начальное значение задаются можности:
в диалоговом окне. В этом помогают меню, весь ввод обычно • автоматическая трассировка соединений компонентов. Про-
выполняется мышью, без помощи клавиатуры; граммисту вообще не приходится рисовать соединения. При
представление раздела объявлений переменных в виде тек- вставке и удалении компонентов система автоматически
ста или картотеки таблиц, разделенных и отсортированных проводит графические соединительные линии (см, рис. 3.2);
по функциональному значению (входные переменные» лока- • автоматическая расстановка компонентов. Местоположение
льные и т. д.); компонента на экране определяется автоматически с учетом
проверка синтаксиса и автоматическое форматирование вво- порядка выполнения. Этим свойством обладают графические
да. Редактор автоматически контролирует введенный текст редактору CoDeSys и OpenPCS. В других представленных в
и выделяет цветом ключевые слова, константы и коммента- книге комплексах программист выбирает местоположение
рии. В результате текст не только легко читается» но иока- компонента вручную, координаты компонента сохраняются
зывается синтаксически проверенным еще до трансляции; при записи проекта (см. рис. 3.3). Команда индикации по-
3 8
Глава 3. Инструменты программирования ПЛК Инструменты комплексов программирования ПЛК 39

рядка выполнения добавляет в изображение компонента по-


рядковый номер (на рис. 3.3, числа в скобках).
автоматическая нумерация цепей;
копирование и перемещение выделенной графической груп-
пы компонентов с учетом их индивидуальной специфики
(рис. 3.4);

- The IEC Piogiamtning System

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

Рис. З.4. Графический редактор функциональных блоковых диаграмм


SoftCONTROL

• произвольное масштабирование изображения с целью наи-


лучшего представления или отдельное окно общего вида.
Для анализа больших разветвленных графических диаграмм
удобно иметь возможность увидеть всю диаграмму или до-
статочно релевантную ее часть целиком (см. рис. 3.5).
В режиме исполнения встроенные редакторы отображают
courier (4)1 • «ожившие* тексты и графические диаграммы (рис. 3.6). При
этом;
• мгновенные значения переменных видны непосредственно в
окне редактора и доступны для изменения;
• активные цепи выделены жирными линиями и цветом. Для
Рис, 3.3. Ручное размещение компонента (ISAGRAF) графических диаграмм наглядно отражается последователь-
ность выполнения.
4 0
Глава 3. Инструменты программирования ПЛК Инструменты комплексов программирования ПЛК 41

3.2.4. Средства отладки


Стандартный набор отладочных функций включает в себя:
• унифицированный механизм соединения с ПЛК. Работа ин-
струментов отладки не зависит от способа соединения конт-
роллера с отладчиком. Не имеет значения, эмулируется ли
контроллер на том же самом компьютере (рис. 3.7), подклю-
чен ли через последовательный порт ПК или даже располо-
жен в другой стране и связан через Интернет;

Sm
i ua
l tor

assign - Stmt

Рис. 3,5. Окна графического редактора FBD и общего обзора infoteam


диаграммы (MULTIPROG) BalRegter
LtReglei SIHT
power supply I process! MoctetlTyp BOO!

power off ModeflTyp


Decrement
Pul8e"=
cycles
SmartSIM 93668

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
1001$ i
Средства импорта и экспорта проектов в другие комплексы
программирования.
Перечисленные выше средства управления проектами позво-
ляют создавать высококачественные проекты с минимумом за- [налнзац
трат времени на это, ' \ - TRUE

3.3. Комплекс CoDeSys


Комплекс CoDeSys разработан фирмой 3S (Smart Software So- Рис, 3.9. Фрагмент визуализации конвейера & CoDeSys
lutions). Это универсальный инструмент программирования конт- •

роллеров и встраиваемых систем на языках МЭК 61131-3, не при-


• Встроенный эмулятор контроллера позволяет проводить отлад-
вязанный, к какой-либо аппаратной платформе и удовлетворяю-
ку проекта без аппаратных средств. Причем эмулируется не
щий современным требованиям быстрой разработки программно-
го обеспечения (рис. 3.9). некий абстрактный контроллер, а конкретный ПЛК с учетом
аппаратной платформы- При подключении реального контрол-
Ядро системы исполнения CoDeSys написано на языке С. Су-
лера (режим online) отладчик работает аналогичным образом.
ществует несколько модификаций оптимизированных для раз-
личных микропроцессоров (включая PC-совместимые). Для при- • Встроенные элементы визуализации дают возможность со-
вязки к конкретному ПЛК требуется адаптация, касающаяся здать модель объекта управления и проводить отладку про-
низкоуровневых ресурсов — распределение памяти, интерфейс екта без изготовления средств имитации. Существует «опе-
связи и драйверы ввода-вывода. рационная» версия CoDeSys. Это компактное приложение,
Среди особенностей данного пакета можно отметить следую- выпблнякИцее только визуализацию» без средств разработки.
щее. Во многих простых случаях нет необходимости приобретать
• Прямая генерация машинного кода. Генератор кода CoDe- отдельно SCADA-систему. Серверы данных (DDE и ОРС) так-
Sys — это классический компилятор, что обеспечивает очень же входят в стандартный пакет поставки.
высокое быстродействие программ пользователя. • Очень широкий набор сервисных функций, ускоряющих ра-
• Полноценная реализация МЭК-языков, в некоторых случаях боту программиста.
даже расширенная. • В настоящее время создано более 150 адаптации комплекса
• «Разумные» редакторы языков построены таким образом, CoDeSys: Фирма 3S не скрывает своих клиентов. Все они от-
что не дают делать типичные для начинающих МЭК про- крыто взаимодействуют друг с другом и совместно работают
граммистов ошибки. над совершенствованием программного инструментария.
4 8 Глава 3. Инструменты программирования ПЛК Строение комплекса CoDeSys 49
Рабочее место программиста ПЛК
Наиболее интересные решения и опыт применения обсужда-1
ются на ежегодном семинаре и учитываются в новых верси-
ях пакета. Благодаря этому и, безусловно, наличию хорошей Шлюз
команды разработчиков и грамотного руководства, пакет связи
Q D
развивается исключительно динамично.
• Для CoDeSys доступен адаптированный русский перевод до-
кументации, выполненный ПК «Пролог* (см. Интернет-ссыл- Интегрированная среда Система исполнения
ки в конце книги).
В последние годы фирма 3S предпринимает весьма успешные Рис. 3.10. Соединение интегрированной среды программирования с ПЛК
усилия для интегрирования различных инструментов в одном па-
кете (конфигуратор распределенных систем, специализированный
модуль управления перемещением, графический логический ана-
лизатор, система управления версиями и др.)* Определение сис-
Tocahost via Tcp/lp
тем класса CoDeSys как инструментов программирования ПЛК
является, безусловно, слишком скромным.
COM2
9SG0
No
3.4. Строение комплекса CoDeSys
Базовый состав комплекса программирования ПЛК состоит из
г

двух обязательных частей: системы исполнения и рабочего места


программиста. Система исполнения функционирует в контролле-
ре и, кроме непосредственно исполнения управляющей програм-
мы, обеспечивает загрузку кода прикладной программы и отла-
дочные функции. Естественно, система исполнения должна иметь
связь с компьютером рабочего места программиста. Как физиче-
ски организована связь ПК и ПЛК, не столь важно. В простей-
шем случае ПЛК подключается к компьютеру через стандартный
Рис. 3.11. Настройка коммуникационных параметров (CoDeSys)
com-порт (RS232) нуль-модемным кабелем. В условиях цеха мо-
жет использоваться более помехоустойчивый и дальнобойный ин- По умолчанию шлюз связи настроен на локальную работу (local
терфейс (RS422, RS485 или токовая петля).
host) и запускается автоматически при установлении связи с ПЛК
В комплексе CoDeSys посредником между средой разработки и
из интегрированной среды. Для соединения с ПЛК через
ПЛК служит специальное приложение — шлюз связи (gateway).
com-порт достаточно только настроить параметры драйвера ин-
Шлюз связи взаимодействует с интегрированной средой через'
Windows сокет-соединение, построенное на основе протокола терфейса (рис. 3.11) в соответствии с руководством по примене-
TCP/IP. Такое соединение обеспечивает единообразное взаимодей- нию ПЛК (порт, скорость, контроль паритета и число стоп-бит).
ствие приложений, работающих на одном компьютере или в сети В состав любого комплекса обязательно входит руководство по
(рис. ЗЛО). Благодаря этому программист может абсолютно полно- применению и электронная справочная система- Ассортимент до-
ценно работать на удаленном компьютере. Причем удаленность не полнительных приложений CoDeSys включает серверы данных
ограничивается рамками локальной сети. ПК, выполняющий зада- (DDE, OPC), утилиты конфигурирования комплекса, средства
чу шлюза связи, может одновременно взаимодействовать с ПК про- управления проектами и версиями, тестовые инструменты, специ-
граммиста через Интернет и с ПЛК через модемное соединение. ализированные библиотеки функций и функциональных блоков.
Элементарные тины данных 51

цессор выполняет сложение двух 16-разрядных значений одной


командой. Сложение же двух значений 32-разрядных перемен-
ных — это подпрограмма из нескольких команд.
Дополнительные задержки могут образовываться за счет муль-
Глава 4. Данные и переменные типлексирования шины данных, связывающих процессор и па-
мять, особенностей микросхем памяти и т* д. В общем случае, ме-
Прежде чем переходить к непосредственно изучению ньшие по диапазону представляемых значений типы переменных
МЭК-языков, необходимо познакомиться с общими элементами требуют меньше памяти, меньше кода, и вычисления с их участи-
этих языков. Общие элементы служат единым фундаментом, по- ем выполняются значительно быстрее-
зволяющим объединить многоязычные компоненты в одном про-
екте. В главе будут рассмотрены данные, с которыми способен ра- Типы данных МЭК разделяются на две категории — эле-
ботать стандартный ПЛК, форматы их представления и наиболее ментарные и составные. Элементарные или базовые типы яв-
общие приемы и тонкости работы с ними. ляются основой для построения составных типов. К составным
типам относятся перечисления, массивы, структуры, массивы
структур и т. д.
4.1. Типы данных
Тип данных переменной определяет род информации, диапа- 4.2. Элементарные типы данных
зон представления и множество допустимых операций. Языки
МЭК используют идеологию.строгой проверки типов данных. Это 4.2.1. Целочисленные типы
означает, что любую переменную можно использовать только по-
сле ее объявления. Присваивать значение одной переменной дру- Целочисленные переменные отличаются различным диапазо-
гой можно, только если они обе одного типа. Допускается также ном сохраняемых данных и, естественно, различными требовани-
присваивание значения переменной совместимого типа, имеющей ями к памяти. Подробно данные характеристики представлены в
более широкое множество допустимых значений. В этом случае следующей таблице.
происходит неявное преобразование типа без потерь. Неявные
преобразования типов данных с потерями запрещены. Так, на- Нижний Верхний Размер,
пример, логическую переменную, способную принимать только Тип
предел предел в байтах
два значения (логические 0 и 1), можно присвоить переменной
типа SINT (-128...+127), но не наоборот. BYTE 8 бит 1
i
При трансляции программы все подобные попытки отслежива- WORD 16 бит 2
ются и считаются грубыми ошибками. Если же это действительно
необходимо, то выполнить присваивание с потерями возможно, DWORD 32 бита 4
но только при помощи специальных операторов. Операторы пре- LWORD 64 бита 8
образования в МЭК выполняют также и более сложные операции,
например преобразование числа или календарной даты в тексто- SINT -128 127 1
вую строку, и наоборот.
INT -32768 32767 2
Наибольшее разнообразие типов данных в стандарте преду-
смотрено для представления целых Чисел, Смысл применения ши- DINT _231 231-1 4
рокого спектра целочисленных переменных заключается в пер-
вую очередь в оптимизации кода программы. Скорость вычисле- LINT -2вз 2вз-1 8
ний зависит от того, как микропроцессор оперирует с переменны- USINT 0 255 1
ми данного типа. Так, вполне очевидно, что 16-разрядный про-
5 2 Глава 4. Данные и переменные Элементарные типы данных 53

'^
—»— • •

Нижний Верхний Размер, При начальной инициализации целочисленные переменные


Тип в байтах получают нулевые значения. Если необходимо задать другие на-
предел предел
i III •

чальные значения, это можно сделать непосредственно приобъяв-


UINT 0 65535 лении переменной.
i ^ Г ^ В - П I •I •
1T1c»fIIcf мТиРи* 4i •• Л • H"i ^»^»^^^^^^^^^»-I ^
2

i •• • — • •

UDINT 0 ' 232-1 4


Примеры:
• •••••» и i l l гт

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. Данные и переменные Элементарные типы данных

кунды стоят первыми, то их значение может быть и большим.


По определению BOOL — это строка из одного бита, но из со- Смысл этого правила состоит в том, что если вы хотите выражать
ображений эффективности кода при автоматическом распределе- интервал, например, исключительно в секундах — пожалуйста.
нии памяти транслятором под битовую переменную выделяется, Но если вы задействуете минуты, то для единообразия представ-
как правило, 1 байт памяти целиком. Переменные типа BOOL»? ления, секунды обязаны соблюдать принятые «правила суборди-
связанные с дискретными входами-выходами или определенные с нации» .
прямым битовым адресом, действительно физически представле-.
ны одним битом. TIME1 := t#lm65s; (•ошибка*)
TIME1 :=T#125s; (*правильно*)
4.2.3. Действительные типы
Младший элемент можно представить в виде десятичной дроби:
Переменные действительного типа REAL представляют дей-
88
ствительные числа в диапазоне ilO* . Из 32 бит, занимаемых TIME1 : - T#1.2S; (*равносильноТ#1з200тз*)
числом, мантисса занимает 23 бита. В результате точность пред-
ставления приблизительно составляет 6 — 7 десятичных цифр; 4.2.5. Время суток и дата
Длинный действительный формат LREAL занимает 64 бита.
Число содержит 52-битовую мантиссу. Точность представлений Типы переменных, выражающие время дня или дату, пред
приблизительно составляет 15 — 16 десятичных цифр. Диапазон ставляются в соответствии с ISO 8601.
807
чисел длинного действительного 11O* .
Числа с плавающей запятой, записываются в формате с точ- Короткое Начальное
Тип обозначение значение
кой: 14.0, -120.2, 0.33__ или в экспоненциальной форме: -1.2ЕЮ,
3.1е7. DATE D 1 января 1970г.
- TIME_OF_DAY TOD 00:00
4.2.4. Интервал времени 00:00 1 января 1970г.
Переменные типа TIME используются для выражения интер- DATE_AND_TIME DT
валов времени. В отличие от времени'суток (TIME_OF_DAY) вре-
менной интервал не ограничен максимальным значением в Дата записывается в формате *год»—«месяц ь-—«число».
24 часа. Время записывается в формате «часы»:«минуты»:«секунды».«со-
Числа, выражающие временной интервал, должны начинаться тые». Дата определяется ключевым словом DATE# (сокращенно
с ключевого слова ТШЕ# или в сокращенной форме Т#. В общем D#), время дня TIME_OF_DAY# (сокращенно TOD#), дата и
случае представление времени составляется из полей дней (d), ча- время DATE_AND_TIME# (сокращенно DT#).
сов (h), минут (т), секунд (s) и миллисекунд (ms). Порядок пред-
ставления должен быть именно такой, хотя ненужные элементы DATE#2002-01-31 или D#2002-01-31
можно опускать. Для лучшего зрительного восприятия поля до- TIME_OF_DAY#16:03:15.47 или TOD#16:03:15.47
пускается разделять символом подчеркивания. Например:
DATE_AND_TIME#2002-01-31-16:03:15.47^H
VAB DT#2002-01-31-16:03:15.47
TIME1: TIME := t#10h_14m_5s;
Все три типа данных физически занимают 4 байта (DWORD)ij
END_VAK Тип TOD содержит время суток в миллисекундах начиная с 0 ч;"™
Старший элемент может превышать верхнюю границу диапа- сов. Типы DATE и DT содержат время в секундах начиная с 0 "*
зона представления. Так, если в представлении присутствуют дни сов 1 января 1970 года.
или часы, то секунды не могут превышать значения 59. Если се-
5 6
Глава 4. Данные и переменные Пользовательские типы данных 57

4.2.5. Строки 4.2.6. Иерархия элементарных типов


Тип строковых переменных STRING определяет переменные, Приведенная ниже иерархия элементарных типов применяет-
содержащие текстовую информацию. Размер строки задается при ся исключительно для удобства описания программ. Каждое наи-
объявлении. Например, объявление строки strl, вмещающей д& менование ANY_... объединяет некоторое множество типов. Так,
20 символов, и str2 — до 60 символов: при описании любой битовой операций удобнее указать, что она
применима для ANY_BIT, чем перечислять всякий раз допусти-
VAR мые элементарные типы. Применять ANY_ при объявлении пере-
s t r l : STRING(20); менных, конечно, нельзя.
str2: STRING(60) := 'Протяжка';
END.VAR ANY INT SINT, INT, DINT, LINT, USINT,
ANY ANY NUM
Если начальное значение не задано, то при инициализации бу- UINT, UDINT, ULINT
дет создана пустая строка. ANY REAL REAL, LREAL
Количество необходимой памяти определяется заданным при ANY BIT BOOL, BYTE, WORD DWORD,
объявлении размером строки. Для типа STRING каждый символ LWORD
занимает 1 байт (WSTRING 2 байта). Строковые константы зада-
ются между одинарных кавычек: STRING
TIME
strl := 'Полет нормальный';
ANY DATE DATE, TIME_OF_DAY,
При необходимости помещения в строку кода, не имеющего DATE AND TIME
печатного отображения, используется знак ($) и следующий за
ним код из двух цифр в шестнадцатеричной системе счисления.
Для распространенных управляющих терминальных кодов мож- 4.3. Пользовательские типы данных
но применить следующие сокращения. ч

Описание пользовательских типов данных (кроме массивов)


должно выполняться на уровне проекта (в CoDeSys на вкладке
Обозначение Код
«Типы данных» — «Организатор Объектов»), Объявление типа
$$ Знак доллара всегда начинается с ключевого слова TYPE и заканчивается стро-
кой END TYPE.
$• Одиночная кавычка
$L или $1 Перевод строки 4.3.1. Массивы
$N или $п Новая строка Массивы представляют собой множество однотипных элемен-
тов с произвольным доступом. Массивы могут быть многомерны-
$Р или $р Перевод страницы
ми. Размерность массива и диапазоны индексов задаются при
$R или $г Разрыв строки объявлении (см. пример задания трехмерного массива):
$Т или $t Табуляция <Имя массива>:ARRAY
OF <mun элемента>;
где HI, 112, ИЗ указывают нижние пределы индексов; hil, Ы2 и
ЫЗ — верхние пределы. Индексы должны быть целого типа и
Глава 4. Данные и переменные Пользовательские типы данных 59
5 8

только положительные, отрицательные индексы использовать 4.3.2. Структуры


нельзя. Структуры предназначены для создания новых типов данных
Примеры объявления массивов: на основе элементов разных базовых типов. С переменной типа
XYbass: ARRAY [1..10,1..20] OF INT; структура можно обращаться как с единым элементом» передавать
TxtMsg: ARRAY [0..10] OF STRINGK32); в качестве параметра, создавать указатели» копировать и т, д.
Massl: ARRAY [1..6] OF SINT : - 1,1,2,2,2,2; В отличие от массивов структура действительно вводит новый
Mass 2: ARRAY [1..6] OF SINT := 1,1,4(2); тип данных. Это означает, что до применения конкретной пере-
менной нужно выполнить как минимум два объявления. Сначала
Два нижних примера показывают, как можно выполнить ини- нужно описать структуру* Описание структуры происходит глоба-
циализацию элементов массива при объявлении. Оба примера со- льно, на уровне проекта. Описанная структура получает иденти-
здают одинаковые массивы. В первом примере все начальные зна^ г

фикатор(имя структуры). Но это еще не переменная, это новый


чения приведены через запятую. Во втором примере присутствуем
тип данных. Теперь, используя новый идентификатор, нужно
сокращение N(a,b,c), которое означает — повторить последова-
объявить одну или сколько угодно переменных, точно так же,
тельность а, Ь, с N раз. Многомерные массивы инициализируют-
как и для базовых типов. Только теперь переменная нового тина
ся построчно:
получает «телесную оболочку» или, иными словами, конкретное
Mass2d: ARRAY [1..2Д..4] OF SINT :== 1,2,3,4,5,6,7,8; : место в памяти данных.
Результат инициализации Mass2d показан на рис. 4.1. Объявление структуры должно начинаться с ключевого слова
STRUCT и заканчиваться END_STRUCT. Синтаксис объявления
[• так:
TYPE <Имя_структуры>:
Мв*шЭД1,2]<-2
3
STRUCT
«Объявление переменной 1>

<Объявление переменной п>


Рис. 4.1. Результат Начальной инициализации массива Mass2d END_STRUCT
END_TYPE
Для доступа к элементам массива применяется следующий
синтаксис; Пример объявления структуры по имени Trolley:
<Имя_массива>[Индекс1,Индекс2,ИпдексЗ] TYPE Trolley:
STRUCT
Для двухмерного массива исдользуются два индекса. Для од-
номерного» очевидно, достаточно одного. Например: Start: TIME;
Distance: INT;
XYbass[2,12] : -
Load, On: BOOL;
i ; - S T R _ T O j N T ( T x t M s g [ 4 ] ) ;
Articl: STRING(16);
Если это не принципиально, используйте в массивах нумерацию
END_STRUCT
с 0. В этом случае вычисление физического адреса элемента при ис-
полнении проще. В результате код получается несколько короче. END TYPE
6 0
Глава 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

4.3.4. Ограничение диапазона Далее везде в программе вы используете тип TEMPERATURA


при объявлении переменных. Если вдруг понадобится изменить
Тип переменных с ограниченным диапазоном значений позво- тип температуры на INT, то это легко и быстро можно будет еде*
ляет определить допустимое множество значений переменной. лать в одном месте-
Объявление типа переменной с ограниченным диапазоном должно Аналогичные псевдонимы типов удобно создавать для лю-
происходить непосредственно между ключевыми словами TYPE и бых часто используемых в программе типов- Например, для
ENDJTYPE: массивов или других типов, имеющих длинное и невыразитель-
ное определение.
TYPE <Имя> :
<Целый тип> (<от>..<до>) 4.3.6. Специфика реализации типов данных CoDeSys
ENDJTYPE Стандарт только определяет совместимые типы данных, но не
требует обязательной поддержки всех типов для всех реализаций
Например: систем МЭК-программирования. CoDeSys имеет наиболее полную
TYPE DAC10: , поддержку стандартных типов. Но даже он в настоящее время
(версия 2.2) не поддерживает 64-разрядные целые и текстовые
INT(0..16#3FF);
строки Unicode.
END_TYPE :
Кроме того, ограничение поддерживаемых типов данных воз-
Применение переменной с ограничением диапазона покажем, можно даже в рамках одного комплекса программирования для
на примере: разных контроллеров. Так, восьмиразрядный генератор кода Co-
DeSys не поддерживает действительные переменные, перечисле-
VAR ния и переменные, выражающие время суток и календарную
dac: DAC10; дату. Ограничение поддержки типов диктуется достижением ми-
ENDJVAR нимальной стоимости при максимальной эффективности ГО1К
dac := 2000; различных категорий. Так, полная реализация ядра системы ис-
полнения CoDeSys (включая отладочные функции и трассировку
При попытке трансляции данного примера возникает законная значений переменных) для Intel 8051 совместимого микроконт-
ошибка: роллера требует всего 6 Кб памяти кода. Естественно, что и код
E r r o r : Type mismatch: Cannot convert Л 2000' to прикладной программы должен быть максимально компактным,
V для чего приходиться идти на определенные компромиссы. Но
INT(O..1023)'.
при необходимости любые специализированные типы данных
можно определить на базе элементарных типов и поддержать при
4.3.5. Псевдонимы типов помощи библиотек,
Проблема выбора додходящего типа данных не всегда решает- В CoDeSys нет ограничения на способ применения битовых
ся легко. Допустим, вы работаете с температурой, замеренной строк. В результате типы BYTE, WORD и DWOKD можно приме-
16-разрядным АЦП. Может ли быть температура только выиз нять в операциях, требующих целых без знака (USINT, UINT и
нуля ИЛИ когда-либо потребуется работать в отрицательной облас- UDINT), но не наоборот.
ти, еще не совсем очевидно. В одном случае нужно использовать Внутренний формат переменных типа TIME стандартом не
тип переменных UINT, а в другом — INT. Здесь удобно опреде ограничен. В CoDeSys интервалы времени хранятся в переменной
лить новый тип данных: типа DWORD в миллисекундах, что обеспечивает представление
i Ч интервалов почти 50 суток.
T Y P E T E M P E R A T U R A : U I N T ;
Если длина строки STRING при объявлении не указана, то
E N D T Y P E принимается значение по умолчанию — 80 символов. В CoDeSys
6 4
Глава 4. Данные и переменные I Переменные

используются нультерминированные (как в С-компиляторах) обычно применяется символ подчеркивания. Символ подчеркива-
строки- То есть под строку всегда заранее выделяется область па* ния является значимым. Так имена '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 " " " • ' лемой, компилятор CoDeSys имеет специальный флажок, прину-
Символ Область памяти дительно включающий байтовую адресацию для всех типов.
нет Бит В каждой области памяти адресация элементов начинается с
нуля. Физическое размещение прямо адресуемых областей в ОЗУ
X Бит определяется конфигурацией контроллера. Очевидно, что сопо-
ставление идентификаторов переменных прямым адресам являет-
— * — — — - ^ — • ^ - ~ * "
-*•*- . f : '

Глава 4. Данные и переменные Переменные


6 8 69

ся делом, требующим большой аккуратности. Поэтому для слож- VAR


ных модульных контроллеров применяются специальные фир- a: WORD;
менные конфигураторы, подключаемые к оболочке комплекса bStop AT %IX64.3: BOOL;
программирования и позволяющие графически «собрать» ПЛК и
END VAR
определить все необходимые интерфейсные переменные.
Входы ПЛК — это переменные с прямыми адресами в облас- a := 0;
ти I. Они доступны в прикладных программах только по чтению. a.3 : = 1; (*или a.3 := TRUE; — результат 2#0000_1000*)
Выходы Q — только по записи. Переменные в области М доступ- a.18 : ^ TRUE; (•ошибка* в WORD не может быть бит а. 18*)
ны по записи и чтению* IF a.15 THEN ('''а меньше нуля?*)
В области памяти М размещают обычно переменные, которые
нельзя однозначно отнести к входам или выходам. Это могут
4.4.5. Преобразования типов
быть диагностические ресурсы модулей, параметры системы ис-
полнения и т. д. Преобразование типов происходит при присваивании значе-
Прямые адреса можно использовать в программах непосредст- ния переменной одного типа переменной другого типа. Преобра-
зование меняет физическое представление значения в памяти
венно: данных, но не должно изменять само значение. Если это невоз-
IF %IW4 > 1 THEN (•Значение входа IW4*) можно, то преобразование приводит к частичной потере данных.

Но в таком случае транслятор требует явного указания необходи-
Тем не менее все же желательно компактно сосредоточить в мости выполнения такой операции.
проекте все аппаратно-зависимые моменты* Рассмотрим сначала работу с целыми числами. Пусть, на-
Обратите внимание, что прямая адресация позволяет размес- пример, объявлена переменная siVar типа короткое целое
тить несколько разнотипных переменных в одной и той же памя*; (SINT 8 бит) и переменная iVar типа целое (INT 16 бит). Допус-
ти. Например, специально для быстрого обнуления 16-дискретных тим siVar = 100, a iVar = 1000. Выражение iVar := siVar являет-
выходов (BOOL) можно использовать переменную типа WORD. ся вполне допустимым, поскольку числа типа SINT являются
Или, например, совместить переменную STRING и несколько пе- подмножеством INT (iVar примет значение 100). Здесь преобра-
ременных типа BYTE, что даст возможность организовать форма* зование типа будет выполнено транслятором автоматически, без
тирование вывода без применения строковых функций. Посколь* каких-либо дополнительных указаний. Обратное присваивание
ку физическое распределение адресов известно на этапе трансляЗ siVar:= iVar приведет к переполнению и потере данных. Заста-
ции, компилятор формирует максимально компактный код дли вить транслятор выполнить преобразование с вероятной поте-
таких объединений, чего не удается достичь при работе с элемент рей данных можно только в явной форме при помощи специа-
льного оператора siVar :— INT_TO_SINT(iVar). Результат равен
тами массива, где требуется динамическая адресация.
24 (в шестиадцатеричной форме 1000 это 16#03Е8 и только
младший его байт перейдет в SINT, значение 16#Е8 соответст-
4.4.4. Поразрядная адресация вует десятичному числу 24).
В стандарте предусмотрена удобная форма работы с отдельны- Аналогичная ситуация возникает при работе с действительны-
ми битами переменных типа битовых строк — поразрядная адре- ми числами длинного LREAL и короткого REAL типов.
сация. Необходимый бит указывается через точку после иденти- Операторы явного преобразования базовых МЭК-типов образу-
фикатора. Аналогичным образом можно использовать отдельные ют свои наименования из двух частей. Вначале указывается «ис-
ходный тип», затем « Т О _» и «тип результата». Например:
биты прямоадресуемой памяти. Младшему биту соответствует ну-
левой номер. Поразрядная нумерация не должна превышать гра- si := INT_TO_SINT(16#55AA); (* Результат 16#AA*)
ницы соответствующего типа числа. v si := TIME_TO_SINT(T# 120ms); (*Г20*)
, . " • >

Глава 4. Данные и временные ] ToH(coctH в ы ч и с л е я и й


71
7 0

i : - REAL_TO_INT(2.7); («Результат З*) ЬуХ: USINT := 255;


i := TRUNC(2.7); («Результат 2*)
ЬуХ : - ЬуХ + 1; (•результат 0*)
t := STRING_TO_TIME('T#216ms'); (*Результат Т#Ц6ms*)
- г ЬуХ := ЬуХ + 1; (•результат 1 •)
Операция TRUNC выполняет отбрасывание дробной части в ЬуХ := ЬуХ - 2; (•результат 255*)
отличие от преобразования REAL_TO_INT, выполняющего округ-
ление. На самом деле переполнение приводит к обнулению перемен-
Обратите внимание, что операции преобразования допусти: ;5 ной и не вызывает ошибки: МАХ + 1 = 0. При вычитании проис-
для любых комбинаций базовых типов, а не только для совмес1 ходит аналогичное превращение: 0 - 1=МАХ. При внимательном
мых типов (например, дату в строку). Так, преобразован^ изучении полученных результатов мы можем заметить своего
<..>_TO_STRING фактически заменяют оператор PRINT, pacni рода симметрию относительно нуля. Получается, что алгебраиче-
страненныЙ в языках общего применения. ; ское равенство (а + Ь) - b = а справедливо, даже если сумма а + b
вызывает переполнение. Дистрибутивный закон (а - Ь) с •» ас - be
В конкретной реализации отдельные преобразования могут не также работает:
поддерживаться или иметь определенные особенности, в первую
очередь это относится к преобразованиям строк в другие типы и a, b, c:USINT;
обратно. Поэтому мы не будем здесь приводить подробные описа-
ния всех возможных преобразований. При необходимости исполь- а := 100;
зуйте руководство по применению системы программирования := 50;
или оперативную справку. с :=
xl : = ( a - b ) * с ; (•результат 150*)
4.5. Тонкости вычислений х2 : - а*с - b * с; (•результат 150*)
Для неспециалистов в области информатики использование Ассоциативный (сочетательный) закон а + (Ь - с) *> (а + Ь) - с
чисел и математических выражений в вычислительной технике вы Можете проверить самостоятельно.
может вызвать удивление. При определенных условиях «язык Получается, что фундаментальные арифметические аксиомы
всех наук» упирается в препятствия, которых в классической маг действуют, не взирая на переполнение, даже если переполнение
тематике нет и быть не может. приведет к тому, что сам результат будет арифметически непра-
При программировании ПЛК наиболее широко применяются! вильным:
логические и целочисленные переменные. Целочисленные типы]
(usint#10O 4- usint#50) * usint#3 - 194;
имеют максимально допустимое верхнее значение. Это понятно,:
поскольку для каждого целого типа в памяти выделяется опреде-i usint#100 * usint#3 + usint#5O * usint#3 = 194.
ленное количество байт. Деление на ноль является недопустимой]
Равенство (a + b)c = ac + be справедливо, хотя правильный
критической ситуацией, вызывающей ошибку микропроцессора,.
результат, конечно, должен быть равен 45Q, а не 194. Фактиче-
Это тоже понятно, поскольку бесконечно большое число не при-]
ски числовая ось для целых типов данных свернута в окруж-
годно для арифметических вычислений. Теперь давайте возьмем
ность, как в часах.
переменную любого целого типа, присвоим ей максимально допу-!
стимое'значение МАХ и прибавим 1, Бытовая логика подсказыва-] В примерах выше были использованы беззнаковые типы дан-
ет, что переменная не изменится. Если в полное ведро добавит] ных, представляющие множество натуральных чисел. Как извест-
одну каплю, то больше уже не станет. Произойдет переполнение^ но, множество натуральных чисел незамкнуто относительно вы-
которое должно вызвать ошибку, как и при делении на ноль.] читания. При вычитании могут образовываться отрицательные
Проверим: числа. При необходимости работы с отрицательными значениями
используются знаковые типы данных, представляющие множест-
7 2 Глава 4. Данные я переменные Тонкости вычислений 73

во целых чисел- При одинаковой разрядности максимальное по- Еще один существенный факт состоит в том, что множество
ложительное число для знаковых типов вдвое меньше (на 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 ,

127 щ 011ИШ x :== a/b + c/d; (*результат О*)


128 -128 1<МЙ_000О x l := (a * d + с * b)/(b * d); (*результат 1*)
а«* ... 4*. В микропроцессорах операция округления сводится к отбрасы-
-—2 ванию дробной части. В результате округленное значение всегда
2 5 4 1Ш_1110
меньше истинного значения. При суммировании округленных
2 5 5
_ _ • »

1111_1111 значений погрешность накапливается. С точки зрения математи-


ки, более корректен метод симметричного округления. Если оста-
Из всего вышеописанного вытекает необходимость учета диа- ток меньше 1/2 » его отбрасывают, если больше — добавляют еди-
пазона возможных значений переменных. Для этого необходимЪ ницу. В нашем примере при симметричном округлении 1/3 = 0, а
внимательно проанализировать формулу вычислений, оптимизм 2/3 = 1, в сумме погрешности компенсировались бы, и результат
ровать и перегруппировать ее при помощи элементарных алгебра- был бы равен 1. К сожалению, симметричное округление сложно
ических преобразований. К счастью, обнаружение ошибок пере- реализуется и поэтому не поддерживается микропроцессорами не-
полнения обычно не вызывает трудности. Ошибочный результат посредственно (см. реализацию ЗТ-функции» выполняющей деле-
никогда не бывает почти правильным. Если есть ошибка в цело- ние с симметричным округлением, в разделе примеров.) При про-
численных вычислениях, то результат» как правило, выглядит граммировании вычислений с дробями о свойстве округления за-
абсолютно невероятным. бывать нельзя.
7 4 Глава 4. Данные и переменные Веш^рская запись

При работе с числами в формате с плавающей запятой макси- Для этого может использоваться специальная запись имей- Пе-
мальное и минимальное (машинный ноль) значения переменных ременных, Впервые такая запись имен была предложена Чарль-
являются абсолютными. Так, при попытке увеличить максималь- зом Симони (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 -Ч

Префикс Назначение переменной


вать вышеописанную систему или разработать свою собственную.
а Составной тип, массив , i
Главное, чтобы принятая система была понятна всем программи-
п Индекс стам — участникам проекта.
Описанные правила образования венгерских имен применяют-
с Счетчик
ся в приведенных ниже примерах. В простых случаях, когда тип
переменной не имеет значения или очевиден, венгерская запись
Для временных переменных можно вообще не утруждать се йе используется.
бя придумыванием имен, а использовать только префиксы. На
пример:
aiSample: ARRAY [1..32] OF INT;
4.7. Формат BCD
c i : I N T ;
Двоично-кодированный десятичный формат представления
FOR ci := 1 TO 32 DO BCD (binary coded decimal) представляет собой числа в позицион-
ной десятичной системе, где каждая цифра числа занимает 4
siSample[ci] :— - 1 ; (*без комментариев*)
бита. Например, десятичное число 81 будет представлено в виде
END FOR 2#1000_0001. Арифметические операции с BCD-числами требуют
К сожалению, некоторые из предложенных префиксов совпа- применения специального математического аппарата, малоэффек-
дают с зарезервированными словами (BY, AT, D, DT, N, ST). При тивны в сравнении с обычным двоичным представлением. Но, с
использовании их в качестве временных переменных вы можете другой стороны, BCD оказывается очень удобным при организа-
добавить порядковый номер или букву алфавита. Например: ции клавиатурного ввода и индикации. Например, функции вы-
вода числа на принтер или даже на сегментный индикатор полу-
ЬуА, ЬуВ, byl, by2: BYTE; ,
чаются тривиальными (одна одномерная таблица на 10 констант).
Структуры и функциональные блоки образуют имена экземп- Для хранения чисел в формате BCD стандарт МЭК предлагает
ляров с включением полного или сокращенного наименования использовать переменные типов ANY_BIT (кроме BOOL, конеч-
типа. Например, tpUpDelay: TP; но). Арифметика BCD-вычислений обычно не поддерживается в
Символ подчеркивания удобно использовать для индикации стандартном комплекте библиотек систем программирования
способа обращения к переменной. Подчеркивание в начале имени ПЛК. В библиотеке утилит CoDeSys реализованы две простые
указывает — только чтение. Идентификаторы переменных, соот- функции BCD преобразования: BCD TO INT и INT TO BCD.
Определение компонента 79

но. В графической форме представления компонент выглядит как


прямоугольник с входами слева и выходами справа. Локальные
(внутренние) переменные компонента недоступны извне и в гра-
фическом представлении не отображаются.
Глава 5. Компоненты организации Благодаря инкапсуляции компоненты успешно решают задачу
программ (POU) структурной декомпозиции проекта. На верхнем уровне пред-
ставления мы работаем с крупными компонентами. Каждый из
Данная глава посвящена компонентам организации программ них выполняет значительную для данного проекта задачу. Лиш-
и продолжает описание общих элементов стандарта. Компоненты ние подробности на этом уровне только мешают пониманию проб-
образуют код прикладного программного обеспечения ПЛК. лемы. Раскрывая вложенные компоненты один за другим, мы мо-
Именно на уровне компонентов доступно совмещение различных жем добраться до самого детального представления.
языков МЭК. В этой главе будут подробно рассмотрены все воз- Готовый компонент всегда можно вскрыть, изучить и попра-
можные компоненты стандарта, способы их определения и испо- вить. Это, конечно, относится только к пользовательским компо-
льзования. В англоязычных документах компоненты организа- нентам и открытым библиотекам. Некоторые стандартные компо-
ции программ сокращенно обозначаются POU — Program Organi- ненты включены в транслятор и не доступны для просмотра и из-
zation Unit. Чтобы не вызывать неоднозначность, мы далее также менения. Это относится и к внешним библиотекам. Внешние биб-
будем использовать эту аббревиатуру. лиотеки реализуются в виде объектного кода при помощи внеш-
них средств, например компилятора С или ассемблера. Возможно
. • . - даже, что компонент реализован не только программно, а исполь-
5.1. Определение компонента зует вспомогательные аппаратные средства, например часы реаль-
ного времени или математический сопроцессор.
Компоненты организации программ являются базовыми эле- Еще одной задачей, решаемой компонентами, является лока-
ментами, из которых строится код проекта. Аналогичным обра- лизация имен переменных. Это означает, что в различных компо-
зом электронные устройства составляются обычно из модулей. нентах можно использовать повторяющиеся имена. Так, напри-
Например, магнитофон содержит: усилители записи и воспроиз- мер, любимую переменную с оригинальным идентификатором
ведения, генератор подмагничивания и стирания, блок питания «X» можно использовать в каждом компоненте, и всякий раз это
и т. д. Каждый компонент программы имеет собственное наиме- будет новая переменная. Область видимости локальных перемен-
нрвание, определенный интерфейс и описание на одном иа ных определяется рамками одного компонента. Конечно, можно
МЭК-языков. Один компонент может вызвать другие компонен- все переменные проекта объявить глобальными. Модификация и
ты. Вызов самого себя (рекурсия) в стандарте МЭК не разрешена. отладка подобных проектов вызывает такие же ощущения, как
Комбинировать различные языки в одном проекте можно при распутывание «бороды» из лески на удочке во время клева. Огра-
описании различных компонентов, но отдельный компонент це- ничение области видимости является обязательным во всех совре-
ликом реализуется на одном языке МЭК. При вызове компонента менных системах программирования.
язык его реализации значения не имеет.
Экземпляры функциональных блоков, объявленные внутри
К компонентам организации программ в МЭК-стандарте отно- других компонентов, также обладают локальной областью види-
сятся функции, функциональные блоки и программы. Все они во мости. Программы и функции всегда определены глобально.
многом похожи, но имеют определенные особенности и различное
назначение. 5.1.1. Объявление POU
Компонент обладает свойством инкапсуляции — работает как
«черный ящик», скрывая детали реализации. Для работы с ком- Реализации любого POU всегда должен предшествовать раздел
понентом достаточно знать его интерфейс, включающий описание объявлений. Объявления функции, функционального блока и про-
входов и выходов. Внутреннее его устройство знать необязатель- граммы начинаются соответственно с ключевых слов FUNCTION,
8 0 Глава 5. Компоненты организации программ (POU) Определение компонента

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).

Функция — это программный компонент, отображающий мно- MUX

жество значений входных параметров на выход. Функция всегда Х1 —


-
возвращает только одно значение. При объявлении функции ука-
зывается тип возвращаемого значения, имя функции и список Х2 —
входных параметров. Вызов функции производится по имени с
указанием значений входных параметров. Функция может испо- Рис. 5.1. Графическое отображение вызова функции
8 4 Глава 5, Компоненты организации программ (POU) Глава 5. Компоненты организации программ (POU) 85

Некоторые функции могут иметь равноценные параметры, тог- AND AND


да их порядок очевидно безразличен. Например: Х1 ——

у := МАХ(х1, х2); (*Возвращает наибольшее иззначений Х2 — ХЗ —

входных параметров*)
у := МАХ(х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рый \ 'день'); ность. В текстовых языках расширение производится добавлени-
или: ем переменных в конец списка параметров:

stHello := ДО№АТ('Добрый % 8ТК2:=*день'); у := MUX(x_n, x l , х2, хЗ, х4, х5);


Если в программе уже определена переменная с именем, сов- По, причине сложности реализации транслятора переменное
падающим с наименованием входного параметра (STR1 := 'Доб- число параметров в пользовательских функциях не используется.
рый';)» вызов может вызывать недоумение:
stHello := CONCAT(STR1:-STR1, STR2:=^eHb'); 5.2.4. Операторы и функции
Операторы — это символы определенных операций. Но их

На самом деле тут все правильно: слева от знака присваива-


ния — параметр функции, справа — переменная. можно определить и как функции, наделенные определенными
привилегиями. Во-первых, код для операторов транслятор созда-
Описанный способ вызова функции предполагаем возможность
ет сам и не требует подключения каких-либо библиотек* Во-вто-
задавать параметры в произвольном порядке и опускать некото- рых, многие операторы имеют особые формы записи в выражени-
рые из них. Текущая версия CoDeSys не обеспечивает функциям ях ST. Например, математические операторы (сложение, вычита-
такую возможность. Единственный смысл такой нотации — в ние, умножение и деление) имеют традиционное символьное
универсальности, приемлемой для функциональных блоков и представление в текстовых языках (+, - , *, / ) . В графических
программ. языках операторы выглядят как обычные функции.
, Передача параметров функции всегда происходит путем копи-
рования. При любом способе вызова функция получает локаль- В принципе, можно обходиться без символьного представле-
ные копии значений переменных. ния операторов. Например:
Y := SUB(MUL(4,x),3);
5.2.3. Функции с переменным числом параметров
• Но символьное представление в ST выглядит значительно лучше:
Для многих функций трудно предугадать, сколько значений
нужно будет обработать в конкретном случае. Например, для Y := 4 * х - 3;
функции AND можно ограничиться двумя входами и использо- Математики пишут еще короче:
вать «лесенку» вызовов функций для обработки большего числа
переменных (рис. 5.2). = 4x-3.
86 Глава 5, Компоненты организации программ (POU) Функции
87

Все три записи равноценны по смыслу- Символьные выраже- pattern, i n l , i n 2 : INT;


ния понятнее и дают возможность более сконцентрироваться на END VAR
сути выражения, а не на форме его представления.
На языке ST тело функции будет таким:
При работе с операторами необходимо обращать внимание на на-
личие символьной формы представления. Так, для математических IF ABS(inl - pattern) < ABS(in2 - pattern) THEN
и логических операторов в языке ST» как. правило» допускается толь- Nearby_int := i n l ;
ко символьное представление. Выражение Y := AND(xl, x2) вызовет ELSE
ошибку компиляции. Необходимо писать так: Y :*=xl AND x2;. Ес-
Nearby_int := in2;
ли оператор не имеет символьного представления, то на него рас-
пространяются обычные правила вызова функций. Например: END__IF
у := SQRT(x);. Локальные переменные в данном примере не использованы,
Обратите внимание» что имена входных параметров для опера- соответственно секция объявлений VAR.i(END_VAR отсутствует.
торов в описании не заданы. Это означает, что вызывать такие На языке IL этот алгоритм можно выразить так:
функции в ST можно только перечислением параметров,
L LD in2

5.2.5. Перегрузка функций и операторов SUB г


pattern
A B S

Существует достаточно много функций, имеющих смысл для


tmp
переменных разного типа. Например, функция МАХ возвращает
S T

наибольшее из входных значений. Очевидно, что код команд L D


inl

микропроцессора, оперирующих с переменными типа SINT и S U B


pattern
REAL, должен быть разным, но с точки зрения языков МЭК это A B S

одна и та же функция. Автоматическая генерация разного кода L T


tmp
для одной функции в зависимости от типов переменных называ-
ется перегрузкой. Реализация перегрузки пользовательских функ-
N O T

ret_in2
ций сложна для трансляции и спорна. Перегрузка операторов J M P C

прозрачна для компилятора с точки зрения контроля типов. В по- L D


inl

льзовательских функциях это может приводить к сложно локали- S T


Nearby_int
зуемым ошибкам. R E T

Многие стандартные функции и операторы поддерживают пе- r e t _ i n 2 :

регрузку. Тип самой функции определяется требованием совмес- L D


in2
тимости с входными типами. Так, для функции МАХ с входными S T
Nearby_int
параметрами типа INT выход будет типа ШТ.
Здесь использована гфомежуточн; переменная tmp9 которую
необходимо объявить:
5.2.6. Пример функции
Рассмотрим пример функции целого типа Nearby_int7 возвра- VAR
щающей ближайшее к образцу pattern значение из двух входных tmp:INT;
inl и in2. END_VAR
Объявление: Аналогичную AVHKHI *m в FRD vn
FUNCTION Nearbyjnt : INT нием бинарного мультиплексора. Такой пример представлен на
VAR INPUT рис. 5.4,
Глава 5. Компоненты организации программ (POU) Функции 89
8 8

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.3. Вызов экземпляра блока


Экземпляр 3 Вызывать экземпляр функционального блока с перечислением
параметров, как функцию, нельзя. Значения входных перемен-
ных должны присваиваться непосредственно. В текстовых язы-
ках входные переменные перечисляются в скобках, после имени
Распределение памяти для экземпляров функциональных экземпляра. Присваивание входных значений выполняется опе-
Рис. 5-6.
блоков рацией ' : = ' .
На языке ST:
ние экземпляра стандартного функционального блока «инкремен-
ctuTimeMeter (RESET := FALSE);
тный счетчик* с идентификатором ctuTimeMeter выглядит так:
На языке IL:
ctuTimeMeter: CTU;
CAL ctuTimeMeter(RESET := FALSE)
Очевидно, что создавать экземпляры можно только для извест- Специальный символ *=>* позволяет получить значения выхо-
ных системе блоков* Это библиотечные блоки или блоки» ранее дов после выполнения блока:
реализованные пользователем. С точки зрения транслятора, со-
здание экземпляра означает выделение необходимой памяти для ctuTimeMeter (RESET := FALSE, CU := Inpl, CV => x);
размещения переменных блока. При вызове экземпляра можно определить только необходи-
Экземпляр функционального блока можно не только вызы- мые параметры» причем в произвольном порядке, В графических
вать, но и использовать в качестве входных переменных других языках неиспользуемые входы и выходы экземпляра блока про-
функциональных блоков. сто остаются не подключенными — PV на рис. 5.7.
Функциональным блоком иногда называют экземпляр функ- ctuTm
i eMeter
ционального блока, для краткости. В данной книге такие неодно-
значные сокращения применяться не будут. Позволим себе толь-
ко называть иногда функциональный блок просто блоком, а эк- FALSE
земпляр функционального блока — экземпляром.

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

лений возникнуть не может. Аналогичная ситуация возникает


при применении прямоадресуемых переменных. С входами проб-
лем нет. Единственное ограничение — это ухудшение возможно-
SyncSwi — SyncSw2
стей блока в плане его повторного применения. При использова-
нии блока в другой программе или проекте прямые адреса при-
Рис. 5.8. Присваивание экземпляров функционального блока дется поправить. Хорошее решение этой проблемы дают шаблон-
ные переменные.
Оператор присваивания выполняет побайтное копирование
данных экземпляра блока по аналогии со структурами данных* 5*3.7. Шаблонные переменные
Очевидно, что такая техника копирования подходит только для
Шаблонные переменные или, как их иногда называют, конфи-
экземпляров одного и того же функционального блока.
гурационные переменные (в CoDeSys variable configuration) явля-
i ются частично определенными прямоадресуемыми переменными.
5*3.6. Особенности реализации и применения Прямой адрес заменяется звездочкой. Определение полного адреса
функциональных блоков г шаблонной переменной дается в специальном разделе ресурсов.
Входные переменные внутри блока доступны для записи. Это Рассмотрим, как это делается на примере. Создадим блок
вызывает определенный соблазн для программиста. Так, напри! SHAMAN, который будет иметь шаблонную переменную bMarvel.
мер, входную переменную удобно применить в качестве счетчик!, Для нашего примера достаточно раздела объявлений:
итераций, если она как раз и отражает число нужных повторе-
FUNCTION_BLOCK SHAMAN
ний. Это позволит избежать создания дополнительной локальной
переменной. Поскольку при вызове экземпляра блока вводная пе- VAR
ременная должна получить новое значение, ничего страшного на bMarvel AT%I* :BOOL;
первый взгляд нет. Вызов экземпляра не обязан сопровождаться END VAR
присваиванием значений всем формальным параметрам. Возмож-
но, в какой-то момент вы решите, что входной параметр уже Далее создадим два экземпляра блока SHAMAN в главной про-
определен, и можно не задавать его повторно. В результате значе- грамме:
..
ние параметра будет равно тому значению, которое он имел прр
PROGRAM PLC_PRG
работе в роли локальной переменной, при предыдущем вызове эк-
земпляра. Конечно, можно придумать много примеров, когда из- VAR
менение значения входной переменной безопасно. Но все же испо- Shaman 1: SHAMAN;
льзовать такой прием нужно исключительно обдуманно и осто- Shaman2: SHAMAN;
рожно. В общем случае при реализации блока входные перемен-
END VAR
ные нужно рассматривать как константы.
Для того чтобы окончательно «разобраться» с шаблонными пе-
Применение глобальных переменных в функциональных бло-
ременными экземпляров, их нужно прописать в ресурсах проекта:
ках вызывает те же проблемы, что и в функциях. Экземпляры
блока перестают быть независимыми. Изменения переменной, VAR_CONFIG
выполненные одним экземпляром, проявят себя совсем в другом PLC^PRG.Shamanl.bMarvel AT%IX1.0 :BOOL;
месте. Иногда это действительно необходимо, н о в обычной прак-
PLC_PRG.Shamanl.bMarvel АТ%1Х1Л : BOOL;
тике желательно ограничивать такое применение глобальных пе-
ременных. END VAR
Если экземпляры функционального блока используют глоба- Типы данных шаблонной переменной, указанные в объявле-
льную переменную только для чтения, то никаких побочных яв- нии блока и при настройке адреса в ресурсах, обязаны совпадать.
.1

98 Глава 5. Компоненты организации программ (POU) Функциональные <>локи 99

5.3.8. Пример функционального блока отражать интервалы, когда мгновенное значение сетевого напря-
В качестве простого примера реализуем блок синхронного пе- жения близко к нулю. Тогда переключение силовой цепи с выхо-
реключателя SyncSwitch. Алгоритм его работы следующий: вы- да SyncSwitch будет происходить без броска тока.
ход переключателя Q принимает значения, равные входу Start, Конечно, практическое значение нашего нового блока несколь-
но переключение выхода разрешено только при Sync :— TRUE. ко меркнет, если вспомнить о стандартном доминантном пере-
Графически это отражено на рис. 5.9. ключателе — SR. С ним задача решается в одну строчку (ST):
SR_1(SET1:= Start AND Sync, RESET:= Sync, Ql=> Q);

sync 5.3.9. Действия


В функциональных блоках МЭК очень не хватает возможности
start выполнять несколько различных операций. Особенно, если блок
содержит объемные данные. Можно, конечно, сделать дополните-
льный вход и по нему анализировать, что мы хотим от блока.
В CoDeSys эта проблема решена самым естественным способом.
Функциональные блоки и программы можно дополнять действия-
Рис. 5.9. Диаграмма работы синхронного переключателя
ми. Действие работает внутри блока с полным правом доступа ко
всем данным. Его можно вызвать как из тела блока, так и извне.
Условие включения выхода выражается уравнением: Q = start
Действие указывается через точку после названия экземпляра
AND sync, а условие выключения Q - NOT start AND sync. Значе-
блока и может иметь список значений входов и выходов. При вы-
ние выхода должно сохранятся между синхроимпульсами, поэтому зове действия из тела блока наименование экземпляра, естествен-
использовать здесь функцию нельзя. На языке IL блок SyncSwitch но, не требуется. Действие не имеет собственных данных и испо-
можно реализовать так: льзует входы, выходы и локальные переменные блока. Язык реа-
FUNCTION_BLOCK SyncSwitch лизации действия может быть произвольным.
VAR_INPUT Для примера дополним вышеописанный блок SyncSwitch дей-
Sync: BOOL; ствием EmergencyBreak. Пускай вызов данного приводит к мгно-
Start: BOOL; венному безусловному выключению выхода. Для определения
END_VAR действия нужно выбрать блок в органайзере объектов CoDeSys
VAR_OUTPUT и дать команду «Add Action». Опишем действие на языке
BOOL; ST: Q := FALSE; Это все. Вызвать данное действие из ST-програм-
Q: мы можно так:
END VAR
SyncSwitch 1. Emergency Break(Q => q);
LD Sync
AND Start В графических языках прямоугольник, представляющий дан-
S Q ное действие» будет иметь заголовок SyncSwitchl.EmergencyBreak.
Sync Обратите внимание, что окно редактора для действий не имеет
LD
раздела объявлений. Компоненты программ с действиями имеют
ANDN Start
раскрывающиеся списки действий в органайзере объектов. Спи-
R Q сок действий в разделе объявлений POU не отражается.
Такой блок полезен при реализации «безударного» переключе- Действия аналогичны методам класса в C++, Термин •* дейст-
ния в цепи переменного тока. Импульсы синхронизации должны вие», пожалуй, даже понятнее, чем «метод*. Своим происхожде-
Глава 5. Компоненты организации программ (POU) Компоненты в CoDeSys
1 0 0
101

нием действия обязаны SFC. В CoDeSys действия можно исполь- зация компонента представляется в отдельном окне. Окна базиру-
зовать как подпрограммы. ются на соответствующем редакторе, текстовом или графическом,
в зависимости от языка реализации компонента. Выбор необходим
мого редактора происходит автоматически.
5.4. Программы
Программа — глобальный программный элемент, отображаю- и FuncBbckJ ffB)
идентификатор
щий множество значений входных параметров на множество вы- В Function,! [FUN) тип компонента
ходных. Программа очень похожа на функциональный блок. Из Function^ (FUNJ
языкреализации
Й PLC_PRG [PRO]
всех программных компонентов МЭК-программа самый крупный.
При помощи программ определяется верхний уровень проекта и
реализуется управление многозадачностью. Программы являются
глобальными компонентами и объявляются на уровне ресурсов. Рис. 5.10. Список компонентов проекта CoDeSys

5*4.1* Использование программ В CoDeSys есть интересная возможность автоматически кон-


Обращение к переменным и вызов программы ничем не отли- вертировать компонент с одного языка на другой. Автоматиче-
чается от работы с экземпляром функционального блока: ский перевод возможен на языки IL, FBD и LD.Конвертирование
выполняется командой •Project» «Object Convert».
AuxiliaryPrg(Active := TRUE» Q ->> q); При создании шаблона нового компонента CoDeSys не пропи-
сывает автоматически заголовок VAR_IN_OUT в разделе объяв-
Правильный с позиций стандарта проект должен включать
лений (и правильно делает). При необходимости его нужно созда-
одну или несколько программ, ассоциированных с задачами. Чис- вать вручную.
ло функций и функциональных блоков, как правило, значитель-
но больше. В графическом представлении компонента CoDeSys отражает
параметры VAR_IN__0UT слева, снабжая их специальным знач-
ком 1> «треугольник*. В некоторых системах такие параметры
5.5. Компоненты в CoDeSys отображаются одновременно с двух сторон графического блока.
То есть соединительная линия как бы проходит через изображе-
Создание нового программного компонента в CoDeSys выпол- ние компонента.
няется командой «Add Object...». Команда открывает диалоговую Глобальные переменные VAR_GLOBAL, VAR_ACCESS и кон-
панель создания компонента. Вам нужно будет только придумать станты в CoDeSys объявляются только в ресурсах. Они существу-
имя, выбрать язык реализации и указать, что именно требуется ют в единственном экземпляре и доступны на запись и чтение для
создать — функцию, блок или программу. Шаблон компонента» всех POU проекта. Обычно глобальные переменные, которые ис-
включающий раздел объявлений, создается автоматически. Пи- пользуются внутри компонента, перечисляются в его разделе объ-
сать ключевые слова объявлений вручную не приходится. Вся ру- явлений под заголовком VARJEXTERNAL. В CoDeSys это делать
тинная работа, как и должно быть, выполняется компьютером. необязательно.
Объявления библиотечных POU содержатся в самих файлах Функцию с переменным числом параметров в текущей версии
библиотек, которые необходимо подключать к проекту при помо- CoDeSys создать нельзя. Но стандартные операторы ADD,MUL,
щи менеджера библиотек (Library Manager), AND, OR, X0R и MUX являются расширяемыми. То есть для
Иерархический список всех компонентов проекта CoDeSys со- них допустимо создавать дополнительные входы.
держится на страничке «POUs» менеджера проекта Object Organi- \ Перегрузка пользовательских функций в CoDeSys не поддер-
zer (рис. 5.10). Для редактирования компонента достаточно вы- живается. В случае необходимости рекомендуется создать не-
брать его из списка двойным щелчком мыши- Описание и реали- сколько одинаковых функций для разных типов параметров.
1 0 2 Глава 5. Компоненты организации программ (POU)

Здесь удобно использовать имена функций с суффиксами типов.


Например:
Nearby_sint, Nearby_int, Nearby_real
Суффикс типа хорошо бросается в глаза, и смысл его очеви- Глава 6, Структура программного
ден. Венгерская запись также успешно решает эту проблему: обеспечения ПЛК
siNearby, iNearby, rNearby
В этой главе представлен верхний уровень модели МЭК про-
Обратите внимание, что в отличие от функционального блока граммирования ПЛК. Описаны средства, реализующие выполне-
в CoDeSys экземпляров программы не существует. Все программы ние программ и многозадачность, дано понятие о ресурсах и эле-
определены глобально и существуют только в единственном эк- ментах конфигурации. Как и в других главах, общие понятия
земпляре. Ограничений на количество и способ использования будут детализированы на примере их реализации в комплексе
программ в CoDeSys нет. CoDeSys.
При создании нового проекта CoDeSys автоматически создает
программу с именем PLC_PRG. В однозадачных проектах 6.1, Задачи
PLC_PRG является главной программой- Цикл выполнения поль-
зовательской задачи сводится к циклическому вызову PLC_PRG, Назначение задач состоит в управлении работой программ
которая должна содержать вызовы всех прочих необходимых проекта, исполняемых одним процессором. Как и программа,
компонентов. каждая задача должна иметь собственный уникальный идентифи-
катор. Задачи подразделяются на циклические и разовые (single).
Выполнение разовой задачи запускается по фронту логической
тригтернои переменной. Циклические задачи выполняются через
заданные интервалы времени. Каждая задача может включать
вызов одной или нескольких программ. Если программа имеет
входные параметры (VAR_INPUT), то они задаются в описании
задачи. Все программы одной задачи выполняются в одном рабо-
чем цикле ПЛК.
Определение задач в системах программирования МЭК выпол-
няется по-разному. Это может быть текстовое описание или гра-
фическое представление. CoDeSys содержит специальный инстру-
мент — менеджер задач (Task configuration), представляющий за-
дачи и их программы в виде иерархического дерева (см. рис. 6Л).
В любом проекте всегда существует, как минимум, одна зада-
ча. По умолчанию это циклическая задачау вызываемая в каждом
рабочем цикле ПЛК. В CoDeSys она включает единственную про-
грамму PLC_PRG.
Каждая задача обладает определенным приоритетом. Приори-
тет определяется числом от 0 до 32. Чем меньше число» тем выше
приоритет. Если две или более задачи должны получить управле-
ние одновременно» то побеждает задача с более высоким приори-
тетом. Так, если две циклические задачи всегда совпадают по вре-
мени и имеют разные приоритеты, то задача с меньшим приори-
1 0 4 Глава 6. Структура программного обеспечения ПЛК Ресурсы 105

тетом не будет работать вовсе» При одинаковом приоритете управ- При работе на ПЛК, имеющим время рабочего цикла около
ление получает задача, имеющая большее время ожидания. То 55 мс (такой цикл дает Windows эмулятор, привязанный к тикам
есть две равно приоритетные задачи будут работать поочередно. системного таймера компьютера), временная диаграмма исполне-
В системе исполнения CoDeSys реализована невытесняющая ния вышеописанных задач будет выглядеть, как показано на
многозадачность. Это означает, что любая задача, даже более рис. 6.2.
приоритетная, дает доработать текущей задаче до конца одного
220 ms
рабочего цикла. Работа циклических задач является аппаратно
независимой. Механизм управления задачами ПЛК всегда опира-
ется на аппаратный системный таймер, поэтому нельзя гаранти-
ровать, что система исполнения обеспечит точность вызова задач
до миллисекунды. Как правило, минимальная дискретность вре-
менного интервала, на которую вы можете рассчитывать, — Рис. 6.2. Временная диаграмма исполнения задач Т1» Т2, ТЗ
10 мс. Когда речь идет о медленных для ПЛК задачах, интервалы
времени измеряются десятыми долями секунды. При таких ин- Обратите внимание, что тестирование многозадачных проектов
тервалах время одного рабочего цикла несоизмеримо мало, поэто- требует осознанной работы с отладчиком. Отладчик должен быть
му механизма невытесняющей многозадачности оказывается до- настроен на необходимую задачу (в CoDeSys команда «Set Debug
статочно для обеспечения высокой относительной точности рабо- Task*). Только тогда точки останова будут корректно работать,
ты циклических задач. т. е. останов будет происходить именно при работе данной задачи.

Например, задача поддержания рабочего давления воздуха в


ресивере при помощи включения и выключения компрессора. 6.2. Ресурсы
Двигателю компрессора необходимо не менее 5 секунд на разгон,
а ощутимое увеличение давление произойдет минимум через С точки зрения стандарта МЭК ресурс это один процессор,
1,5..,2 минуты. Очевидно, что «дергать* компрессор чаще, чем в снабженный собственной системой исполнения. То есть одна или
2 минуты, бессмысленно и вредно. несколько задач загружается в ресурс и исполняется им. В CoDe-
Sys (и не только) применяется понятие проект — все прикладное
На рис. 6.1 показано определение трех задач. Задача Т1 имеет программное обеспечение, обеспечивающее работу конкретного
приоритет, равный 10, и должна вызываться через 200 мс. Задача приложения. Слово же «ресурсы» употребляется во множествен-
Т2 имеет наименьший приоритет, равный 20, и должна вызыва- ном числе и определяет набор аппаратно зависимых деталей про-
ться в каждом цикле, не занятом другими задачами. Задача ТЗ екта. То есть проект включает аппаратно независимые реализа-
имеет самый высокий приоритет, равный 1, и должна вызываться ции программ (функции, функциональные блоки и их локальные
через 800 мс. данные) и требующие настройки ресурсы. Ресурсы содержат:
• определение глобальных и прямо адресуемых переменных;
В—Task configuration • конфигурацию ПЛК;
& - Т 1 (PRIORITY := 10. INTERVAL :=T«00msl • установки целевой системы исполнения (тип микропроцессо-
•— PR6_1; ра, распределение памяти, порядок байт в слове, параметры
T2 (PRIORITY = 20]
сети и т. д.);
PRG 2
• менеджер задач.
Г J_ TTXX4,

N
l l d T C R V A L : f J i r a g p m s ]

L. PRG 3
Сюда же включаются и дополнительные фирменные инстру-
менты, зависящие от особенностей реализации конкретной систе-
-.'•
? • < ? " • . % * * ' ; , - - , ; ,

мы исполнения. Это модуль трассировки переменных» терминал


Рис. 6.1. Менеджер задач CoDeSys для работы с фирменными командами ядра ПЛК (PLC Browser),
106 Глава 6. Структура программного обеспечения ПЛК

конфигуратор сети и т. д. Это необязательные элементы» их нали-


чие и тонкости работы зависят от конкретной реализации аппара-
туры и встроенного программного обеспечения ПЛК.

Глава 7* Языки МЭК


6.3. Конфигурация
Эта глава начинается с краткого анализа особенностей созда-
Стандарт МЭК вводит еще одно понятие более высокого уров-
ния прикладного программного обеспечения ПЛК и представле-
ня» чем ресурс» — это конфигурация. Конфигурация — это мно-
ния языков МЭК. Далее каждый из пяти языков МЭК будет рас-
жество ресурсов» взаимодействующих определенным образом
смотрен более подробно- Специфика реализации языков, сущест-
(сконфигурированных). В одной системе может быть несколько
вующие ограничения и пути развития будут продемонстрированы
интеллектуальных ресурсов» каждый из которых обладает соб-
на примере транслятора комплекса CoDeSys.
ственным процессором» памятью и системой исполнения. Каж-
дый из них можно программировать. Это могут быть реальные
модули (возможно» удаленные) или виртуальные машины, эму-
лируемые одним процессором. Все они имеют доступ к опреде-
7.1. Проблема программирования ПЛК
ленным наборам входов-выходов и координируют свою работу Как было описано выше, ПЛК функционирует циклически —
посредством глобальных переменных, расположенных в общедо- чтение входов, выполнение прикладной программы и запись вы-
ступной памяти. ходов. В результате прикладное программирование для МЭК ПЛК
Что касается понятия проекта в CoDeSys, то оно непосредст- существенно отличается от традиционной модели» применяемой
венно связано с одним аппаратным ресурсом. То есть для про- при работе на языках высокого уровня ПК. Рассмотрим в качест-
граммирования каждого ресурса (в рамках МЭК-конфигурации) ве иллюстрации простейшую задачу: необходимо запрограммиро-
должен быть создан отдельный проект. Поскольку система про- вать мерцающий световой индикатор. Очевидно» что алгоритм
граммирования универсальна, то здесь не делается различий должен быть примерно такой:
для взаимодействия ресурсов и конфигураций. Техника же по- 1) включить выход;
строения распределенных систем существенно зависит от кон- 2) выдержать паузу;
кретной реализации сети ПЛК. Это может быть, например, вы-
сокоуровневое взаимодействие через переменные общего доступа 3) выключить выход;
(VAR_ACCESS), обмен (MAP MMS) сообщениями с помощью 4) выдержать паузу;
библиотеки функциональных блоков стандарта МЭК 61131-5 или 5) переход к шагу 1 (начало программы);
работа с удаленными модулями ввода-вывода (CANopen). 6) конец программы.
С переводом слова * конфигурация» (configuration) в англоя- Реализованная по этому алгоритму программа для ПЛК рабо-
зычных описаниях систем программирования МЭК существует тать не будет. Во-первых, она содержит бесконечный цикл. Весь
неоднозначность- Так, слово «конфигурация», как это описано код прикладной программы выполняется от начала и до конца в
выше, понимается как существительное (как конфигурация мор- каждом рабочем цикле. Любая прикладная программа ПЛК явля-
ского дна). Кроме того, есть еще процесс конфигурирования, ко- ется частью рабочего цикла и должна возвращать управление сис-
торый также называют «configuration». Так, объект *PLC confi- теме исполнения. Поэтому шаг 5 «переход на начало программы»
guration» на вкладке ресурсов проекта CoDeSys — это инстру- лишний.
мент, выполняющий конфигурирование ПЛЙ. Если в нашем алгоритме удалить •переход на начало»» про-
грамма будет работать. Хотя и не так, как задумано. Выход все-
гда будет оставаться в выключенном состоянии, поскольку физи-
чески установка значений выходов производится по окончании
прикладной программы один раз. Промежуточные изменения
1 0 8 Глава 7. Языки МЭК Проблема программирования ПЛК 109

значений выходов не отображаются на аппаратные средства. Ко- дов и текущим состоянием. Реакция автомата зависит только от
нечно, значение переменной будет изменяться многократно» но текущего состояния без предыстории, т. е. не важно, как он при-
определяющим выход станет только последнее значение. шел в данное состояние- Вместе с тем текущее состояние также из-
Что еще плохо для ПЛК в данном алгоритме, так это задержка меняется по тактам, автомат переходит в новое состояние (функ-
времени. Вполне вероятно, что, кроме мерцания одним выходом, ция переходов 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 развивается как инстру-
мент описания производственных операций, а сети Петри расши-
ряют способности моделирования дискретных систем.

SFC-диаграммы
Рис. 7.2. Сеть Петри В отличие от сетей Петри дуги в SFC имеют выраженную на-
правленность сверху вниз и отражаются прямыми линиями. По-
щих дуг, ведущих к разным позициям. Проверка условия перехо- зиции в SFC называют шагами или этапами. На диаграмме они
да (разрешение) производится, только если хотя бы одна из его отражаются в виде прямоугольников. Благодаря такому •кубиз-
исходных позиций владеет маркером. му» существует возможность реализации диаграмм в символах
Существенным моментом сети Петри является то, что несколь- псевдографики (рис. 7.3). Задать несколько стартовых шагов в
ко позиций могут одновременно иметь маркеры. То есть сеть опи- SFC нельзя, только один шаг диаграммы является начальным.
сывает процессы, работающие параллельно и взаимосвязанно- Со-
стояние сети определяется совокупностью позиций, владеющих I
маркерами. +• ,1, -\
II
Описанная сеть позиций и переходов является простейшим ва- II Step 2
риантом сетей Петри. Именно она и послужила прототипом для Ьх1 Ii
разработки SFC. -\у т
I
Заслуга первой практической реализации языка этапов и пере- Л ^

ходов для ПЛК принадлежит французским фирмам. Совместная Step3 i

работа изготовителей ПЛК и объединения пользователей привела


к появлению национального стандарта «Графсет» и международ-
i
ного стандарта МЭК 848 (1988 г.). МЭК 61131-3 заимствовав Рис. 7,3. SFC-диаграмма, выполненная символами псевдографики
•Графсет» с некоторыми доработками. (условие перехода — язык IL)
В настоящее время отождествлять SFC с сетями Петри уже не-
льзя. Пути их развития оказались разными, причем не только в Графическая диаграмма SFC состоит из шагов и переходов
отдельных деталях, но и идеологически. Так, в сетях Петри мар- между ними. Разрешение перехода определяется условием, С ша-
кер наделили свойствами объекта* а переходы получили способ- гом связаны определенные действия. Описания действий выпол-
ность воспринимать свойства маркера. Это так называемые *цвет- няются на любом языке МЭК. Сам SFC не содержит каких-либо
ные» сети Петри, маркеры в которых имеют разные типы и раз- управляющих команд ПЛК. Действия могут быть' описаны и в
ные цвета. В современном SFC маркер является не более чем кви- виде вложенной SFC-схемы. Можно создать несколько уровней
танцией — нарядом на определенную работу. Позиции же SFC подобных вложений, но в конечном счете действия нижнего уров-
приобрели большую силу и имеют возможность выполнять опре- ня все равно необходимо будет описать на IL, ST, LD или FBD.
деленные наборы действий. Чтобы понять разницу, представьте Заметим сразу, что даже упрощенная реализация SFC требует
себе коллектив людей, передающих друг другу пакеты (маркеры). неявно некоторой памяти для кодирования маркеров позиций.
1 1 4 Глава 7. Языки МЭК Семейство языков МЭК 115

Требование параллельности приводит к невозможности компакт- транслированный код. Благодаря чему, 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

7.3.2. Аккумулятор loopl:


(*тело цикла*)
Абсолютное большинство инструкции IL выполняют некото-
рую операцию с содержимым аккумулятора (см. его определение LD Counter
чуть ниже). Операнд, конечно, тоже принимает участие в инст- ADD
рукции, но результат опять помещается в аккумулятор. Напри- ST Counter
мер, инструкция SUB 10 отнимает число 10 от значения аккуму- LE 5
лятора и помещает результат в аккумулятор. Команды сравнения
JMP loopl
сравнивают значение операнда и аккумулятора, результат сравне-
ния ИСТИНА или ЛОЖЬ вновь помещается в аккумулятор. В примере показана реализация цикла на 5 повторений с од-
Команды перехода на метку способны анализировать аккумуля- ной очевидной ошибкой. Вместо безусловного перехода JMP дол-
тор и принимать решение — выполнять переход или нет. жен быть JMPC.
В системах с интерпретатором IL или промежуточным коди-
Аккумулятор IL является универсальным контейнером, спо-
рованием время выполнения перехода оказывается зависимым
собным сохранять значения переменных любого типа. от направления и расстояния. В CoDeSya команда безусловного
В аккумулятор можно поместить значение типа BOOL, затем перехода транслируется в одну машинную команду процессора и
INT или REAL, транслятор не будет считать это ошибкой. Такая выполняется очень быстро. Ограничений на число переходов в
гибкость не означает, что аккумулятор способен одновременно со- CoDeSys нет.
держать несколько значений разных типов. Только одно, причем Но это не означает целесообразность создания больших моно-
тип значения также фиксируется в аккумуляторе. Если операция литных IL-программ с множеством переходов. Такие программы
требует значение другого типа, транслятор выдаст ошибку. очень сложно читать и не легко сопровождать.
В стандарте МЭК вместо термина «аккумулятор» используется
термин «результат» (result). Так, инструкция берет «текущий ре- 7.3.4. Скобки
зультат» и формирует «новый результат». Тем не менее почти все
руководства по программированию различных фирм широко ис- Последовательный порядок выполнения команд IL можно из-
пользуют термин «аккумулятор». менять при помощи скобок. Открывающая скобка ставится в ин-
струкции после операции. Закрывающая скобка ставится в отде-
льной строке. Инструкции, заключенные в скобки, выполняются
7.3.3. Переход на метку в первую очередь. Результат вычисления инструкций в скобках
помещается в дополнительный аккумулятор, после чего выполня-
Программа на IL выполняется подряд, сверху вниз. Для изме-
ется команда, содержащая открывающую скобку. Например:
нения порядка выполнения и организации циклов применяется
переход на метку. Переход на метку может быть безусловным LD 5
JMP — выполняется всегда, независимо от чего-либо. Условный MUL (2
переход JMPC выполняется только при значении аккумулятора SUB 1
ИСТИНА. Переход можно выполнять как вверх, так и вниз. Мет-
ки являются локальными, другими словами, переход на метку в
другом POU не допускается. ST (*y = 5 * ( 2 - I ) = 5*)
W
Переходы нужно организовывать достаточно аккуратно, чтобы
LD 5
не получить бесконечный цикл:
MUL 2
LD SUB 1
ST Counter ST У (*y = 5 * 2 - 1 = 9*)
Глава 7. Языки МЭК Язык линейных инструкций (IL) 121
1 2 0

Скобки могут быть вложенными. Каждое вложение требует ор- Оператор Модификатор Описание
ганизации некоего временного аккумулятора. Это вызывает неод-
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

C T D _ 1 ( C D = TRUE, LOAD :- FALSE, PV := 10) разобраться. Возможность комментировать каждую строку не


означает, что так и нужно поступать. Правильно составленное по-
C A L

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.3,8. Вызов функции 7.3.10. IL в режиме исполнения


При вызове функции с перечислением параметров в IL сущест- В режиме исполнения CoDeSys автоматически превращает
вует одна немаловажная особенность. В качестве первого пара- окно редактора в окно мониторинга. Значения всех переменных
метра используется аккумулятор: отображаются справа от команд IL и доступны для изменения.
Вы можете установить или сбросить точку останова и прошагать
LD TRUE программу по одной команде. Интересные возможности для IL
SEL 3,4 предоставляет режим Flow control CoDeSys. В этом режиме в окне
На ST это равносильно вызову SEL (TRUE,3,4). Очевидно, при мониторинга подсвечиваются номера строк, которые исполнялись
вызове функции или оператора с одним параметром список пара- в предыдущем рабочем цикле, и отображаются соответствующие
значения аккумулятора (рис. 7*4).
метров вообще не нужен:
LD ivarl >j Ra•nd iom
H^m innn{nP
ww nnLnn
C
f_|fPpR
|^fG Rand) (FB IL)
INTJTO^BOOL Э-RESET
ЬТтр =^227
ST bvarl Load =
lend1_0:
7.3.9. Комментирование текста 0013 OS LD = 143
ООП 114 MUL 170
Язык lit является языком низкого уровня. Поэтому тексты IL 0015 DIV 251
всегда достаточно велики по объему. Обычно при написании про- 001Б ЪЪ ST bTmp | Ь Т т р =2 2 7
граммы алгоритм кажется настолько понятным, что не нуждает- 0017 25i| LD 251
y. : _«y^T^
ся в комментариях. Однако текст чужой программы без коммен-
тариев понять очень тяжело- Нередко бывает, что и самому авто-
ру программы через год-другой после ее написания трудно в ней Рис. 7.4. IL в режиме исполнения
1 2 4
Глава 7. Языки МЭК Структурированный текст (ST) 125

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:

7.4.2. Порядок вычисления выражений IF х = Threshold THEN


Вычисление выражения происходит в соответствии с правила- (*все хорошо*)
ми приоритета операций. Первыми выполняются операции с на- ELSIF x > Threshold THEN
ивысшим приоритетом, M a r k e r := bMarker - 1; (*шагвниз*)
В порядке уменьшения приоритета операции располагаются ELSE
так: выражение в скобках; вызов функции; степень ЕХРТ; заме-
на знака (-); отрицание NOT ; умножение» деление и деление по bMarker := bMarker + 1; (*шаг вверх*)
модулю MOD; сложение и вычитание (+, -); операции сравнения END_IF; (*лишняя; - поставлена по Паскалевской привычке*)
Глава 7. Языки МЭК Структурированный текст (ST) 127
Х26

7.4.4. Оператор выбора IF IF bReset THEN


iVarl := 1;
Оператор выбора позволяет выполнить различные группы iVar2 := 0;
выражений в зависимости от условий, выраженных логически- ENDJF
ми выражениями. Полный синтаксис оператора IF (если) выгля-
дит так: На первый взгляд конструкция IF с несколькими группами
ELSIF выглядит сложной, но на самом деле оказывается доста-
IF <логическое выражение IF> точно выразительной:
THEN IF bReset 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

ci := 1; цикле. Начальное и конечное значения и шаг могут быть как


WHILE ci <> 100 DO константами, так и выражениями.
Varl := Varl + 1; Счетчик изменяется после выполнения тела цикла. Поэтому
ci := ci + 10;
если задать конечное значение меньшее начального, то при поло-
жительном приращении цикл не будет выполнен ни разу. При
END_WHILE одинаковых начальном и конечном значениях тело цикла будет
Очевидно, счетчик ci при начальном значении 1 и приращении выполнено один раз.
10 никогда не станет равным 100. Часть конструкции BY в скобках необязательна, она определя-
Для реализации минимального времени выполнения цикла не- ет шаг приращения счетчика. По умолчанию счетчик увеличива-
обходимо избегать в теле цикла и в условном выражении вычис- ется на единицу в каждой итерации. В качестве счетчика можно
лений, которые можно было сделать заранее. Такие вычисления использовать переменную любого целого типа. Пример:
повторяются в цикле, всякий раз отнимая время. Например: Varl : - 0;
WHILE ci < 5 + х DO FOR cw := 1 ТО 10 DO
Var := Varl + 2*x*x + 1; Varl := Varl + 1;
ci :— ci + 1; END_FOR
END_WHILE Данный цикл будет выполнен 10 раз и соответственно Varl бу-
Данный цикл можно оптимизировать по скорости: дет иметь значение 10.
Шаг изменения счетчика итераций может быть и отрицатель-
iMax := 5+х; ным. Начальное условие в этом случае должно быть больше ко-
iPoly := 2*х*х + 1; нечного. Цикл будет закончен, когда значение счетчика станет
WHILE ci < iMax DO меньше конечного значения. Например:
Var := Varl + iPoly; Varl := 0;
ci :— ci + 1; FOR ci := 10 ТО 1 BY -1 DO
END_WHILE Varl := Varl + 1;
END_FOR
7.4.7. Цикл FOR
Цикл FOR исключительно удобен для итераций с заранее изве-
Цикл FOR обеспечивает заданное количество повторений стным числом повторов. Причем» чтобы создать бесконечный
группы выражений. Синтаксис: цикл FOR, нужно хорошо постараться- Можно, например, попы-
таться задать нулевой шаг приращения (в CoDeSys это не помога-
FOR <Целый счетчик> := <Начальное значение> ет) или сбросить счетчик в теле цикла.
ТО <Конечное значение> Для построения правильного цикла достаточно соблюдать два
[BY <Шаг>] DO простых формальных требования:
<Выражения - тело цикла> • не изменяйте счетчик цикла и условие окончания в теле
END FOR цикла. Счетчик и переменные образующие конечное условие
в цикле, можно использовать только для чтения;
Перед выполнением цикла счетчик получает начальное значе- • не задавайте в качестве конечного условия максимальное
ние. Далее тело цикла повторяется, пока значение счетчика не для типа переменной счетчика значение. Так, если для одно-
превысит конечного значения. Счетчик увеличивается в каждом байтного целого без знака задать константу 255, то условие
1 3 2 Глава 7, Языки МЭК Структурированный текст (ST) 133

окончания не будет выполнено никогда. Цикл станет беско- FOR у := О ТО 9 DO


нечным. FOR x := О ТО 99 DO (* обрабатываем строку массива Агг[у][х]*)
В CoDeSys счетчик изменяется в теле цикла всегда, включая
завершающую итерацию, когда условие окончания уже достигну-
IF .„ THEN EXIT; (*'хвост' строки обрабатывать не
то. Но в стандарте такие тонкости не оговорены. С целью оптими-
надо, переходим к следующей*)
зации по скорости транслятор может обойти изменение счетчика
лишний раз. Поэтому не рекомендуется использовать значение END^FOR
счетчика вне тела цикла. Переносимость такой программы гаран- END FOR
тировать нельзя. Избегайте использовать цикл FOR со сложными
условиями окончания и в случаях, когда по окончании цикла не- При необходимости завершения внешнего цикла по условию,
обходимо определить причину окончания. Например, когда цикл возникшему во вложенном цикле, можно использовать пару син-
может быть прерван оператором EXIT и есть необходимость уз- хронизированных операторов EXIT:
нать, сколько итераций в действительности было выполнено (см. bBreakY := FALSE;
ниже пример с EXIT).
FOR у := О ТО 9 DO
Второй момент, который необходимо учитывать при создании FOR x := 0 TO 99 DO
переносимой программы, это отрицательное приращение счетчи-
ка. К сожалению, далеко не все системы программирования под-
держивают такую возможность. IF _ THEN bBreakY :** TRUE; EXIT; (*прервать обработку*)
END_FOR
7.4.8* Прерывание итераций операторами IF bBreakY THEN EXIT;
EXIT и RETURN END__FOR
Оператор EXIT, помещенный в теле циклов WHILE, REPEAT Оператор RETURN осуществляет немедленный возврат из
и FOR, приводит к немедленному окончанию цикла. Хороший POU. Это единственный способ прервать вложенные итерации без
стиль программирования призывает избегать такого приема, но введения дополнительных проверок условий. Оператор RETURN
иногда он весьма удобен. Рассмотрим, например, поиск элемента
выполняется очень быстро, фактически это одна машинная
массива с определенным значением (х). Проще всего организовать
команда процессора. Но не стоит им злоупотреблять. Поскольку в
линейный перебор при помощи цикла FOR:
тексте компонента, имеющего, например, 50 выходов, разобрать-
bObtained:= FALSE; ся весьма не просто.
FOR cN := 1 TO Maxlndex DO Иногда бывает удобно создать безусловный цикл, а условия
IF x - aX[cN] THEN выхода формировать в теле цикла с использованием EXIT. На-
пример, могут потребоваться несколько равновероятных, но не-
Index := cN; взаимосвязанных условий выхода из цикла. Создать безусловный
bObtained := TRUE; (бесконечный) цикл в ST проще всего так: WHILE TRUE DO...
EXIT;
ENDJF 7.4.9. Итерации на базе рабочего цикла ПЛК
END_FOR Использовать для условия выхода из циклов WHILE и
IF bObtained THEN (*элемент найден, его индекс — Index*) REPEAT входы, выходы или другие аппаратно-зависимые пере-
менные ПЛК нельзя. Данные переменные не изменяют своих зна-
Для вложенного цикла оператор EXIT завершает только чений в пределах одного рабочего цикла пользовательской про-
«свой» цикл, внешний цикл будет продолжать работу. Например: граммы, поэтому цикл всегда будет бесконечным. Если подобная
1 3 4 Глава 7. Языки МЭК Структурированный текст (ST) 135

необходимость все же есть, используйте для итераций рабочий F O R i c Y : = 0 T O 8 DO


цикл ПЛК. Выполнение итерации задается простым условием IF.
FOR icX := 0 TO 16 DO
Аналогично можно поступать при необходимости построения
длительных циклов. Например, инициализация или копирование IF iaPos[icY,icX] > iLevel THEN
больших массивов данных. «Размазывание» объемных операций iBalance := iBalance + 1;
на множество рабочих циклов является стандартным приемом, ELSE
позволяющим избежать нежелательного замедления других, па-
раллельно выполняемых задач. IF iaPos[icY,icX] < iLevel THEN
Так, инициализация данных функционального блока с выстав- iBalance :•» iBalance - 1;
лением сигнала готовности может выглядеть так: END_IF
END_IF
ENO: BOOL := FALSE;
END_FOR
niCounter: INT := 1000;
aiVar: ARRAY[0..999] OF INT; iLevel := iLevel *2;
END_FOR
IF niCounter - 0 THEN Плохо оформленный ST-текст читать крайне тяжело, даже ре-
ENO := TRUE; дактор с цветовым выделением инструкций здесь не спасает.
Мало того, ошибки в схеме отступов способны совершенно сбить с
(•основная работа блока*)
толку:
ELSE
FOR icY := 0 ТО 8 DO
niCounter := niCounter - 1;
FOR icX : - 0 ТО 16 DO
aiVar[niCounter] := GetlnitVal(niCounter);
IF iaPos[icY,icX] > iLevel THEN
(*сложная инициализация*)
iBalance := iBalance + 1;
END_IF ELSE
IF iaPos[icY,icX] < iLevel THEN
7.4.10. Оформление текста
iBalance := iBalance - 1;
Оформление текстов ST-программ может быть совершенно END.JF
произвольным. Расположение операторов и выражений в строке END_IF
не влияет на правильность программ. Но очень важно выработать END_FOR
свой собственный стиль и строго придерживаться его. Важней-
iLevel := iLevel *2;
шую роль в оформлении играют отступы в начале строк. Отсту-
пы зрительно объединяют строки, содержащие выражения одного END_FOR
уровня вложения. Текст, выровненный в виде лесенки, каждая Для оформления ST текстов вполне применимы рекоменда-
ступенька которой относится к одному циклу или условию, чита- ции, которые можно встретить в литературе по программирова-
ется легко. Несмотря на возможность горизонтальной прокрутки нию на Паскале и С. Обратите внимание, что в ST отсутствуют
в редакторе, желательно, чтобы по ширине текст помещался на пресловутые программные скобки (в Паскале: begin, end; в С: {}).
одной странице. Не стоит располагать несколько выражений в Вместо них каждое выражение языка имеет собственную концов-
одну строку. Ничего страшного нет в том, что текст окажется рас- ку (WHILE .. END_WHILE, IF .. END_IF). To есть закрывающая
тянутым по вертикали: лаконичные выражения и даже пустые программная скобка является информативной. Зрительно такой
строки только помогают зрительному анализу (см. пример ниже). текст воспринимается явно лучше. При создании сложных вло-
1 3 6 Глава 7. Языки МЭК
Релейные диаграммы (LD) 137
жений в языке С закрывающие скобки часто расположены
сплошной лесенкой. В таких случаях опытные программисты Приведенная на рис. 7.5 схема эквивалентна выражению:
применяют краткие комментарии после каждой закрывающей Lampl := (Switchl OR Switch2) AND Switch3 AND ((Switch4
скобки. Комментарии подсказывают, с чего начат данный уро- AND Switch6) OR Switch5);
вень отступа. Например: (*FOR x*)9 Это хороший прием, но при
грамотном применении отступов в строках ST такая необходи- Зрительное восприятие LD-диаграмм должно быть интуитивно
мость возникает значительно реже, чем в С и Паскале. понятным. Для России этому несколько мешает принятая систе-
ма условных графических обозначений, базирующаяся на амери-
канском стандарте NEMA. Преимущество таких обозначений со-
7.5. Релейные диаграммы (LD) стоит в возможности применения символов псевдографики для
построения LD-диаграмм.
7.5.1* Цепи
Сопоставление обозначений базовых элементов LD и обозначе-
Релейная схема представляет собой две вертикальные шины ний ЕСКД приведено в таблице.
питания, между ними расположены горизонтальные цепи, обра-
зованные контактами и обмотками реле. Количества контактов в
цепи произвольно, реле одно. Если последовательно соединенные LD ЕСКД Обозначение
контакты замкнуты, ток идет по цепи и реле включается (в при-
мере на рис. 7.5 Lampl). При необходимости можно включить па-
раллельно несколько реле, последовательное включение не допус- НЬ Нормально разомкнутый контакт
кается.
Нормально замкнутый контакт
V
Правильная установка контактов включит лампу 1

SwftcM Switch3 SwitcM Swilch6


-i У- Обмотка реле
\ \

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-диаграмму проще и красивее.

7.5.2. Реле с самофиксацией


7.5.3. Порядок выполнения и обратные связи
Помимо обычных реле, в релейных схемах часто применяются
поляризованные реле. Такое реле имеет две обмотки, переключа- Идеология релейных схем подразумевает параллельную работу
ющие его из одного положения в другое. Переключение произво- всех цепей. Ток во все цепи подается одновременно.
дится импульсами тока. При отключении тока питания поляризо- В LD решение диаграммы выполняется последовательно слева
ванное реле остается в заданном положении, что реализует эле- направо и сверху вниз. В каждом рабочем цикле однократно вы-
ментарную ячейку памяти. полняются все цепи диаграммы, что и создает эффект параллель-
В LD такое реле реализуется при помощи двух специальных ности работы цепей. Любая переменная в рамках одной цепи все-
обмоток SET и RESET. Обмотки типа SET обозначаются буквой S гда имеет одно и то же значение. Если даже реле в цепи изменит
внутри круглых скобок (S). Обмотки типа RESET обозначаются переменную, то новое значение поступит на контакты только в
буквой R. Если соответствующая обмотке (S) переменная прини- следующем цикле. Цепи расположенные ниже, получат новое
мает значение ИСТИНА, то сохраняет его бесконечно. Вернуть значение переменной сразу. Цепи расположенные выше — только
данную переменную в ЛОЖЬ можно только обмоткой (R). в следующем цикле. Строгий порядок выполнения схемы очень
Очевидно, что полной аналогии с поляризованным реле про- важен. Случайный или даже истинно параллельный порядок вы-
граммно достичь невозможно. Даже если значение логического полнения цепей мог бы приводить к эффекту •гонок», встречаю-
выхода сохраняется в энергонезависимой памяти, состояние са- щемуся в электронных схемах с триггерами. Благодаря жесткому
мой электрической цепи при выключенном питании ПЛК опреде- порядку выполнения LD-диаграммы сохраняют устойчивость при
ляется его схематикой. Фиксация безопасного положения аппара- наличии обратных связей.
туры при аварии питания системы управления может быть до- В приведенной на рис. 7.8 схеме включение Key вызовет мгно-
стигнута только аппаратно. венное (в том же цикле) включение Р2 и отключение РЗ. Реле Р1
Условие выключения реле не всегда равносильно отсутствию будет включено только в следующем цикле, причем даже если
условия включения. Благодаря (R) и (S) обмоткам условия вклю- Key уже в обрыве (ЛОЖЬ).
чения и выключения реле можно формировать совершенно неза- Используя вышеописанный принцип цикличности выполне-
висимо, причем в любой цепи и сколько угодно раз. Обмотки (Я) ния LD-диаграмм, очень легко построить генератор единичных
и (S) обеспечивают фиксацию условий управления, что необходи-
мо при реализации автоматов с памятью. PI

Конечно, самофиксацию несложно организовать и на простом


реле, используя дополнительный контакт в цепи питания. При-
мер этого представлен на рис. 7.7. Key Р2

О
R R1
И ( Р2 РЗ

Рис. 7.7. Реле с самофиксацией Рис. 7.8. LD диаграмма с обратной связью


1 4 0 Глава 7- Языки МЭК Релейные диаграммы (LD) 141

импульсов. Пример такого построения дан на рис. 7.9. Период Специальный переход RETURN прекращает выполнение LD
импульсов на реле Р1 будет равен удвоенной длительности рабо- диаграммы. Если RETURN встречается в основной программе
чего цикла ПЛК. (PLC_PRG), рабочий цикл прерывается. В функциях и функцио-
нальных блоках происходит возврат в место вызова. Иными сло-
PI PI вами, использование перехода RETURN аналогично по смыслу
оператору RETURN в текстовых языках.

7.5.5. Расширение возможностей LD


Рис, 7.9. Генератор единичных импульсов
В LD-диаграмму можно вставить функции и функциональные
блоки. Функциональные блоки должны иметь логические вход и
7.5.4* Управление порядком выполнения выход. На рис. 7.11 показан пример организации цикла на 10 по-
второв на базе функционального блока декрементный счетчик.
Порядок выполнения цепей диаграммы можно принудительно
Первая цепь загружает счетчик числом повторов. Вторая цепь —
изменять, используя метки (labels) и переходы (jumps).
генератор единичных импульсов. Третья — декрементный счет-
Метку можно ставить только в начало цепи. Имена меток чик с проверкой условия окончания цикла. Тело цикла на рисун-
подчинены правилам наименования переменных. Для наглядно- ке не показано.
сти можно закончить метку двоеточием. Двоеточие не образует
новой метки. Так, Ml: и Ml это одно и то же. Цепь может
иметь только одну метку и один переход. Переход равнозначен
выходному реле и выполняется, если выходная переменная Decrement
имеет значение ИСТИНА. Переход может быть инверсным, в CTD
Q Cycle
этом случае он выполняется при значении цепи ЛОЖЬ. Испо- СО

льзуя переход» можно пропустить выполнение части диаграм- TRUE LOAD CV

мы. Пропущенные цепи не сбрасываются, а именно не выпол- 10 PV

няются — замирают в том положении, в котором были ранее. Cycle:

Переход вверх допускается и позволяет создавать циклы Pulse Putee


(рис. 7.10). Проверка условий окончания цикла, естественно»
лежит на совести программиста.
Тело цикла повторяется 10 раз
Decrement
FOR ever AND ever Pulse "
FOReverANDever t>Cycte
FALSE -
0-
Рис. 7.10. Простейший бесконечный цикл

Идеологически переходы противоречат аналогии LD с релей- Рис. 7.11. Цикл на 10 повторов на базе функционального блока CTD
ными схемами, нарушая законы электрических цепей. В схеме
LD с переходами разобраться бывает сложно. Желательно не за- Для включения в диаграмму функций в них искусственно вво-
ниматься управлением порядком выполнения LD-диаграммы в дится добавочный логический вход, обозначаемый EN (Enable)
ней самой, а использовать для этого более выразительные средст- (см. пример на рис. 7.12). Логическое значение на входе EN раз-
ва. Например, разделить LD-диаграмму на модули (действия), а решает или запрещает выполнение функции. Сама функция не
порядок выполнения описать в SFC. терпит никаких изменений при добавлении входа EN.
1 4 2 Глава 7. Языки МЭК Релейные диаграммы (LD) 143

1 |EN y2 PROGRAMPLC PR6


а2-
ADD
М
1
EO_counter2 So
tp2
У2
CU C TU Q
11
=ALSE-RESET C V -Counter2
PV
1
' ,

Рис. 7Л2. Использование оператора EQ, управляемого по входу EN

В первой редакции стандарт МЭК определял контакты и об-


мотки» управляемые фронтами импульсов: контакт |Р| и обмотка
(Р) переднего фронта» контакт |N| и обмотка (N) заднего фронта. Рис. 7.13. Правый край двух целей различной длины
В настоящее время поддержка таких контактов и обмоток не яв-
ляется обязательной» так как аналогичную цепь легко можно по- ровать ее далее, можно сразу присвоить значение FALSE выход-
строить при помощи функциональных блоков R_TRIG и F_TRIG. ной переменной. Компилятор кода CoDeSys так и делает.
Для функциональных блоков CoDeSys позволяет графически
7*5.6. Особенности реализации LD в CoDeSys подключать только один вход в логическую цепь. Стандарт не на-
Нетрудно заметить, что длина LD-цепей различна в зависимо- кладывает таких ограничений. Например, в системе MULTIPROG
сти от сложности. Например, пусть первая цепь состоит из 50 первая цепь, показанная на рис. 7.11, может выглядеть как на
контактов, а вторая из двух. В этом случае шины питания на схе- рис. 7.14.
ме должны быть широко разнесены, чтобы вместить все соедине-
ния первой цепи. Вторая цепь будет выглядеть неоправданно рас-
Decrement
тянутой. Эта особенность РКС всегда вызывала сложности при ре-
Cycle
ализации программирующих станций ПЛК. Если цепь не вмеща-
лась в один экран, ее разрывали и переносили остаток ниже. Ана-
логично выглядят предложения данного абзаца, выровненные по
ширине. Перенос легко читается для одного провода, но цепь мо-
жет быть разветвленной.
Стандарт МЭК допускает не изображать общую правую шину Рис. 7.14. Изображение декрементиого счетчика в MULTIPROG
вообще и выравнивать цепи влево для лучшего зрительного вос-
приятия. Графический редактор CoDeSys не ограничивает воз- Вход RESET здесь получает значение ИСТИНА непосредствен-
можную ширину LD-цепи и не требует применения переносов. но от шины питания- Такая схема нагляднее, но приемлема толь-
Сложные цепи изображаются слитно и для работы с ними необ- ко для логических переменных. Аналоговые переменные все рав-
ходимо пользоваться горизонтальной прокруткой экрана но не вписываются в идеологию LD и требуют непосредственное
(см. рис. 7.13). Правая шина изображается вертикальными от- присваивание.
резками в пределах каждой цепи и выравнивается влево, цепи Функция или функциональный блок в LD рассматриваются
пронумерованы и разделены горизонтальными линиями. как исполнительное устройство — аналог реле. Применение фун-
Время выполнения одной LD-цепи не постоянно. Если процесс кции фактически означает конец LD-диаграммы и начало FBD.
сор обнаружил, что цепь разомкнута, то уже нет смысла анализи- Правила построения LD-диаграмм здесь уже не работают.
1 4 4 Глава 7. Языки МЭК Функциональные блоковые диаграммы (FBD) 145

Помимо входа 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. Функциональные блоковые диаграммы Trig 1 Tlmeri


(FBD) OR TOF
Observer^
Ъг li# U V • VCLK
W• Q IN —o-
• • • QW -Warning
Trig2 T#10s- РТ ЕТ
7.6Л. Отображение POU F_TRIG I
Observer- CLK Q|Ml
Диаграмма FBD строится из компонентов» отображаемых на
схеме прямоугольниками. Входы POU изображаются слева от
прямоугольника, выходы справа. Внутри прямоугольника указы- Tlmer2
вается тип POU и наименования входов и выходов. Для экземп- TON
ляра функционального блока его наименование указывается | Warning-I N Q
ЕУТ
сверху, над прямоугольником. В графических системах програм-
мирования прямоугольник компонента может содержать картин-
ку, отражающую его тип. Размер прямоугольника зависят от чис- Рис. 7.16. Диаграмма FBD из двух цепей
1 4 6 Глава 7. Языки МЭК Функциональные блоковые диаграммы (FBD) 147

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

0001 MOD LT AND


(Var1+Var2)/2
Ы<>Ь2

•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. Определить действия,
соответствующие шагу, можно в Дозревание

0005 END STEP любое время. Нет ничего удиви-


тельного, если пустые шаги
Ready
останутся и в законченном про-
пустая цепь
екте. Задачей пустого шага яв- р и с 7 1 9 Ш а г и и п е р еходы
TRUE ляется ожидание перехода.

Рис. 7.17. Метки и переходы в FBD 7.7-2. Переходы


Ниже шага на соединительной линии присутствует горизонта-
7.6.7. Выражения ST в FBD льная черта, обозначающая переход (см. пример на рис. 7.19).
CoDeSys позволяет записывать выражения ST на входе графи- Условием перехода может служить логическая переменная,
ческих блоков. Такой прием расширяет стандартный FBD и час- логическое выражение, константа или прямой адрес.
то оказывается достаточно удобным. Компактная форма пред- Переход выполняется при соблюдении двух условий:
ставления выражений облегчает запись и чтение функциональ- 1) переход разрешен (соответствующий ему шаг активен);
ных диаграмм. 2) условие перехода имеет значение TRUE.
1 5 0 Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 151

Простые условия отображаются непосредственно на диаграмме


справа от черты, обозначающий переход. В CoDeSys на диаграмме bDigEnd
можно записывать только выражения на языке ST (T1 > 50 на bX2
рис. 7.19). bXl
Для громоздких условий применяется другой подход. Вместо
условия на диаграмме записывается только идентификатор пере*
Рис- 7.22, Переход Ready (IL)
хода. Само же условие описывается в отдельном окне с примене-
нием языка IL, ST, LD или FBD-
На рис, 7.20—7.23 показаны четыре возможных представле-
ния перехода Ready на разных языках.
[bDigEnd OR bX2)AND
Переменные или прямые адреса используются в условии пере-
хода только для чтения. В условном выражении перехода нельзя
вызывать экземпляры функциональных блоков и использовать
операцию присваивания.
Рис. 7.23. Переход Ready (ST)
Признаком того, что идентификатор перехода на диаграмме
является отдельно реализованным условием, а не простой логиче-
ской переменной, служит закрашенный угол перехода (см. В качестве условия перехода может быть задана логическая
рис. 7Л9). константа. Если задано TRUE, то шаг будет выполнен однократ-
но, за один рабочий цикл, далее управление перейдет к следую-
щему шагу. Если задано условие FALSE, то шаг будет выполня-
TransitionReady (LD) ться бесконечно.

7*7.3. Н а ч а л ь н ы й шаг

Каждая SFC-схема начинается с шага, выделенного графиче-


ски двойными вертикальными линиями или по всему перимет-
ру. Это — начальный шаг (рис. 7.24). Наименование начально-
го шага может быть произвольным (по умолчанию Init). Нача-
льный шаг присутствует обязательно, хотя и может быть
Рис. 7.20. Переход Ready (LD) пустым.

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

Digestion x<-10 - - x > 20

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

Move Dwn MoveJJp Нагревание

-Lx<-10 4-x>20

MoveJJp Move Dwn


Stop_nxrtor
Digestion Дозревание
i

Рис. 7.27. Перекрестные поименованные переходы

7.7.7. Упрощенный SFC


Помимо рассмотренной ниже стандартной МЭК-технологии Рис. 7*28. Создание нового описания шага
связи шагов и действий, в CoDeSys реализована упрощенная реа-
лизация (easy mode SFC). Смысл ее заключается в применении бо- Шаги, содержащие действие, на схеме отличаются тем, что
лее простого, компактного и быстрого последовательного SFC-ис- верхний правый угол прямоугольника закрашен. Пока шаг акти-
полнителя. Помимо этого, сами диаграммы получаются компакт- вен, текущее действие будет выполняться один раз в каждом ра-
нее и часто проще для понимания. Безусловно, возможности бочем цикле*
упрощенной реализации несколько уже — нельзя, включать и вы-
ключать действия в разных шагах и управлять активностью дей-
Входные и выходные действия
ствий по времени.
Действия могут быть трех классов — текущее, входное и вы- Весьма вероятен случай, когда определенные действия нужно
ходное. Графически действия на диаграмме никак не отобража- выполнить в шаге только один раз (рис. 7-29)- Например, вклю-
ются, их редактирование выполняется в отдельных окнах, чить нагрев в начале активности шага и выключить при перехо-
В упрошенной реализации действия принадлежат шагу. То есть де на другой шаг. С этой целью и предусмотрены входное и вы-
действие нельзя вызвать из другого шага или откуда-либо еще. ходное действия. Входное действие обозначается сегментом 'Е'
Можно считать, что каждый прямоугольник шага при его увели- (Entry) в нижнем левом углу прямоугольника шага и выполня-
ченном рассмотрении содержит 3 раздела, соответствующие трем ется однократно при активизации шага. Выходное обозначается
возможным действиям. Если шаг удалить, то и все его действия сегментом *Х* (eXit) в нижнем левом углу прямоугольника шага.
будут утрачены. Не удивительно, что такие действия не требуют Выходное действие выполняется однократно при завершении ра-
отдельных идентификаторов и называются по именам шагов. боты шага.
Для создания нового или редактирования существующего дей-
ствия в CoDeSys достаточно щелкнуть мышкой по прямоугольни- Нагревание
ку шага. Это приведет к открытию соответствующего редактора
или вызову диалога создания нового действия, если шаг еще не
описан.
На рис. 7.28. показан момент определения действия шага Рис. 7.29. Шаг с входным и выходным действиями
Digestion (Дозревание).
1 5 6 Глава 7, Языки МЭК Последовательные функциональные схемы (SFC) 157

Механизм управления шагом Описанный упрощенный механизм SFC продолжает работать и


Для каждого шага CoDeSys создает две логические перемен- при использовании МЭК шагов. То есть CoDeSys позволяет в лю-
ные. Допустим, шаг называется Stepl, Для него будут определе- бое время подключить полный SFC исполнитель, без переделки
ны переменные _Stepl и Stepl. Объявления переменных происхо- того, что уже реализовано.
дят неявно, т. е. в разделе объявлений никаких дополнительных
записей делать ненужно. Переменная с лидирующим подчеркива- 7.7.8- Стандартный SFC
нием (_Stepl) получает значение TRUE, когда шаг активируется
(входное условие выполнено), и сбрасывается при деактивации Вышеописанная упрощенная техника настраивает на то, что
(сразу при выполнении выходного условия). Переменная без под- изначально определяются шаги, которые наполняются определен-
черкивания (Stepl) отстает на один рабочий цикл, т. е. получает ным содержимым в процессе работы над проектом.
значение TRUE после выполнения входного действия и сбрасьг&а- При применении МЭК-действий подход несколько иной. Сна-
ется после выполнения выходного действия. Комбинации двух чала определяются действия (виды работ), которые должна вы-
этих переменных (JStepl, Stepl) последовательно образуют 4 воз- полнять система» а затем уже составляется диаграмма, в которой
можных состояния шага: не выполняется (00), входное действие определяется их порядок и взаимосвязь. Каждое действие сопо-
(10), текущее действие (11 и 10), выходное действие (01). ставляется одному или нескольким шагам. Причем вполне воз-
Данные переменные можно использовать для определения Ак- можно, что некоторое действие должно запускаться в одном шаге
тивности шага, например, с целью синхронизации параллельных и останавливаться в другом. Также возможно, что начатое дейст-
ветвей (рис. 7.30). Так, в следующем примере шаг Step4 не может вие должно закончить свою работу вообще независимо ни от ка-
быть закончен раньше, чем Step2. ких шагов. Например, начав движение, кабина лифта должна
как минимум доехать до ближайшего этажа и выпустить пасса-
жиров, даже если дана команда на окончание работы.
Действия МЭК показываются на SFC-диаграмме в виде прямо-
угольников, расположенных справа от шага и привязанных к
нему графически. Пример шагов, содержащих действия, показан
NOT Step2 на рис. 7.31.
Существенно важным здесь является то, что одно и тоже дей-
ствие можно многократно использовать в разных шагах. Так, в
данном примере шаги Cooling (охлаждение) и Drying (сушка) ис-
пользуют действие air-cooling (воздушный обдув). В отличие от
Рис. 7.30. Синхронизация шагов описанных выше упрощенных действий, действия МЭК не при-
надлежат конкретному шагу, а являются самостоятельными про-
Для доступа к переменным шага вне данного компонента и из граммными элементами SFC-компонента.
отладчика их необходимо объявить как логические переменные.
Предварительная установка переменных (_Step) шагов в отладчи- N air-cooling
ке дает возможность быстро перейти к отладке какого-либо оцре- N welling
деленного состояния системы. Обращаться к переменным шага на
запись в пользовательской программе нельзя- Это приведет к
тому, что SFC-диаграмма будет работать совсем не так, как следу- IN air. cooling
ет из ее графического представления, что, безусловно, противоре-
чит самой идее SFC. На самом деле, запись не запрещена, но ис-
пользовать эту возможность желательно только в целях отладки. Рис. 7.31. Действия
Последовательные функциональные схемы (SFC) 159
Глава 7. Языки МЭК
1 5 8

• R — сброс (Reset, рис. 7.35). Действие деактивируется.


Идентификаторы действий должны быть уникальны в преде-
лах компонента POU и не должны совпадать с идентификаторами
Шаг
шагов и переходов.

7.7.9. Классификаторы действий Действие J U U U U I

Прямоугольник, отображающий действие, содержит в левой Рис- 7.35- Сброс действия


части специальное поле — классификатор (см. рис. 7.31). Клас-
сификатор (qualifier) определяет способ влияния активного шага • L — ограниченное по времени (time Limited). Действие акти-
!
на данное действие. вируется вместе с шагом и остается активным на заданное
Возможны следующие классификаторы: время, но не дольше, чем шаг. На рис. 7.36 показаны два
• N — несохраняемое действие (Non-stored, рис. 7-32). Данное возможных случая. В первом случае действие деактивирует-
действие будет выполняться в каждом рабочем цикле, пока ся по истечении времени, во втором — по причине деактива-
активен шаг. ции шага.

Шаг Шаг

Ш_
г

Действие J L U I L Действие

Рис. 7.32. Несохраняемое действие Время


шага

. Р - импульс (Pulse, рис. 7.33). Действие выполняется один Рис. 7.36. Ограниченное по времени действие
раз при активации и второй раз после деактивации шага.
• SL — сохраняемое и ограниченное по времени (Stored and
time Limited, рис. 7.37). Действие активируется вместе с ша-
Шаг J гом и остается активным заданное время, вне зависимости
от активности шага. Действие можно деактивировать до-
Действие
срочно из другого шага с классификатором R.

Рис. 7.33. Импульсное действие


Шаг

. S - сохраняемое (Stored, рис. 7.34). Действие активирует-


ся и остается активным до сброса. Действие продолжит вы-
полняться в каждом цикле даже тогда, когда шаг уже не
Действие 1АШ_
активен. Время
действия

Шаг Рис. 7.37. Сохраняемое и ограниченное по времени действие

Действие 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

Шаг Рис. 7.41. Деактивация действия

Определить состояние деактивации можно внутри действия


Действие путем анализа признака активности (подробнее см. раздел
7.7.12). Такая необходимость возникает особенно часто при реа-
Время
шага
лизации импульсных действий, когда разные операции нужно
выполнить в начале и в конце шага. Например:
Рис. 7.39. Отложенное сохраняемое действие
IFStepl.XTHEN
• SD — сохраняемое отложенное (Stored and time Delayed, iACount := iACount + 1; (*Счетчик активных циклов*)
рис. 7.40). Действие активируется через заданное время по- ELSE
сле активации шага, даже если шаг уже не активен. Но ес-
ли в процессе отсчета задержки активации выполнить сброс iDCount := iDCount + 1; (*Счетчик деактиваций*)

_п
END_IF
Шаг
7.7.10. Действие — переменная
Действие Ш1МШ Действие стандартного SFC не обязательно должно что-либо
делать. В качестве имени действия можно указать логическую пе-
ВрвМЯ
действия
ременную, внутреннюю или внешнюю. Переменная (на рис. 7.42
bMoveUp) будет соответствовать состоянию активности действия,
Рис. 7.40 Сохраняемое отложенное действие классификаторы будут работать.
1 6 2 Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 163

Функциональный блок имеет входы, соответствующие клас-


сификаторам. Если какой-либо активный шаг включает данное
bMoveUp AT 9CQX2.3: BOOU (*полъем*1 действие» то это приводит к присваиванию логической едини-
цы соответствующему входу SFCActionControl. После обработ-
ки всех активных шагов по состоянию выхода Q система ис-
b MoveUp
полнения принимает решение о необходимости вызова данного
Step2
действия. Все действия вызываются один раз в рабочем цикле.
Порядок выполнения активных действий зависит от реализа-
ции исполнителя.
bUDPOS
В CoDeSys идентификаторы действий автоматически сортиру-
ются в менеджере проекта в алфавитном порядке, в процессе ис-
Рис. 7.42. Переменная действия полнения эта последовательность сохраняется- Интерфейс функ-
ционального блока SFCActionControl описан в библиотеке
Такая переменная гораздо полезнее, чем может показаться на IECSFC.lib CoDeSys, которая обязательно должна быть включена
первый взгляд. Вполне вероятно, что необходимо управлять од- в. проект при использовании SFC с МЭК-действиями. Входы бло-
ним дискретным выходом, а вся необходимая логика уже отраже- ка имеют одну тонкость — вместо классификаторов S и R испо-
на в SFC-диаграмме. Никакого дополнительного программирова- льзуются идентификаторы SO и R0- Это сделано для исключения
ния здесь ненужно. Кроме того, переменные действий часто при- конфликта с ключевыми словами.
меняются для синхронизации различных ветвей диаграммы или Функциональный блок SFCActionControl реализуется из стан-
программ всего проекта. дартных компонентов МЭК, как это показано на рис. 7.44.
Как видно из реализации» сброс R0 является доминирующим
7.7.11. Механизм управления действием входом. При наличии сброса выход Q безусловно приобретает зна-
чение FALSE, Прочие входы после соответствующего анализа объ-
Классификаторы определяют достаточно сложные возможно-
единены по ИЛИ. Как уже было сказано» действие вызывается
сти управления работой действия. Причем очевидно, что действие
всякий раз при Q = TRUE и последний раз после перехода Q из
так же, как и шаг, должно иметь внутреннюю память состояния TRUE в FALSE.
и логику управления, причем даже более развитую. Для реализа-
ции такого управления в каждое действие неявно включается эк- Описание функционального блока SFCActionControl дано здесь
земпляр функционального блока SFCActionControl (рис. 7.43). для лучшего понимания механизма работы действий. На самом
деле вы не найдете ни объявления экземпляров, ни его реализа-
SFCActonControl ции в проекте. Логика работы действий скрыта от глаз и являет-
N Q ся заботой системы исполнения SFC.
R0 В CoDeSys существует все же лазейка, позволяющая получить
SO
р доступ к блоку управления действием. Экземпляр SFCActionCont-
L rol доступен под именем АС в каждом МЭК-действии.
SL
О IF A_3.AC.Q THEN
DS (*действие активно?*)
SD
Т
END IF
Если вы правильно поняли механизм МЭК-действий, то
Рис. 7.43. Графическое представление SFCActionControl ошибочность примеров представленных на двух следующих ри-
1 6 4
Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 165

Теперь рассмотрим пример, представленный на рис. 7.46


Здесь действие А_2 два раза разрешается, затем сбрасывается
В результате выполняться оно не будет.
RESET1 Transi
LTMR
ТОК N А 2 I *_2
IN О N А 2
РТ ЕТ D_TMR
ТОН
Ш Q
S2-2
РТ ЕТ
Р TRIG
R TRIO Рис. 7.46. Попытка вызвать действие 2 раза в одном цикле и запретить
CLK Q
SD_TMR
TON
Ш Q
RESET1 РТ ЕТ 7*7.12. Внутренние переменные шага и действия
DS^TMR
TON Для каждого МЭК-шага неявно объявлена структура из двух до-
IN Q SET ступных по чтению переменных. Первая переменная типа BOOL
— RO- RESET1
носит «оригинальное* название X и является признаком активно-
сти шага. По смыслу она равноценна логической переменной шага
RE5ET1 <StepName> в упрощенной реализации SFC. Логическая единица
SL TMR является признаком активности шага. Вторая переменная типа
SL FF.Q1-
TIME называется Т и указывает время активности шага.
PT ET
Доступ к переменным шага возможен через имя шага и точку,
как к данным структуры или экземплярам функционального бло-
ка — <StepName>.x. Вне программного компонента необходимо
Рис. 7.44. Реализация функционального блока SFCActionControl (FBI?) использовать «трехэтажную» конструкцию, начинающуюся с
имени POU. Например:
IF MoveCtrLMoving.X о TRUE THEN ...

N Переменные шага можно использовать в условиях переходов.


N A2 I *_2 I
N A2 Пример применения такого приема представлен на рис. 7.47,

Рис. 7.45. Попытка вызвать действие три раза в одном цикле


Step2 S
L
лN T
#1
sb
L
ed
12 А 2

4- Step2.t

сунках должна быть для вас очевидной. Начнем с примера, пока-* Рис. 7.47. Пятнсекувдный шаг
занного на рис. 7.45.
Данная конструкция абсолютно бессмысленна. Выполнение Переменная X также доступна и для шагов с аналогичным
действия А_2 трижды разрешается, но само действие все равно смыслом. Фактически <ActionName>-x это общедоступная копия
будет выполнено один раз в рабочем цикле. выхода Q SFCActionControl.
1 6 6 Глава 7, Языки МЭК Последовательные функциональные схемы (SFC) 167

7*7.13. Функциональные блоки и программы SFC


Применение SFC в объемных компонентах позволяет сокра-
тить время выполнения и соответственно время реакции системы.
При помощи шагов монолитная программа разбивается на корот-
кие фрагменты, выполняющиеся в разных рабочих циклах ПЛК.
В других языках МЭК реализация объемных и в тоже время бы-
стрых программ требует дополнительного кодирования механиз-
ма поэтапного выполнения. Проблемы с ростом времени рабочего
цикла при усложнении программы особенно заметны в LD. SFC
стимулирует к равномерному распределению вычислительной SU>T#1s
мощности процессора практически без дополнительных усилий
программиста.
Реализация функциональных блоков и программ в SFC имеет
существенную особенность. Отсутствуют первая и последняя ин-
струкции. Оператор RETURN также не используется. Программа
как бы не имеет конца- Каждый вызов SFC POU равноценен вы-
полнению одного цикла- Что конкретно будет выполнять POU» за-
висит от его предыдущего состояния.
Принудительно вернуть компонент в начальное состояние
можно только путем сброса ПЛК. Принудительная активация на* Рис. 7.48. Замкнутая ветвь SFC
чального шага в SFC не означает автоматический сброс компонен-
та. Она приведет только к тому, что кроме текущих активных В CoDeSys экстренный сброс SFC-программ и функциональных
действий активным еще станет и начальный шаг. Начальный шаг блоков все же возможен. Проблема решается с помощью специа-
не содержит скрытых действий. Он не запрещает другие ш а г и н льных системных флагов (SFCInit, SFCReset), управляющих рабо-
действия. Ситуация демонстрируется примером на рис. 7.48» той SFC-исполнителя*
Здесь параллельная ветвь, с пустым шагом (Idle) передает актив-
ность начальному шагу. Другая параллельная ветвь SI—S2 беско- 7.7.14. Отладка и контроль исполнения SFC
нечно зациклена сама на себя. Она продолжает спокойно работать
независимо ни от чего. Кроме того» не забывайте, что еще сущест- В различных системах программирования для отладки
вуют действия с памятью. SFC-диаграмм применяются следующие приемы:
Отработка реакции на все необходимые события, включая эк- • анимация активных шагов и действий;
стренные, должна быть предусмотрена в SFC явным образом. Пе- • принудительная установка активных шагов;
ревод систем^ в начальное или безопасное состояние предусмат- • блокировка проверки или фиксация условий переходов;
ривает для ПЛК установку заданного положения исполнительных
• пропуск выполнения заданных шагов;
механизмов и управление ими. Нажатие аварийной клавиши,
обестбчивающей исполнительные механизмы, должно корректно • блокировка выполнения действий;
отрабатываться программным обеспечением. Установка и поддер- • мониторинг времени активности шагов.
жание безопасного состояния системы — это такая же работа, Общим методом отслеживания работы SFC-диаграмм в реаль
как и нормальное функционирование- Не стоит для этих целей ном масштабе времени является мониторинг и трассировка пере
использовать программный сброс ПЛК, тем более что такая функ- менных шагов и действий, специально созданных вспомогатель
ция в стандартных библиотеках отсутствует. ных логических флагов и счетчиков активности.
1 6 8 Глава 7. Языки МЭК Последовательные функциональные схемы (SFC) 169

Расширенные отладочные функции реализуются в системах На рис. 7.49 показана SFC-диаграмма в режиме исполнения.
программирования различными способами и зависят от системы Шаг S1 по условию (вероятно, ошибочно) активен дольше, чем за-
исполнения. Поэтому мы не будем рассматривать их здесь деталь- дано атрибутами шага (не более T#0.75s). Атрибуты времени по-
но- Ограничимся одним простым примером мониторинга активно- казаны справа от шага серым цветом. Текущее время — черным
сти шагов в CoDeSys. цветом. В окне объявлений вы можете увидеть флаги, сигнализи-
Условия перехода могут зависеть от переменных, связанных рующие ошибку, шаг и диагноз — условие, задерживающее вы-
с различными входными воздействиями, датчиками, сообщени- полнение.
ями сети, логическими вычислениями и т. д. Если некоторый Флаги с точки зрения отладки, возможно, не являются са-
шаг «пролетает» слишком быстро или наоборот • тормозит», не мым удобным средством, но зато они универсальны. Анализ
всегда так просто понять причину сбоя. Тем более что это не флагов и управляющих переменных SFC-исполнителя позволяет
обязательно программная ошибка. Исходя из здравого смысла, при необходимости создать в прикладной программе собствен-
можно примерно оценить допустимые пределы времени актив- ный модуль контроля и ранней диагностики «разумности» систе-
ности шага. Так, процесс перемещения кабины лифта с одного мы управления.
этажа на другой не может занимать 100 мс, но и не должен за-
нимать несколько часов. В CoDeSys для каждого шага можно
задать временные границы. Нарушение границ возбуждает спе-
циальный флаг ошибки. Помимо этого, отладочная система по-
зволяет определить шаг, где произошла ошибка, и условие, при-
ведшее к нарушению.

RunningUghts {PLC_PRG.nz} (FB SFC)


SFC En able Limit ="RUE
SFCError =FRUE
SFCErrorStep = '
SFCCurrentStep ='ST
SFCErrorAnalyzation = 'SI Л > T#2000ms
Go

N T#0.5s
T#0.75s
T#1s760ms

S1.t>T#2s

T#2s
T#0ms

Рис* 7.49. Диагностика «торможения» шага в CoDeSys


Операторы и функции 171

Оператор Символ Действие Типы параметров

MOD MOD Остаток от деления ANY_INT

Глава 8. Стандартные компоненты EXPT Возведение в степень


INI ANY_NUM
IN2 ANYJNT
В этом разделе описаны наиболее широко применяемые стан- MOVE • Присваивание ANY
дартные операторы, функции и функциональные блоки. Описан-
ные компоненты присутствуют во всех без исключения комплек-
сах МЭК-программирования- Арифметические операторы являются перегружаемыми: тип
В конкретных реализациях возможны незначительные отли- результата операции определяется типом операндов.
чия. Для информации о включенных в состав поставки конк- В графических языках блоки MUL и ADD можно расширять,
ретного комплекса библиотечных компонентах используйте ру- т. е. добавлять произвольное число параметров (см. раздел «Фун-
ководство по применению. Руководства по применению обычно кции с переменным числом параметров»).
пишут люди, настолько владеющие предметом, что им трудно
Пример ST:
представить, что тут вообще может быть что-то непонятно. По-
этому перед применением нового компонента в своей програм- ixl:= (ixl + ix2 + ix3) / 3;
ме желательно детально исследовать его работу на простых
примерах. Реализация этого же примера в FBD представлена на рис. 8.1.
Еще раз напомним» что для начинающих при первом знаком-
стве досконально разбирать все тонкости стандартных компонен- ADD DIV
тов не обязательно. Для начала достаточно иметь общее представ-
ление» чтобы суметь найти решение» когда возникнет такая необ-
bci —
ходимость, 1x2 —
ix3 —
8.1. Операторы и функции Рис. 8.1. Пример графического представления арифметических
блоков
8.1.1. Арифметические операторы
Переменные типа TIME можно складывать между собой, вы-
Почти все арифметические операторы имеют символьнуюфор- читать. Одну переменную типа TIME можно умножать и делить
му для записи в выражениях языка ST. В других языках МЭК ис- на число. Результат во всех случаях будет иметь тип TIME.
пользуются вызовы операторов в виде функции.
Операция MOD применима только на множестве целых чисел.
Смысл выражения OUT := INI MOD IN2 можно раскрыть на язы-
Оператор Символ Действие Типы параметров ке ST так:
ADD Сложение ANY_NUM, TIME IF (IN2 = 0) THEN OUT := 0 ;
SUB

Вычитание ANY_NUM, TIME ELSE OUT : - INI - (IN1/IN2) * IN2 ;


END IF
MUL *
Умножение ANY_NUM, TIME
IN2
Операция OUT : - EXPT(IN1/IN2) означает OUT - IN1 . Па
DIV Деление ANY_NUM, TIME
I
раметр IN2 должен быть целого типа.
1 7 2 Глава 8* Стандартные компоненты Операторы и функции 173

Операция 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
старшие биты замещаются младшими

Циклический сдвиг операнда IN влево на N бит»


ROL
младшие биты замещаются старшими

Пример применения операций сдвига в графической схеме


представлен на рис. 8.2.

SHL OR
wY=16#55AA- wX=16#AA55
I—

SHR

6- -

Рис* 8.2, Перестановка байт в слове (режим online)


Рис. 8.3. Блок голосования два из трех (на логическом базисе И—НЕ)
В языке ST этот пример будет выглядеть так:
В языке LD логические операции И, ИЛИдля типа BOOL за-
wX := SHL(wY,8) OR SHR(wY,8); меняются монтажными соединениями. Операция AND представ-
1 7 4 Глава 8. Стандартные компоненты Операторы и функции 175

ляется последовательным соединением контактов, а операция Типы


OR параллельным соединением (монтажное ИЛИ) (см. пример Текстовый формат Действие
параметров
на рис. 8-4).
OUT :- н т д а г о , I N D Наименьшее из значений ANY
ЬХ1 ЬХ2 bOut Ограничитель:
OUT := LIMIT(Min, IN, Max)
^ OUT:-MIN{MAX(IN,Min)1Max)
ЬХ1 ьхз
ь OUT : - MUX(K» Ш о , . . . . I N ( K - D )
Мультиплексор:
OUT : - IN*.
INo, .-.,
IN^-DJIANY
ЬХ2 ЬХЗ
К: ANY_INT

Рис. 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. Пример применения ограничителя и мультиплексора

OR (bX2 8.1.5* Операторы сравнения


AND ЬХЗ
Следующие операторы реализуют операции сравнения

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

допустимо. На практике обычно реализуют операторы сравнения Действие Типы параметров


Оператор
на 2 входа.
Операторы сравнения принимают 2 параметра любого типа, LN Натуральный логарифм числа ANY_REAL
тип возвращаемого значения BOOL. Действие описывается по от-
LOG Десятичный логарифм числа ANY_REAL
ношению к первому параметру. Так, bOUT :•« INI > IN2; будет
иметь значение TRUE, если IN1 больше IN2. ЕХР Экспонента ANY_REAL
Если необходимость сравнения нескольких величин все же
возникает, необходимо использовать несколько операторов срав- SIN Синус ANY_REAL
нения» объединенных по И, Сравнение трех переменных на ST ANY_REAL
COS Косинус
можно записать так:
bOut := iXX > iX2 AND iXl > iX3 ANDiX2 > iX3; TAN Тангенс ANY_REAL
В графическом представлении используется многовходовый
ASIN Арксинус ANY_REAL
блок AND» На рис. 8-6 дан пример на сравнение трех переменных.
ACOS Арккосинус ANY_REAL
GT AND
ATAN Арктангенс ANY_REAL
1X1- •bOut
iX2 — Единственная функция способная работать с целочисленными
GT значениями ABS, все прочие функции возвращают результат то-
JX1 — лько в формате с плавающей запятой.
Стандартные тригонометрические функции работают в радиа-
нах.
GT Пример ST:
1X2 — irY := EXPT(SIN(lrX),2) + EXPT(COS(lrX),2); (*Результат 1,
1X3- при любом х*)

Рис. 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

достаточную разрядность, чтобы исключить возможность пере-


INT : - LEN(STR)
полнения за один рабочий циклПЛК.
Возвращает длину строки Нельзя полагаться на то» что повторный вызов экземпляра
STR : - MID(STRING STR, INT LEN, INT POS) функционального блока в одном рабочем цикле даст различные
результаты. Значения программных таймеров могут обновляться
Возвращает часть STR с позиции POS длиной LEN
при вызове экземпляра функционального блока или синхронно с
STR := CONCAT(STRING STR1, STRING STR2) обновлением входов. Это зависит от реализации системы испол-
Возвращает конкатенацию строк STR := STR1 + STR2 нения. Не используйте в своих программах циклы (WHILE,
REPEAT) с условием окончания итераций по таймеру.
STR : - INSERT(STRING STR1, STRING STR2, INT POS)
Возвращает STR1 со вставленной STR2 в позицию POS ТР генератор импульса
STR := REPLACE(STR1, STRING STR2, INT LEN, INT POS)
ТР
Возвращает STR1, заменив LEN символов» с позиции POS на STR2
IN BOOL Q BOOL
INT := FIND(STRING STR1, STRING STR2)
РТ TIME ЕТ TIME
Возвращает позицию STR2 в строке STR1. Если STR2 не найдена, воз
вращает О
Запуск таймера происходит по фронту импульса на входе IN.
Вход РТ задает длительность формируемого импульса. После за-
Нумерация позиций в строке начинается с 1.
пуска таймер не реагирует на изменение значения входа IN. Вы-
ход ЕТ отсчитывает прошедшее время. При достижении ЕТ значе-
8.2. Стандартные функциональные блоки ния РТ счетчик останавливается, и выход Q сбрасывается в 0.
Временная диаграмма работы таймера ТР показана на
8.2.1. Таймеры рис. 8.7,

Таймеры ПЛК принципиально отличаются от таймеров, при-


меняемых в языках общего применения, В языках программиро- Вход IN
вания компьютеров существуют функции задержки (delay, sleep),
которые приводят к приостановке выполнения программы на за-
Выход Q J
данное время. Таймера, способного приостановить работу ПЛК, в
стандарте МЭК нет. Представьте себе, что на один вход контрол- Время Р Т - -

лера поступает некоторый сигнал. На второй вход поступает тот ВыходЕТ


же сигнал, но через аппаратный модуль задержки. Именно так
работают стандартные таймеры. Временная задержка влияет то- Рис. 8.7. Временная диаграмма работы таймера ТР
лько на формирование выходных сигналов и не вызывает никако-
го замедления в программе. На рис. 8.8 показано про- PULSE
Для правильной работы таймеров необходима аппаратная под- стейшее применение блока ТР ТР NOT

держка. Все экземпляры функциональных блоков таймеров «за- в качестве генератора корот- Ьх — IN Q — Ьх

секают» время (в CoDeSys во внутренней локальной переменной ких прямоугольных импуль- РТ ЕТ —


StartTime), пользуясь общими часами. При проектировании ПЛК сов. Длительность паузы зада-
достаточно иметь один аппаратный таймер-счетчик, увеличиваю- ется таймером. Начальное со- Рис. 8.8. Пример использования
щийся с постоянной частотой. Аппаратный счетчик должен иметь стояние Ьх = 0. В первом ЦИК- блока ТР
1 8 0 Глава 8. Стандартные компоненты Стандартные функциональные блоки 181

ле Ьх получит значение 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

Выход Q При создании экземпляра блока, пока вход EN равен


Время Р Т - - FALSE, выход Q равен FALSE, а выход CDT равен
DT#1970-01-01-00-00:00:00. По переднему фронту EN в часы за-
Выход
гружается начальное время PD и начинается отсчет. Пока часы
Рис. 8.9. Временная диаграмма работы таймера TOF работают, выход Q = FALSE. Если EN перейдет в FALSE, CDT
сбросится в начальное значение.
Описанная реализация блока RTC вызывает массу сложностей.
TON таймер с задержкой включения Очевидно, часы должны продолжать свою работу при выключен-
ном питании ПЛК. Коррекция хода часов отдельных экземпляров
TON функционального блока RTC должна осуществляться на приклад-
IN BOOL BOOL
ном уровне. Многие ПЛК имеют аппаратно реализованные часы
Q
реального времени. Доступ к аппаратным часам гораздо проще
РТ TIME ЕТ TIME организовать через прямо адресуемые ячейки памяти, чем под-
держивать блок RTC.
По фронту входа IN выполняется обнуление счетчика и начи- Кроме всего прочего, программирование задач управления по
нается новый отсчет времени. Выход Q будет установлен в TRUE часам реального времени достаточно коварно. Иногда часы могут
1 8 2 Глава 8. Стандартные компоненты Стандартные функциональные блоки 183

идти назад! Например, при коррекции или переходе на зимнее Блок 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 побеждает «СТОП».

SR переключатель с доминантой включения R TRIG


CLK BOOL Q BOOL
SR
Функциональный блок R_TRIG генерирует единичный им-
SET1 BOOL Ql BOOL пульс по переднему фронту входного сигнала.
RESET BOOL Реализация блока требует одной внутренней переменной М:
BOOL :== FALSE. На языке ST блок реализуется так:

Блок SR имеет два устойчивых состояния Ql = TRUE и Q := CLK AND NOT M;


Ql •= FALSE, На языке ST работа блока описывается выраже- М : - CLK;
нием:
Выход Q устанавливается в TRUE, если в предыдущем цикле
Q1 - (NOT RESET AND Ql) OR SET1, вход CLK был равен FALSE, а в текущем цикле он уже имеет зна-
чение TRUE. При следующем вызове функционального блока вы-
Вход SET1 включает выход, вход RESET — выключает. При ход сбрасывается в FALSE. Переменная М запоминает значение
одновременном воздействии обоих входов вход SET1 является до- CLK в предыдущем цикле.
минантным.
Если на вход CLK подать константу TRUE, то при перезапуске
RS переключатель с доминантой выключения ПЛК на выходе Q будет сформирован единичный импульс. Анало-
гично, если вход CLK связан с аппаратурой и уже имеет значение
TRUE, экземпляр R_TRIG сформирует ложный единичный им-

RS пульс при первом вызове. Если бы переменная М имела начальное


значение TRUE, то ложного импульса не возникало бы. В случае,
SET BOOL Ql BOOL когда это явление не желательно, можно создать собственный бе-
RESET1 BOOL зопасный детектор фронта или применить пустой вызов экземпля-
ра при начальной инициализации. Такое поведение детекторов
Расширенные библиотечные компоненты 185
1 8 4
Глава 8. Стандартные компоненты
CTD декрементный счетчик
фронтов не является ошибкой, поскольку во многих случаях нача
льный импульс оказывается желательным.
CTD
FJTRIG детектор заднего фронта CD BOOL BOOL
Q
LOAD BOOL
F TRIG
PV WORD CV WORD
CLK BOOL Q BOOL
По каждому фронту на входе CD счетчик (выход CV) уменьша-
Функциональный блок F_TRIG генерирует единичный им- ется на 1. Выход Q устанавливается в TRUE, когда счетчик до-
пульс по заднему фронту входного сигнала. стигнет нуля. Счетчик CV загружается начальным значением,
Реализация блока требует одной внутренней переменной М: равным PV по входу LOAD = TRUE.
BOOL := FALSE. На языке ST блок реализуется так:
CTUD инкрементный / декрементный счетчик
Q := NOT CLK AND NOT M;
M : - NOT CLK; CTUD
Из сравнения двух реализаций очевидно, что блок F_TRIG си BOOL QU BOOL
превращается в R_TRIG включением на входе инвертора NOT. CD BOOL QD BOOL
Обратите внимание на примечание к блоку R_TRIG. Блок RESET BOOL
F_TRIG также обладает свойством формировать ложный импульс
при перезапуске. LOAD BOOL
PV WORD CV WORD
8.2.4. Счетчики
По значению входа RESET = TRUE счетчик CV сбрасывается
Теперь рассмотрим реализацию счетчиков.
в 0. По значению входа LOAD = TRUE счетчик CV загружается
CTU инкрементпный счетчик значением равным PV.
По фронту на входе CU счетчик увеличивается на 1. По фрон-
ту на входе CD счетчик уменьшается на 1 (до 0).
сти Выход QU равен TRUE, если CV > - PV, иначе FALSE.
си BOOL Q BOOL 1
Выход QD равен TRUE, если CV = 0, иначе FALSE.
RESET BOOL
8.3. Расширенные библиотечные компоненты
PV WORD CV WORD
В этом разделе описано несколько широко распространенных
По каждому фронту на входе CU значение счетчика (выход функций и функциональных блоков, реализованных практически
CV) увеличивается на 1, Выход Q устанавливается в TRUE, когда всеми комплексами программирования ПЛК, В CoDeSys описан-
счетчик достигнет или превысит заданный PV порог. Логическая ные блоки включены в состав библиотеки утилит (UTIU3), Биб-
единица на входе сброса (RESET «- TRUE) останавливает счет и об- лиотека реализована как внутренняя, т. е,> написана исключите-
льно на языках МЭК (ST) и доступна для редактирования.
нуляет счетчик (CV := 0).
Глава 8. Стандартные компоненты Глава 8. Стандартные компоненты 187
1 8 6

8.3.1. Побитовый доступ к целым UNPACKER(B:=In, B0=>B7, B1=>B6, В2=>В5, ВЗ=>В4,


В4=>ВЗ, В5=>В2, В6=>В1, В7=>В0);
Для побитового доступа к целым используются следующие ин-
Out : - РАСК(ВО, В1, В2, ВЗ, В4, В5, В6, В7);
струкции.
EXTRACT 8.3.2. Гистерезис
Чтение бита. Функция EXTRACT типа BOOL имеет 2 парамет- Функциональный блок HYSTERESIS (см. рис. 8.11) реализует
ра: DWORD X и BYTE N. Возвращает TRUE, если бит номер N в компаратор, обладающий эффектом гистерезиса.
числе X равен 1, в противном случае — FALSE. Нумерация бит
начинается с 0.
PUTBIT
Запись бита. Функция типа DWORD имеет 2 параметра:
DWORD X, BYTE N и BOOL В. Функция возвращает X с установ-
ленным в 1 битом N, если В равен TRUE. В противном случае за-
данный бит принимает значение 0.
Рис. 8.11. Функциональный блок HYSTERESIS
PACK
Если значение входа IN превышает порог HIGH, выход OUT
Упаковка значений восьми логических переменных в байт.
приобретает значение FALSE. Если значение IN меньше порога
Функция PACK получает восемь параметров ВО, В1, ..., В7 типа
LOW, выход OUT равен TRUE. В пределах от LOW до HIGH выход
BOOL. Возвращаемое значение типа BYTE содержит побитно упа-
функционального блока HYSTERESIS не изменяется. Реализация
кованные значения входных параметров.
блока на языке ST очень проста:
UNPACK IF IN < LOW THEN
Распаковка байта в восьми логических переменных. Функцио-
OUT := TRUE;
нальный блок PUTBIT имеет восемь входов типа BOOL и выход
типа BYTE, выполняет обратную по отношению к PACK распа- END IF
ковку. IF IN > HIGH THEN
Пример функционального блока Turn, изменяющего порядок OUT := FALSE;
бит в байте на обратный:
END IF
FUNCTION_BLOCK Turn
Все три входа IN, LOW и OUT — типа INT, выход OUT типа
VAR_INPUT
BOOL.
In: BYTE;
Применение функционального блока HYSTERESIS демонстри-
ENDJVAR рует рис. 8.12.
VAR_OUTPUT
Out: BYTE;
END_VAR
VAR
B0,Bl,B2,B3,B4,B5,B6,B7: BOOL;
UNPACKER: UNPACK;
END VAR Рис. 8.12. Селекция импульсов с помощью HYSTERESIS
1 8 8 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 189

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

DESCEND максимальный спад N ERR

TIMEBASE время нарастания/спада Р

RESET сброс (BOOL)


Рис. 8.15. Функциональный блок CHARCURVE
1 9 0 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 191

Пусть входное значение х принадлежит интервалу 8.3.6. Дифференцирование


X, < х < Xi+V Тогда у лежит на отрезке прямой, соединяющем со- Функциональный блок DERIVATE осуществляет численное
ответствующие узловые точки (XMYj) и (Х| +1 ,У |+1 ), Значение у дифференцирование входного сигнала (рис. 8.16).
определяется по формуле прямой:

J L

В функциональном блоке CHARCURVE для удобства вычисле-


ния используется интервал (XHUYhl) и (XttYt). To есть интерполя- Г
ция опирается не на начальную, а на конечную узловую точку Рис. 8.16. Дифференцирование прямоугольного импульса
интервала. В этом случае формула выглядит так:
Производную сигнала можно вычислить, зная две ординаты и
приращение времени. Разделив приращение сигнала на прираще-
1
_1 ние времени, получим приближенно значение производной. Для
получения точного значения необходимо использовать бесконечно
Вектор узловых точек CHARCURVE должен быть представлен малое приращение времени, что невозможно на практике. Расчет
в виде массива ARRAY Р[О..1О], где Р — структура типа POINT, производной по двум точкам дает хорошие результаты при точных
состоящая из двух переменных INT — X и У. Вход N (BYTE) ука- значениях ординат. При работе с оцифрованными результатами из-
зывает число узловых точек, которое не должно превышать 11, мерений обязательно присутствует погрешность квантования и,
что соответствует десяти отрезкам интерполяции. Данные пода- как правило, другие высокочастотные шумы различной природы.
ются на вход IN (INT) и после преобразования поступают на вы- Незначительное отклонение ординаты одной из двух точек сущест-
ход OUT (INT). венно влияет на результат. Поэтому функциональный блок
Узловые точки должны быть отсортированы в порядке возрас- DERIVATIVE использует более совершенную формулу, полученную
тания значений X. Выход ERR дает диагностику возможных на основе интерполяционного полинома по четырем ординатам.
ошибок применения функционального блока CHARCURVE: Описанный эффект представлен на рис. 8.17. На графике сиг-
нала (жирная линия) показаны четыре узловые точки. Поскольку
мы говорим о сигнале, по оси абсцисс отложено время, по оси ор-
ERR Расшифровка

0 Ошибок нет

1 Массив точек отсортирован неверно

2 Входное значение лежит за пределом области определения:


Ш < Р[0].Х или IN > P[N-1].X

4 Недопустимое значение N: N < 2 или N > 11

При обнаружении ошибки выход OUT принимает значение


равное нулю.
Применение блока CHARCURVE подробно проиллюстрировано
в примере «Линеаризация измерений». Рис. 8.17. Дифференцирование по двум и по четырем точкам
1 9 2 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 193

динат — уровень сигнала. Точки пронумерованы так, что боль- Функциональный блок 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

IN REAL входное значение


IrSin:=SIN[iN«0.0314159);
rCos:=COS[iN*0.0314159]; ТМ DWORD приращение времени (в мс)
v,i\
!*DER!VATIVE[IN:=rSin, ТМ:=1, RESET:= FALSE); g RESET BOOL сброс
D := fDERIVATIVE.OUT / 0.03141
!iN := IN+1; •
x „t
f<*--. Значение интеграла дает выход OUT. Выход OVERFLOW
(BOOL) сигнализирует о переполнении максимального значения
Рис. 8.18. Проверка работы функционального блока DERIVATIVE переменной OUT типа REAL.
1 9 4 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 195

PLC PRG.tAC

Рис. 8.19. Интегрирование треугольного импульса

Перед началом вычислений необходимо выполнить сброс


. РПП (PFHi STJ
(RESET). Далее заданный интервал интегрирования разбивается rAC := 10 • 4*SIN0N4J.O3141591 + 2 > SIN(iN*O.0628318]:H rAC = 6.127571
на несколько малых частей. Значение интеграла вычисляется пу-
тем циклического суммирования. При каждом вызове экземпля- ItF IN < 200 THEN IN = 150
IN := IN+1: IN = 150
ра функционального блока он получает на вход новое значение flNTEGRAl_pN:=rAC. TW:= 1 , RESET:= FALSER rAC = 6.127571
IN и соответствующее ему приращение времени ТМ. Интеграл :LSE
IN := 0; IN = 150
рассчитывается приближенно методом прямоугольников rDC := flMTtGRALOUT / 200; Гпост. составляю! rDC = 10
(см. рис. 8.20). Значение интеграла приближенно равно сумме flNTEGRAMRESEl> TRUE);
;ND I F
площадей прямоугольников. На языке ST реализация данного
функционального блока (без сброса) описывается одним выраже-
нием : OUT : - OUT + IN * ТМ. Сброс выполняется установкой Рис. 8.21. Выделение постоянной составляющей сигнала
значения входа RESET в TRUE, он вызывает обнуление суммы и
снимает признак переполнения. ми средствами. В описаниях величина ТМ задана в миллисекун-
дах, но это только лишь отражает наиболее распространенную об-
ласть применения. На самом деле ничего не мешает работе функ-
ционального блока INTEGRAL с произвольным масштабом време-
ни (секунды» часы и т. д»)- Мало того, вообще не обязательно
ограничиваться интегрированием по времени. Например, вы мо-
жете применить INTEGRAL для расчета расхода топлива за отре-
зок пути по мгновенным значениям.

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
щения и т. д. В общем случае выходная переменная реагирует на показано регулирование объекта» обладающего трением, который
изменение воздействия по некоторому сложному закону с запазды- «трогается с места* только тогда, когда величина управления
ванием. Математическая модель такого объекта представляет со- превысит значение единицы. В данном же случае скачок управ-
бой систему дифференциальных уравнений. На основании модели ляющего задания вдвое меньше.
объекта можно найти оптимальный закон регулирования. Но это
достаточно сложная задача. В большинстве практических случаев
промышленной автоматики применяется универсальный ПИД-ре-
гулятор. Для него закон регулирования формируется настрой трех
констант, рассчитанных на основании модели объекта или подо-
бранных опытным путем. Уравнение ПИД-регулятора имеет вид:

где Уо — значение при нулевой ошибке, e(t) — сигнал ошибки,


Кр — коэффициент передачи» Тп — постоянная интегрирования,
Tv — постоянная дифференцирования- Рис. 8.23. Регулирование объекта с трением
На рис. 8.22 показаны результаты трассировки системы с ре-
гулятором на основе функционального блока PID при единичном Интегрирование даже малой постоянной ошибки приводит к
скачке сигнала управления. Верхняя кривая соответствует пере- постоянному увеличению управляющего воздействия во времени.
ходной характеристике объекта управления. Вторая кривая — Тем самым достигается точность регулирования при изменении
выходная переменная в системе с ПИД-регулятором. Нижняя характеристик объекта. Дифференциальный канал ПИД-регуля-
кривая — сигнал управления с выхода регулятора. тора улучшает динамические характеристики, компенсируя за-
паздывание фазы управляющего сигнала.
Интерфейс функционального блока ПИД-регулятора определя-
ется следующими входами:

ACTUAL REAL сигнал обратной связи


SET_POINT REAL задание
КР REAL коэффициент передачи
TN DWORD постоянная интегрирования (msec)
TV DWORD постоянная дифференцирования (msec)
YJ3FFSET REAL стационарное значение
Y_MIN REAL минимальное допустимое значение
Рис. 8,22. Пример применения функционального блока ПИД
1 9 8 Глава 8. Стандартные компоненты Расширенные библиотечные компоненты 199

Y_MAX REAL максимальное допустимое значение чески не регулируется. Если заданы пороги допустимого значе-
ния (YJV1AX > Y_MIN), регулятор автоматически ограничивает
MANUAL BOOL ручной режим значение управляющего воздействия и адаптирует рост интегра-
RESET BOOL сброс льной составляющей.
Пропорционально-интегральный (ПИ) регулятор получается из
и выходами; функционального блока ПИД при TV := 0. Для пропорционально-
го (П) и пропорционально-дифференциального (ПД) законов регу-
лирования библиотека утилит CoDeSys включает функциональ-
Y REAL управляющее воздействие ный блок PD.
LIMITS_ACTIVE BOOL признак достижения пороговых значений
OVERFLOW BOOL признак ошибки переполнения

Схематично функциональный блок можно представить следу-


ющим образом {рис. 8.24).

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*

Рис. 8,24. Схема построения функционального блока ПИД

Помимо основной функции ПИД-регулирования» в CoDeSys ре-


ализации данного функционального блока предусмотрен ручной
режим и ограничение диапазона выходной переменной регулято-
ра. В ручном режиме регулятор выключен, значение Y автомати- 3
Последовательное управление по времени (PRG LD» SFC) 201

ботки цепей данного примера можно формировать импульсы,


зависящие от более сложных условий, чем одиночные выходы
таймеров.
Выходы ЕТ-таймеров дают линейно нарастающие значения
Глава 9. Примеры программирования времени. Если преобразовать их к целому типу, то получится ге-
нератор треугольных импульсов.
В этой главе будут подробно рассмотрены примеры программи-
рования с применением языков МЭК- Примеры расположены в
порядке возрастания сложности. В заголовках примеров сокра- 9.2. Последовательное управление по времени
щенно указаны примененные языки и форма реализации. Сокра- (PRG LD, SFC)
щение PRG говорит о том, что пример реализован как программа
в форме законченного проекта. Другие примеры реализованы в Используя блоки таймеров, несложно организовать последова-
форме компонентов, FUN — функция, FB — функциональный тельное переключение выходов с фазами заданной продолжите-
блок. Все иллюстрации получены на основе реализации примеров льности и произвольным фазовым сдвигом. Программа, форми-
в комплексе CoDeSys. рующая три последовательных интервала по 1 секунде, показана
на рис. 9.2.

9.1. Генератор импульсов (PRG LD) Т1


Go ТР х1
Генератор прямоугольных импульсов с заданными длительно* IN О
стями импульса и паузы показан на рис- 9.1. Это элементарный РТ ЕТ
пример LD с функциональными блоками. Т2
Go ТР х2
IN Q <}
Impus
le T#2s- РТ ЕТ
ТЗ
Go ТР хЗ
IN Q О
T#3s- РТ ЕТ
Pause XI у1
О
х2 х1 у2
О
хЗ х2 уз
Рис, 9.1. Генератор прямоугольных импульсов О

Таймер Impulse запускается по переднему фронту х и сбрасы- Рис. 9.2. Последовательное управление по времени в LD
вает х по окончании заданного времени, запуская, таким обра-
зом, таймер Pause. Конец паузы взводит переменную х, которая и По фронту входа Go одновременно запускаются все три тайме-
запускает новый импульс (в следующем рабочем цикле)- Пере- ра Т1 — ТЗ. Каждый таймер отмеряет момент окончания соответ-
менная х является выходом генератора. ствующей фазы. Три нижних цепи выделяют выходы Yl — Y3,
Безусловно, задачу формирования прямоугольных импульсов соответствующие фазам управления. Все переменные программы
можно решить с применением единственного таймера (см. при- должны быть объявлены как BOOL. Процесс работы схемы на-
мер ШИМ или стандартный блок BLINK CoDeSys). Путем дора- глядно отражает экран трассировки CoDeSys (рис. 9.3).
2 0 2 Глава 9, Примеры программирования Кодовый замок (PRG LD) 203

Go

PLC PRCxi • - S1.t>T#1t


|S2 ha
•• S2.t > T#1s
PLC PRG-хЗ
[S3 HN
PLC PRG.yi S3.t > T#1s
PLC PRG-y2
Intt
С PRG.y3 Рис. 9.5. Трехфазная коммутация в SFC

Рис. 9.З. Трассировка схемы последовательного управления 9.3. Кодовый замок (PRG LD)
В данную схему несложно добавить цепь автоматического пе- Пример демонстрирует замену релейного автомата програм-
резапуска- Тогда схема будет работать циклически, как «бегущие мной реализацией на ПЛК без переработки алгоритма работы
огни». Если же вы настроены более серьезно, назовем нашу про- устройства.
грамму модулем управления двигателем с электронной коммута- На рис. 9.6 приведена К1 звонок Р38

цией обмоток статора- принципиальная электриче-


ская схема кодового замка
на электромагнитных реле.
хЗ Go
14 О Для открывания замка не-
обходимо набрать код после-
Рис. 9.4. Цепь автоматического перезапуска
довательным нажатием кно-
пок К2, КЗ, К4, К5. Первую
кнопку кода К2 нужно на-
Данный пример можно реализовать значительно проще с при-
жимать одновременно с
менением SFC. В разделе объявлений нужно объявить всего три
кнопкой дверного звонка
логических переменных. К1. Все промежуточные ре-
yl, у2, уЗ: BOOL; ле Р2 — Р5 работают с са-
мофиксацией, одновременно
Go: BOOL := TRUE;
освобождая реле предыду-
Никаких вспомогательных переменных не требуется. Алго- щей цепи. Ошибочное нажа-
ритм реализуется1 дословно. После окончания работы шага S1 за- тие кнопок Кб —- К9 или
пускается шаг S2, за ним S3. Каждый шаг работает заданное открывание двери (К д ) сбра-
время. Шаг Init — пустой, он ожидает разрешения работы — Go. сывают замок в исходное
Действия yl, у2, уЗ связаны с логическими переменными. Про- состояние. Таким образом, Рис. 9.6- Принципиальная схема
грамма целиком отражена в SFC-диаграмме на рис. 9.5. «свой» открывает замок с кодового замка
2 0 4 Глава 9. Примеры программирования Динамический знаковый индикатор (FUN LD, ST) 205

K1 9.4* Динамический знаковый индикатор


I К1 - кнопка дверного звонка А1штп
—I I
К2-К5 - кнопки набора кода
(FUN LD, ST)
Рб РЗ «arm К2 Р2
— И - г Н \—\ Ь Смысл динамической индикации заключается в экономии вы-
92 ходов контроллера. Один индикатор, состоящий из семи сегмен-
U I I тов, требует для управления семь выходов. Допустим, необходимо
Р6 Р4 Р2 КЗ РЗ
14 построить табло, состоящее из N однотипных индикаторов. Если
РЗ использовать статическую индикацию, то понадобится 7 * N вы-
L
Р6 Р5 РЗ К4 Р4
ходов. Соединим параллельно одинаковые сегменты всех индика-
НИ торов и добавим ключи позволяющие управлять подачей питания
на каждый из них отдельно. Тогда достаточно иметь 7 + N выхо-
Р5
дов для вывода информации на любой из индикаторов. Если поо-
К5
чередно зажигать все индикаторы достаточно быстро, то за счет
послесвечения и инерции зрения образуется статическая картина.
Р6 Для управления индикатором
будем использовать выход типа
BYTE, где семи младшим битам
Кнопки сброса и датчик открытой двери сопоставлены сегменты, как по-
казано на рис. 9,8.
Рассмотрим для примера табло,
Р и с 9.8. Нумерация сегментов состоящее из двух индикаторов.
индикатора Отображаемая информация — это
Плунжер замка Plunger
-О- 1 восьмиразрядное число, которое
нужно показать в шестнадцатеричном формате. Построение гене-
Рис. 9,7. LD-диаграмма кодового замка ратора, управляющего питанием индикаторов, не представляет
сложности. Главная задача — создать функцию, которая должна
очень коротким звонком, « чужой» вынужден поднять трезвон формировать байт управления сегментами из двух параметров: но-
при попытках подбора кода- Одновременное нажатие всех кно- мер индикатора (HD) и индицируемое значение (IN). Для выбора
пок К2 — К9 вызывает сброс в исходное состояние. Секретность из двух индикаторов достаточно переменной типа BOOL. Значение
цифр кода достигается распайкой К2 — К5 к различным клави- входа HD равное ИСТИНА выбирает старший индикатор.
шам наборного поля. Силовые цепи звонка громкого боя и элект- Раздел объявлений функции:
ромагнитного плунжера на схеме не показаны.
Для реализации кодового замка на контроллере необходим FUNCTION DinLight7 : BYTE
ПЛК-имеющий 10 дискретных входов К1 — Кд и 2 выхода: зво- VAR_INPUT
нок и электромагнитный плунжер. Реализующая логику управле- IN: BYTE;
ния диаграмма LD показана на рис. 9.7. Легко заметить, что диа-
грамма практически повторяет принципиальную схему. Единст- HD: BOOL;
венное отличие в том, что контакты реле Р6 разделены на не- ENDJVAR
сколько цепей. Это диктуется правилами построения диаграмм и VAR CONSTANT
не влияет на работу схемы.
LightCodes: ARRAY[0..15] OF BYTE :
16#3F, 16#06, 16#5B, 16#4F,
2 0 6 Глава 9. Примеры программирования Целочисленное деление с симметричным округлением (FUN ST) 207

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.13. График деления у := ISMDIV(x, 3), где х изменяется


от - 1 0 до +10

Кривые на рис. 9.13 отражают работу функции ISMDIV. Из


графика видно, что операционная ошибка деления распределена
симметрично относительно точных значений.
Реализованная функция ISMDIV выполняет симметричное
округление с одним исключением. Если остаток составляет ровно
половину от частного, симметрия нарушается. Для этого случая
вы можете доработать функцию округления в соответствии с пра-
вилом Гаусса. Коррекция результата вверх при половинном
Рис. 9.14. Трассировка работы генератора случайных чисел
остатке должна проводиться, только для четных чисел. Округле-
ние вверх и вниз в этом случае равновероятно, что и является за-
дачей симметричного округления. Функциональный блок имеет один выход х — генерируемое
значение и два входа. Вход хО - начальное значение. По фронту
входа Load блок загружает начальное значение. Если начальное
9.6. Генератор случайных чисел (FB ST) значение не задано, по умолчанию используется число 1.

Функциональный блок генерирует неповторяющиеся целые FUNCTION_BLOCK Random


числа, принадлежащие интервалу [1..250], с равномерным рас- VARJNPUT
пределением. Для формирования очередного числа применяется Load: BOOL;
формула вычетов:
x0: USINT;
Xt ^ЬХ^.-аЕфХ^/а), END_VAR
где а и & — целые константы, Е — функция, возвращающая це- VAR_OUTPUT
лую часть аргумента. Очевидно, что при точном вычислении x: USINT := 1;
(без Е ) формула всегда должна давать 0. *Случайность» резуль- ENDJVAR
тата достигается исключительно за счет целочисленного округле-
ния [17]. После генерации определенного количества разных чи- VAR
сел последовательность в точности повторяется. Период повторе- RESET: R TRIG;
2 1 2 Глава 9. Примеры программирования Очередь FIFO (FB ST) 213

END_VAR Рассмотрим пример блока с размером очереди до 16 байт.


Поскольку никаких преобразований данных в блоке не проис-
ResetfCLK := Load);
ходит, в него можно безопасно помещать любые однобайтные
данные.
I F Reset.Q T H E N x : = xO; E N D _ I F
FUNCTION_BLOCK BY_FIFO
x := x * 170 - 251 *(x * 170/251);
VAR_INPUT
Трассировка 200 циклов работы генератора случайных чисел byWR: BYTE; (•записываемые данные*)
показана на рис. 9.14. На практике для формирования разных
случайных последовательностей в качестве случайного начально- bWREn: BOOL; (•разрешение записи*)
го числа можно использовать мгновенное значение нескольких bRDEn: BOOL; (•разрешение чтения*)
младших разрядов системного таймера ПЛК. END_VAR
VAR_OUTPUT
9.7. Очередь FIFO (FB ST) bReady: BOOL; (•очередь жива*)
byRD: BYTE; (•читаемые данные*)
Блок FIFO реализует очередь — первым пришел, первым
ушел. Работа блока проста. Если запись разрешена (bWREn = END VAR
TRUE), то входной байт (byWR) помещается в конец очереди. VAR
Если чтение разрешено (bRDEn = TRUE), то блок отдает первый byBuf: ARRAY[0..15J OF BYTE;
по очереди байт (byRD). Выход bReady говорит о наличии очере- nWRPos: WORD := 0; (*позиция записи*)
ди. При попытке чтения из пустой очереди (bReady = FALSE)
byRD должен быть равен 0. nRDPos: WORD := 0; (*позиция чтения*)
END VAR
BY_FIFO
byWR bReady IF bWREn THEN (*запись в FIFO*)
byWREn byRD byBuf[nWRPos] : - byWR;
byRDEn

Рис. 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 bRDEn THEN (*чтение из FIFO*) nWRPos := nWRPos + 1;


byRD := byBuf[nRDPos]; END_IF

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 льными действиями.

Алгоритм опирается на два кольцевых индекса, указывающих


позиции чтения и записи. При достижении верхней границы бу- 9.9. Фильтр «скользящее среднее» (FB ST)
ферного массива индекс обнуляется. Запись не должна обгонять
чтение. В этом случае очередь будет перезаписана. Корректная Фильтр «скользящее среднее» (рис. 9.17) является простей-
обработка такой ситуации в данном примере не предусмотрена. шим в реализации цифровым фильтром. Тем не менее он дает
очень хорошие результаты при подавлении шумов и высокочас-
тотных помех.
9.8. Быстрая очередь FIFO (FB ST)
BY_MOVAVR
Данный текст реализации мог быть написан только полным -
«чайником», тем не менее он работает лучше приведенного выше byLen bReady
примера. Быстрота достигается за счет того, что индексы позиций byln byOut
записи и чтения не имеют проверки верхней границы. Фактиче-
ски текст содержит только запись и чтение, никаких вспомогате- Рис. 9.17, Графическое представление экземпляра функционального
льных операций. Трюк состоит в использовании для индексов без- блока Move Average
знакового целого типа и достаточно большого массива. Поскольку
BYTE#255 + BYTE#1 — 0, все получается автоматически. Раздел Алгоритм работы фильтра основан на усреднении нескольких
объявлений входов и выходов аналогичен примеру байтового FI- последних значений сигнала- Математически это выглядит так:
FO-буфера. Локальные переменные должны объявляться так:

VAR
byBuf: ARRAY[0..255] OF BYTE;
где х[] — входной сигнал, у[] — выходной сигнал, N — ширина
nWRPos BYTE :— 0; (*позиция записи*)
фильтра или число усредняемых замеров.
nRDPos: BYTE := 0; (*позиция чтения*) Формула предполагает, что замеры сигнала собраны в массиве.
END VAR При вычислении значения y[i] используется x[i] и N - 1 предыду-
Выход готовности очереди ликвидирован в жертву быстродей щих значений- Очевидно, при обработке сигнала в режиме реаль-
ного времени, выходной сигнал будет запаздывать по отношению
ствию. О корректности применения блока должна заботиться вы
к входу.
зывающая программа.
Рисунок 9.18 демонстрирует действие фильтра. Верхн