Язык релейных диаграмм LD и его применение
Язык релейных или лестничных диаграмм LD (от англ. Ladder Diagram) представляет собой простой в обращении, графический язык разработки. В его основе лежат релейно-контактные схемы, поэтому элементами логики здесь выступают: обмотки реле, контакты реле, горизонтальные и вертикальные перемычки.
Пары контактов реле или кнопки — вот основные логические переменные языка LD, при этом состояние переменных — это есть ни что иное, как состояние контактов: разомкнутое или замкнутое.
Сама же программа на данном графическом языке представляется аналогом релейной схемы, в которую может входить множество различных функциональных блоков. В общем и целом, синтаксис языка LD позволяет очень просто строить логические схемы для релейной техники.
Немного истории
Как таковой, язык релейных схем существовал еще во времена Томаса Эдисона, и лишь в начале 1970-х он был адаптирован для первых ПЛК. В самом начале данный язык появился в пакетах программирования ПЛК компаний Modicon и Allen-Bradly, причем символика была заимствована именно из электротехнической области.
Язык LD изначально был предназначен для инженеров по автоматизации, работающих на предприятиях. Интерфейс программирования наглядно преподносит логику работы контроллера, позволяет легко решать задачи ввода в эксплуатацию, а также быстро находить неполадки в подключенном к ПЛК оборудовании. Разработчики стандарта специально сделали форму такой, чтобы максимально облегчить работу инженерам по релейной автоматике на ПЛК.
В Соединенных Штатах например, язык релейных диаграмм — самый распространенный язык для программирования ПЛК. Он также широко распространен по всему миру. Написанная программа выглядит интуитивно понятно, так что любой инженер-электрик сможет легко ее прочитать и понять, ведь логические операции здесь представляются в виде электрической цепи с разомкнутыми и замкнутыми контактами.
Результат логической операции «ЛОЖЬ» или «ИСТИНА» в общем случае имеет под собой соответствующее состояние цепи: если ток течет — «ИСТИНА», «true», если тока нет — «ЛОЖЬ», «false».
Достоинства и недостатки языка LD
Главное достоинство языка — безусловно простота. Программа представляется как электрический поток, любой специалист по электротехнике это поймет. Правила просты, здесь используются лишь булевые выражения, код рационален и легко может быть оптимизирован вручную.
Соответственно вытекает отсюда главный недостаток — операции только двоичные, лишь дискретные состояния возможны, непрерывное управление сразу отпадает. К тому же с увеличением количества реле схема становится сложной для чтения, понимания и отладки.
Как выглядит программа на LD
Две вертикальные линии представляют пару питающих шин. Между шинами располагаются горизонтально цепи, в которые включаются обмотка и контакты реле. В цепи может быть установлено произвольное количество контактов. Последовательно соединенные контакты должны замкнуться все, тогда по цепи пойдет ток, и обмотка реле получит питание. Несколько обмоток реле может быть включено параллельно, но не последовательно.
В языке LD для каждого контакта имеет место логическая переменная, которая и определяет состояние контакта. Для нормально-разомкнутого контакта переменная принимает значение «ИСТИНА» когда контакт замкнут, или принимает значение «ЛОЖЬ», когда контакт разомкнут. Надпись над контактом — это имя переменной и одновременно название контакта.
-(/)- катушка реле инверсная
Как легко видеть, графические обозначения внутри LD-диаграммы интуитивно понятны, но они отличаются от принятых в электрических схемах. Тем не менее, факт, что символы псевдографики служат для построения диаграммы (программы), является преимуществом языка.
Примеры использования языка LD :
Еще один очень распространенный язык программирования ПЛК:
Мы планируем развивать эту тему здесь:
Structured Text
Книга «Изучаем Structured Text МЭК 61131-3»: Ссылка на книгу
Любите умные гаджеты и DIY? Станьте специалистом в сфере Internet of Things и создайте сеть умных гаджетов!
Записывайтесь в онлайн-университет от GeekBrains:
Изучить C, механизмы отладки и программирования микроконтроллеров;
Получить опыт работы с реальными проектами, в команде и самостоятельно;
Получить удостоверение и сертификат, подтверждающие полученные знания.
Starter box для первых экспериментов в подарок!
После прохождения курса в вашем портфолио будет: метостанция с функцией часов и встроенной игрой, распределенная сеть устройств, устройства регулирования температуры (ПИД-регулятор), устройство контроля влажности воздуха, система умного полива растений, устройство контроля протечки воды.
Вы получите диплом о профессиональной переподготовке и электронный сертификат, которые можно добавить в портфолио и показать работодателю.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ LAD, STL И FBD
Каждый вход и выход имеет абсолютный адрес, предопределенный конфигурацией аппаратуры. Этот адрес указывается непосредственно, например: I 1.5 (вход-байт 1-бит 5). Абсолютный адрес может быть заменен символическим именем по вашему выбору (рис.53).
Рис. 53 Распределение адресов
Лучше использовать только абсолютное программирование, если в программе S7 не нужно обращаться ко многим входам и выходам.
Создание программы в OB1
В STEP 7 программы S7 создаются на стандартных языках программирования: контактный план (LAD), список операторов (STL) или функциональный план (FBD), рисунок 54. На практике необходимо решить, какой язык использовать.
Рис. 54 Стандартные языки программирования
Блок OB1 теперь откроется в соответствии с языком, который вы выбрали при создании блока в мастере проекта. Однако вы можете в любое время изменить язык программирования, установленный по умолчанию.
Копирование таблицы символов и открытие OB 1
Для копирования таблицы символов необходимо открыть свой проект «Getting Started». Для этого щелкните на кнопке Open [Открыть]на панели инструментов, выберите проект «Getting Started», который был создан, и подтвердите с помощью OK.
В зависимости от того, какой язык программирования решено использовать, откройте один из следующих проектов:
Ø zEn01_06_STEP7__LAD_1-9;
Ø zEn01_02_STEP7__STL_1-9;
Ø zEn01_04_STEP7__FDB_1-9.
В методических указаниях приведены все три примера проектов. Необходимо открыть „zEn01_XXX“ и достигнуть компонент Symbols [Символы]. Далее студент может скопировать его с помощью буксировки в папку S7 Programв окне своего проекта «Getting Started». Затем окно „zEn01_XXX“ закрывается. Дважды щелкнув на OB 1в проекте «Getting Started» и откроется окно для программирования LAD/STL/FBD.
Буксировка означает, что вы щелкаете мышью на любом объекте и перемещаете его, удерживая кнопку мыши нажатой. Когда вы отпускаете кнопку мыши, объект вставляется в выбранной позиции. В STEP 7 OB 1 обрабатывается CPU циклически. CPU читает и исполняет строку за строкой команды программы. Когда CPU возвращается к первой строке программы, он завершает ровно один цикл. Время, необходимое для этого, называется временем цикла сканирования. Все блоки программируются в окне LAD/STL/FBD.
Рис. 55 Окно для программирования LAD/STL/FBD
Программирование ОВ 1 в виде контактного плана
Далее рассмотрим примеры программирования последовательной, параллельной цепи и функцию памяти SR (установка / сброс) в виде контактного плана (LAD).
Программирование последовательной цепи в контактном плане. Если необходимо, установите LADв качестве языка программирования в меню View [Вид]. Щелкните в области заголовка (title)OB1 и введите, например, «Циклически обрабатываемая главная программа». Выберите путь тока для своего первого элемента. Щелкните на этой кнопке на панели инструментов и вставьте нормально открытый контакт (рис.56).
Рис. 56 Последовательная цепь в контактном плане
Таким же образом вставьте второй нормально открытый контакт. Вставьте катушку у правого конца пути тока. В этой последовательной цепи пока отсутствуют адреса нормально открытых контактов и катушки. Проверьте, активизировано ли символическое представление (Symbolic Representation).
Щелкните на знаке . и введите символическое имя «Key_1 [Ключ_1]» (в кавычках). Подтвердите, нажав Enter. Введите символическое имя «Key_2 [Ключ_2]» для второго нормально открытого контакта. Введите имя «Green_Light [Зеленый_свет»] для катушки. Теперь запрограммирована вся последовательная цепь. Сохраните блок, если отсутствуют символы, выделенные красным цветом. Символы отображаются красным цветом, если, например, они отсутствуют в таблице символов, или если имеет место синтаксическая ошибка (рис.57).
Для программирования параллельной цепи в контактном плане выделите Network 1 [Сегмент 1]. Вставьте новый сегмент. Снова выберите путь тока. Вставьте нормально открытый контакт и катушку. Выделите вертикальную линию в пути тока. Вставьте параллельную ветвь. Добавьте еще один нормально открытый контакт в параллельной ветви. Закройте ветвь (если необходимо, выберите нижнюю стрелку). В параллельной цепи все еще отсутствуют адреса. Для назначения символических адресов действуйте так же, как и для последовательной цепи.
Напишите у верхнего нормально открытого контакта «Key_3 [Ключ_3]», у нижнего контакта «Key_4 [Ключ_4]», а у катушки «Red_Light [Красный_свет]» Сохраните блок.
Рис. 58 Параллельная цепь в контактном плане
Для программирования функции памяти в контактном плане выделите Network 2 [Сегмент 2] и вставьте еще один сегмент (рис.59). Снова выделите путь тока. Перемещайтесь в каталоге элементов программы в разделе Bit Logic [Двоичная логика], пока не достигнете элемента SR. Дважды щелкните, чтобы вставить этот элемент. Вставьте нормально открытый контакт перед каждым из входов S и R. Введите следующие символические имена перед элементом SR:
Ø Верхний контакт «Automatic_On
Ø Нижний контакт «Manual_On
Ø Элемент SR «Automatic_Mode
Сохраните блок и закройте окно.
Рис. 59 Функция памяти в контактном плане
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.
Программирование ПЛК
Особенности языка LAD в CodeSys
Как и было описано, в первой статье, ПЛК осуществляет циклическое чтение входов, выполнение прикладной программы и запись выходов. Потому написание программы для ПЛК отличается от традиционного написания программы для микроконтроллеров и ПК. К программам для ПЛК предъявляются жесткие требования по надежности, одно дело зависает текстовый редактор, а другое дело программа, управляющая ядерным реактором. Другое не менее важное требование – это своевременное реагирование на событие. А что значит, во время не прореагировать на событие в промышленности? Это значит потерять контроль над технологическим процессом. Что в некоторых случаях, примером с реактором, приведет к непоправимым последствиям.
По данному алгоритму программа на ПЛК работать не будет, она содержит бесконечный цикл. А в ПЛК вся прикладная программа выполняется от начала до конца в каждом рабочем цикле, и любая программа должна отдавать управление системной программе. Поэтому при такой организации алгоритма наш ПЛК зависнет. Даже если и убрать, переход по метке на начало, программа не будет работать, так как нам хочется. Порт всегда будет в состоянии лог.0, так как физическая установка выходов производиться только после выполнения всей прикладной программы. И поэтому промежуточные состояния это всего лишь программные переменные в памяти, и на аппаратной части она ни как не отображаются.
В дополнение задержку времени тоже хорошо бы организовать с помощью таймера, периодически проверяя его значение, а не ожидать в пустую пока это время пройдет, наверняка для контроллера найдется другая более важная работа.
С учетом выше сказанного, правильный алгоритм будет выглядеть следующим образом:
1. Проверить таймер, если время паузы вышло, то
а) инвертировать выход
б) начать новый отсчет
2. Конец программы
Реализуем данный алгоритм на практике ниже, а теперь рассмотрим основные особенности LAD (Ladder Diagram) языка.
Релейная схема представляет собой две вертикальные шины, между ними расположены горизонтальные цепи образованные контактами и обмотками реле. Пример на рисунке:
— нормально разомкнутый контакт
— нормально замкнутый(инверсный) контакт
— обмотка реле
Количество контактов цепи может быть разным, а обмотка одна.
Любому контакту ставится в соответствие логическая переменная, определяющая его состояние. Если нормально замкнутый контакт замкнут, то ИСТИНА, если размокнут – Ложь, для инверсного наоборот, он замкнут когда переменная имеет значение ЛОЖЬ. Имя переменной пишется над контактом и служит его названием.
Последовательно соединенные контакты равносильны логической операции И, а параллельно-монтажное ИЛИ. Инверсный контакт равносилен операции НЕ. Параллельное соединение обмоток допускается, а последовательное нет. Обмотка реле также может быть инверсной, тогда она копирует в соответствующую логическую переменную инверсное состояние цепи.
Идея релейных схем, такова, что все цепи работают параллельно, т.е. ток во все цепи подается одновременно. Но мы знаем, что программу процессор выполняет последовательно, и мы не можем это сделать одновременно. Так и в LAD программа выполняется последовательно слева направо, сверху вниз. Но цикл процессора мал, поэтому и получается эффект параллельности.
Любая переменная в рамках одной цепи имеет одно и то же значение. Если даже реле в цепи изменит переменную, то новое значение поступит на контакты только в следующем цикле. Цепи расположенные выше получают новое значение переменной сразу, а цепи расположенные ниже – только в следующем цикле. Строгий порядок выполнения очень важен, и благодаря ним LAD- диаграмма сохраняет устойчивость при наличии обратных связей.
Хоть это и противоречит аналогии LAD с релейными схемами, порядок выполнения LAD- программы можно нарушить с помощью меток и переходов. Это ухудшает читаемость программе, и в них бывает сложно разобраться, но как говориться если очень хочется, то можно. Для этого желательно разбить программу на модули, и делать переходы между модулями.
Возможности LAD программы можно расширить, вставляя функциональные блоки. Вставлять можно все стандартные функциональные блоки, которые содержаться в МЭК. Описание для функциональных блоков можно найти в справке.
Давайте составим нашу первую программу на LAD в среде CoDeSys. CoDeSys можно скачать в интернете, достаточно воспользоваться поисковиком
После установки, выбираем создать новый проект, и CoDeSys попросит выбрать целевую платформу для ПЛК. Указание целевой платформы необходимо, чтобы среда знала, для какого типа контроллера пишется программа. Выбираем 3S CodeSyS Sp PLCWinNT V2.4 и жмем OK.
Имя проекта оставляем по умолчанию, язык выбираем LD
Интерфейс программы на русском языке, и интуитивно понятен. При наведении на элемент всплывает имя. Советую рассмотреть все элементы, а также пункты главного меню.
Для добавления элемента в программу необходимо левой кнопкой мыши кликнуть в рабочее поле программы и потом ЛКМ кликнуть на элемент, который вы хотите поместить в программу. Например, нормально разомкнутый контакт, у вас должно получиться следующее.
Вместо вопросительных знаков пишем имя нашей переменной, например SB, и нажимаем Enter, выходит окно объявление переменной, выбираем Bool и нажимаем OК.
Рассмотрите, какие типы можно выбрать, а также какие классы переменных.
Давайте, реализуем программы для мигания светодиодом, а если говорить в общем, то программа для генератора одиночных импульсов
Для реализации программы используем функциональные блок таймер TP. Таймер TP – этой таймер одиночного импульса с заданной по входу PT длительностью.
Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.
Временная диаграмма работы TP:
Для вставки TP, на панели элементов выбираем:
И у нас всплывает ассистент выбора функционального блока.
Скачайте файл проекта, и давайте рассмотрим как он работает.
Выход генератора можно поглядеть с помощью цифрового трассировщика, для этого переходим на вкладку Ресурсы в нижнем левом углу
Цикличность записи поставим Вручную, нажимаем на менеджер и выбираем переменные X(Bool)
Нажимаем Ok . Выбираем перо для нашей переменной
Рассмотрим еще один пример управление двигателем с электронной коммутацией обмоток статора
Саму программу представлять не буду, скачайте проект. А об алгоритме работы расскажу.
Все таймеры запускаются по сигналу старт. Каждый таймер отмеряет момент окончания фазы. Переменные Y1-Y3 являются выводами соответствующей фазы управления. Каждый выход включается в том случае, если таймер еще не переполнен и выключен предыдущий выход. Последняя цепь, является цепью автоматического перезапуска.
Общие сведения о языке LD¶
LD (Ladder Diagram) – графический язык, основанный на принципах релейно-контактных схем (элементами релейно-контактной логики являются: контакты, обмотки реле, вертикальные и горизонтальные перемычки и др.) с возможностью использования большого количества различных функциональных блоков. Достоинствами языка LD являются: представление программы в виде электрического потока (близко специалистам по электротехнике), наличие простых правил, использование только булевых выражений. На рис. 6.1 приведён пример программы на языке LD (слева) и ее эквивалент в виде электрической цепи с реле и выключателями (справа).
Рис. 6.1 – Программа на языке LD (слева) и ее эквивалент в виде электрической (справа)
Схемы, реализованные на данном языке, называются многоступенчатыми. Они представляют собой набор горизонтальных цепей, напоминающих ступеньки лестницы, соединяющих вертикальные шины питания.
Объекты языка программирования LD обеспечивают средства для структурирования программного модуля в некоторое количество контактов, катушек. Эти объекты взаимосвязаны через фактические параметры или связи.
Порядок обработки индивидуальных объектов в LD-секции определяется потоком данных внутри секции. Ступени, подключенные к левой шине питания, обрабатываются сверху вниз (соединение к левой шине питания). Ступени внутри секции, которые не зависят друг от друга, обрабатываются в порядке размещения.
Основные конструкции языка
Слева и справа схема на языке LD ограничена вертикальными линиями – шинами питания. Между ними расположены цепи, образованные контактами и катушками реле, по аналогии с обычными электронными цепями. Слева любая цепь начинается набором контактов, которые посылают слева направо состояние «ON» или «OFF», соответствующие логическим значениям TRUE или FALSE. Каждому контакту соответствует логическая переменная (типа BOOL). Если переменная имеет значение TRUE, то состояние передается через контакт. Иначе – правое соединение получает значение выключено (“OFF”).
Контакты могут быть соединены параллельно, тогда соединение передает состояние «логическое ИЛИ». Если контакты соединены последовательно, то соединение передаёт «логическое И».
Контакт может быть инвертируемым. Такой контакт обозначается с помощью символа |/| и передает состояние “ON”, если значение переменной FALSE.
Контактом является LD-элемент, который передаёт состояние горизонтальной связи левой стороны горизонтальной связи на правой стороне. Это состояние – результат булевой AND-операции состояния горизонтальной связи с левой стороны с состоянием ассоциированной переменной или прямого адреса. Контакт не изменяет значения связанной переменой или прямого адреса.
Для нормальных контактов (см. рис. 6.2) состояние левой связи передается в правую связь, если состояние связанного логического фактического параметра TRUE. Иначе, состояние правой связи FALSE.
Рис. 6.2 – Нормальный контакт
Для инверсных контактов (см. рис. 6.3) состояние левой связи передается в правую связь, если состояние связанного логического фактического параметра FALSE. Иначе, состояние правой связи TRUE.
Рис. 6.3 – Инверсный контакт
В контактах для обнаружения нарастания фронта (см. рис 6.4) правая связь устанавливается в состояние TRUE, если переход связанного фактического параметра происходит из FALSE в TRUE, и в то же время состояние левой связи TRUE. Иначе, состояние правой связи FALSE.
Рис. 6.4 – Контакт для обнаружения нарастания фронта
В контактах для обнаружения спада фронта (см. рис. 6.5) правая связь устанавливается в состояние TRUE, если переход связанного фактического параметра происходит из True в False, и состояние левой связи True в то же время. Иначе, состояние правой связи FALSE.
Рис. 6.5 – Контакт для обнаружения спада фронта
Катушка является LD-элементом, который передаёт состояние горизонтальной связи на левой стороне неизменяемым горизонтальной связи на правой стороне. В этом процессе состояние связанной переменной или прямого адреса будет сохранено.
В нормальных катушках (см. рис. 6.6) состояние левой связи передается в связанный логический фактический параметр и в правую связь.
Рис. 6.6 – Нормальная катушка
В инвертирующей катушке (см. рис. 6.7) состояние левой связи копируется в правую связь. Инвертированное состояние левой связи копируется в связанный логический фактический параметр. Если связь находится в состоянии FALSE, тогда правая связь тоже будет находиться в состоянии FALSE, и связанный логический фактический параметр будет находиться в состоянии TRUE.
Рис. 6.7 – Инвертирующая катушка
В катушке установки (см. рис. 6.8) состояние левой связи копируется в правую связь. Связанный логический фактический параметр устанавливается в состояние TRUE, если левая связь имеет состояние TRUE, иначе он не изменяется. Связанный логический фактический параметр может сбрасываться только катушкой сброса.
Рис. 6.8 – Катушка установки
В катушке сброса (см. рис. 6.9) состояние левой связи копируется в правую связь. Связанный логический фактический параметр устанавливается в состояние FALSE, если левая связь имеет состояние TRUE, иначе он не изменяется. Связанный логический фактический параметр может устанавливаться только катушкой установки.
Рис. 6.9 – Катушка сброса
В катушке обнаружения нарастания фронта (см. рис. 6.10) состояние левой связи копируется в правую связь. Связанный фактический параметр типа данных BOOL будет установлен в состояние TRUE для цикла программы, если произошел переход левой связи из FALSE в TRUE.
Рис. 6.10 – Катушка обнаружения нарастания фронта
В катушке обнаружения спада фронта (см. рис. 6.11) состояние левой связи копируется в правую связь. Связанный фактический параметр типа данных BOOL будет установлен в состояние TRUE для цикла программы, если произошел переход левой связи из TRUE в FALSE.
Рис. 6.11 – Катушка обнаружения спада фронта
Слово «катушка» имеет обобщенный образ исполнительного устройства, поэтому в русскоязычной документации обычно говорят о выходе цепочки, хотя можно встретить и частные значения термина, например катушка реле.
Левая шина питания соответствует единичному сигналу. Ступени, подключённые к левой шине питания, обрабатываются сверху вниз (соединение к левой шине питания).
Пример программы на языке LD
Пример представляет собой реализацию логического выражения:
При создании LD диаграмм можно использовать только переменные типа BOOL. Добавим новый контакт и привяжем его к имени A (имени переменной). Далее добавляется шина питания слева, шина питания справа, нормальный контакт, инверсный контакт и нормальная катушка. Нормальный контакт ассоциируется с переменной A, инверсный контакт с переменой B, нормальная катушка с переменной C. Далее это всё последовательно соединяется (см. рис. 6.12), и результатом является программа, написанная на языке LD, реализующая логическое выражение:
Рис. 6.12 – Пример LD диаграммы, реализующей логическое выражение C = A AND NOT B