Mr.Doors


Rambler's Top100



Arduino как программируемый логический контроллер (ПЛК)

Arduino_community_logoЦель данного материала – показать, как использовать Arduino в качестве программируемого логического контроллера (ПЛК), подключив его к соответствующим интерфейсам ввода / вывода.

ПЛК (PLC - Programmable Logic Controller) был и остается основным компонентом промышленной автоматизации. Промышленное применение подразумевает высокую стоимость ПЛК как при покупке, так и при обслуживании и ремонте. Кроме того, требует узких профессиональных навыков от разработчиков-программистов ПЛК и специалистов по обслуживанию систем на основе программируемых логических контроллеров. Arduino является в своем роде универсальным программируемым контроллером, не смотря на то, что в первую очередь рассматривается как «ядро» для систем общего применения. Используя дополнительное оборудование (в основном устройства интерфейса, обеспечивающие взаимодействие контроллера Ардуино с датчиками и исполнительными механизмами) и соответствующее программное обеспечение, можно легко превратить его в нечто очень похожее на ПЛК.

Возможность преобразовать платформу Arduino в ПЛК, использование специализированных языков программирования логики ПЛК позволит интересующимся начать изучать этот увлекательный мир промышленной автоматизации, не затрачивая больших финансов на оборудование и обучение.

