Языки программирования ПЛК – LD

yazyki-programmirovaniya-plc-ldПродолжаем разговор о языках программирования  ПЛК.

В предыдущей статье мы поговорили о языке IL и о типах данных языков стандарта МЭК 61131-3.

Как я и обещал, в этой статье мы поговорим о языке LD – ladder diagramm, или языке релейной логики, который очень хорошо понятен тем, кто имеет дело с электрическими схемами. Типы данных здесь, естественно такие же, как и в IL.

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

Его достоинство – очень хорошая наглядность и восприятие для не очень сложных логических схем.

В тоже время, если АСУ ТП достаточно сложная, требует много математических вычислений, то программирование на языке LD становится интересным  квестом. Но кого пугают такие трудности? 🙂

Начнем с того, что этот язык пришёл, фактически, из обычных релейных схем. Обозначения контактов в этом языке немного отличаются от тех, что приняты у нас:

NO

 

— нормально разомкнутый контакт (NO)

 

 

NC

 

— нормально замкнутый контакт (NC)

 

 

Rele

 

 

— катушка реле

 

Rele

 

— или тоже катушка реле

 

 

Но, в общем, эти обозначения вполне интуитивно понятны.

Пример схемки на языке программирования LD (контроллер Simatic S1200):

Shema-na-LD

В этом примере, если приходит команда «Открыть» от кнопки (RK14_btnOpen) и нет открытого состояния клапана (RK14_IOPEN), то формируется выходная команда открыть клапан (RK14_COPEN).

Вполне себе понятная стандартная релейная схема.

Есть, правда, и отличия. Как видно на рисунке, в схеме с левой стороны, как и обычно, присутствует шина питания. Но! Если в электрической релейной схеме это питание подается сразу на все элементы, к ней присоединенные, то в контроллере выполнение команд происходит последовательно слева направо и сверху вниз.

Что это означает на практике?

Как я уже писал, выполнение программы в контроллере идет циклично. Поэтому, рассматривая нашу схему, если контакт реле RK14_COPEN используется в схеме выше нашей цепи, то его измененное состояние придет туда только в следующем цикле. А цепи ниже нашей получат его измененное состояние уже в этом цикле. Не забывайте про это.

Да, кстати. Уже, я думаю, понятно, что реле в языке LD имеет бесконечное (в пределах памяти контроллера) множество контактов NO и NC, имеющих такое же имя (адрес) как и само реле (в нашем примере это RK14_COPEN).

Да, правая общая шина тоже есть. Но её принято не рисовать полностью. Поскольку цепочки контактов могут быть как очень короткие, так и очень длинные. И, если привязывать их и к левой и к правой шинам, то читабельность релейной диаграммы резко ухудшается. Поэтому, чаще всего, в среде разработки правая шина плавающая.

Кроме обычных реле присутствуют и реле  с самофиксацией. Что бы установить такое реле во включённое положение используется команда SET, а чтобы выключить – команда RESET. Обозначаются они в стандарте следующим образом:

LD_SET

 

SET, значение «Tag_2» будет установлено в логическую «1», пока не применится команда

 

LD_RESET

 

RESET, которая сбросит значение «Tag_2» в «0».

 

 

Кроме того, катушка реле тоже может быть инвертирована, и выглядит это так:LD_Rele_NOT

 

 

 

т.е., если на реле нет напряжения, то оно сработано, а если появляется, то отпущено.

Присутствуют в арсенале этого языка и реле времени. Выглядят они так:LD_TON

 

— таймер с задержкой включения,

 

LD+TOF

 

— таймер с задержкой отключения.

 

 

Есть еще TP – генератор импульса, TONR – аккумулирующий таймер. А есть и счетчики импульсов CTU – с увеличением, CTD – с уменьшением, CTUD – с увеличением и с уменьшением.

Естественно, поскольку у нас все ж таки программируемый логический контроллер, то и возможности для рисования, то бишь программирования, таких схем только контактами и катушками реле не ограничиваются. Контроллер таки позволяет и математические функции выполнять, и логические, и функции сдвига, и циклы, и функциональные блоки, и функции управления и специальные функции.

Кроме того, LD позволяет использовать и, так называемые, функциональные блоки – небольшие законченные программы, выполняющие определенную функцию и имеющие набор входов и выходов. Функциональные блоки есть готовые и даже определенные стандартом МЭК 61131-3. А есть возможность использовать и функциональные блоки написанные пользователем на любом другом стандартном языке программирования ПЛК. Т.е., по сути, возможности языка LD в таком варианте безграничны.

Пример вызова функционального блока из  релейной логики:

LD_vizov-FB

В рамках одной статьи описать все возможности и команды языка LD, конечно же, не возможно. Или это будет уже не статья :).

Кроме того, производители контроллеров и программного обеспечения для них могут расширять свои языки в дополнение к стандарту МЭК 61131-3.

Поэтому, самый надёжный вариант изучения языка  — это изучение мануала по программированию конкретного контроллера.

А моя задача была дать понимание и представление об этом языке, а дальше – обращайтесь к Марксу, т.е. к «Руководству по программированию контроллеров …» (вместо троеточия вставляете свой контроллер).

Пишите вопросы, пожелания, замечания в комментариях ниже. Если статья понравилась – не жадничайте, делитесь с друзьями и коллегами в соцсетях. 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

− 3 = 1