Продолжаем разговор о языках программирования ПЛК.
В предыдущей статье мы поговорили о языке IL и о типах данных языков стандарта МЭК 61131-3.
Как я и обещал, в этой статье мы поговорим о языке LD – ladder diagramm, или языке релейной логики, который очень хорошо понятен тем, кто имеет дело с электрическими схемами. Типы данных здесь, естественно такие же, как и в IL.
Мне, по роду своей работы, очень часто приходится программировать контроллер именно на языке LD.
Его достоинство – очень хорошая наглядность и восприятие для не очень сложных логических схем.
В тоже время, если АСУ ТП достаточно сложная, требует много математических вычислений, то программирование на языке LD становится интересным квестом. Но кого пугают такие трудности?
Начнем с того, что этот язык пришёл, фактически, из обычных релейных схем. Обозначения контактов в этом языке немного отличаются от тех, что приняты у нас:
Программирование ПЛК. Пример ladder logic
— нормально разомкнутый контакт (NO)
— нормально замкнутый контакт (NC)
— или тоже катушка реле
Но, в общем, эти обозначения вполне интуитивно понятны.
Пример схемки на языке программирования LD (контроллер Simatic S1200):
В этом примере, если приходит команда «Открыть» от кнопки (RK14_btnOpen) и нет открытого состояния клапана (RK14_IOPEN), то формируется выходная команда открыть клапан (RK14_COPEN).
Вполне себе понятная стандартная релейная схема.
Есть, правда, и отличия. Как видно на рисунке, в схеме с левой стороны, как и обычно, присутствует шина питания. Но! Если в электрической релейной схеме это питание подается сразу на все элементы, к ней присоединенные, то в контроллере выполнение команд происходит последовательно слева направо и сверху вниз.
Что это означает на практике?
Как я уже писал, выполнение программы в контроллере идет циклично. Поэтому, рассматривая нашу схему, если контакт реле RK14_COPEN используется в схеме выше нашей цепи, то его измененное состояние придет туда только в следующем цикле. А цепи ниже нашей получат его измененное состояние уже в этом цикле. Не забывайте про это.
Да, кстати. Уже, я думаю, понятно, что реле в языке LD имеет бесконечное (в пределах памяти контроллера) множество контактов NO и NC, имеющих такое же имя (адрес) как и само реле (в нашем примере это RK14_COPEN).
Да, правая общая шина тоже есть. Но её принято не рисовать полностью. Поскольку цепочки контактов могут быть как очень короткие, так и очень длинные. И, если привязывать их и к левой и к правой шинам, то читабельность релейной диаграммы резко ухудшается. Поэтому, чаще всего, в среде разработки правая шина плавающая.
Кроме обычных реле присутствуют и реле с самофиксацией. Что бы установить такое реле во включённое положение используется команда SET, а чтобы выключить – команда RESET. Обозначаются они в стандарте следующим образом:
Программирование ПЛК. Как понять язык LADDER за 5 минут!
SET, значение «Tag_2» будет установлено в логическую «1», пока не применится команда
RESET, которая сбросит значение «Tag_2» в «0».
Кроме того, катушка реле тоже может быть инвертирована, и выглядит это так:
т.е., если на реле нет напряжения, то оно сработано, а если появляется, то отпущено.
Присутствуют в арсенале этого языка и реле времени. Выглядят они так:
— таймер с задержкой включения,
— таймер с задержкой отключения.
Есть еще TP – генератор импульса, TONR – аккумулирующий таймер. А есть и счетчики импульсов CTU – с увеличением, CTD – с уменьшением, CTUD – с увеличением и с уменьшением.
Естественно, поскольку у нас все ж таки программируемый логический контроллер, то и возможности для рисования, то бишь программирования, таких схем только контактами и катушками реле не ограничиваются. Контроллер таки позволяет и математические функции выполнять, и логические, и функции сдвига, и циклы, и функциональные блоки, и функции управления и специальные функции.
Кроме того, LD позволяет использовать и, так называемые, функциональные блоки – небольшие законченные программы, выполняющие определенную функцию и имеющие набор входов и выходов. Функциональные блоки есть готовые и даже определенные стандартом МЭК 61131-3. А есть возможность использовать и функциональные блоки написанные пользователем на любом другом стандартном языке программирования ПЛК. Т.е., по сути, возможности языка LD в таком варианте безграничны.
Пример вызова функционального блока из релейной логики:
В рамках одной статьи описать все возможности и команды языка LD, конечно же, не возможно. Или это будет уже не статья :).
Кроме того, производители контроллеров и программного обеспечения для них могут расширять свои языки в дополнение к стандарту МЭК 61131-3.
Поэтому, самый надёжный вариант изучения языка — это изучение мануала по программированию конкретного контроллера.
А моя задача была дать понимание и представление об этом языке, а дальше – обращайтесь к Марксу, т.е. к «Руководству по программированию контроллеров …» (вместо троеточия вставляете свой контроллер).
Пишите вопросы, пожелания, замечания в комментариях ниже. Если статья понравилась – не жадничайте, делитесь с друзьями и коллегами в соцсетях.
Источник: asutpby.ru
Язык ld примеры программ
Уважаемые коллеги, мы рады предложить вам, разрабатываемый нами учебный курс по программированию ПЛК фирмы Beckhoff с применением среды автоматизации TwinCAT . Курс предназначен исключительно для самостоятельного изучения в ознакомительных целях. Перед любым применением изложенного материала в коммерческих целях просим связаться с нами. Текст из предложенных вам статей скопированный и размещенный в других источниках, должен содержать ссылку на наш сайт heaviside.ru . Вы можете связаться с нами по любым вопросам, в том числе создания для вас систем мониторинга и АСУ ТП.
Начальные сведения по языку LD
В прошлой статье мы научились создавать проект, настраивать среду выполнения runtime и написали простейшую программу. В этой статье мы начнем изучать описываемый в стандарте МЭК 61131-3 язык программирования LD.
Код на языках стандарта МЭК 61131-3 (далее кратко языки МЭК) содержится в программных компонентах (POU, Англ. Program Organization Bloc). Каждый программный компонент состоит из раздела объявлений и кода. Раздел объявлений переменных находится в верхней части программного компонента, раздел кода в нижней.
Переменные
Согласно определению, данному в стандарте ГОСТ Р МЭК 61131-3-2016 «КОНТРОЛЛЕРЫ ПРОГРАММИРУЕМЫЕ»:
переменная (variable): Объект программного обеспечения, который может принимать различные значения, в каждый момент времени только одно значение.
В языке LD, как и во всех языках стандарта МЭК 61131-3, любые элементы, будь то контакты, катушки или функциональные блоки, должны быть соотнесены какой-либо переменной. Это значит, что, если мы хотим в своей программе использовать катушку, мы должны объявить переменную типа BOOL, в которой будет хранится состояние этой катушки. Если на катушку «подано напряжение», переменная будет иметь значение «1», если на катушке «напряжения нет», переменная примет значение «0». Если мы повторно хотим использовать переменную, задействовав контакт, соответствующий этой переменной, то заново переменную объявлять не нужно и даже нельзя. В пределах одного программного компонента не должно быть одноименных переменных.
Для создания переменной ее необходимо объявить в разделе объявлений программного компонента, в секции переменных между ключевыми словами «VAR» и «END_VAR». Для объявления переменных действует следующий синтаксис:
Значения, содержащиеся между скобок из символов <>, являются обязательными. Значения, содержащиеся между скобок из символов <>, являются необязательными и указываются только при необходимости. Важно не пропускать символы «:», «;» и «=».
— имя переменной, именно оно указывается над контактами, катушками и т.д. Идентификатор обязательно должен соответствовать правилам присвоения идентификаторов.
< AT > — (не обязательный элемент) ключевое слово AT может использоваться для непосредственной привязки переменной к определенному адресу. Присваивание адреса переменной мы будем разбирать статьях об указателях, массивах, привязки переменных к входам выходам, передаче данных по Modbus TCP.
— здесь указывается к какому типу данных относится переменная. В этой статье мы познакомимся только с типом данных BOOL, который может принимать два значения «1» (Истина, Англ. TRUE) и «0» (Ложь, Англ. FALSE). Перед типом данных в объявлении переменной обязательно должен быть поставлен знак «:».
< : = > — (не обязательный элемент) это значение будет иметь переменная при запуске программы (функционального блока, функции). Если не указать начального значения, переменная примет начальное значение, присваемое по умолчанию для соответствующего типа данных, как правило ноль.
Объявление переменной должно заканчиваться символом « ; ».
Крайне желательно добавлять к переменным комментарии, которые поясняют назначение переменной. Комментарии — это поясняющие строки в программном коде, которые позволяют понять смысл написанного. Они пишутся для людей и не влияют на выполнение программы. В TwinCAT 3 любые надписи, заключенные между символами (* и *) , являются комментарием. Так же весь текст после символов // и до начала новой строки является комментарием (в TwinCAT 2 этот способ не работает, пользуйтесь только (*…*) ).
Правила присвоения идентификаторов переменным:
- Идентификатор должен содержать следующие буквы и цифры: 0…9; A…Z; a…z.
- TwinCAT не чувствителен к регистру, то есть: VAR1 и var1 обозначают одну и ту же переменную.
- Идентификатор не может начинаться с числа.
- Идентификатор не может содержать пробелы, специальные символы (!, https://heaviside.ru/stati/znakomstvo-s-yazykom-ld/» target=»_blank»]heaviside.ru[/mask_link]
Язык программирования LD
Язык программирования LD — это один из самых простых языков стандарта МЭК, используемых для программирования ПЛК. В некоторых средствах разработки имеется вообще только один язык. И, как правило, это LD.
Основное преимущество этого языка — он очень похож на релейные схемы. Поэтому даже простой электрик, который не имеет никакого понятия о программировании, может достаточно быстро его изучить и начать применять ПЛК вместо электромагнитных реле.
LD — это Ladder Diagram — язык релейных диаграмм, он же язык Релейно-Контактных Схем (РКС). Это графический язык, реализующий структуры электрических цепей.
Он был придуман в США. В начале 1970-х годов релейная автоматика начала постепенно вытесняться контроллерами. Но какое-то время и то и другое работало одновременно и обслуживалось одними и теми же людьми. Так появилась задача простого и понятного переноса релейных схем в ПЛК. Язык LD получился достаточно простым и завоевал заслуженную популярность.
Поэтому и был включён в стандарт МЭК.
Графически LD-диаграмма представлена в виде двух вертикальных шин питания, между которыми расположены цепи, образованные соединением контактов. Нагрузкой каждой цепи служит “катушка” реле. Каждое реле имеет как бы контакты, которые можно использовать в других цепях.
Контакты могут быть включены как последовательно, так и параллельно, что позволяет реализовать булеву логику (то есть контакты могут выступать в качестве базовых логических элементов И, ИЛИ, НЕ). Поэтому на LD можно создавать не только “релейную” логику, но и “микросхемную”.
Кроме того, LD позволяет включать в свои цепи функциональные блоки, которые могут быть написаны на других языках. Благодаря этому возможности LD становятся почти неограниченными.
На рисунке пример программы на LD и основные элементы языка. Даже этой очень незначительной части уже достаточно, чтобы понять суть программирования на LD. И вы можете начать прямо сейчас. Потому что в простых случаях это почти ничем не отличается от разработки схем автоматики на реле. Ну а сложные задачи научитесь решать по мере набора практического опыта.
Кстати, язык LD можно использовать и для проверки работоспособности ваших схем на реле. Пример можно найти здесь.
На этом всё. Подписывайтесь на новости, чтобы ничего не пропустить (красная кнопка вверху справа), или подключайтесь к группе ВК.
Источник: asu-app.ru