Продолжаем разговор о языках программирования ПЛК.
В предыдущей статье мы поговорили о языке IL и о типах данных языков стандарта МЭК 61131-3.
Как я и обещал, в этой статье мы поговорим о языке LD – ladder diagramm, или языке релейной логики, который очень хорошо понятен тем, кто имеет дело с электрическими схемами. Типы данных здесь, естественно такие же, как и в IL.
Мне, по роду своей работы, очень часто приходится программировать контроллер именно на языке LD.
Его достоинство – очень хорошая наглядность и восприятие для не очень сложных логических схем.
В тоже время, если АСУ ТП достаточно сложная, требует много математических вычислений, то программирование на языке LD становится интересным квестом. Но кого пугают такие трудности? 🙂
Начнем с того, что этот язык пришёл, фактически, из обычных релейных схем. Обозначения контактов в этом языке немного отличаются от тех, что приняты у нас:
— нормально разомкнутый контакт (NO)
— нормально замкнутый контакт (NC)
— катушка реле
— или тоже катушка реле
Но, в общем, эти обозначения вполне интуитивно понятны.
Пример схемки на языке программирования LD (контроллер Simatic S1200):
В этом примере, если приходит команда «Открыть» от кнопки (RK14_btnOpen) и нет открытого состояния клапана (RK14_IOPEN), то формируется выходная команда открыть клапан (RK14_COPEN).
Вполне себе понятная стандартная релейная схема.
Есть, правда, и отличия. Как видно на рисунке, в схеме с левой стороны, как и обычно, присутствует шина питания. Но! Если в электрической релейной схеме это питание подается сразу на все элементы, к ней присоединенные, то в контроллере выполнение команд происходит последовательно слева направо и сверху вниз.
Что это означает на практике?
Как я уже писал, выполнение программы в контроллере идет циклично. Поэтому, рассматривая нашу схему, если контакт реле RK14_COPEN используется в схеме выше нашей цепи, то его измененное состояние придет туда только в следующем цикле. А цепи ниже нашей получат его измененное состояние уже в этом цикле. Не забывайте про это.
Да, кстати. Уже, я думаю, понятно, что реле в языке LD имеет бесконечное (в пределах памяти контроллера) множество контактов NO и NC, имеющих такое же имя (адрес) как и само реле (в нашем примере это RK14_COPEN).
Да, правая общая шина тоже есть. Но её принято не рисовать полностью. Поскольку цепочки контактов могут быть как очень короткие, так и очень длинные. И, если привязывать их и к левой и к правой шинам, то читабельность релейной диаграммы резко ухудшается. Поэтому, чаще всего, в среде разработки правая шина плавающая.
Кроме обычных реле присутствуют и реле с самофиксацией. Что бы установить такое реле во включённое положение используется команда SET, а чтобы выключить – команда RESET. Обозначаются они в стандарте следующим образом:
SET, значение «Tag_2» будет установлено в логическую «1», пока не применится команда
RESET, которая сбросит значение «Tag_2» в «0».
Кроме того, катушка реле тоже может быть инвертирована, и выглядит это так:
т.е., если на реле нет напряжения, то оно сработано, а если появляется, то отпущено.
Присутствуют в арсенале этого языка и реле времени. Выглядят они так:
— таймер с задержкой включения,
— таймер с задержкой отключения.
Есть еще TP – генератор импульса, TONR – аккумулирующий таймер. А есть и счетчики импульсов CTU – с увеличением, CTD – с уменьшением, CTUD – с увеличением и с уменьшением.
Естественно, поскольку у нас все ж таки программируемый логический контроллер, то и возможности для рисования, то бишь программирования, таких схем только контактами и катушками реле не ограничиваются. Контроллер таки позволяет и математические функции выполнять, и логические, и функции сдвига, и циклы, и функциональные блоки, и функции управления и специальные функции.
Кроме того, LD позволяет использовать и, так называемые, функциональные блоки – небольшие законченные программы, выполняющие определенную функцию и имеющие набор входов и выходов. Функциональные блоки есть готовые и даже определенные стандартом МЭК 61131-3. А есть возможность использовать и функциональные блоки написанные пользователем на любом другом стандартном языке программирования ПЛК. Т.е., по сути, возможности языка LD в таком варианте безграничны.
Пример вызова функционального блока из релейной логики:
В рамках одной статьи описать все возможности и команды языка LD, конечно же, не возможно. Или это будет уже не статья :).
Кроме того, производители контроллеров и программного обеспечения для них могут расширять свои языки в дополнение к стандарту МЭК 61131-3.
Поэтому, самый надёжный вариант изучения языка — это изучение мануала по программированию конкретного контроллера.
А моя задача была дать понимание и представление об этом языке, а дальше – обращайтесь к Марксу, т.е. к «Руководству по программированию контроллеров …» (вместо троеточия вставляете свой контроллер).
Пишите вопросы, пожелания, замечания в комментариях ниже. Если статья понравилась – не жадничайте, делитесь с друзьями и коллегами в соцсетях. 🙂