6

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота.

В предыдущем посте я писал про Raspberri PI как про перспективное средство домашней автоматизации и только вскользь упомянул про возможность создания связки softLogic+веб (под softLogic понимать программирование малины на языках MЭК). А теперь хочу раскрыть эту тему гораздо более развёрнуто и показать как построить небольшую системку управления роботом через веб и подавать ему команды вправо/влево/прямо/назад из браузера десктопа, планшета или мобильника.

Кто не читал предыдущий пост, тот может и не знать, что эту задачу можно порешать двумя путями - CodeSys-ом или Isagraf-ом. Так как на codesys халява действует только 2 часа, да и сам я являюсь адептом второго варианта, то на нём и заостряю свой мысленный взор.

Как начать и что скачать показано здесь, включая то, как потренироваться на демо-проекте. Да, загружать всё это надо конечно не в малину, а на комп разработки под windows,  а уже среда разработки сама загрузит исполняемый код на ПЛК (так далее будем называть raspberry pi3).

Итак, пошагово:

1. В среде разработки ISaGRAF Workbench создаём новый проект  (Файл->Новый):

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост
2. В проекте robot создаём программу, скажем, main на языке SFC (Файл->Новый):
Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

По умолчанию Isagraf предлагает создать программу на языке FBD и неспроста - большинство предпочитает именно FBD. FBD это схема, похожая на электрическую схему на микросхемах, видимо это и привлекает мириады радиолюбителей. Но даже если вы хорошо читаете такие схемы, реализовать робота на FBD не получится так красиво, как на SFC. Поэтому всё-таки SFC.

3. Теперь щёлкаем по main и открываем окно SFC-редактора:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Что такое, скажете вы. У вас в окне появился только один квадратик и больше ничего! А здесь много квадратиков крестиков. Всё верно, просто я выложил скрин уже готовой программы, благо она невелика.

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

Но где же здесь логика управления роботом? А логику надо вбить в шаги и переходы методом двойного клика по ним. При этом справа выскакивает текстовый редактор:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

3.1 Вы видите текст

ACTION (P) :

do_left:=false;

do_right:=false;

do_up:=false;

do_down:=false;

END_ACTION;


который следует ввести в первый шаг (пока не надо, потом). Шаг это код на языке ST, похожем на Паскаль. Тут видно, что переменным do_* присваиваются логические нули (если не знакомы с двоичными/булевскими переменными, то лог.ноль это false (ложь), а лог. единица это true (истина)). А что такое ACTION() легко ищется в мануале изаграфа. Если коротко, действия шагов могут быть импульсными ( читай однократными, внутри ACTION (P) как у нас) или 'несохранёнными' (ACTION(N)). Я не знаю почему их назвали несохранёнными, но суть в том, что код внутри ACTION(N) будет молотить постоянно, пока шаг активен. Вернее даже не постоянно, а с частотой цикла исполнения программы. Т.е. если цикл нашей программы 10 мС, а шаг продержался активным 1 сек, то ACTION(N) успеет отработать 100 раз.

Но как удерживать шаг в активном состоянии? Для этого служит переход под шагом. Если переход заперт, шаг продолжает выполняться. Если переход открыт, то активность получает следующий шаг и т.д.

Теперь про переходы. Если переход пуст, т.е. в нём не прописано никаких условий, то он всегда открыт. В противном случае анализируется условие, прописанное в переходе и по нему уже выясняется - открыт или заперт.

3.2 Набейте скелет программы, чтобы он выглядел так, как на предпоследнем скрине. Просто введите пустые шаги и переходы. Если программу оставить в таком виде, то она тоже будет работать, в каждом цикле переходя на следующий шаг и так по кругу, ведь все переходы по умолчанию разрешены. Там, где переходы расходятся параллельно, программа пойдёт по первому (левому) пути, т.е. будут поочерёдно исполняться шаги 1 и 2. Попробуйте проверить программу, нажав на красную галочку "Проверка программы". Должен отработать генератор кода и выдать подобное сообщение:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

3.3 Теперь наберите следующее содержимое шагов и переходов:

Шаг 1:

ACTION (P) :

do_left:=false;

