Ladder Logic для PIC и AVR
Перевод на русский язык оригинальной
статьи Jonathan Westhues: http://cq.cx/ladder.pl
Предисловие: Я написал
компилятор, который позволяет работать с диаграммами лестничной
(релейной)
логики (Ladder Logic) и генерирует нативный код для PIC16 и AVR.
Особенности программы:
- цифровые входы и выходы
- таймеры (TON, TOF, RTO)
- счетчики (CTU, CTD, 'цифровые счетчики'
для использования в качестве секвенсора)
- аналоговые входы, аналоговые (ШИМ) выходы
- целочисленные переменные и
арифметические команды
- последовательный порт для связи с PC,
LCD, и другими устройствами
- сдвиговые регистры, просмотровые таблицы
(look-up tables)
- EEPROM переменные, значения которых не
теряются при выключении питания
- симулятор, для проверки вашей программы
перед генераций кода для PIC/AVR
Данная программа является свободным программным обеспечением; исходный
код и исполняемые файлы доступны
для скачивания.
Введение
ПЛК часто программируются в релейной логике. Это происходит потому, что
ПЛК первоначально заменили
релейные системы управления, и даже спустя сорок лет релейные схемы
широко распространены и популярны.
ПЛК, как и любой микропроцессор, выполняет список инструкций в
определенной последовательности.
Лестничная логика абстрагирует алгоритм работы программы; Вы можете
программировать ПЛК соединяя проводами контакты реле, концевики, и
катушки реле на экране (как в реальной релейной схеме), а затем в
режиме реального времени ПЛК симулирует схему, которую Вы нарисовали.
Некоторые контакты могут быть привязаны к входным сигналам из реального
мира, а некоторые реле могут быть привязаны к выходам. Таким
способом, вы можете заставить моделируемую схему взаимодействовать с
другими устройствами, и управлять ими.
На самом деле вы можете гораздо больше, потому что вы можете
включить в схему таймеры и счетчики и арифметические операции, которые
вы не можете (легко) реализовать с одними реле. Концепция схем
полезна, не только потому, что интуитивна, но и потому, что
абстрагирует Вас от проблемы параллелизма. Выглядит это примерно так:
||
Xa
Xb
Yout
||
1
||-------]
[------+-------]
[------+-------(
)-------||
||
|
|
||
||
|
Xc
|
||
||
+-------]/[------+
||
Это простой фрагмент комбинационной схемы. . Есть три входа, Xa, Xb и
Xc. Существует один выход Yout. Выражение Yout: = Ха И (Xb ИЛИ (НЕ
Хс)). Представьте что Xa и Xb нормально открытые контакты , Хс как
нормально замкнутый контакт, и Yout как выходное реле (катушка
выходного реле). Более сложный пример:
||
||
||
Asetpoint
||
1
||-------------------------------------{READ
ADC}----||
||
||
||
Atemperature
||
||-------------------------------------{READ
ADC}----||
||
||
||
||
||
||
||
||
||
{SUB
min_temp
:=}
||
2
||------------------------{
Asetpoint
-
20 }--------||
||
||
||
{ADD
max_temp
:=}
||
||------------------------{
Asetpoint
+
20
}--------||
||
||
||
||
||
||
||
||
||[Atemperature
>]
Yheater
||
3
||[
max_temp
]+------------------------(R)-------||
||
|
||
||
Xenable
|
||
||-------]/[------+
||
||
||
||[Atemperature
<]
Xenable
Yheater
||
||[
min_temp
]--------]
[--------------(S)-------||
||
||
||
||
||
||
||
||
||
{SUB
check_temp
:=}
||
4
||-----------------------{
Asetpoint
-
30 }-------||
||
||
||
||
||
||
||
||
||[Atemperature
>]
Yis_hot
||
5
||[
check_temp
]-------------------------(
)-------||
||
||
||
||
||
||
||------[END]----------------------------------------||
||
||
||
||
Это простой термостат. . Есть два аналоговых входа , один из которых
(Asetpoint прим. переводчика) предназначен для задания значения, он
может, например, быть подсоединен к потенциометру, чтобы пользователь
выбирал желаемую температуру. Другой вход (Atemperature прим.
переводчика) обеспечивает измерение температуры, это может быть
полупроводниковый датчик температуры или платиновая термопара с
подходящей схемой сопряжения. Цифровой выход - Yheater. Он управляет
нагревательным элементом, с помощью соответствующего исполнительного
элемента(тиристора, реле, или твердотельного реле и тд.).
Мы контролируем цикл с простым гистерезисным (релейным) контроллером.
Выбрано плюс/минус 20 единиц АЦП гистерезиса. Это означает, что, когда
температура опускается ниже (уставка - 20), мы включаем обогреватель, и
когда она поднимается выше (уставки + 20), мы выключаем нагреватель.
Я добавил несколько "фишек". Во-первых, вход разрешения: нагреватель
принудительно выключен, когда Xenable закрыт. Я также добавил
индикатор, Yis_hot (Нагрев), чтобы показывать, когда температура
находится в пределах регулирования. Это сопоставимо с порогом немного
холоднее, чем (уставка - 20), так, чтобы индикатор не моргал во время
нормального цикла термостата.
Это тривиальный пример, но по нему должно быть ясно, что язык (Ladder
Logic) довольно выразителен и понятен. Лестничная логика не язык
программирования общего назначения, но это Тьюринг-образный,
применяемый в промышленности, и для ограниченного класса (в основном,
контрольно-ориентированных) проблем - очень удобный в применении
инструмент (электрики как правило читают релейные схемы пром.
установок, но упаси бог ему подсунуть реализацию алгоритма работы схемы
на языке "C" - пошлет Вас на 3 веселых буквы :-) примечание
переводчика).
Компилятор релейной логики для PIC16 и AVR
Современные 3-х долларовые микроконтроллеры, вероятно, обладают
вычислительной мощностью сопоставимой с PLC примерно 1975-го года.
Таким образом, они обеспечивают более чем достаточно MIPS для запуска
достаточно сложной лестничной логики с циклом время несколько
миллисекунд. Я думаю, ПЛК, как правило, имеют какую-то, виртуальную
машину или интерпретатор работающий в режиме реального времени,
но если мы делаем логическую схему на микропроцессоре без достаточного
обьема памяти, то компилятор является лучшей идеей.
Поэтому я написал компилятор. Вы начинаете с пустого цикла. Можно
добавлять контакты (входы) и реле (выходы) и более сложные структуры
для создания вашей программы. Таймеры (TON, TOF, RTO)
поддерживаются. Макс / мин длительность зависит от времени цикла
ПЛК, которая настраивается, таймеры могут считать от миллисекунд
до десятков минут. Вы можете использовать счетчики и арифметические
операции (плюс, минус, умножение, дел).
Схемные элементы могут быть добавлены последовательно или параллельно с
существующими элементами.Список Ввода/Вывода строится из нарисованной
лестничной логики. Вы можете использовать внутренние реле (Rfoo), для
которых автоматически выделяется память, или входы (Xfoo) и выходы
(Yfoo), к которым необходимо привязывать пины(выводы) микроконтроллера.
Выбор пинов зависит от микроконтроллера. Я стараюсь поддерживать
наиболее популярные PIC'и и AVR'ы (см. ниже).
Вы можете редактировать программы в графическом виде:
Затем вы можете протестировать программу, моделируя ее в режиме
реального времени. Программа появляется на экране с подсвеченными
ветвями (при значении true), что облегчает отладку. Состояние всех
переменных отображается в нижней части экрана в списке Ввода/Вывода.
После того как программа отлажена в режиме симуляции, можно связать
пины микроконтроллера с входами и выходами релейной схемы и
генерировать PIC или AVR код.
Программа поддерживает АЦП, ШИМ-блок, и UART на тех,
микроконтроллерах которые их имеют. Это означает, что вы можете
написать релейную логику, которая считывает аналоговые входы, и
отправляет и получает через последовательные порт символы (например,
для PC, если Вы добавите соответствующий преобразователь,
подобный MAX232, или символьный ЖК(LCD)). Можно отправить произвольные
строки через последовательный порт, а также значения целочисленных
переменных, в виде ASCII-текста. Наконец, программа теперь поддерживает
"сохраненные переменные" (preserved variables) на микроконтроллерах с
EEPROM, вы можете указать, что некоторая переменная должна быть
автоматически сохранена в энергонезависимой памяти всякий раз, когда
она меняется, так что это значение сохраняется даже после сброса
питания (выключения).
Ограничения, и Правовая ответственность
Конечно микроконтроллер с этим программным обеспечением не может делать
все, что настоящий промышленный ПЛК. Большинство коммерческих ПЛК сред
предлагают больше возможностей, и готовых блоков, чем мой
инструментарий. Аппаратный блок ПЛК как правило, тоже лучше, входы и
выходы, сконструированы с учетом возможных больших электрических
перегрузок.НО Вы можете приобрести PIC16F877 на плате за десять или
двадцать долларов, или Вы можете заплатить намного больше за ПЛК с
приблизительно такими же параметрами.
До сих пор я получил очень мало сообщений об ошибках по сравнению
с количеством людей, имеющих вопросы или пожелания. Существует еще
большая возможность ошибок, особенно при использовании
микроконтроллеров, которых я физически не имею (и, следовательно, не
могу проверить). Поэтому, НЕ ИСПОЛЬЗУЙТЕ LDmicro В КРИТИЧЕСКИ ВАЖНЫХ
ПРИЛОЖЕНИЯХ, И В ЧЕМ-ТО ЧТО МОЖЕТ РАЗРУШИТЬ ДОРОГОЕ УСТРОЙСТВО ПРИ
СВОЕМ ОТКАЗЕ.
Как отмечалось выше, код, который генерирует LDmicro далек от
оптимального. Кроме того, не все из ОЗУ данных в PIC16 устройств
доступно для программы лестничной логики. Это потому, что я не
реализовал полную поддержку страничной памяти PIC. Программа, однако,
поддерживает страничную память памяти программ, которая необходима для
доступа памяти программ в PIC16 за границей 2к.
Загрузка
Программное обеспечение разработано под Windows XP. Оно проверено во
всех версиях Windows от 2000 до Windows 7, и по неподтвержденным
сообщениям, она работает под WINE (Linux).Загрузите .exe-файл;. никаких
других файлов не требуется, поэтому нет программы установки. Сохраните
программу где-либо на вашем компьютере и просто запускайте ее от туда.
Мануал включен в .exe-файл, но вы можете скачать его отдельно, если
хотите.
Компилятор генерирует Intel IHEX файл. Большинство программаторов
которые я видел поддерживают этот режим. Разумеется, вам нужен какой-то
программатор, чтобы "залить" hex файл в чип. Для AVR, я рекомендую
AVRISP MKII, который доступен у различных дистрибьюторов. Для PIC, я
рекомендую PICkit 2 компании Microchip, который можно купить во многих
веб-магазинах. Оба программатора официально поддерживаются,
подключаются через USB, и стоят менее 40 долларов.
В целом возможно использовать код, сгенерированный LDmicro с
загрузчиком. Большинство микроконтроллеров AVR имеют специальные фьюзы
(BOOTRST, BOOTSZx), которые должны быть настроены под конкретный
загрузчик, который вы используете.PIC16 не имеют какой-либо конкретной
аппаратной поддержки загрузчика, но LDmicro генерирует код с корректным
форматом, чтобы загрузчик мог переписать вектора сброса.
Буду признателен за любые сообщения об ошибках.Поддерживаются следующие
чипы:
- PIC16F628(A)
- PIC16F88
- PIC16F819
- PIC16F877(A)
- PIC16F876(A)
- PIC16F887
- PIC16F886
- ATmega128
- ATmega64
- ATmega162
- ATmega32
- ATmega16
- ATmega8
Кроме того, можно генерировать C код из лестничных диаграмм. Это менее
удобно, но вы можете использовать его на любом процессоре, для которого
у вас есть компилятор C.
LDmicro может генерировать интерпретируемый байт-код.Если вы готовы
написать интерпретатор, то вы можете использовать его, чтобы запустить
свою релейную схему на любом контроллере (процессоре). Существует не
очень много документации по этому вопросу, но я обеспечиваю пример
интерпретатора реализованный на C (см. исходники проекта прим.
переводчика).
Программа доступна на нескольких языках:
Исходный код, а также различные другие файлы, также доступны для
скачивания. Эта программа может быть распространена и модифицирована в
соответствии с условиями GPL версии 3.
Также доступны cтарые релизы :
(кликните правой кнопкой мыши, чтобы сохранить эти файлы)
Сообщайте о любых ошибках программы.
Это свободное программное
обеспечение, поставляемое без ответственности за контроль качества. Я
даже не имею многих контроллеров для их собственноручной проверки.
Ошибка, о которой не сообщается, вряд ли когда-либо будет исправлена.
У меня есть учебник, в
котором я описываю, как ввести простую релейную
диаграмму, симулировать ее, а затем генерировать IHEX файл и
запрограммировать его в PIC. Это, наверное, самый простой способ начать
работать с данной программой.
Если у вас есть вопросы о LDmicro, задавайте их на форуме.
Переведено: Ибрагимов М.Р.
Россия Тольятти 06.2011.г.