Существуют два подхода для превращения Ардуино в программируемый логический контроллер:

  • Первый - писать программу, используя язык лестничной логики. Для этого необходимо использовать два дополнения к Arduino IDE. Первое приложение называется LDmicro, оно является редактором и компилятором кода на лестничной логике (скачать приложение можно здесь  http://cq.cx/dl); второе представляет собой веб-страницу, которая поможет нам в создании кода для ladder.h библиотеки (http://adam.horcica.cz/tools/ladder-gen). Для простоты, в данном руководстве мы будем рассматривать только цифровые входы / выходы без каких-либо особенностей.
  • Второй способ заключается в использовании plcLIB (библиотеки, соответствующим образом модифицированной для использования шилдов (плат расширения) в сочетании с Arduino UNO), так что вы сможете писать код проекта на языке подобном AWL (инструкции: IF, AND, OR, ...), обеспечивающим контроль над таймерами и другими функциями.

Примечание: язык программирования «Список операторов», часто сокращенно называемый STL (от англ. Statement List) или AWL (от нем. Anweisungsliste) разработан компанией Сименс.

В данном варианте, наше внимание будет так же сосредоточено исключительно на использовании цифровых входов / выходов, не касаясь специфических функций.

Практический пример

В качестве примера, чтобы понять, как в полной мере использовать оба из вышеупомянутых методов попытаемся решить проблему автоматизации дома на основе WEB: автоматизируем электрические зонтики от солнца. В случае сильного ветра они должны автоматически складываться и раскрываться вновь, когда ветер стихнет. Кроме того, должно учитываться время суток – очевидно отсутствие необходимости в зонтиках в ночное время. Но условие силы ветра должны превалировать над освещением.

В качестве возможного решения мы могли бы использовать реальный ПЛК, но, учитывая, их высокую стоимость и простоту алгоритма, данное решение не кажется разумным.
Используем два сенсора: «сумерок НЕТ» (нормально открытый) и «ветра НЕТ», подключенные к плате ввода/вывода. Кроме того, необходимо адаптировать схему питания двигателями зонтиков, так что бы Arduino могло управлять ими.

Приобрести недорогие компоненты для сборки можно в магазине BG


Способ 1: LDmicro


LDMicro
Прежде чем начать писать код на лестничной логике (или языке релейных схем), аналогичной той, что на рисунке, нам нужно скачать исполняемый файл LDmicro по ссылке http://cq.cx/ladder.pl . После загрузки и сохранения на рабочий стол, просто дважды щелкните на значке LDmicro. Теперь, прежде чем приступить к применению кода, мы должны написать проект программы, которую мы хотим создать.


LDmicro_window

Так как программа очень проста, используется всего несколько переменных, мы можем применить самый простой программный подход: коммутируемую логику. Эта методика состоит из простых логических уравнений, которые всегда будут выдавать на выходе (после знака равенства) значение 0 или 1. Из операторов, будут использоваться только И (последовательно), ИЛИ (параллельно) и НЕ (отрицание), входные и выходные переменные в нашей программе, будут следующими:

- INPUT (вход):
WIND SENSOR (ДАТЧИК ВЕТРА): XSEN_VENTO
LIMIT SWITCH ROLL (КОНЦЕВИК СЛОЖЕННОГО ЗОНТА): XFINE_COR_A
LIMIT SWITCH UNROLL  (КОНЦЕВИК ОТКРЫТОГО ЗОНТА): XFINE_COR_S
TWILIGHT SWITCH (ДАТЧИК ОСВЕЩЕННОСТИ): XIN_CREP

- OUTPUT (выход):
ROLLER (СКЛАДЫВАНИЕ): YAVVOLG
LED ROLLER РОЛИК: YL_AVV
UNROLLER(РАЗВОРАЧИВАНИЕ): YSVOLG
LED UNROLLER: YL_SVO
IDLE STATE(СОСТОЯНИЕ ОЖИДАНИЯ): YL_RIP

Следует отметить, что выходные контакты Arduino еще не были объявлены, в то время как "х" и "у" размещены в начале объявления каждой переменной относительно входа и выхода. Программа сама автоматически добавит их во время кодирования.

После того, как переменные объявлены, мы можем перейти к написанию логических выражений, учитывая, что Arduino с нашим шилдом читает все входы HIGH (1), когда контакт разомкнут и LOW (0), когда контакт замкнут: поэтому мы должны использовать отрицательную логику для всех входов для того, чтобы они были правильно интерпретированы.

LDMicro_window2

 

Теперь, когда у нас есть булевые уравнения, мы можем вернуться к LDmicro. Нажав клавишу "C" или выбрав в меню “instruction->include contact” , мы получаем включение открытого контакта. Теперь, без каких-либо изменений, нажав клавишу "L" на клавиатуре (после того как курсор перемещен после Xnew, на правой стороне), мы должны получить сегмент, идентичный показанному на фиг.

Перемещая курсор ниже Xnew (с помощью клавиш со стрелками на клавиатуре) и нажав "C", мы получим новый сегмент, всегда названный как Xnew, но параллельный с предыдущим.
Теперь, мы должны нажать на Ynew перемещая курсор вертикально слева (до) выхода, мы должны дважды нажать "C". Делая это, мы добавляем еще два контакта, последовательных с двумя (параллельными) предыдущими. Чтобы закончить, нам просто нужно нажать на Ynew (но на этот раз курсор должен быть под выходным символом), далее нажмите «L»: таким образом, мы добавили еще один выход параллельно с существующей Ynew.

Теперь мы должны изменить все имена контактов, соответственно, тем, которые используются в выражениях. Для этого просто дважды щелкните на первом Xnew контакте который мы создали и укажите имя и тип контакта в всплывающем окне. Введите имя "SEN_VENTO", выберите "INPUT PIN" (вход) и поставьте галочку "| / | NORMALMENTE CHIUSO” (нормально закрыто - NC). Помните, что программное обеспечение автоматически назначает начальную букву "X" или "Y" в зависимости от предназначения переменной для ввода или вывода, соответственно.

popup

Вся процедура повторяется для всех остальных контактов и выражений.

LDMicro_window3

 

Чтобы вставить новый сегмент, нажмите на кнопку “Edit->Insert segment behind”  ("Правка> Вставить сегмент за"). После завершения настройки, из меню “Settings” ("Настройки") нужно выбрать "Microcontroller-> ANSI C Code”, далее произвести компиляцию из меню "Compile->Compile as”.

Сохраним файл на Рабочем столе с этими настройками:

  • Save as: All Files (сохранить как: все файлы)
  • Filename: ladder.cpp (имя файла: ladder.cpp)
После сохранения файла, всплывающее окно предупредит нас о необходимости настройки карты адресов ввода / вывода: нажимаем "OK", сохраняем наш LDmicro проект (menu File->save as) всегда на столе, назвав его как "ladder.ld".

Переходим к следующему шагу. Открыв файл ladder.cpp с помощью блокнота, выделите весь текст, скопировав, вставьте его на веб-сайт http://adam.horcica.cz/tools/ladder-gen. Нажав на кнопку “Generate” ("Создать"), мы получим новый код. Скопируйте этот код в новый файл блокнота и со следующими параметрами:

  • Save as: All Files (сохранить как: все файлы)
  • Filename: ladder.h (имя файла: ladder.h)

В этом упражнении мы выбрали следующую конфигурацию контактов:

pinMode (2, INPUT);
pinMode (3, INPUT);
pinMode (4, INPUT);
pinMode (5, INPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
pinMode (11, OUTPUT);
pinMode (12, OUTPUT);

Далее мы можем изменить "ladder.h" библиотеку с этой конфигурацией контактов, как показано в листинге 1:

/* This is autogenerated code. */
/* (generated Wed, 13 Nov 2013 14:06:53 +0100 by ladder-gen v 1.0) */
 
#ifndef LADDER_H
#define LADDER_H
 
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
 
#define BOOL boolean
#define SWORD int
 
#define EXTERN_EVERYTHING
#define NO_PROTOTYPES
 
void PlcCycle(void);
 
/* Configure digital I/O according to LD (call this in setup()). */
 
inline void PlcSetup()
{
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
 
/* Individual pins (this code is used in ladder.cpp) */
 
inline extern BOOL Read_U_b_XSEN_VENTO(void)
{
return digitalRead(2); // TODO
}
 
inline extern BOOL Read_U_b_XIN_CREP(void)
{
return digitalRead(5); //TODO
}
 
inline extern BOOL Read_U_b_XFINE_COR_A(void)
{
return digitalRead(3); //TODO
}
 
inline BOOL Read_U_b_YL_SVO(void)
{
return digitalRead(11); //TODO
}
 
inline void Write_U_b_YL_SVO(BOOL v)
{
digitalWrite(11, v); //TODO
}
 
inline BOOL Read_U_b_YAVVOLG(void)
{
return digitalRead(8); //TODO
}
 
inline void Write_U_b_YAVVOLG(BOOL v)
{
digitalWrite(8, v); //TODO
}
 
inline BOOL Read_U_b_YL_AVV(void)
{
return digitalRead(9); //TODO
}
 
inline void Write_U_b_YL_AVV(BOOL v)
{
digitalWrite(9, v); //TODO
}
 
inline extern BOOL Read_U_b_XFINE_COR_S(void)
{
return digitalRead(4); //TODO
}
 
inline BOOL Read_U_b_YSVOLG(void)
{
return digitalRead(10); //TODO
}
 
inline void Write_U_b_YSVOLG(BOOL v)
{
digitalWrite(10, v); //TODO
}
 
inline BOOL Read_U_b_YL_RIP(void)
{
return digitalRead(12);  //TODO
}
 
inline void Write_U_b_YL_RIP(BOOL v)
{
digitalWrite(12, v); //TODO
}
 
 
#endif

После того как вы изменили библиотеку как было показано, необходимо сохранить изменения, не меняя ни имени, ни расширение файла и сохраняя его всегда на "Рабочем столе".

Далее создадим файл "pinmap.ini" и объявим в нем имена наших переменных и соответствующих им разъемов. Этот шаг можно пропустить, но правильная работа программы в таком случае не гарантируется. Изменения в этом файле завязаны с нашим проектом и должны согласовываться с кодом в ladder.h (листинг 2).

; This file contains mapping between variable name in the LD and actual
; pin number of the Arduino.
 
; SEN_VENTO on pin 2
SEN_VENTO = 2
 
; FINE_COR_A on pin 3
FINE_COR_A = 3
 
; FINE_COR_S on pin 4
FINE_COR_S = 4
 
; IN_CREP on pin 5
IN_CREP = 5
 
; AVVOLG on pin 8
AVVOLG = 8
 
; L_AVV on pin 9
L_AVV = 9
 
; SVOLG on pin 10
SVOLG = 10
 
; L_SVO on pin 11
L_SVO = 11
 
; L_RIP on pin 12
L_RIP = 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>
void setup()
{
PlcSetup();
}
void loop()
{
PlcCycle();
delay(10);
}

Нажмите на кнопку “verification check” (верификация) для проверки нашего кода и подождите, пока скетч не будет скомпилирован. При возникновении ошибок компиляции – перепроверьте правильность выполнения предыдущих шагов. По окончанию компиляции, нажмите на ярлык для прошивки программы в Arduino. Подождите пока она загружается. Примите поздравления - вы сумели превратить ваш Arduino в контроллер, очень похожий на программируемый логический контроллер (ПЛК). Теперь вы можете оперировать системой, соблюдая логику, которую мы установили для входов и выходов.

Внимание: При создании нового проекта, прежде чем импортировать новую папку (чье имя должно всегда быть «ladder», она должна содержать файлы с теми же именами, как и было ранее), необходимо удалить из каталога папку предыдущего проекта. В случае, если вы хотите сохранить его, просто переименуйте его и сохраните в другом каталоге. Если вы захотите восстановить его, просто переименуйте папку обратно в " ladder " и верните ее обратно в каталог.

Способ 2.1: plcLIB

Загрузите модифицированную библиотеку plcLIB и распакуйте в папку в "C:\programmiX86\ Arduino\libraries" для Windows 7 или в "C:\Program Files\Arduino\libraries" для Windows XP.

В данном варианте, в отличии от первого метода, мы сможем воспользоваться некоторыми дополнительными функциями, такими как таймеры.

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

Table

 

Повторно используя булевые выражения, описанные выше, напишем наш код в Arduino IDE: рассмотрим их как реальные уравнения с учетом необходимой очередности выполнения операторов (в начале вычисления в скобках, далее остальные).

#include <plcLib.h>  
void setup()
{
setupPLC();
}
void loop()
{
inNot(X1);
orNotBit(X4);
andBit(X2);
andNotBit(Y4);
out(Y1);
 
in(Y1);
out(Y2);
 
in(X4);
andBit(X3);
andNotBit(Y2);
andBit(X1);
out(Y3);
 
in(Y3);
out(Y4);
 
inNot(Y2);
andNotBit(Y4);
out(Y5);
 
}

Отредактировав код, нажмите «Verify» и дождитесь окончания компиляции скетча. Перепроверьте корректность выполнения всех шагов в случае возникновения ошибок. После завершения сборки нажмите на кнопку “Upload” для загрузки кода в Arduino.
Подождите, пока загрузка не будет завершена. Вы превратили ваше Arduino в подобие ПЛК.

Предупреждение: эта библиотека была изменена и настроена, для использования с цифровыми входами / выходами Arduino UNO. Для нового проекта, вы должны изменить только код, заключенный в void loop () {…}, не изменяя предыдущую часть. Вы можете сохранить свой скетч, не меняя библиотеку: это проще и быстрее по времени по сравнению с вариантом в котором используем LDmicro.  Вы не можете использовать GUI (графический интерфейс) с лестничной логикой, но вы можете в полной мере использовать логику ПЛК, с существенной экономией времени, снижая риска ошибок компиляции или несовпадения кода без необходимости переключаться в другое программное обеспечение. На самом деле, хороший программист — это тот, кто способен создать хороший продукт, независимо от SDK или GUI он использует: главное, что логика алгоритма всегда та же самая.

Дополнительная информация: пожалуйста, обратите внимание, что расположение контактов из нашей библиотеки было изменено, для соответствия с платой ввода вывода (шилдом) Arduino UNO. Описанное выше работоспособно только в том случае, если вы использовали оригинальную библиотеку по ссылке ниже, так что все специальные функции были объявлены и описаны. Библиотека была адаптирована для платы (шилда) ввода/вывода, поэтому некоторые функции, которые вы можете обнаружить в коде по ссылке ниже могут работать некорректно в связи с проделанной адаптацией. Мы не гарантируем надлежащую работу всех функций, упомянутых electronics-micros. Тем не менее, нами проверено, что функция таймера работает отлично. Если вы хотите попробовать все другие функции, вы можете скачать оригинальную библиотеку и следуйте шаг за шагом инструкции указанного сайта.

Здесь приведен пример использования таймеров:

unsigned long TIMER0 = 0;
void setup() {
setupPLC();
}
void loop() {
in(X1);
timerOn(TIMER0, 2000);
out(Y1);
}

 Ссылки на подробную информацию и оригинальную библиотеку plcLIB без наших изменений:

- www.electronics-micros.com/software-hardware/plclib-arduino/

- www.electronics-micros.com/resources/arduino/plclib/plcLib.zip

На рисунке вы видите схему подключения датчиков и моторчика зонтика (220 однофазный двигатель с двухсторонним вращением).
ПРИМЕЧАНИЕ: схема предназначена для потенциально опасных напряжений, мы не несем никакой ответственности в случае аварии, травмы людей или порчи имущества в результате неправильного толкования электрической схемы с вашей стороны.
 Shema_arduino1

Метод 2.2: plcLIB вариант аналого-цифровой

Чтобы следовать этому примеру, пожалуйста, скачайте библиотеку .

В этом разделе мы немного отклонимся от мира электротехники и автоматики ПЛК и сделаем шаг в направлении электроники. Данная библиотека plcLIB была изменена, для соответствия нашему шилду ввода/вывода. Таким образом, мы имеем возможность использовать три цифровых входа, три выхода ШИМ, шесть входов и шесть аналоговых выходов.

Распакуйте скаченный файл PlcLIB.zip и скопируйте папку в каталог ".... \Arduino\libraries"

Внимание: если вы установили библиотеку, указанную в предыдущем варианте, необходимо вырезать и вставить ее в другой каталог, чтобы избежать конфликтов имен (сохраните ее, если хотите создать чисто цифровой проект). В случае, если вы хотите построить прототип, который объединяет как цифровые, так и аналоговые входы / PWM управления, используйте библиотеку, указанный в текущем пункте.
Таблица ниже указывает входа и выхода, в соответствии с нашим шилдом ввода/вывода.

Arduino_table2

Напоминаем, что на аналоговых входах, максимальный разрешенный ток равен 100mA, напряжение - 5V.

Arduino_shema2

 

Пример приложения: мы хотим затемнить светодиод (L1; AY1) в соответствии со значением с потенциометра (R1; Ax1) в режиме реального времени.

Решение на Arduino, приложено  в листинге ниже. Его будет проще понять после изучения предыдущего пункта.

#include <plcLib.h>
void setup()
{
setupPLC();
}
void loop()
{
inAnalog(AX1);
outPWM(AY1);
}

После проверки кода, вы можете загрузить его в  Arduino.

Автор: Christian Granvillano
Оригинал на английском: www.open-electronics.org/arduino-as-a-programmable-logic-controller-plc

 

Lamoda RU