Автор | Сообщение |
---|---|
admin | |
Цель данного материала – показать, как использовать Arduino в качестве программируемого логического контроллера (ПЛК), подключив его к соответствующим интерфейсам ввода / вывода. ПЛК (PLC - Programmable Logic Controller) был и остается основным компонентом промышленной автоматизации. Промышленное применение подразумевает высокую стоимость ПЛК как при покупке, так и при обслуживании и ремонте. Кроме того, требует узких профессиональных навыков от разработчиков-программистов ПЛК и специалистов по обслуживанию систем на основе программируемых логических контроллеров. Arduino является в своем роде универсальным программируемым контроллером, не смотря на то, что в первую очередь рассматривается как «ядро» для систем общего применения. Используя дополнительное оборудование (в основном устройства интерфейса, обеспечивающие взаимодействие контроллера Ардуино с датчиками и исполнительными механизмами) и соответствующее программное обеспечение, можно легко превратить его в нечто очень похожее на ПЛК. Возможность преобразовать платформу Arduino в ПЛК, использование специализированных языков программирования логики ПЛК позволит интересующимся начать изучать этот увлекательный мир промышленной автоматизации, не затрачивая больших финансов на оборудование и обучение. Существуют два подхода для превращения Ардуино в программируемый логический контроллер:
Примечание: язык программирования «Список операторов», часто сокращенно называемый STL (от англ. Statement List) или AWL (от нем. Anweisungsliste) разработан компанией Сименс. В данном варианте, наше внимание будет так же сосредоточено исключительно на использовании цифровых входов / выходов, не касаясь специфических функций. Практический пример В качестве примера, чтобы понять, как в полной мере использовать оба из вышеупомянутых методов попытаемся решить проблему автоматизации дома на основе WEB: автоматизируем электрические зонтики от солнца. В случае сильного ветра они должны автоматически складываться и раскрываться вновь, когда ветер стихнет. Кроме того, должно учитываться время суток – очевидно отсутствие необходимости в зонтиках в ночное время. Но условие силы ветра должны превалировать над освещением. В качестве возможного решения мы могли бы использовать реальный ПЛК, но, учитывая, их высокую стоимость и простоту алгоритма, данное решение не кажется разумным. Приобрести недорогие компоненты для сборки можно в магазине BG . Способ 1: LDmicro Прежде чем начать писать код на лестничной логике (или языке релейных схем), аналогичной той, что на рисунке, нам нужно скачать исполняемый файл LDmicro по ссылке http://cq.cx/ladder.pl . После загрузки и сохранения на рабочий стол, просто дважды щелкните на значке LDmicro. Теперь, прежде чем приступить к применению кода, мы должны написать проект программы, которую мы хотим создать. Так как программа очень проста, используется всего несколько переменных, мы можем применить самый простой программный подход: коммутируемую логику. Эта методика состоит из простых логических уравнений, которые всегда будут выдавать на выходе (после знака равенства) значение 0 или 1. Из операторов, будут использоваться только И (последовательно), ИЛИ (параллельно) и НЕ (отрицание), входные и выходные переменные в нашей программе, будут следующими: - INPUT (вход): Следует отметить, что выходные контакты Arduino еще не были объявлены, в то время как "х" и "у" размещены в начале объявления каждой переменной относительно входа и выхода. Программа сама автоматически добавит их во время кодирования. После того, как переменные объявлены, мы можем перейти к написанию логических выражений, учитывая, что Arduino с нашим шилдом читает все входы HIGH (1), когда контакт разомкнут и LOW (0), когда контакт замкнут: поэтому мы должны использовать отрицательную логику для всех входов для того, чтобы они были правильно интерпретированы. Теперь, когда у нас есть булевые уравнения, мы можем вернуться к LDmicro. Нажав клавишу "C" или выбрав в меню “instruction->include contact” , мы получаем включение открытого контакта. Теперь, без каких-либо изменений, нажав клавишу "L" на клавиатуре (после того как курсор перемещен после Xnew, на правой стороне), мы должны получить сегмент, идентичный показанному на фиг. Перемещая курсор ниже Xnew (с помощью клавиш со стрелками на клавиатуре) и нажав "C", мы получим новый сегмент, всегда названный как Xnew, но параллельный с предыдущим. Теперь мы должны изменить все имена контактов, соответственно, тем, которые используются в выражениях. Для этого просто дважды щелкните на первом Xnew контакте который мы создали и укажите имя и тип контакта в всплывающем окне. Введите имя "SEN_VENTO", выберите "INPUT PIN" (вход) и поставьте галочку "| / | NORMALMENTE CHIUSO” (нормально закрыто - NC). Помните, что программное обеспечение автоматически назначает начальную букву "X" или "Y" в зависимости от предназначения переменной для ввода или вывода, соответственно. Вся процедура повторяется для всех остальных контактов и выражений. Чтобы вставить новый сегмент, нажмите на кнопку “Edit->Insert segment behind” ("Правка> Вставить сегмент за"). После завершения настройки, из меню “Settings” ("Настройки") нужно выбрать "Microcontroller-> ANSI C Code”, далее произвести компиляцию из меню "Compile->Compile as”. Сохраним файл на Рабочем столе с этими настройками:
После сохранения файла, всплывающее окно предупредит нас о необходимости настройки карты адресов ввода / вывода: нажимаем "OK", сохраняем наш LDmicro проект (menu File->save as) всегда на столе, назвав его как "ladder.ld". Переходим к следующему шагу. Открыв файл ladder.cpp с помощью блокнота, выделите весь текст, скопировав, вставьте его на веб-сайт http://adam.horcica.cz/tools/ladder-gen. Нажав на кнопку “Generate” ("Создать"), мы получим новый код. Скопируйте этот код в новый файл блокнота и со следующими параметрами:
В этом упражнении мы выбрали следующую конфигурацию контактов: pinMode (2, INPUT); Далее мы можем изменить "ladder.h" библиотеку с этой конфигурацией контактов, как показано в листинге 1: /* This is autogenerated code. */ #ifndef LADDER_H #if ARDUINO >= 100 #define BOOL boolean #define EXTERN_EVERYTHING void PlcCycle(void); /* Configure digital I/O according to LD (call this in setup()). */ inline void PlcSetup() /* Individual pins (this code is used in ladder.cpp) */ inline extern BOOL Read_U_b_XSEN_VENTO(void) inline extern BOOL Read_U_b_XIN_CREP(void) inline extern BOOL Read_U_b_XFINE_COR_A(void) inline BOOL Read_U_b_YL_SVO(void) inline void Write_U_b_YL_SVO(BOOL v) inline BOOL Read_U_b_YAVVOLG(void) inline void Write_U_b_YAVVOLG(BOOL v) inline BOOL Read_U_b_YL_AVV(void) inline void Write_U_b_YL_AVV(BOOL v) inline extern BOOL Read_U_b_XFINE_COR_S(void) inline BOOL Read_U_b_YSVOLG(void) inline void Write_U_b_YSVOLG(BOOL v) inline BOOL Read_U_b_YL_RIP(void) inline void Write_U_b_YL_RIP(BOOL v)
После того как вы изменили библиотеку как было показано, необходимо сохранить изменения, не меняя ни имени, ни расширение файла и сохраняя его всегда на "Рабочем столе". Далее создадим файл "pinmap.ini" и объявим в нем имена наших переменных и соответствующих им разъемов. Этот шаг можно пропустить, но правильная работа программы в таком случае не гарантируется. Изменения в этом файле завязаны с нашим проектом и должны согласовываться с кодом в ladder.h (листинг 2). ; This file contains mapping between variable name in the LD and actual ; SEN_VENTO on pin 2 ; FINE_COR_A on pin 3 ; FINE_COR_S on pin 4 ; IN_CREP on pin 5 ; AVVOLG on pin 8 ; L_AVV on pin 9 ; SVOLG on pin 10 ; L_SVO on pin 11 ; L_RIP on pin 12 Теперь переложим наши четыре файла 1. "ladder.ld" 2. "ladder.cpp" 3. "ladder.h" 4. "pinmap.ini" в одну папку под названием «ladder». Затем переместите эту папку в Windows7: "C:\programmiX86\Arduino\libraries", в Windows XP: "C:\Program Files\Arduino\libraries". Откройте или перезагрузите Arduino IDE. Добавьте следующий код (ПРИМЕЧАНИЕ: не предназначено для использования таймеров или других специальных функций). В меню “SKETCH”, выбираем “import library” (импорт библиотеки), далее выбираем “ladder”. Теперь, введите следующий код, который подходит для всех проектов, подобных этому: #include <ladder.h> Нажмите на кнопку “verification check” (верификация) для проверки нашего кода и подождите, пока скетч не будет скомпилирован. При возникновении ошибок компиляции – перепроверьте правильность выполнения предыдущих шагов. По окончанию компиляции, нажмите на ярлык для прошивки программы в Arduino. Подождите пока она загружается. Примите поздравления - вы сумели превратить ваш Arduino в контроллер, очень похожий на программируемый логический контроллер (ПЛК). Теперь вы можете оперировать системой, соблюдая логику, которую мы установили для входов и выходов. Внимание: При создании нового проекта, прежде чем импортировать новую папку (чье имя должно всегда быть «ladder», она должна содержать файлы с теми же именами, как и было ранее), необходимо удалить из каталога папку предыдущего проекта. В случае, если вы хотите сохранить его, просто переименуйте его и сохраните в другом каталоге. Если вы захотите восстановить его, просто переименуйте папку обратно в " ladder " и верните ее обратно в каталог. Способ 2.1: plcLIB Загрузите модифицированную библиотеку plcLIB и распакуйте в папку в "C:\programmiX86\ Arduino\libraries" для Windows 7 или в "C:\Program Files\Arduino\libraries" для Windows XP. В данном варианте, в отличии от первого метода, мы сможем воспользоваться некоторыми дополнительными функциями, такими как таймеры. После того, как вы импортировали библиотеку просто измените свой код учетом некоторых факторов: цифровые входы / выходы должны соответствовать наименованиям в таблице. Повторно используя булевые выражения, описанные выше, напишем наш код в Arduino IDE: рассмотрим их как реальные уравнения с учетом необходимой очередности выполнения операторов (в начале вычисления в скобках, далее остальные). #include <plcLib.h> in(Y1); in(X4); in(Y3); inNot(Y2); } Отредактировав код, нажмите «Verify» и дождитесь окончания компиляции скетча. Перепроверьте корректность выполнения всех шагов в случае возникновения ошибок. После завершения сборки нажмите на кнопку “Upload” для загрузки кода в Arduino. Предупреждение: эта библиотека была изменена и настроена, для использования с цифровыми входами / выходами Arduino UNO. Для нового проекта, вы должны изменить только код, заключенный в void loop () {…}, не изменяя предыдущую часть. Вы можете сохранить свой скетч, не меняя библиотеку: это проще и быстрее по времени по сравнению с вариантом в котором используем LDmicro. Вы не можете использовать GUI (графический интерфейс) с лестничной логикой, но вы можете в полной мере использовать логику ПЛК, с существенной экономией времени, снижая риска ошибок компиляции или несовпадения кода без необходимости переключаться в другое программное обеспечение. На самом деле, хороший программист — это тот, кто способен создать хороший продукт, независимо от SDK или GUI он использует: главное, что логика алгоритма всегда та же самая. Дополнительная информация: пожалуйста, обратите внимание, что расположение контактов из нашей библиотеки было изменено, для соответствия с платой ввода вывода (шилдом) Arduino UNO. Описанное выше работоспособно только в том случае, если вы использовали оригинальную библиотеку по ссылке ниже, так что все специальные функции были объявлены и описаны. Библиотека была адаптирована для платы (шилда) ввода/вывода, поэтому некоторые функции, которые вы можете обнаружить в коде по ссылке ниже могут работать некорректно в связи с проделанной адаптацией. Мы не гарантируем надлежащую работу всех функций, упомянутых electronics-micros. Тем не менее, нами проверено, что функция таймера работает отлично. Если вы хотите попробовать все другие функции, вы можете скачать оригинальную библиотеку и следуйте шаг за шагом инструкции указанного сайта. Здесь приведен пример использования таймеров: unsigned long TIMER0 = 0; Ссылки на подробную информацию и оригинальную библиотеку plcLIB без наших изменений: - www.electronics-micros.com/software-hardware/plclib-arduino/ - www.electronics-micros.com/resources/arduino/plclib/plcLib.zip На рисунке вы видите схему подключения датчиков и моторчика зонтика (220 однофазный двигатель с двухсторонним вращением). Метод 2.2: plcLIB вариант аналого-цифровой Чтобы следовать этому примеру, пожалуйста, скачайте библиотеку . В этом разделе мы немного отклонимся от мира электротехники и автоматики ПЛК и сделаем шаг в направлении электроники. Данная библиотека plcLIB была изменена, для соответствия нашему шилду ввода/вывода. Таким образом, мы имеем возможность использовать три цифровых входа, три выхода ШИМ, шесть входов и шесть аналоговых выходов. Распакуйте скаченный файл PlcLIB.zip и скопируйте папку в каталог ".... \Arduino\libraries" Внимание: если вы установили библиотеку, указанную в предыдущем варианте, необходимо вырезать и вставить ее в другой каталог, чтобы избежать конфликтов имен (сохраните ее, если хотите создать чисто цифровой проект). В случае, если вы хотите построить прототип, который объединяет как цифровые, так и аналоговые входы / PWM управления, используйте библиотеку, указанный в текущем пункте. Напоминаем, что на аналоговых входах, максимальный разрешенный ток равен 100mA, напряжение - 5V. Пример приложения: мы хотим затемнить светодиод (L1; AY1) в соответствии со значением с потенциометра (R1; Ax1) в режиме реального времени. Решение на Arduino, приложено в листинге ниже. Его будет проще понять после изучения предыдущего пункта. #include <plcLib.h> После проверки кода, вы можете загрузить его в Arduino. Автор: Christian Granvillano Источник: http://www.asu-tp.org/index.php?option=com_content&task=view&id=420&Itemid=101 |
|
Сообщения: 463 |