Справочник от Автор24
Поделись лекцией за скидку на Автор24

Программируемые логические контроллеры

  • 👀 1695 просмотров
  • 📌 1626 загрузок
Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Программируемые логические контроллеры» docx
ПРОГРАММИРУЕМЫЕ ЛОГИЧЕСКИЕ КОНТРОЛЛЕРЫ Конструктивно ПЛК обычно приспособлены для работы в типовых промышленных условиях, с учётом уровней сигналов, термо- и влагостойкости, ненадёжности источников питания, механических ударов и вибраций. Кроме того, термин ПЛК отображает ещё одну особенность конструктивного исполнения такой УВМ – это отсутствие интерфейса с оператором. Т.е. в состав типового ПЛК не входят ни клавиатура, ни мышь, ни монитор – ничего из тех устройств, которые используются оператором для взаимодействия с обычным компьютером. Конечно, в случае необходимости ПЛК может быть оснащён средствами отображения информации, однако его основная задача – обмен информацией с техническим процессом, а не с человеком. Типичный программируемый логический контроллер состоит из следующих частей: • промышленное шасси или крейт (от англ. crate – корзина); • модуль центрального процессора; • модули ввода-вывода данных. Промышленное шасси представляет собой сборный конструктив, включающий защитный кожух, пассивную объединительную плату (кросс-плата, backplane), вентиляторы, фильтры, источник питания. Защитный кожух изготавливается из прочной стали, возможно, оцинкованной, и алюминиевых элементов. Он обеспечивает защиту компьютера от пыли, вибрации, влаги, ударов, перегрева, электромагнитных помех и позволяет размещать компьютер в сложных цеховых условиях. В шасси устанавливаются и фиксируются электронные компоненты компьютера. Пассивная объединительная плата, которая содержит несколько разъёмов служит для электрического объединения электронных компонентов. Тип разъёмов определяется стандартом шины. Модуль центрального процессора (одноплатный компьютер), содержит процессор и оперативную память, контроллер шины и контроллер интерфейса для программирования. В некоторых случаях здесь же может размещаться и контроллер сети. Модуль центрального процессора устанавливается в один из разъёмов объединительной платы, а остальные заполняются модулями ввода-вывода данных. Пользователь может выбрать наиболее подходящее шасси, отвечающее лучшим образом требованиям по количеству посадочных мест, мощности источника питания и т.д. В том случае, когда каждый модуль выполнен в корпусе с соответствующей защитой, промышленное шасси может выродиться до рейки или стойки (rack – стойка), иногда выполняющей функции объединительной платы. В этом случае в состав контроллера должен входить и модуль источника питания. В качестве системного интерфейса ПЛК используются либо открытые стандарты шин (VME, ISA, CompactPCI), либо собственные стандарты фирм-изготовителей контроллеров (закрытые стандарты). Естественно, собственные стандарты могут позволить себе только крупные фирмы, которые в состоянии поставлять на рынок весь спектр модулей расширения для своей шины, а также средства программирования таких контроллеров. К таким компаниям относятся Siemens, Schneider Electric, ABB, Mitsubishi. ОСНОВНЫЕ ПРИНЦИПЫ ОРГАНИЗАЦИИ РАБОТЫ ПЛК Принципы функционирования ПЛК Естественно, при программировании контроллеров программист должен опираться на определённую функциональную структуру ПЛК (с учётом конкретной конфигурации) и принципы организации его работы. Требования к функциональности ПЛК определены в первой части стандарта МЭК 61131 [20]. Далее рассматриваются основные свойства ПЛК, которые должны учитываться пользователем при разработке программного обеспечения ПЛК. Области памяти ПЛК В большинстве ПЛК выделяют три типа памяти: • загрузочная память используется для хранения программы и начальных значений данных. Загрузочная память чаще всего выполняется энергонезависимой (РПЗУ, EEPROM, FLASH). Часто загрузочная память выполняется в виде отдельной карты памяти, объём которой зависит от конкретных потребностей пользователя; • рабочая память используется для размещения рабочей программы и данных во время исполнения программы; • системная память содержит такие элементы памяти как области отображения входов и выходов технологического процесса (образа технологического процесса), внутренняя память, доступная программисту, в т.ч. память с побитовым доступом (флаги), таймеры и счётчики. Если проводить аналогию с обычной ЭВМ, то загрузочная память соответствует жёсткому диску, рабочая память – оперативной памяти ЭВМ. А вот системная память – это особенность программируемых контроллеров. Её появление неразрывно связано с рабочим циклом ПЛК. Рабочий цикл ПЛК Обмен данными между ПЛК и управляемым технологическим процессом (датчиками и исполнительными механизмами) является неотъемлемой частью АСУ ТП. Поэтому в большинстве ПЛК операция опроса состояния входов и установки нужных значений на выходах реализуется системным программным обеспечением ПЛК и не требует никаких усилий со стороны программиста. Такие программируемые контроллеры работают по методу периодического опроса входных данных. Именно на такую модель опирается стандарт МЭК 61131-3. Рабочий цикл ПЛК включает четыре фазы [18]: • опрос входов; • выполнение пользовательской программы; • установку значений выходов; • некоторые вспомогательные операции (диагностика, подготовка данных для отладчика, сетевой обмен и т.д). Прикладная программа имеет дело с одномоментной копией значений входов. Внутри одного цикла выполнения программы, значения входов можно считать константами. Такая модель упрощает анализ и программирование сложных алгоритмов. Очевидно, что время реакции ПЛК на изменение значения на входе будет зависеть от времени выполнения одной итерации прикладной программы – одного цикла ПЛК. Такая организация работы ПЛК обеспечивает: • неизменность входных переменных в течение рабочего цикла; • гарантированное время постоянства значений на выходных каналах контроллера (изменение не чаще чем один раз в рабочий цикл); • возможность оценивать и управлять длительностью рабочего цикла всего приложения. Для доступа программиста к значениям на входах и выходах ПЛК выделяются специальные области памяти. Чаще всего, это либо две области: область памяти входов и область памяти выходов, либо четыре: области памяти дискретных и аналоговых входов и области памяти дискретных и аналоговых выходов. Тогда рабочий цикл ПЛК можно представить следующим образом (рис. 2.8). Входные дискретные и аналоговые сигналы обрабатываются модулями дискретного ввода (Discrete Input, DI) и аналогового ввода (Analog Input, AI) и в виде двоичного кода записываются в области памяти входов (первая фаза). Во время исполнения программы (вторая фаза) используются данные изо всех областей памяти. В результате исполнения программы рассчитываются новые значения внутренних переменных, а также значения, которые должны быть установлены на выходах контроллера. Рассчитанные значения размещаются в соответствующих областях памяти (см. рис. 2.8). Во время третьей фазы цифровые значения из областей выходов пересылаются в модули дискретного вывода (Discrete Output, DO) и аналогового вывода (Analog Output, AO) соответственно, модули преобразуют их в соответствующие значения тока или напряжения на своих выходах. Четвёртая фаза используется, например, для обмена данными по сети. Способы исполнения рабочего цикла ПЛК Некоторые ПЛК позволяют настраивать способ исполнения рабочего цикла: • циклический – новый цикл начинается сразу по окончании последнего цикла; • периодический – программист задаёт минимальную длительность цикла ПЛК. Если последний цикл завершился раньше заданного времени, то начало нового цикла задерживается до тех пор, пока не пройдёт установленная длительность цикла. Обмен данными между модулем центрального процессора и модулями ввода-вывода При организации обмена данными между узлами ПЛК используются те же принципы, что и в ЭВМ с шинной организацией [21]. Центральный процессор под управлением операционной системы опрашивает входы ПЛК, размещает полученные данные в специальных областях, исполняет программу и передаёт новые значения на выходы ПЛК. Каждый модуль ввода-вывода, входящий в состав ПЛК, есть не что иное, как периферийное устройство, конкретные характеристики и способы работы с которым задаются на этапе конфигурирования контроллера. Обмен данными с периферийными устройствами осуществляется с помощью портов ввода-вывода. Каждому модулю ввода-вывода назначается свой уникальный диапазон портов ввода-вывода. Таким образом, центральный процессор ПЛК может обратиться к любому модулю ввода-вывода с запросом на чтение (модули ввода) или записи данных (модули вывода). В состав каждого модуля входит один или несколько регистров данных – локальная память модуля. При обращении к модулю ввода-вывода центральный процессор передаёт по шине адреса адрес соответствующего порта ввода-вывода, а по шине управления – тип операции (чтение из порта или запись в порт). Данные передаются по шине данных. Таким образом, центральный процессор и модули ввода-вывода работают асинхронно: модули ввода непрерывно опрашивают свои входы, постоянно поддерживая в актуальном состоянии локальную память модуля, а центральный процессор периодически считывает значения из локальной памяти каждого модуля ввода во время фазы опроса входов (первая фаза рабочего цикла ПЛК). Модули вывода постоянно удерживают на выходах значения из своей локальной памяти. Поэтому, как только значение локальной памяти модуля вывода изменяется центральным процессором во время фазы установки выходов (третья фаза рабочего цикла ПЛК), на выходах модуля вывода устанавливаются новые значения. Модуль дискретного ввода Дискретные датчики (Д0 … Д7) представляют собой ключи (электронные или механические – неважно). Замыкание соответствующего ключа замыкает электрическую цепь, подключая светодиод соответствующей оптопары к источнику питания датчиков. Ток, протекающий через светодиод опто-пары, переводит транзистор оптопары в проводящее состояние и потенциал на его коллекторе становится равен нулю (относительно внутренней земли модуля), что соответствует логической единице в ТТЛ-логике. Если ток через светодиод не протекает (ключ разомкнут), то транзистор закрывается и на коллекторе устанавливается напряжение +5В (логический нуль). Текущие значения дискретных входов (логические нули и единицы) сохраняются в регистре данных (локальная память модуля), откуда в любой момент могут быть переданы по системной шине ПЛК по запросу модуля центрального процессора. Возможен вариант, при котором питание датчиков осуществляется переменным напряжением, электрическая схема подключения датчиков к модулю дискретного ввода выглядит следующим образом. Два противоположно включенных параллельных светодиода оптопары обеспечивают открытие транзисторного ключа на каждом полупериоде сигнала. В обеих схемах оптопары обеспечивают гальваническую развязку входов модуля с внутренними цепями. К основным характеристикам модуля дискретного ввода относятся следующие: • количество входов (каналов) и способ подключения сигнальных линий. Количество каналов обычно кратно восьми. По способу подключения модули могут быть с дифференциальными входами (каждый вход − отдельная пара проводов) и с общей точкой (передача сигнала относительно общего провода − земли); • количество входов в группах. Если подключение сигнальных линий осуществляется с общей точкой, то несколько входов объединяются в одну группу с общей землей; • тип сигнала (постоянное/переменное напряжение). Для переменного напряжения дополнительно указывается допустимый диапазон частот сигнала, [Гц]; • уровень логического нуля, [В]; • уровень логической единицы, [В]; • входное сопротивление, [кОм]; • максимальная частота переключения входного сигнала, [Гц] или задержка распространения входного сигнала, [с]; • наличие гальванической развязки (гальваническая изоляция, UПРОБОЯ). Отсутствие изоляции снижает стоимость модуля, но повышает риск выхода контроллера из строя при попадании на сигнальные линии датчика силового напряжения. • Модуль дискретного вывода Принципиальная электрическая схема модуля дискретного вывода представлена на рис. 2.15. Программа ПЛК сохраняет нужное состояние дискретных выходов контроллера в области памяти дискретных выходов, которая затем, во время установки выходов записывается в регистр данных (локальную память модуля дискретного вывода). Модуль дискретного вывода устанавливает на своих выходах соответствующие значения. Логическая единица на любом из выходов регистра данных приводит к появлению разности потенциалов между выходами светодиода оптопары и, как следствие, протеканию тока через светодиод, что, в свою очередь, приводит открытию транзисторного ключа и подачи напряжения на соответствующий исполнительный механизм (ИМ, рис. 2.15). На рис. 2.15 приведена схема модуля дискретного вывода с транзисторными ключами с восемью выходами, объединёнными в одну группу с общей точкой (DO общ) и внешним источником питания постоянного тока. Для защиты транзисторных ключей от сгорания параллельно им подключены стабилитроны, которые ограничивают максимальный ток через транзисторный ключ. Использование транзисторного ключа для управления дискретным выходом обеспечивает высокое быстродействие выходов; отсутствие механических контактов – высокую износостойкость. Однако транзисторный ключ не позволяет коммутировать большие токи, а также требует учитывать полярность коммутируемого напряжения, а значит, может работать только с постоянным напряжением. Перечисленных недостатков лишены модули дискретного вывода с релейным выходом (рис. 2.16). Вход «Упр.» подключается к одному из выходов регистра данных. При появлении на входе «Упр.» логической единицы, т.е. потенциал на эмиттере становится равен нулю, транзистор открывается и через катушку реле протекает ток, что приводит к срабатыванию реле и замыканию контакта реле. Контакты реле могут коммутировать напряжение любого вида (постоянное, переменное, любое другое). При появлении на входе «Упр.» логического нуля (потенциал +5 В) ток по цепи «база–эмиттер» не протекает и транзистор переходит в непроводящее состояние. Катушка реле обесточивается, реле отключается, и электрическая цепь исполнительного механизма разрывается. Поскольку катушка реле является индуктивной нагрузкой, то ток через неё моментально измениться не может (первое правило коммутации) [7]. Поэтому, чтобы защитить транзисторный ключ параллельно катушке реле включается диод. Когда через катушку протекает ток, через диод, включенный встречно, ток не течёт. При закрытии транзистора через диод протекает ток, индуцированный катушкой реле не вызывая увеличения потенциала на коллекторе транзистора. На рис. 2.16 для управления включением реле используется обычный транзистор, а не оптопара, поскольку само реле выступает в качестве гальванической развязки. Можно сказать, что реле является полной противоположностью транзисторного ключа: недостатки одного являются достоинствами другого. Реле позволяет коммутировать напряжение независимо от полярности. Реле, встраиваемые в модули дискретного вывода, обеспечивают коммутацию достаточно больших токов – до 8 Ампер. Для сравнения: транзисторные ключи обычно коммутируют токи не более 0,5 Ампер. Однако реле обладают сравнительно невысоким быстродействием и ограниченным ресурсом из-за искрения и обгорания контактов при размыкании цепи [26]. На рис. 2.16 показано реле с нормально разомкнутым (нормально открытым) контактом. Т.е. при отсутствии питания катушки реле цепь разомкнута. Возможно использование в составе модуля дискретного вывода реле с нормально замкнутыми (нормально закрытыми) контактами. Такие реле реализуют инверсную логику и используются в системах управления в тех случаях, когда по требованиям безопасности при пропадании питания контроллера цепи дискретного выхода должны оставаться замкнутыми. Иногда релейный выход называют выходом типа «сухой контакт». Промежуточное положение между транзисторными и релейными дискретными выходами занимают модули с симисторовыми выходами (рис. 2.17). Симисторы довольно часто называют «твердотельными реле», термин появился как перевод соответствующего английского термина –solid state relay. Они имеют высокое быстродействие, в них отсутствуют механические контакты и одновременно их конструкция не накладывает никаких ограничений на характер питающего напряжения. На рис. 2.17 представлен один из вариантов реализации схемы управления симисторовым выходом. С помощью маломощного симистора, входящего в состав оптопары осуществляется управление обычными силовыми симисторами, которые замыкают электрическую цепь, подключая исполнительный механизм к источнику питания [26, 27]. К основным характеристикам модуля дискретного вывода относятся следующие: • количество выходов (каналов) и способ подключения сигнальных линий (с общим проводом, изолированные); • количество выходов в группах; • тип сигнала. Тип сигнала зависит в первую очередь от того, как реализован коммутирующий элемент. Соответственно различают модули с транзисторными ключами, реле и симисторами. Иногда встречаются модули с транзисторными ключами и внутренним источником напряжения. В этом случае уже говорят не о замыкании или размыкании электрической цепи с помощью дискретного выхода, а о подаче/снятии напряжения на дискретном выходе; для транзисторных ключей указываются: • напряжение логического нуля, [В]; • напряжение логической единицы, [В]; • максимальный выходной ток логической единицы, [А]; для релейных выходов указываются: • • логика – прямая или инверсная (нормально открытые или нормально закрытые контакты реле); • номинальное коммутируемое напряжение, [В]; • коммутационная способность контактов (максимальный коммутируе-мый ток), [А]; • количество циклов срабатывания контактов (обычно – до нескольких миллионов); • для симисторовых выходов указываются: • номинальное коммутируемое напряжение, [В]; • максимальный коммутируемый ток, [А]; • частота переключений выходов при разных типах нагрузки (активная, ин-дуктивная, емкостная), [Гц]. При этом указывается предельно допустимая индук-тивность [Гн] и ёмкость [мкФ] нагрузки; • наличие гальванической развязки. Модуль аналогового ввода Обработка аналоговых сигналов начинается с фильтрации всех высокочастотных помех, наводимых в сигнальных проводах при передаче сигнала, с помощью фильтра низких частот (ФНЧ, рис. 2.21). Отфильтрованные измерительные сигналы собираются в мультиплексоре. Это устройство, которое имеет адресные входы, несколько информационных входов и один выход. В зависимости от адреса, один из входов коммутируется на выход. Основное назначение мультиплексора – уменьшить общую стоимость модуля аналогового ввода за счёт применения только одного устройства обработки сигналов (в данном случае – аналогово-цифровой преобразователь, АЦП), которое обычно существенно дороже мультиплексора для всех входных сигналов. В АЦП происходит преобразование аналогового сигнала в цифровой. К выходам АЦП подключаются параллельно все регистры данных (РД) буфера данных [1]. С помощью мультиплексора входы модуля поочерёдно подключаются ко входу АЦП. Одновременно с переключениями мультиплексора дешифратор буфера данных переключает подачу разрешающего сигнала «запись» (WR) на управляющий вход очередного регистра данных. Таким образом, цифровой сигнал на выходе АЦП, соответствующий i-тому входу запоминается в i-том регистре данных локальной памяти модуля. Управление переключениями мультиплексора и дешифратора осуществляет функциональный узел «Логика управления переключениями», который обычно реализуется микроконтроллером модуля. Частота переключений мультиплексора определяется временем АЦ-преобразования, что, в свою очередь, влияет на стоимость АЦП и модуля аналогового ввода в целом: чем меньше время преобразования, тем выше стоимость. От времени АЦ-преобразования зависит и частота обновления значений в регистрах данных. Так, например, для модуля аналогового ввода со временем АЦ-преобразования 500 мс и восемью каналами, значение в регистре данных для каждого входа будет обновляться один раз в четыре секунды. Другими словами – частота сканирования или частота выборки в этом случае составляет 0,25 Гц. Таким образом, модуль аналогового ввода представляет собой экстраполятор нулевого порядка с определённым периодом квантования. Экстраполятор нулевого порядка может рассматриваться как фильтр низких частот (теорема Котельникова-Шеннона, [2]), в связи с этим некоторые производители модулей позволяют настраивать время АЦ-преобразования. Иногда от настроенного времени АЦ-преобразования зависит точность преобразования. Буфер данных (локальная память модуля) хранит результаты последнего измерения значений сигналов для каждого входа. По запросу центрального процессора эти данные передаются по системной шине для размещения в соответствующей области памяти. Основные характеристики модуля аналогового ввода: • количество входов (каналов) и способ подключения сигнальных линий (с общим проводом, изолированные). Для каналов с общим проводом указывается количество входов в группах; • типы подключаемых датчиков (унифицированный вход напряжения или тока, термопара, терморезистор, тензодатчик); • диапазон изменения входного сигнала (в зависимости от типа датчика), [В, мА, тип термопары, тип терморезистор, Ом]; • способ передачи аналогового сигнала (дифференциальный, с относитель-ной землёй); • максимально допустимая разность потенциалов между входами модуля. Этот параметр определяется характеристиками мультиплексора. При превышении установленного значения мультиплексор может сгореть; • разрешающая способность АЦП, [бит]; • полоса пропускания, [Гц]; • частота выборки или сканирования, [Гц], или время АЦ-преобразования, [мс]; • для входного сигнала напряжения указывается входное сопротивление, [МОм]; • погрешность АЦП, [%]; • температурный дрейф нуля, [мкВ/°С]; • наличие гальванической развязки. Модуль аналогового вывода Функциональная схема модуля аналогового вывода представлена на рис. 2.24. Значения из области аналоговых выводов пересылаются в локальную память модуля. К информационным выходам каждого регистра данных (РД) через гальваническую развязку (ГР) подключен цифроаналоговый преобразователь (ЦАП), который преобразует цифровой код на входе в уровень напряжения на выходе. Аналоговый сигнал с выхода ЦАП поступает на фильтр низких частот и далее, через выходной усилительный каскад (ВК) – на входы исполнительных устройств и механизмов. Здесь уже не используется мультиплексор. Во-первых, стоимость ЦАП не так высока, а во-вторых, и это главное, при использовании мультиплексора пришлось бы включать в состав модуля функциональное устройство способное хранить значение сигнала не в виде цифрового кода, а в аналоговой форме в виде уровня напряжения, что труднореализуемо. Основные характеристики модуля аналогового вывода: • количество и тип выходов (каналов) и способ подключения сигнальных линий (с общим проводом, изолированные). Для каналов с общим проводом указывается количество входов в группах; • диапазон изменения выходного сигнала, [В, мА]; • разрядность ЦАП, [бит]; • скорость нарастания сигнала, [В/с, мА/с]. Из-за конструктивных особенностей ЦАП на его выходе невозможно получить скачкообразное изменение сигнала. При появлении скачка на входе ЦАП, напряжение на его выходе будет линейно увеличиваться. Скорость этого увеличения и указывается в качестве характеристики модуля; • входное сопротивление нагрузки, [кОм]; • максимальная ёмкость нагрузки, [мкФ]; • максимальная индуктивность нагрузки, [Гн]; • базисная и рабочая погрешности преобразования ЦАП, [%]; • температурный дрейф нуля, [мкВ/°С, мкА/°С]; • наличие гальванической развязки. Разработка программного обеспечения ПЛК Программирование ПЛК осуществляется на этапе разработки и внедрения системы АСУ ТП. Тем не менее, необходимость изменения программы в ПЛК возникает регулярно иногда и непредвиденно. Поэтому, написана она должна быть так, чтобы любой человек, а не только её автор мог в ней быстро разобраться и оперативно внести необходимые доработки. Говорить о том, что программы написаны для ПЛК, не вполне корректно [18]. Все программы написаны человеком и предназначены для чтения человеком. Любые инструменты программирования дают в конечном итоге микропроцессору инструкции в его машинных кодах. Для него нет разницы, на каком языке написана программа. То есть, говоря о различных характеристиках языков программирования, имеют в виду их способность эффективно выражать мысли программиста. В семидесятых годах прошлого века появилось множество языков для программирования ПЛК, ориентированных в первую очередь не на программистов, а на специалистов-технологов. В конце семидесятых годов сложилась крайне сложная ситуация. Каждый изготовитель ПЛК разрабатывал собственный язык программирования, поэтому ПЛК разных производителей были программно несовместимы, кроме того, существовала проблема аппаратной несовместимости. Замена ПЛК на продукт другого изготовителя превратилась в огромную проблему. Покупатель ПЛК был вынужден использовать изделия только одной фирмы либо тратить силы на изучение разных языков и средства на приобретение соответствующих инструментов. В итоге в 1979 году в рамках Международной Электротехнической Комиссии (МЭК) была создана специальная группа технических экспертов по проблемам ПЛК. Ей была поставлена задача – выработать стандартные требования к аппаратным средствам, программному обеспечению, правилам монтажа, тестирования, документирования и средствам связи ПЛК. В 1982 году был опубликован первый черновой вариант стандарта, который получил наименование МЭК 1131. Ввиду сложности получившегося документа, было решено разбить его на несколько частей. После перехода в 1997 году на пяти цифровые обозначения, в настоящее время выделяют следующие части стандарта МЭК 61131 [19]: МЭК 61131-1. Программируемые контроллеры. Часть первая. Общая ин-формация. В Российской Федерации на базе этого стандарта разработан ГОСТ Р 51840–2001. МЭК 61131-2. Программируемые контроллеры. Часть вторая. Требования к оборудованию и испытаниям (ГОСТ Р 51841–2001). МЭК 61131-3. Программируемые контроллеры. Часть третья. Языки программирования. МЭК 61131-4. Программируемые контроллеры. Часть четвёртая. Руководства для пользователя. МЭК 61131-5. Программируемые контроллеры. Часть пятая. Технические характеристики средств обмена сообщениями. МЭК 61131-7. Программируемые контроллеры. Часть седьмая. Программирование нечёткого управления. МЭК 61131-8. Программируемые контроллеры. Часть восьмая. Руководства по применению и реализации языков программирования. Шестая часть, МЭК 61131-6, зарезервирована для возможного использования в будущем. Вопросам программирования посвящена третья часть стандарта «Языки программирования ПЛК». Рабочей группой МЭК было принято достаточно оригинальное решение. Из всего многообразия существовавших на момент разработки стандарта языков программирования ПЛК были выделены пять языков, получивших наибольшее распространение. Спецификации языков были доработаны, так что стало возможным использовать в программах написанных на любом из этих языков стандартизованный набор элементов и типов данных. Такой подход МЭК не раз подвергался критике, но время доказало правильность этого решения. Реализация подобного подхода позволила привлечь к программированию одного и того же ПЛК специалистов различных областей знаний (и что особенно важно – различной квалификации): специалистов по релейной автоматике (и даже электриков), программирующих в LD, специалистов в области полупроводниковой схемотехники и автоматического регулирования для которых привычен язык FBD, программистов, имеющих опыт написания программ для компьютеров на языке ассемблера (ему соответствует язык IL для ПЛК), на языках высокого уровня (язык ST), даже далекие от программирования специалисты-технологи получили свой инструмент программирования – язык SFC. Хотя внедрение МЭК систем программирования и не позволило полностью отказаться от услуг профессиональных программистов (впрочем такая цель и не ставилась), но зато позволило снизить требования к квалификации и соответственно затраты на оплату труда программистов ПЛК. Стандартизация языков позволила (по крайней мере, частично) решить проблему зависимости пользователя ПЛК от конкретного изготовителя. Все современные ПЛК оснащаются средствами МЭК 61131-3 программирования, что упрощает работу пользователям контроллеров (можно использовать ПЛК различных фирм без затрат на переучивание) и одновременно снимает ряд проблем для изготовителей ПЛК (можно использовать компоненты ПЛК других изготовителей). Следует отметить, что некоторые старейшие изготовители ПЛК до сих пор вынуждены поддерживать свои собственные языки (системы программирования), однако все они, в той ли иной форме, стремятся обеспечить поддержку МЭК 61131-3. Стандарт существенно расширил возможности на рынке труда специалиста, занимающегося программированием ПЛК. Подобно тому, как автомеханик, имеющий стандартный набор инструментов, может браться за ремонт любого узла (кроме нестандартных) машины любой фирмы, так и специалист, изучивший языки МЭК 61131-3 сможет разобраться с программой любого современного ПЛК. Это позволило уменьшить как зависимость фирмы от специалиста по программированию ПЛК, так и специалиста от фирмы. Еще одним важным положительным результатом стандартизации языков явилась возможность специализации изготовителей ПЛК как на производстве аппаратных средств ПЛК, так и на производстве средств программирования ПЛК. Результаты такой специализации хорошо видны на примере индустрии персональных компьютеров: существуют компании выпускающие высококлассные аппаратные средства, они умеют делать это лучше других и не испытывают необходимости выпускать программное обеспечение, в то же время на рынке программных средств есть свои лидеры, вооруженные опытом и имеющимися у них технологиями. Благодаря стандартизации обеспечивается совместимость и в результате пользователь может свободно выбрать лучшие продукты как из аппаратных, так и из программных средств. 4.1. Структурное программирование и ООП Одной из первых и наиболее широко применяемых технологий программирования стало структурное программирование. Структурный подход к программированию был впервые предложен в начале 70-х годов XX века фирмой IBM. Его появление было связано с распространением ЭВМ III-го поколения и развитием алгоритмических языков высокого уровня (III-го поколения). До этого (при программировании на ЭВМ I-го и II-го поколений, размер оперативной памяти которых был значительно ограничен, а машинное время очень дорого) использовался операциональный подход, которому был присущ целый ряд недостатков: запутанность логики программы, ее непонятность другим пользователям (кроме авторов программы) и недостаточная надежность. Эти недостатки, а также машинная зависимость ЯП I-го и II-го поколений, не позволяли перейти к массовому промышленному созданию программного обеспечения. Это и подтолкнуло ведущие фирмы к разработке новых методологий программирования, наиболее удачной из которых на тот момент стала идея структурного программирования. Метод структурного программирования до сих пор не потерял своего значения для определенного класса задач. Он базируется на двух основополагающих принципах: 1) использование процедурного стиля программирования, 2) последовательная декомпозиция алгоритма задачи сверху вниз (нисходящее проектирование). Согласно структурному подходу задача изначально формулируется в терминах ввода данных – вывода результата: на вход программы подаются исходные данные, программа работает (обрабатывает данные) и выдает результат (рис. 14). После этого начинается последовательное разложение (декомпозиция) всей задачи на отдельные более простые действия. При этом на любом этапе декомпозиции программу можно проверить с помощью специальных «заглушек» – процедур, имитирующих вход и/или выход процедур нижнего уровня. «Заглушки» позволяют проверить логику верхнего уровня алгоритма до реализации следующего уровня. Таким образом, на каждом шаге разработки можно иметь работающий «каркас» программы, который постепенно обрастает деталями. Рис.14. Схема верхнего уровня структурного подхода Для структурного программирования также характерны следующие черты: 1) алгоритм любой программы выражается комбинацией трех базовых структур – линейной, разветвляющейся и циклической (см. пункт 2.6 в Главе 2), 2) любой блок кроме условного имеет только один вход и один выход, а блок проверки условия – один вход и два выхода; 3) избегается использование безусловного перехода из одной точки программы в другую (т.е. оператора GOTO); 4) программа имеет модульную структуру, т.е. состоит из модулей (модуль – последовательность логически связанных операций, оформленная как отдельная часть программы и решающая некоторую функциональную задачу). Модульная структура имеет ряд явных преимуществ по сравнению с монолитной структурой программы при разработке больших проектов: 1) позволяет создавать программу одновременно нескольким программистам (каждый будет разрабатывать свой (свои) модуль (модули)); 2) облегчает проектирование и последующие модификации программы; 3) упрощает отладку программы, т.е. поиск и устранение программных ошибок; 4) позволяет использовать готовые библиотеки модулей. Однако, несмотря на все достоинства структурного программирования, настал момент, когда использование только структурного (процедурного) подхода в программировании исчерпало себя. Поэтому стали появляться различные новые непроцедурные методологии программирования, одной из которых и являетсяобъектно-ориентированное программирование (ООП). ООП родилось и получило широкое распространение благодаря попыткам разрешения проблем, возникавшим при проектировании и разработке сложных программных комплексов. Основными из этих проблем являлись следующие: 1. Развитие языков и методов программирования не успевало за все более растущими потребностями в прикладных программах. Единственным способом снижения времени разработки при структурном подходе был метод многократного использования уже разработанного ПО, т.е. проектирование новой программы на базе ранее разработанных программных модулей (что не всегда было удобно). 2. Ускорение разработки нового ПО требовало упрощения их сопровождения и модификации. 3. Не все задачи поддаются алгоритмическому описанию по требованиям структурного программирования, поэтому для упрощения процесса проектирования требовалось приблизить структуру программы к структуре решаемой задачи (что не всегда возможно при процедурном подходе). Решение перечисленных проблем в рамках создания ООП и породило три его основных достоинства: упрощение процесса проектирования программ (даже сложных), облегчение процесса их сопровождения и модификации, минимизация времени разработки за счет использования готовых модулей. 4.2. Понятие программного объекта Понятие объекта. ООП базируется на понятии программного объекта. В отличие от процедурного подхода к программированию, когда описание программы представляет собой последовательность действий (процедуру), ООП предлагает описывать программу в виде взаимодействия объектов (в виде соотношений между объектами). При этом любой программный объект представляет собой совокупность данных и действий над ними. Характеристики состояния объекта называют свойствами, а действия над данными объекта называют методами. Каждому типу объектов могут быть присущи свои свойства и методы. Пример. Пусть требуется построить изображение «звездного неба» в двумерной проекции. Задача состоит в размещении и перемещении некоторого количества мерцающих разноцветных точек (обозначающих звезды) и кружков (обозначающих планеты) на плоскости экрана. Пусть звезда – точка на экране с координатами (Х, У), которая имеет цвет, может быть видимой или невидимой и может перемещаться по «звездному небу». Планета – цветной круг с координатами центра (Х, У), который тоже может быть видимым или невидимым и должен перемещаться. Все звезды (и планеты) в нашем примере однотипны и могут представляться одинаковыми свойствами и процедурами обработки. Поэтому для решения этой задачи необходимо создать объекты типа «Звезда» и «Планета». 4.3. Наследование, инкапсуляция и полиморфизм Характерными особенностями, присущими ООП, являются: наследование, инкапсуляция и полиморфизм объектов. Наследование. В рассмотренном ранее примере о звездном небе, очевидно, что для изображения любого объекта должно определяться его положение на экране (например, координатами Х и У относительно верхнего левого угла экрана). Поэтому можно описать объект «Позиция» с координатами Х и У и методом «Назначить координаты»: Позиция (Х, У, Назначить ХУ) В то же время объект «Звезда» может быть описан следующим образом: Звезда (Х, У, Видимость, Цвет, НазначитьХУ, Назначить цвет, Зажечь, Погасить, Переместить) Обратим внимание, что возможности объекта Позиция полностью входят в объект Звезда. Такое свойство называется наследованием и позволяет описать объект Звезда через объект Позиция: Звезда (Позиция, Видимость, Цвет, Назначить цвет, Зажечь, Погасить, Переместить) Таким образом, наследование позволяет повторно использовать уже созданную часть программного кода, в том числе и в других проектах, тем самым, исключая избыточность программного кода (ненужных повторов). Посредством наследования формируются связи между объектами через понятия «родители» и «потомки». В нашем примере о звездном небе объект Позиция можно считать «родителем» относительно объекта Звезда, а объект Звезда – «потомком» для объекта Позиция. Инкапсуляция. Объединение в одном месте всех данных и методов объекта (включая данные и методы объектов-предков) называется инкапсуляцией. При этом инкапсуляция значительно облегчает понимание программы, ее отладку и модификацию, т.к. разработчика редко интересует внутренняя реализация объектов. Для него важнее, чтобы объект обеспечивал назначенные ему функции (а как он это делает – неважно). Взаимодействие с объектом происходит через его интерфейс. Обычно интерфейс определяет единственный способ входа в объект и выхода из него; детали реализации остаются инкапсулированными. При создании собственных объектов разработчик должен организовать для них собственные интерфейсы (по тому же принципу). В объектах интерфейсами (средствами доступа к этим объектам) являются их свойства, методы и события. Только они предоставляются каждым объектом в распоряжение других объектов. Благодаря этому предотвращается доступ других объектов к внутренним переменным состояния объекта, которые могут обрабатываться только предусмотренными для этого процедурами. Таким образом, инкапсуляция обеспечивает использование объекта, не зная как, он реализован внутри (его внутренняя реализация как бы скрыта «внутри капсулы). Полиморфизм. В рассмотренном ранее примере о звездном небе уже были описаны объекты Позиция и Звезда. Если пытаться описать объект Планета, очевидно, что этот объект должен наследовать возможности объекта Звезда, но методы Назначить цвет, Зажечь, Погасить, Переместить, по результату являясь теми самыми, фактически не могут быть реализованы одинаковой последовательностью команд и для Звезды, и для Планеты (вспомним, что Звезда – точка на экране, а Планета – кружок). Эта ситуация разрешается следующим образом: методы объектов имеют одинаковое название (и, соответственно, одинаковый ожидаемый результат), а внутреннее описание методов будет различно для разных объектов. Такое свойство объектов называется полиморфизмом, а объект Планета может иметь следующее описание: Планета (Звезда, Радиус, Назначить цвет, Зажечь, Погасить, Переместить) Полиморфизм основывается на возможности включения в данные объекта информации о методах обработки этих данных. При этом различные по типу объекты могут использовать одинаковую абстракцию – могут иметь свойства и методы с одинаковыми названиями. Однако обращение к ним будет вызывать различную реакцию для различных объектов. 4.4. Понятие класса объектов В рассмотренном ранее примере о звездном небе фактически были описаны множества однотипных объектов (а именно трех типов: Звезда, Планета, Позиция), которые обладают одинаковыми возможностями, т.е. можно сказать, что Позиция, Звезда и Планета представляют целые классы объектов. Таким образом, класс объединяет объекты с одинаковыми возможностями (данными и методами). Он описывает общее поведение и характеристики набора аналогичных друг другу объектов (однотипных). Объект – это экземпляр класса или, другими словами, переменная, тип которой задается классом. Объекты в отличие от классов реальны, они существуют и хранятся в памяти во время выполнения программы. Соотношение между объектом и классом похоже на соотношение между переменной и типом. Использование готовых библиотек классов повышает скорость разработки программ, но требует хорошего знания этих библиотек и понимания того, как они устроены. Кроме того, библиотека классов должна быть написана на том же ЯП, что и разрабатываемая программа. Существует способы сопряжения разных языков, но если библиотека написана на другом ЯП, то это потребует дополнительных усилий. Например, чтобы использовать для программы, написанной на языке Pascal,библиотеку классов на языке С++, необходимо написать программу с вызовами нужных функций или порождением необходимых классов. Такого рода неудобства привели к появлению концепции компонента – программного модуля или объекта, который готов для использования в качестве составного блока программы и которым можно визуально манипулировать во время разработки программы. 4.5. Типы программных компонентов Компонент — это объект, объединяющий состояние и интерфейс (способ взаимодействия с этим объектом). Состояние компонента может быть изменено только с помощью изменения его свойств и вызова методов. Каждый компонент имеет интерфейсы двух типов: интерфейс стадии проектирования и интерфейс стадии выполнения. Интерфейс проекти­рования позволяет включать компоненты в современные среды разра­ботки приложений, а интерфейс выполнения управляет работой компо­нента во время выполнения программы. При этом неважно, на каком языке программирования реализован компонент. Он должен просто удовлетворять определенным внешним параметрам и быть нейтрален по отношению к языку программирования, чтобы его можно было исполь­зовать в программе на любом языке, поддерживающем компонентную технологию. Например, компоненты стандарта ActiveX могут быть одинаково успешно включены как в программу, реализованную на Visual Basic, так и в приложение, разработанное в среде Delphi. Компоненты графического интерфейса, управляемые событиями, являются основным «строительным» материалом при разработке при­ложений средствами графических редакторов. Разработка любого при­ложения состоит из двух взаимосвязанных этапов: 1) проектирование и создание интерфейса при­ложения как набора визуальных компонентов, которые будут обеспечивать взаимодействие пользователя и вычислительной среды; 2) программирование процедур обработки событий, возникаю­щих при работе пользователя с приложением. На этапе проектирования интерфейса происходит формирование общего вида главного окна программы, а также способов управления ее работой. Для каждого компонента должен быть определен его внешний вид, размеры, способ и место раз­мещения в области окна приложения. Рис. 15. Иерархия групп компонентов схожей внутренней структуры Компоненты, доступные проектировщику на этапе разработки при­ложения, можно разбить на функциональные подгруппы. С точки зрения внутренней структуры компоненты разбиваются на три группы: визуальные оконные, визуальные неоконные, невизуальные. На рисунке 15 представлена графическая интерпретация этого разбиения. Визуальные компоненты (элементы управления) характеризуются наличием свойств размеров и положения в области окна и на стадии разработки приложения обычно находятся в окне формы в том же месте, что и во время выполнения приложения (например, кнопки, списки, пере­ключатели, надписи). Визуальные компоненты имеют две разновидно­сти — «оконные» и «неоконные» (графические). Оконные визуальные компоненты (самая многочисленная группа компонентов) — это компоненты, которые могут получать фокус ввода (т.е. становиться активными для взаимодействия с пользова­телем) и содержать другие визуальные компоненты. Неоконные (графические) визуальные компоненты не могут по­лучать фокус и содержать другие визуальные компоненты (напри­мер, надписи и графические кнопки). Невизуальные компоненты на стадии разработки не имеют своего фиксированного местоположения и размеров. Во время выполнения приложения некоторые из них иногда становятся видимыми (например, стандартные диалоговые окна открытия и сохранения файлов), а другие остаются невидимыми всегда (например, таблицы базы данных). Важной характеристикой компонента являются его свойства. Свойства компонента — это атрибуты, определяющие его состояние и поведение. Различают три типа свойств: 1) свойства времени проектирования (установленные для них значения будут использоваться в момент первого отображения ком­понента и в дальнейшем могут быть изменены во время выполнения приложения); 2) динамические свойства (изменением их значений можно управлять только изнутри программного кода (во время выполнения приложения)); 3) свойства только-для-чтения, которые могут быть прочитаны и использованы при выполнении программы, но не могут быть изменены. На этапе программирования процедур обработки событий, исходящих от компонентов, происходит непосредственная разработка программ-откликов на события с целью задать реакцию на различные изменения состояний объектов. Общий принцип работы приложения с графическим интерфейсом может быть представлен схемой, изображенной на рисунке 16. Работаю­щее приложение находится в состоянии ожидания события, которое возникает в результате взаимодействия пользователя с элементами управления графического интерфейса приложения. При получении события от компонента программа передает управление процедуре обработки этого события (если таковая предусмотрена набором функций приложения). Рис.16. Схема работы приложения с графическим интерфейсом ЯЗЫКИ ПРОГРАММИРОВАНИЯ КОНТРОЛЛЕРОВ МЭК 61131 Язык структурированного текста ST В следующей таблице приведен список ST операторов, расположенных в порядке приоритета. Оператор присваивания Перед оператором присваивания находится операнд (переменная или адрес), которому присваивается значение выражения, стоящего после оператора присваивания. Пример: Var1: = Var2 * 10; После выполнения этой операции Var1 принимает значение в десять раз большее, чем Var2. Вызов функционального блока в ST Функциональный блок вызывается с помощью имени экземпляра функционального блока и списка входных параметров с присваиванием данных в круглых скобках. В следующем примере вызывается таймер с параметрами IN и PT. Значение выходной переменнойQ присваивается переменной А. К выходной переменной, как и в IL, можно обратиться с помощью имени экземпляра функционального блока, точки, следующей за ним и имени выходной переменной: CMD_TMR (IN: = %IX5, PT: = 300); A: =CMD_TMR.Q Инструкция RETURN Инструкция RETURN позволяет выйти из POU, например, в зависимости от условия. Инструкция IF Используя инструкцию IF, можно проверить условие, и в зависимости от этого условия выполнить какие-либо действия. Синтаксис: IF THEN {ELSIF THEN . . .ELSIF THEN ELSE } END_IF; Часть конструкции фигурных скобках не обязательна. Если < возвращает истину, тогда выполняется. В противном случае будут выполняться остальные логические выражения одно за другим, пока одно из них не возвратит истину. Тогда выполняются инструкции, стоящие после этого логического выражения до следующего ELSIF или ELSE. Если все логические выражения ложны, то выполняются инструкции, стоящие после ELSE. Инструкция CASE C помощью инструкции CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции. Синтаксис: CASE OF : : : : ... : ELSE END_CASE; Инструкция CASE выполняется согласно следующим правилам: · Если переменная имеет значение , то выполняется инструкция · Если не принимает ни одного из указанных значений, то выполняется . · Чтобы одна и та же инструкция выполнялась при различных значениях переменной , необходимо перечислить эти значения через запятую. · Чтобы одна и та же инструкция выполнялась для целого диапазона значений, необходимо указать начальное и конечное значения, разделенные двумя точками. Цикл FOR С помощью FOR можно программировать повторяющиеся процессы. Синтаксис: INT_Var :INT; FOR := TO {BY } DO END_FOR Часть конструкции, заключенная в фигурные скобки, не обязательна. выполняются, пока счетчик не больше . Это условие проверяется перед выполнением , поэтому раздел не выполняется, если больше . Всякий раз, когда выполняются , значение , увеличивается на . может принимать любое целое значение. По умолчанию шаг устанавливается равным 1. Цикл WHILE Цикл WHILE может использоваться, как и цикл FOR, с тем лишь различием, что условие выхода определяется логическим выражением. Это означает, цикл выполняется, пока верно заданное условие. Синтаксис: WHILE END_WHILE Раздел выполняется циклически до тех пор, пока дает TRUE. Если равно FALSE уже при первой итерации, то раздел не будет выполнен ни разу. Если никогда не примет значение FALSE, то раздел будет выполняться бесконечно. Цикл REPEAT Цикл REPEAT отличается от цикла WHILE тем, что первая проверка условия выхода из цикла осуществляется, когда цикл уже выполнился 1 раз. Это означает, что независимо от условия выхода цикл выполняется хотя бы один раз. Синтаксис: REPEAT UNTIL END_REPEAT Раздел выполняется циклически до тех пор, пока дает TRUE. Если равно FALSE уже при первой итерации, то раздел не будет выполнен один раз. Если никогда не примет значение FALSE, то раздел будет выполняться бесконечно. Инструкция EXIT Если EXIT встречается в циклах FOR, WHILE, REPEAT, то цикл заканчивает свою работу независимо от значения условия выхода. Язык линейных диаграмм LD Язык LD - графический язык, основанный на принципах ре­лейно-контактных схем с возможностью использования большого количества различных функциональных блоков. Элементами релейно-контактной логики являются: контакты, катушки, а так же программы, составленные на языке LD, могут содержать FBD блоки. Контактом является LD-элемент, который пере­дает состояние горизонтальной связи левой стороны горизон­тальной связи на правой стороне. Последовательное соединение контактов или цепей соответствует логической операции И. Параллельное соединение равноценно операции ИЛИ (рисунок 1). Рисунок 1 – Пример соединения контактов на языке LD Различают нормально разомкнуты (I1) и нормально замкнутые контакты (I2). Нормально разомкнутый контакт разомкнут при значении ЛОЖЬ, назначенной ему переменной и замыкается при значении ИСТИНА. Нормально замкнутый контакт, напротив, замкнут, если переменная имеет значение ЛОЖЬ, и разомкнут, если переменная имеет значение ИСТИНА. В правой части схемы находиться катушки. В правой части цепи может находиться любое количество катушек соединяться только параллельно. Цепь может быть либо замкнутой (ON), либо разомкнутой (OFF). Это как раз и отражается на обмотке и соответственно на логической переменной или обмотки (ИСТИНА/ЛОЖЬ). Катушки также могут быть инверсными. Если обмотка инверсная, тогда в соответствующую логическую переменную копируется инверсное значение. Катушки могут быть с «самофиксацией» типов SET и RESET. Катушки типа SET обозначаются буквой "S" внутри круглых скобок (S). Если соответствующая этой катушке переменная принимает значение ИСТИНА, то она навсегда (до сброса R) сохраняет его. Обмотки типа RESET обозначаются буквой R. Если соответствующая переменная принимает значение ЛОЖЬ, то она навсегда (до установки S) сохраняет его. Пример программы на языке LD представлен на рисунке 1. Рисунок 1 – Пример программы на языке LD Операторы и функции Арифметические операторы Оператор Действие Изображение ADD Сложение SUB Вычитание MUL Умножение DIV Деление MOD Остаток от деления EXPT Возведение в степень MOVE Присваивание Логические битовые операторы Оператор Действие Изображение AND Побитное И OR Побитное ИЛИ XOR Побитное исключающее ИЛИ NOT Побитное НЕ Операторы сравнения Оператор Действие Изображение GT Больше GE Больше или равно EQ Равно LE Меньше или равно LT Меньше NE Не равно Таймеры ТР генератор импульса Запуск таймера происходит по фронту импульса на входе IN. Вход РТ задает длительность формируемого импульса. После запуска таймер не реагирует на изменение значения входа IN. Выход ЕТ отсчитывает прошедшее время. При достижении ЕТ значения РТ счетчик останавливается, и выход Q сбрасывается в 0. TOF таймер с задержкой выключения По фронту входа IN выход Q устанавливается в TRUE. Сброс счетчика ЕТ и начало отсчета времени происходит по каждому спаду входа IN. Выход Q будет сброшен через заданное РТ время после спада входного сигнала. Если во время отсчета вход IN будет установлен в TRUE, то отсчет приостанавливается. Таким образом, выход Q включается по фронту» а выключается логическим нулем продолжительностью не менее РТ, TON таймер с задержкой включения По фронту входа IN выполняется обнуление счетчика и начинается новый отсчет времени. Выход Q будет установлен в TRUE через заданное РТ время, если IN будет продолжать оставаться в состоянии TRUE. Спад входа IN останавливает отсчет и сбрасывает выход Q в FALSE. Таким образом, выход Q включается логической единицей продолжительностью не менее РТ, а выключается по спаду входа IN. CTU инкрементпный счетчик По каждому фронту на входе CU значение счетчика (выход CV) увеличивается на 1, Выход Q устанавливается в TRUE, когда счетчик достигнет или превысит заданный PV порог. Логическая единица на входе сброса (RESET «- TRUE) останавливает счет и обнуляет счетчик (CV := 0). CTD декрементный счетчик По каждому фронту на входе CD счетчик (выход CV) уменьшается на 1. Выход Q устанавливается в TRUE, когда счетчик достигнет нуля. Счетчик CV загружается начальным значением, равным PV по входу LOAD = TRUE. CTUD инкрементный / декрементный счетчик По значению входа RESET = TRUE счетчик CV сбрасывается в 0. По значению входа LOAD = TRUE счетчик CV загружается значением равным PV. По фронту на входе CU счетчик увеличивается на 1. По фронту на входе CD счетчик уменьшается на 1 (до 0). Выход QU равен TRUE, если CV >- PV, иначе FALSE. Выход QD равен TRUE, если CV = 0, иначе1 FALSE. Язык функциональных блок-схем FBD Язык FBD - это полностью графический язык высокого уровня, обеспечивающий управление потоками данных, включающих всех типы. Позволяет использовать очень мощные алгоритмы простым вызовом функций и функциональных блоков, имеет большую библиотеку блоков, удовлетворяет непрерывным динамическим процессам, хорош для сложных вещей подобно ПИД-регуляторам, массивам и т. д. Объекты языка FBD являются: - EFB (Elementary Function Block) - элементарные функции и элементарные функциональные блоки; они находятся в библиотеках. Логика обработки в EFB (программа) написана на языке С и не может быть изменена в редакторе FBD. Изменять можно только параметры блоков; - DFB (Derived Function Block) - функции и функциональные блоки пользователя; они конструируются пользователем из EFB; - UDEFB (User Defined Elementary Function Block) - разработанные пользователем на языке С; они оформляются как объекты библиотек. Операторы и функции Арифметические операторы Оператор Действие Изображение ADD Сложение SUB Вычитание MUL Умножение DIV Деление MOD Остаток от деления EXPT Возведение в степень MOVE Присваивание Логические битовые операторы Оператор Действие Изображение AND Побитное И OR Побитное ИЛИ XOR Побитное исключающее ИЛИ NOT Побитное НЕ Операторы сравнения Оператор Действие Изображение GT Больше GE Больше или равно EQ Равно LE Меньше или равно LT Меньше NE Не равно Метки, переходы и возврат Порядок выполнения FBD-цепей диаграммы можно принуди­тельно изменять, используя метки и переходы, точно так же, как и в релейных схемах. Метка ставится в начале любой цепи, являясь, по сути, назва­нием данной цепи. Цепь может содержать только одну метку. Имена меток подчинены общим правилам наименования иденти­фикаторов МЭК. Графический редактор автоматически нумерует цепи диаграммы. Эта нумерация применяется исключительно для документирования и не может заменять метки. Переход обязательно связан с логической переменной и выпол­няется, если переменная имеет значение ИСТИНА. Для создания безусловного перехода используется константа ИСТИНА, связан­ная с переходом. Метки и переходы в FBD представлены в примере, показанном на. Обратите внимание на последнюю цепь на рисунке 2 — она является пустой. Пустая цепь обознача­ется единственной константой TRUE. Оператор возврата RETURN можно использовать в FBD так же, как и переход на метку, т. е. в связке с логической перемен­ной. Возврат приводит к немедленному окончанию работы про­граммного компонента и возврату на верхний уровень вложений. Для основной программы это начало рабочего цикла ПЛК. Язык инструкций IL Язык IL является языком низкого (машинного) уровня, что существенно облегчает, например, условный или безусловный вызов функциональных блоков и функций, выполнение назначений и условных или безусловных переходов внутри секции. Текст на IL — это текстовый список последовательных инст­рукций. Каждая инструкция записывается на отдельной строке. Инструкция может включать 4 поля, разделенные пробелами или знаками табуляции: Метка: Оператор Операнд Комментарий Метка инструкции не является обязательной, она ставится только там, где нужно. Оператор присутствует обязательно. Операнд необходим почти всегда. Если используется несколько операндов, они отделяются запятыми. Комментарий — необязательное поле, записывается в конце строки. Ставить комментарии между полями инструкции нельзя. Пример IL-программы: МЕТКА1: LD Sync (*пример IL*) AND Start ST Q (*для красоты метку можно поставить в отдельную строку*) МЕТКА2: LD 2 (* у = 2 + 2 *) ADD 2 ST у Аккумулятор Абсолютное большинство инструкции IL выполняют некото­рую операцию с содержимым аккумулятора. Операнд, конечно, тоже принимает участие в инст­рукции, но результат опять помещается в аккумулятор. Напри­мер, инструкция SUB 10 отнимает число 10 от значения аккуму­лятора и помещает результат в аккумулятор. Команды сравнения сравнивают значение операнда и аккумулятора, результат сравне­ния ИСТИНА или ЛОЖЬ вновь помещается в аккумулятор. Команды перехода на метку способны анализировать аккумуля­тор и принимать решение — выполнять переход или нет. Аккумулятор IL является универсальным контейнером, спо­собным сохранять значения переменных любого типа. В аккумулятор можно поместить значение типа BOOL, затем INT или REAL, транслятор не будет считать это ошибкой. Такая гибкость не означает, что аккумулятор способен одновременно со­держать несколько значений разных типов. Только одно, причем тип значения также фиксируется в аккумуляторе. Если операция требует значение другого типа, транслятор выдаст ошибку. Переход на метку Программа на IL выполняется подряд, сверху вниз. Для изме­нения порядка выполнения и организации циклов применяется переход на метку. Переход на метку может быть безусловным JMP — выполняется всегда, независимо от чего-либо. Условный переход JMPC выполняется только при значении аккумулятора ИСТИНА. Переход можно выполнять как вверх, так и вниз. Мет­ки являются локальными, другими словами, переход на метку в другом POU не допускается. Переходы нужно организовывать достаточно аккуратно, чтобы не получить бесконечный цикл: LD 1 ST Counter LOOPL: (*тело цикла*) LD Counter ADD 1 ST Counter LE 5 JMPC LOOPL В примере показана реализация цикла на 5 повторений с од­ной очевидной ошибкой. В системах с интерпретатором IL или промежуточным коди­рованием время выполнения перехода оказывается зависимым от направления и расстояния. В CoDeSys команда безусловного перехода транслируется в одну машинную команду процессора и выполняется очень быстро. Ограничений на число переходов в CoDeSys нет. Но это не означает целесообразность создания больших моно­литных IL-программ с множеством переходов. Такие программы очень сложно читать и не легко сопровождать. Скобки Последовательный порядок выполнения команд IL можно из­менять при помощи скобок. Открывающая скобка ставится в ин­струкции после операции. Закрывающая скобка ставится в отде­льной строке. Инструкции, заключенные в скобки, выполняются в первую очередь. Результат вычисления инструкций в скобках помещается в дополнительный аккумулятор, после чего выполня­ется команда, содержащая открывающую скобку. Например: LD 5 MUL (2 SUB 1 ) ST y (*y=5*(2-1)=5*) LD 5 MUL 2 SUB 1 ST y (*y=5*2-1=9*) Скобки могут быть вложенными. Каждое вложение требует ор­ганизации некоего временного аккумулятора. Это вызывает неоднозначность при выходе из блока скобок командами JMP, RET, CAL и LD. Применять эти команды в скобках нельзя. Модификаторы Добавление к мнемонике некоторых операторов символов — модификаторов 'С' и 'N' модифицирует смысл инструкции. Символ 'N' (negation) вызывает инверсию значения операнда до выполнения инструкции. Операнд должен быть типов BOOL, BYTE, WORD или DWORD. Символ 'С' (condition) добавляет проверку условий к командам перехода, вызова и возврата. Команды JMPC, CALC, RETC будут выполняться только при значении аккумулятора ИСТИНА. До­бавление символа 'N' приводит к сравнению условия с инверсным значением аккумулятора. Команды JMPCN, CALCN, RETCN бу­дут выполняться только при значении аккумулятора ЛОЖЬ. Мо­дификатор 'N' без 'С' не имеет смысла в данных операциях и не применяется. Операторы Стандартные операторы IL с допустимыми модификаторами представлены в таблице. Оператор Модификатор Описание LD N Загрузить значение операнда в акку­мулятор ST N Присвоить значение аккумулятора операнду S Если аккумулятор ИСТИНА, устано­вить логический операнд (ИСТИНА) R Если аккумулятор ИСТИНА, сбро­сить логический операнд (ЛОЖЬ) AND N, ( Поразрядное И OR N, ( Поразрядное ИЛИ Оператор Модификатор Описание XOR N, ( Поразрядное ИЛИ NOT Поразрядная инверсия аккумулятора ADD ( Сложение SUB ( Вычитание MUL ( Умножение DIV ( Деление MOD ( Деление по модулю GT ( > GE ( >= EQ ( = NE ( < > LE ( <= LT ( < JMP CN Переход к метке CAL CN Вызов функционального блока RET CN Выход из POU и возврат в вызываю­щую программу. Операторы S и R применяются только с операндами типа BOOL. Прочие операторы работают с любыми переменными базо­вых типов. Вызов функциональных блоков и программ Вызвать экземпляр функционального блока или программу в IL можно с одновременным присваиванием переменных. На­пример: CAL CTD_1(CD := TRUE, LOAD := FALSE, PV := 10) LD CTD_1.CV ST у Аналогичный вызов можно выполнить с предварительным присваиванием значений входных переменных: LD TRUE ST CTD_1.CD LD FALSE ST CTD_1.LOAD LD 10 ST CTD_1.PV CAL CTD_1 LD CTD_1.CV ST У Таймеры. Счетчики. ТР генератор импульса Запуск таймера происходит по фронту импульса на входе IN. Вход РТ задает длительность формируемого импульса. После запуска таймер не реагирует на изменение значения входа IN. Выход ЕТ отсчитывает прошедшее время. При достижении ЕТ значения РТ счетчик останавливается, и выход Q сбрасывается в 0. Изображение функционального блока Пример объявления CAL TPInst(IN := VarBOOL1, PT := T#5s) LD TPInst.Q ST VarBOOL2 TOF таймер с задержкой выключения По фронту входа IN выход Q устанавливается в TRUE. Сброс счетчика ЕТ и начало отсчета времени происходит по каждому спаду входа IN. Выход Q будет сброшен через заданное РТ время после спада входного сигнала. Если во время отсчета вход IN будет установлен в TRUE, то отсчет приостанавливается. Таким образом, выход Q включается по фронту» а выключается логическим нулем продолжительностью не менее РТ, Изображение функционального блока Пример объявления CAL TONInst(IN := VarBOOL1, PT := T#5s) LD TONInst.Q ST VarBOOL2 TON таймер с задержкой включения По фронту входа IN выполняется обнуление счетчика и начинается новый отсчет времени. Выход Q будет установлен в TRUE через заданное РТ время, если IN будет продолжать оставаться в состоянии TRUE. Спад входа IN останавливает отсчет и сбрасывает выход Q в FALSE. Таким образом, выход Q включается логической единицей продолжительностью не менее РТ, а выключается по спаду входа IN. Изображение функционального блока Пример объявления CAL TOFInst(IN := VarBOOL1, PT := T#5s) LD TOFInst.Q ST VarBOOL2 CTU инкрементпный счетчик По каждому фронту на входе CU значение счетчика (выход CV) увеличивается на 1, Выход Q устанавливается в TRUE, когда счетчик достигнет или превысит заданный PV порог. Логическая единица на входе сброса (RESET «- TRUE) останавливает счет и обнуляет счетчик (CV := 0). Изображение функционального блока Пример объявления CAL CTUInst(CU := VarBOOL1, RESET := VarBOOL2, PV := VarINT1) LD CTUInst.Q ST VarBOOL3 LD CTUInst.CV ST VarINT2 CTD декрементный счетчик По каждому фронту на входе CD счетчик (выход CV) уменьшается на 1. Выход Q устанавливается в TRUE, когда счетчик достигнет нуля. Счетчик CV загружается начальным значением, равным PV по входу LOAD = TRUE. Изображение функционального блока Пример объявления CAL CTDInst(CD := VarBOOL1, LOAD := VarBOOL2, PV := VarINT1) LD CTDInst.Q ST VarBOOL3 LD CTDInst.CV ST VarINT2 CTUD инкрементный / декрементный счетчик По значению входа RESET = TRUE счетчик CV сбрасывается в 0. По значению входа LOAD = TRUE счетчик CV загружается значением равным PV. По фронту на входе CU счетчик увеличивается на 1. По фронту на входе CD счетчик уменьшается на 1 (до 0). Выход QU равен TRUE, если CV >- PV, иначе FALSE. Выход QD равен TRUE, если CV = 0, иначе1 FALSE. Изображение функционального блока Пример объявления CAL CTUDInst(CU := VarBOOL2, RESET := VarBOOL3, LOAD := VarBOOL4, PV := VarINT1) LD CTUDInst.QU ST VarBOOL5 LD CTUDInst.QD ST VarBOOL6 LD CTUDInst.CV ST VarINT2 Язык последовательного функционального управления SFC Язык SFC – графический язык, предназначенный для описания функций последовательных операций и позволяющий яснее и однозначное определение желаемого поведения системы управления. Отличается строгим математи­ческим определением, (каждое операционное состояние может быть Декодировано с очень небольшим анализом). Удобен для описания, как последовательных процессов, так и пакетных или параллельных процессов, легко комбинируется с другими языками (язык спецификаций). Обеспечивает улучшение понимания оборудования при формировании модели приложения. Обладает развитыми механизмами синхронизации. Использует простые динамические правила. Языки SFC и ST, в паре составляющие полную и завершенную среду для программирования ПЛК, не всегда удовлетворяют пользователей, например, из-за быстродействия или невозможности доступа к системным ресурсам, что заставляет прибегать к использованию языков типа С. Язык SFC использует следующие структурные элементы для создания программы: шаг, переход, прыжок и связи типа ответвления. Шаги Шаги показаны на схеме (рисунок 1) прямоугольниками. Реальная работа шага (действия) описыва­ется в отдельном окне системы программирования и не отражает­ся на диаграмме. О назначении шага SFC говорит только его на­звание или, если этого не достаточно, краткое текстовое описание (комментарий). Шаг содержит в себе действия, которые должны выполняться, когда шаг активен. Действия являются подпрограммами составленные с применением языков SFC, LD, FBD, IL, ST, а также дополнительных интерактивных редакторов для описания переменных, определений и конфигурации ввода/вывода. Шаги на схеме могут быть пустыми, что не вызывает ошиб­ки при компиляции проекта. Пустые шаги являются нормой при применении программирова­ния сверху вниз, характерного для SFC. Определить действия, соответствующие шагу, можно в любое время. Нет ничего удиви­тельного, если пустые шаги останутся и в законченном проекте. Задачей пустого шага является ожидание перехода. Переходы Ниже шага на соединительной линии присутствует горизонта­льная черта, обозначающая переход (см. пример на рисунке 1). Условием перехода может служить логическая переменная, логическое выражение, константа или прямой адрес. Переход выполняется при соблюдении двух условий: - переход разрешен (соответствующий ему шаг активен); - условие перехода имеет значение TRUE. Простые условия отображаются непосредственно на диаграмме справа от черты, обозначающий переход. В CoDeSys на диаграмме можно записывать только выражения на языке ST. Начальный шаг Каждая SFC-схема начинается с шага, выделенного графиче­ски двойными вертикальными линиями или по всему перимет­ру. Это — начальный шаг (рис. 7.24). Наименование начально­го шага может быть произвольным (по умолчанию Init). Нача­льный шаг присутствует обязательно, хотя и может быть пустым. Рисунок 2 – Начальный шаг Reset Параллельные ветви Несколько ветвей SFC могут быть параллельными (рисунок 3). Признаком параллельных ветвей на схеме является двойная го­ризонтальная линия. Каждая параллельная ветвь начинается и заканчивается шагом. То есть условие входа в параллельность всегда одно, условие выхода тоже одно на всех. Рисунок 3 – Параллельные ветви Параллельные ветви выполняются теоретически одновремен­но. В жизни это означает — в одном рабочем цикле, слева на­право. Условие перехода, завершающее параллельность, проверяется только в случае, если в каждой параллельной ветви активны по­следние шаги. Альтернативные ветви Несколько ветвей SFC могут быть альтернативными ветвя­ми. Признаком альтернативных ветвей на схеме является одинар­ная горизонтальная линия. Каждая альтернативная ветвь начи­нается и заканчивается собственным условием перехода. Провер­ка альтернативных условий выполняется слева направо. Если верное условие найдено, то прочие альтернативы не рассматрива­ются. В альтернативных ветвях всегда работает только одна из ветвей, поэтому ее окончание и будет означать переход к следую­щему за альтернативной группой шагу. В данном примере (рис. 7.26) альтернатива Stop оценивается первой. Шаги Move_Dwn и MoveJJp имеют шанс стать активны­ми, только если Stop равен FALSE. Рисунок 4 – Альтернативные ветви При создании альтернативных ветвей желательно задавать взаимоисключающие условия. В этом случае вероятность допус­тить ошибку при анализе или в процессе доработки диаграммы значительно ниже. Переход на произвольный шаг В общем случае SFC-схема выполняется сверху вниз. Стандар­том допускается создание переходов на произвольный шаг. Для этого применяются соединительные линии с промежуточными стрелками или поименованные переходы. То есть переход выпол­няется на шаг, имя которого указано под стрелкой. В англоязыч­ных источниках переход на произвольный шаг называется «прыжок» (jump). В примере, показанном на рисунке 5, шаги Move_Dwn и Мо-veJJp последовательно активируют друг друга. Заметьте, что условие Stop при этом проверяться не будет, шаги Move_Dwn и MoveJUp соединены в логическое кольцо, имеющее 2 варианта входа, но ни одной возможности выхода. Маркер активности бу­дет перемещаться исключительно в этом кольце. Прыжок из одной ветви параллельного блока наружу вызыва­ет эффект размножения маркера. Прыжок внутрь параллельного блока нарушает параллельность ветвей. Подобных трюков необхо­димо избегать. Рис. 7.27. Перекрестные поименованные переходы Язык непрерывных блок-схем CFC Язык CFC (Continuous Flow Chart) ‑ ещё один высокоуровневый язык графического программирования. CFC ‑ это дальнейшее развития языка FBD. CFC был специально создан для проектирования систем управления непрерывными технологическими процессами. Основными объектами языка программирования CFC являются «вход» (рисунок 1-а), «выход» (рисунок 1-б) и «элемент» (рисунок 1-в). а) б) в) Рисунок 1 – Основные объекты языка CFC «Вход» позволяет получить текущее значение литерала, переменной или прямого адреса, чтобы использовать его в алгоритме. «Выход» ‑ позволяет записать некое полученное значение в переменную. «Элементом» в языке CFC являются блоки FFB, используемые в языке программирования FBD В отличие от FBD редактор непрерывных функциональных схем не использует цепи, но дает возможность свободно размещать компоненты и соединения, что позволяет создавать обратные связи. Пример программы на языке CFC представлен на рисунке 2. Рисунок 2 – Пример программы на языке CFC Основное преимущество языка программирования CFC перед FBD заключается в том, что в схемы можно непосредственно добавлять линии обратной связи. Операторы и функции Арифметические операторы Оператор Действие Изображение ADD Сложение SUB Вычитание MUL Умножение DIV Деление MOD Остаток от деления EXPT Возведение в степень MOVE Присваивание Логические битовые операторы Оператор Действие Изображение AND Побитное И OR Побитное ИЛИ XOR Побитное исключающее ИЛИ NOT Побитное НЕ Операторы сравнения Оператор Действие Изображение GT Больше GE Больше или равно EQ Равно LE Меньше или равно LT Меньше NE Не равно
«Программируемые логические контроллеры» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 142 лекции
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot