Опубликовано: 04.01.2017 16:07
Автор: genaonyx
Приветствую всех посетителей нашего портала, сегодня у нас обзор бесплатной программы под названием FLProg. Узнал я о ней из письма одного из наших посетителей, который попросил уделить ей внимание и по возможности поучаствовать в ее развитии. Собственно сегодня я ее скачаю и попробую написать пару демонстрационных схем, попутно комментируя и выделяя как плюсы программы, так и её минусы. Сразу оговорюсь, что я успел прочесть пару статей о данной программе и немного просмотреть ее официальный сайт, но саму программу я скачиваю впервые. Так же я поверхностно знаком c FBD и LAD, делали большой проект автоматизации завода лет шесть назад, правда программировали контроллеры на STL и SCL, но для общего развития и, понимая, я читал так же и об других, таких как FBD, LAD, GRAPH 7.
Теперь немного поговорим о самой программе. FLProg - это альтернативная среда разработки, эдакая обертка над Arduino IDE позволяющая программировать и задавать логику микроконтроллеру на двух дополнительных языках: FBD и LAD. Оба этих языка стали популярными благодаря старшим братьям микроконтроллеров - промышленным контроллерам от фирмы Siemens, гиганта в мире промышленных контролёров, заслуженно занимающий одно из лидирующих мест. Собственно автор программы частенько на это ссылается, будь то скриншоты контроллеров взятых с официального сайта Сименса или иконками, взятыми из программы Step7.
Немного информации из википедии (Хотя бы бегло прочтите, лишним не будет).
На этом со вступлением мы закончим и перейдем к скачиванию и установке программы.
И так, переходим на официальную страницу скачивания программы. И видим мы тут первый ее плюс. Программа кроссплатформенная. Здесь есть несколько вариантов ОС, это Linux и Wondows. К сожалению дистрибутива, для Mac OS - нет, но мне она и не нужна (Минус не ставлю, но некоторым это не понравиться). Скачаем мы с вами портативную версию под Windows (Второй плюс, наличие портативной версии, порой удобней таскать все с собой, ну например на флэшке). Переходим по нескольким страницам, после чего попадаем в Яндекс.Диск и наконец скачиваем программу (Первый минус, в место прямых ссылок игра в прятки, дизайн сайта и вложенность запутывает). И так, после того как мы скачали последнюю версию (FLProg 2.2) и распаковали ее куда нам надо, приступим к ее изучению.
После запуска нас приветствует главное окно программы с минимальным интерфейсом.
В главном окне мы видим стандартное меню, и несколько кнопок (Открыть, закрыть, сохранить проект и тд).
Создадим свой первый проект. И по традиции ардуинщиков это будет стандартный Blink (моргание 13-м светодиодом).
Нажимаем кнопку "Создать новый проект" и в открывшемся окне выбираем FBD и Arduino UNO.
Проект создан, можно приступать.
Что мы тут видим. Окно поделенное на несколько оконных блоков. Предназначение левого мне неизвестно, но вот два центральных и правое выглядят знакомо.
Первым делом мы настроим наши порты, а точнее только порт под номером 13 на котором распаян светодиод на плате Arduino UNO.
Кликаем в верхнем центральном блоке по надписи "Выходы" - "Добавить выход". В открывшемся окне выбираем "Тип" - Цифровой, "Номер контакта" - 13, "Имя" - любой текст (в примере - pin13). Все остальные поля игнорируем.
После того как мы нажмем на кнопку "Готово" и окно закроется, в списке появиться выход с наименованием "pin13". Перетаскиваем надпись на рабочее поле.
Вот что в итоге у нас получилось.
Ищем в списке готовых блоков нечто похожее на таймеры или хотя бы delay. Таких "таймеров" оказалось два, и оба являются эдакими обертками с дополнительным функционалом.
Блок "Timer" в разделе "Таймеры" - который как мы понимаем из названия и должен быть таймером, на самом деле оказалось реле задержки включения/выключения, использующее для своей работы таймер но не как не являющееся им. За это однозначно минус, наименования не соответствует работе блока.
Последний блок "Generator" в разделе "Таймеры" уже боле менее понятен и как раз впишется в наш пример. Предназначение блока создавать импульсы с заданной длительностью и паузой. Этот блок и будет включать и выключать наш светодиод.
Перетаскиваем блок в рабочее поле и соединяем его выход "Q" с блоком порта "pin13".
Теперь нам надо зайти в настройки блока генератора. И в настройках выбрать:
Тип генератора: Симметричный мультивибратор. (Вам не кажется, что подобные названия заставляют задуматься и как минимум прочитать мануалы?).
Длина импульса: Константа - Миллисекунды - 1000.
И тут мы видим, что блок поменял свое наименование с G-S на GS-M. То есть авторы решили не делать кучу блоков, а по возможности объединить их, и изменив тип блока мы по сути получили совсем другой блок работающий иначе чем первоначальный. Это еще один минус. Надо читать мануалы и настраивать блоки (Хорошо, что у программы мануалы есть и довольно таки неплохие, за это плюс). Я понимаю, что авторы решили упростить и не плодить кучу блоков, но это затруднило, например их поиск, и заставляет читать мануалы, настраивать, и тестировать так ли блок работает, как я его настроил.
После того как мы настроили блок, осталось лишь подать на вход блока генератора единицу, чтобы он работал сразу и всегда.
Кликаем правой кнопкой мыши на входе "EN" блока G-SM и выбираем пункт "Вставить константану". В открывшемся окне выбираем "True" и жмем "Готово".
Все, на этом наш пример Blink закончен, осталось лиши загрузить все в Arduino нажав на кнопку "Компилировать проект". После чего откроется Arduino IDE (Почему-то старая версия 1.6.3) в которой мы увидим созданный FLProg скетч. Грузим скетч в Ардуинку и проверяем.
Ну и давайте теперь посмотрим, какой Си код у нас в итоге получился.
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
if (1) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
if (_gen1I) { if ( _isTimer ( _gen1P , 1000 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
digitalWrite(13, _gen1O);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
На первый взгляд у нас тут какая-то не отформатированная каша, но это только на первый взгляд.
На самом деле программа не обязана делать отформатированный Си код, ведь основная из ее задач - дать не программистам и людям, не знающим Си, программировать Ардуино, и форматирование тут не важно. Но если бы генерируемый код был бы отформатирован, я бы однозначно поставил плюс.
Теперь давайте отформатируем его вручную и разберемся что там к чему.
// Объявление переменных для работы генератора.
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
void setup()
{
// Настройка 13-го порта как выход.
pinMode(13, OUTPUT);
}
void loop()
{
// Первая строка. Инициализация таймера и его включение/выключение.
// Если генератор включен (Напоминаю мы вставили константу чтобы он работал всегда, но это может быть например и порт и некая переменная).
if (1)
{
// Если генератор не был инициализирован, то включаем его и выставляем переменные.
if (!_gen1I)
{
_gen1I = 1;
_gen1O = 1;
_gen1P = millis();
}
}
else
{
// Выключение генератора
_gen1I = 0;
_gen1O = 0;
}
// Вторая строка. Логика самого генератора. Переключения и запоминание переменных.
// Если генератор включен.
if (_gen1I)
{
// Проверка на необходимость переключения генератора в асинхронном режиме.
if (_isTimer(_gen1P, 1000))
{
_gen1P = millis();
_gen1O = !_gen1O;
}
}
// Третья строка. Работа с портом.
digitalWrite(13, _gen1O);
}
// Дополнительная функция, реализующая таймер.
bool _isTimer(unsigned long startTime, unsigned long period )
{
// Получение текущего времени.
unsigned long currentTime;
currentTime = millis();
// Проверка, наступило ли время переключения.
// Функция так же содержит проверку на переполнение переменной, таким образом таймер может работать непрерывно и долго.
if (currentTime >= startTime)
{
return (currentTime >= (startTime + period));
}
else
{
return (currentTime >= (4294967295 - startTime + period));
}
}
Как вы видите из отформатированного кода выше (с моими комментариями), код получился в целом хороший. Лишнего мало. Таймер асинхронный. Проверка на переполнение переменной. Ну и собственно все работает.
Конечно, написав на Си мы могли бы сделать код и по проще и по быстрее, но это не главное, главное то, что мы сделали все это просто перетащив пару блоков и задав несколько настроек. А это значит, что программа справляется со своею задачей, дать не программистам, возможность программировать и задавать логику микроконтроллерам.
На этом обзор программы FLProg закончен, но я обязательно продолжу его через неделю, ведь мы попробовали отнюдь не все ее возможности и языки.
Но уже сейчас я могу сделать выводы, что программа достойна внимания, ее стоит скачать и посмотреть. Ну а окончательные выводы мы сделаем в следующей статье.
С наилучшими пожеланиями и с прошедшим вас новым годом.
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.