do_right:=false;

do_up:=false;

do_down:=false;

END_ACTION;


Переход 1:

cmd=CMD_LEFT

Переход 2:

cmd=CMD_RIGHT

Переход 3:

cmd=CMD_UP

Переход 4:

cmd=CMD_DOWN


Шаг 2:

ACTION (P) :

do_left:=true;

END_ACTION;

Шаг 3:

ACTION (P) :

do_right:=true;

END_ACTION;

Шаг 4:

ACTION (P) :

do_up:=true;

END_ACTION;

Шаг 5:

ACTION (P) :

do_down:=true;

END_ACTION;


Переход 5:

cmd<>CMD_LEFT

Переход 6:

cmd<>CMD_RIGHT

Переход 7:

cmd<>CMD_UP

Переход 8:

cmd<>CMD_DOWN

3.4 Если теперь проверить программу, то генератор выплюнет кучу ошибок. Это от того, что переменные cmd, do_left, do_right и др. не были созданы заранее. Это в php и js переменные создаются автоматом, а тут их надо явно прописать в словаре. Переменные следующие:

- cmd - переменная, в которую через веб-сервис прилетает код команды от 1 до 4. Чтобы не оперировать не этими числами, а более читаемыми наименованиями, я завёл 4 макроопределения: CMD_LEFT, CMD_RIGHT, CMD_UP, CMD_DOWN и присвоил им значения от 1 до 4 (аналог #define в С);

- do_left ... do_down - булевские переменные, каждая из которых отвечает за свой дискретный выход, управляющий соответствующим моторчиком, рулём или чем-то там ещё);


Открываем словарь и вводим макроопределения:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Затем переменную-команду:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

И, наконец, выходы (эти переменные надо создавать с атрибутом 'выход'):

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Обратите внимание, что переменные do_* должны быть глобальными (т.е. видными из всех программ, если бы их было несколько), иначе Isagraf не позволит привязать их к выходам GPIO.

Если теперь сделать проверку программы, то хоть все переменные созданы, но Isagraf сообщит о том, что переменные do_* объявлены как выходы, но к физическому выходу не привязаны.

Есть в isagraf-е такое понятие - плата ввода-вывода. Щёлкнем по пиктограмме "Соединения ввода/вывода" в окне программ. У вас окошко будем пустым, а я уже забил туда 2 платы:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост
Верхняя gpioconf это даже не плата как таковая, а средство для настройки GPIO, т.к. это ужасно универсальный разъём и входы-выходы можно компоновать как угодно. На последней картинке видно, что параметр mode0_7 (настройка для первых 8-ми ножек GPIO) содержит 4 символа 'O' в начале. Это означает, что первые четыре ноги GPIO сконфигурятся как дискретные выходы. Что означают другие символы, можно посмотреть двойным кликом по плате и затем нажав кнопку Замечание.

А вот плата gpio_do это самая что ни на есть настоящая плата:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

На неё и приходят наши выходные сигналы.

По завершению ввода плат и привязки сигналов нужно проверить программу и избавиться от возможных ошибок.


4. Теперь откроем окно опций компилятора (окно "Программы"->Создать->"Опции компилятора") :

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Вот так оно должно выглядеть.

А теперь опции выполнения (окно "Программы"->Создать->"Опции выполнения приложения"):

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Здесь вводим время цикла программы в мС.

А теперь пробуем не проверить, а создать приложение (окно "Программы"->Создать->"Создать приложение").

Ошибок быть не должно.

5. Прежде чем грузить приложение в контроллер, его можно погонять на симуляторе (я нарочно поставил галочку напротив симулятора в опциях проекта п.4). Запустив симулятор и расположив окна наглядным образом можно погонять робота туда-сюда и буквально увидеть как работает программа:

Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота. Raspberry pi, Программирование, Веб-разработка, Длиннопост

Гонять робота можно открыв словарь и записывая значение переменной cmd двойным кликом по ней. Другого способа пока нет, т.к. web-морду мы пока ещё не прикрутили. Но всё равно интересно!


Продолжение следует. В следующем посте нарисуем веб-интерфейс, сконпонуем его с isagraf-проектом и зальём в малину.