Вы находитесь на странице: 1из 9

Особенности языка LAD в CodeSys

Как и было описано, в первой статье, ПЛК осуществляет циклическое чтение входов,
выполнение прикладной программы и запись выходов. Потому написание программы для
ПЛК отличается от традиционного написания программы для микроконтроллеров и ПК. К
программам для ПЛК предъявляются жесткие требования по надежности, одно дело
зависает текстовый редактор, а другое дело программа, управляющая ядерным
реактором. Другое не менее важное требование – это своевременное реагирование на
событие. А что значит, во время не прореагировать на событие в промышленности? Это
значит потерять контроль над технологическим процессом. Что в некоторых случаях,
примером с реактором, приведет к непоправимым последствиям.

Рассмотрим отличия написания программы  для ПЛК и микроконтроллера. Для примера


возьмем простейшую задачку для МК - мигающий светодиод. Подозреваю, что все
начинали знакомство с МК именно с этой задачи. Алгоритм будет следующим

1. Записать в порт лог. 1.
2.  Временная задержка
3. Записать в порт лог.0.
4. Временная задержка
5.  Переход по метке на начало программы.

По данному алгоритму программа на ПЛК работать не будет, она содержит бесконечный


цикл. А в ПЛК вся прикладная программа выполняется от начала до конца в каждом
рабочем цикле, и любая программа должна отдавать управление системной программе.
Поэтому при такой организации алгоритма наш ПЛК зависнет. Даже если и убрать,
переход по метке на начало, программа не будет работать, так как нам хочется. Порт
всегда будет в состоянии лог.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= False , поэтому инверсный контакт X замкнут и таймер T2


запущен, выход Q= True, поэтому цепь включена. А так как обмотка в цепи инверсная,
значит она копирует инверсное состояние цепи в X , и X остается False, после
переполнения таймера Q = False , и инверсная обмотка переводит X в True. После этого
запускается T1, после переполнения скидывает X в False и все повторяется. Переменная
X является выходом генератора. Таймер T2 устанавливает паузу, а T1 длительность
импульса.

Компилируем проект Проект -> Компилировать


В пункте онлайн выбираем Режим эмуляции , а затем Подключение и Старт. И видим,
наша схема начинает переключаться, цепь где «протекает ток» выделяется синим
цветом. Также в области объявления переменных видим текущее значение переменных.
Выход генератора можно поглядеть с помощью цифрового трассировщика, для этого
переходим на вкладку Ресурсы в нижнем левом углу

Выбираем Цифровой трассировщик -> Дополнение -> Настройка трассировки,


выйдет следующее окно

Цикличность записи поставим Вручную, нажимаем на менеджер и выбираем


переменные X(Bool)
Нажимаем Ok . Выбираем перо для нашей переменной
Выбираем в онлайн Подключение, нажимаем  Старт , далее Дополнительно -> Начать
трассировку, также выберите пункт Автоматическая трассировка

Рассмотрим еще один пример управление двигателем с электронной коммутацией


обмоток статора
Саму программу представлять не буду, скачайте проект. А об алгоритме работы
расскажу.
Все таймеры запускаются по сигналу старт. Каждый таймер отмеряет момент окончания
фазы. Переменные Y1-Y3 являются выводами соответствующей фазы
управления. Каждый выход включается в том случае, если таймер еще не переполнен и
выключен предыдущий выход. Последняя цепь, является цепью автоматического
перезапуска.