Ladder Logic для PIC и AVR


Перевод на русский язык оригинальной статьи Jonathan Westhues: http://cq.cx/ladder.pl

Предисловие: Я написал компилятор, который позволяет работать с  диаграммами лестничной (релейной)
логики (Ladder Logic) и генерирует нативный код для PIC16 и 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 генерирует код с корректным форматом, чтобы загрузчик мог переписать вектора сброса.

Буду признателен за любые сообщения об ошибках.Поддерживаются следующие чипы:
Кроме того, можно генерировать C код из лестничных диаграмм. Это менее удобно, но вы можете использовать его на любом процессоре, для которого у вас есть компилятор C.

LDmicro может генерировать интерпретируемый байт-код.Если вы готовы написать интерпретатор, то вы можете использовать его, чтобы запустить свою релейную схему на любом контроллере (процессоре). Существует не очень много документации по этому вопросу, но я обеспечиваю пример интерпретатора реализованный на C (см. исходники проекта прим. переводчика).

Программа доступна на нескольких языках:

Исходный код, а также различные другие файлы, также доступны для скачивания. Эта программа может быть распространена и модифицирована в соответствии с условиями GPL версии 3.


Также доступны cтарые релизы :


(кликните правой кнопкой мыши, чтобы сохранить эти файлы)

Сообщайте о любых ошибках программы. Это свободное программное обеспечение, поставляемое без ответственности за контроль качества. Я даже не имею многих контроллеров для их собственноручной проверки. ​Ошибка, о которой не сообщается, вряд ли когда-либо будет исправлена.

У меня есть учебник, в котором я описываю, как ввести простую релейную диаграмму, симулировать ее, а затем генерировать IHEX файл и запрограммировать его в PIC. Это, наверное, самый простой способ начать работать с данной программой.

Если у вас есть вопросы о LDmicro, задавайте их на форуме.

Переведено: Ибрагимов М.Р.
Россия Тольятти 06.2011.г.