Учебник LDmicroПеревод на русский язык оригинальной статьи Jonathan Westhues: http://cq.cx/ladder-tutorial.pl |
В этом примере я покажу Вам, как
написать очень простую программу.
Предполагается, что Вы писали алгоритмы лестничной логики раньше, и что
у Вас есть базовые понятия о микроконтроллерах, но Вы никогда не
использовали LDmicro. Если вы не понимаете, что такое лестничная логика
и ПЛК, полезно предварительно ознакомиться с учебником на plcs.net. У нашего устройства одна кнопка, и один светодиод. При запуске светодиод будет выключен. При нажатии кнопки один раз, светодиод загорается. При нажатии кнопки второй раз, светодиод начнет мигать. После третьего нажатия кнопки, светодиод погаснет. При последующих нажатиях, цикл будет повторяться. Выбор микроконтроллера и схемаМы будем использовать PIC16F876, который можно купить в Digikey или у других онлайновых дистрибьюторов (рекомендую ТРИТОН на территории России прим. переводчика). Микросхема имеет несколько вариантов корпуса - я выбираю DIP.Обратите внимание, что по состоянию на ноябрь 2009, PIC16F876 не рекомендуется для новых разработок. Рекомендуется использовать вместо него PIC16F886, который совместим по контактам с PIC16F876. Убедитесь, что при компиляции выбран правильный целевой микроконтроллер. Это наша схема: Полное название примененного микроконтроллера (IC1) PIC16F876-20I/SP. Единственное, что может сбить вас с толку, что кнопка идет к Vdd(+5V прим. переводчика), и пин кнопки подтянут резистором к земле(RC3 выв.14 прим. переводчика). Вы вероятно чаще встречали схему с замыканием кнопки на землю и подтяжкой пина к Vdd. Для TTL, подходит этот вариант. Для современных КМОП-это не так, и я считаю "активная 1" более удобна (т.е. вариант изображенный на схеме прим. переводчика), чем традиционный "активный 0" цепи. Кроме того, я решил использовать керамический резонатор U1, вместо кварцевого резонатора и двух ~ 20 пФ конденсаторов. Кварцевый резонатор будет работать так же хорошо, и даже выдает более точную частоту, но это немного удорожает конструкцию , и вам потребуется больше деталей. Вы могли бы собрать схему разными способами. Я сделал ее на макетной плате, и она выглядит так: (Номиналы резисторов на фото отличаются от тех что, на схеме,но это не критично.) Программирование лестничной логики (Ladder Diagram).Во-первых нам нужен генератор для мигания светодиода. Применяем стандартный для лестничной логики способ. || Rosc Tosc_on Tosc_off Rosc || 1 ||-------] [--------[TON 250.0 ms]---[TOF 250.0 ms]---------(/)-------|| Этот узел мигает с частотой в 1 / ((250 +250) мс), или 2 Гц, т.е. два раза в секунду.Скважность 50% (меандр прим. переводчика) - 250 мс "1", 250 мс "0". Эта схема может генерировать сигнал любой частоты (от десятков герц и ниже в зависимости от периода цикла ПЛК прим. переводчика), с любой скважностью которая вам требуется, поэтому данный блок полезно запомнить. Заметьте, что мы решили использовать внутреннее реле ('Rfoo') вместо "внешнего" подсоединенного к вводу/выводу ('Yfoo' или 'Xfoo'). Это резонно, потому что нет никакой особой необходимости выводить сигнал на пины микроконтроллера. LDmicro автоматически выделяет память для внутреннего реле. В нашей программе будет три состояния: ВЫКЛ, ВКЛ, и МИГАНИЕ (светодиода прим. переводчика). Программа должна изменять свое состояние по каждому положительному фронту сигнала от кнопки. С данной задачей хорошо справится круговой счетчик. Полагаем, что 'состояние 0' - 'ВЫКЛ', 'состояние 1' - 'ВКЛ', и 'состояние 2' - 'МИГАНИЕ'.Счетчик подсчитывает 0, 1, 2, 0, 1, 2, ..., поэтому входным условием ступени (rung-in condition) мы назначаем вход кнопки, данный узел выглядит так: || Xbutton Cstate || 2 ||-------] [---------------------------------------------{CTC 0:2}----|| Теперь осталось только использовать состояния программы, чтобы управлять светодиодом. Сделаем это так: || [Cstate ==] Yled || 3 ||---[ 1 ]-------------------+------------------------( )-------|| || | || || [Cstate ==] Rosc | || ||---[ 2 ]----------] [------+ || Легко понять, что данный блок делает, то что нам нужно. Если программа находится в 'состоянии 1': 'Cstate == 1' = TRUE - выход Yled находится в состоянии '1' (ВКЛ. прим. переводчика). В 'состоянии 2': 'Cstate == 2' - выход Yled находится в состоянии '1' (ВКЛ. прим. переводчика), но только тогда, когда 'Rosc == 1'. Так как 'Rosc' генерирует частоту, то светодиод мигает. Наконец в 'состоянии 0' оба условия (компаратора здесь и далее прим. переводчика) не выполняются: 'Cstate == 1' = FALSE, и 'Cstate == 2' = FALSE, поэтому выход 'Yled' = 0 (ВЫКЛ прим. переводчика). Рисование лестничной логики.Теперь, когда у нас составлена схема, мы можем нарисовать ее в LDmicro. Когда вы запускаете LDmicro, вы увидите одну пустую ступень (rung):Рисуем первую ступень из описанной выше. Мы начинаем с реле (coil), выбираем "Instruction -> Insert Coil". Это то, что нам нужно, за исключением того, что название по умолчанию нас не устраивает, и реле должно быть инверсным (Negated) и внутренним (Internal). Дважды щелкните по реле, это откроет диалоговое окно, где мы можем поменять параметры: Теперь мы можем вставить оставшуюся часть ступени подобным образом. Нажмите на левый край реле, курсор станет вертикальным, и слева от реле. Теперь выберите "Instruction -> Insert TON (Delayed Turn On)". Опять дважды кликаем по таймеру, чтобы переименовать его и установить его период. Добавьте таймер TOF и контакт таким же способом. Переходим к вводу второй ступени, выбираем "Edit -> Insert Rung After". Затем кликаем на вторую ступень, чтобы переместить туда курсор: Вторая ступень проста: достаточно заполнить две инструкции в правильном порядке, помещая курсор там, куда вы хотите делать вставку, а затем выбирая "Instruction -> Insert ...". Не забудьте назначить имя 'Xbutton', для контакта, а также установить имя и верхний предел счетчика. Затем выберите команду: "Edit -> Insert Rung After" снова. Ваша программа должна выглядеть следующим образом: Третья ступень будет немного сложнее, потому что она имеет параллельные ветви. Это означает, что вы должны думать о порядке, в котором вставляете инструкции. Во-первых, вставьте реле, и переименуйте его: Теперь вставьте первую инструкцию компаратора слева от реле, как обычно, и укажите правильные имя переменной и значение. После этого, добавьте параллельную ветвь. Вы можете сделать это, нажав на нижний край инструкции компаратора , курсор будет горизонтальным и ниже команды компаратора: Теперь выберите "Instruction -> Insert EQU (Compare for Equals)". Так как курсор находится ниже первого компаратора, новая инструкция компаратора будет вставлена ниже, параллельно первому компаратору. Переименуйте его, как обычно. Для завершения ступени, Вы должны вставить контакт 'Rosc' справа от второго компаратора. Для этого кликнете на правую границу компаратора: Теперь выберите "Instruction -> Insert Contacts". Контакт будет вставлен последовательно со вторым компаратором, как Вам требуется. Переименуйте его и на этом ввод схемы закончен. Правый край второго компаратора: Симуляция программыТеперь мы готовы симулировать схему. Выберите: "Simulate -> Simulation Mode". Изображение изменится: лестничная диаграмма станет серой, но никаких изменений на схеме пока не будет. Все верно, рабочий цикл PLC еще не запущен.Для его запуска выберите "Simulate -> Start Real-Time Simulation". Теперь Вы увидете, что происходит: генератор, очевидно, работает, но светодиод 'Yled' по-прежнему выключен, так как кнопку не нажата. Чтобы имитировать нажатие кнопки, дважды щелкните текст "Xbutton" в списке в нижней части экрана. Так вы симулируете нажатие кнопки (на входе контороллера появляется "1" прим. переводчика). Вы видите, что программа работает: счетчик "Cstate" в 'состоянии 1', т.е. 'ВКЛ'. Светодиод горит, вы видете его значение 1 в списке, и реле "Yled" красное на диаграмме. Дважды щелкните текст "Xbutton" в списке в нижней части экрана, чтобы симитировать отпускание кнопки, затем повторите это действие, чтобы нажать кнопку снова: реле "Yled" начнет мигать, как мы и хотели. При третьем нажатии кнопки реле "Yled" перейдет в состояние 'ВЫКЛ'. Компиляция в формат IHEXИтак, теперь мы уверены, что программа работает. Теперь мы готовы генерировать рабочий код, и программировать его в микроконтроллер. Во-первых, выходим из режима симуляции, выбрав "Simulate -> Simulation Mode" или нажав Escape.Далее мы должны выбрать микроконтроллер. Мы решили ранее, что мы будет использовать PIC16F876, так что выбирайте "Settings -> Microcontroller -> Microchip PIC16F876 28-PDIP or 28-SOIC". Кроме того, мы должны указать LDmicro какой генератор мы будем использовать, и какое будет время цикла. Выберите пункт меню "Settings -> MCU Parameters" и введите тактовую частоту 20 МГц. Оставьте время цикла в 10 мс, это обычно, нормальное значение. Теперь мы можем привязать пины(выводы) микроконтроллера к входам и выходам схемы. Дважды щелкните "Xbutton" в списке в нижней части экрана и выберите пин 14 PIC, который соответствует порту RC3 микроконтроллера. (Как правило не важно какой порт Вы используете, просто посмотрите на номер пина). Нажмите кнопку 'OK', а затем повторите эти действия для "Yled", который Вы можете видеть на схеме должнен быть привязан к пину 15. Другие элементы в списке - внутренние переменные и биты в памяти, так что нет необходимости привязывать их к выходам. LDmicro "автоматом" выделит им память при компиляции. Итак, теперь все готово к компиляции. Выберите "Compile -> Compile", и укажите, куда вы хотите сохранить IHEX файл. Затем с помощью любого PIC программатора который есть у Вас в наличии, запрограммируйте микроконтроллер, и эксплуатируйте устройство. На этом мой урок закончен. Конечно, можно писать намного более сложные программы, чем эта. Данная программа проста и использует малую часть памяти вашего микроконтроллера, так что еще можно добавить много ступеней логики. С LDmicro также можно использовать специализированные инструкции, такие как: арифметика, аналоговые (A/D)входы, PWM, и даже текстовый вывод на символьный ЖК-дисплей или терминал PC. Все это описано в мануале (руководство по эксплуатации). Я не понимаю, зачем Вам это может понадобится, но Вы можете скачать данный файл учебной программы. Переведено: Ибрагимов М.Р. Россия Тольятти 06.2011.г. |