Домашние вкусняшки на Raspberry PI. Халявная веб-морда робота.
В предыдущем посте я писал про Raspberri PI как про перспективное средство домашней автоматизации и только вскользь упомянул про возможность создания связки softLogic+веб (под softLogic понимать программирование малины на языках MЭК). А теперь хочу раскрыть эту тему гораздо более развёрнуто и показать как построить небольшую системку управления роботом через веб и подавать ему команды вправо/влево/прямо/назад из браузера десктопа, планшета или мобильника.
Кто не читал предыдущий пост, тот может и не знать, что эту задачу можно порешать двумя путями - CodeSys-ом или Isagraf-ом. Так как на codesys халява действует только 2 часа, да и сам я являюсь адептом второго варианта, то на нём и заостряю свой мысленный взор.
Как начать и что скачать показано здесь, включая то, как потренироваться на демо-проекте. Да, загружать всё это надо конечно не в малину, а на комп разработки под windows, а уже среда разработки сама загрузит исполняемый код на ПЛК (так далее будем называть raspberry pi3).
Итак, пошагово:
1. В среде разработки ISaGRAF Workbench создаём новый проект (Файл->Новый):
По умолчанию Isagraf предлагает создать программу на языке FBD и неспроста - большинство предпочитает именно FBD. FBD это схема, похожая на электрическую схему на микросхемах, видимо это и привлекает мириады радиолюбителей. Но даже если вы хорошо читаете такие схемы, реализовать робота на FBD не получится так красиво, как на SFC. Поэтому всё-таки SFC.
3. Теперь щёлкаем по main и открываем окно SFC-редактора:
Что такое, скажете вы. У вас в окне появился только один квадратик и больше ничего! А здесь много квадратиков крестиков. Всё верно, просто я выложил скрин уже готовой программы, благо она невелика.
Квадратики - это шаги. Крестики - переходы из текущего шага в следующий, нижний шаг. Самый верхний шаг обведён двойной рамкой, это т.н. шаг инициализации, в нём оказывается программа при запуске. После каждого шага обязательно следует переход, таковы правила стандарта.
Но где же здесь логика управления роботом? А логику надо вбить в шаги и переходы методом двойного клика по ним. При этом справа выскакивает текстовый редактор:
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. Попробуйте проверить программу, нажав на красную галочку "Проверка программы". Должен отработать генератор кода и выдать подобное сообщение:
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 - булевские переменные, каждая из которых отвечает за свой дискретный выход, управляющий соответствующим моторчиком, рулём или чем-то там ещё);
Открываем словарь и вводим макроопределения:
Затем переменную-команду:
И, наконец, выходы (эти переменные надо создавать с атрибутом 'выход'):
Обратите внимание, что переменные do_* должны быть глобальными (т.е. видными из всех программ, если бы их было несколько), иначе Isagraf не позволит привязать их к выходам GPIO.
Если теперь сделать проверку программы, то хоть все переменные созданы, но Isagraf сообщит о том, что переменные do_* объявлены как выходы, но к физическому выходу не привязаны.
Есть в isagraf-е такое понятие - плата ввода-вывода. Щёлкнем по пиктограмме "Соединения ввода/вывода" в окне программ. У вас окошко будем пустым, а я уже забил туда 2 платы:
А вот плата gpio_do это самая что ни на есть настоящая плата:
На неё и приходят наши выходные сигналы.
По завершению ввода плат и привязки сигналов нужно проверить программу и избавиться от возможных ошибок.
4. Теперь откроем окно опций компилятора (окно "Программы"->Создать->"Опции компилятора") :
Вот так оно должно выглядеть.
А теперь опции выполнения (окно "Программы"->Создать->"Опции выполнения приложения"):
Здесь вводим время цикла программы в мС.
А теперь пробуем не проверить, а создать приложение (окно "Программы"->Создать->"Создать приложение").
Ошибок быть не должно.
5. Прежде чем грузить приложение в контроллер, его можно погонять на симуляторе (я нарочно поставил галочку напротив симулятора в опциях проекта п.4). Запустив симулятор и расположив окна наглядным образом можно погонять робота туда-сюда и буквально увидеть как работает программа:
Гонять робота можно открыв словарь и записывая значение переменной cmd двойным кликом по ней. Другого способа пока нет, т.к. web-морду мы пока ещё не прикрутили. Но всё равно интересно!
Продолжение следует. В следующем посте нарисуем веб-интерфейс, сконпонуем его с isagraf-проектом и зальём в малину.