Обзор FLProg (Часть 1)

04.01.2017 16:07

genaonyx



Введение

Приветствую всех посетителей нашего портала, сегодня у нас обзор бесплатной программы под названием FLProg. Узнал я о ней из письма одного из наших посетителей, который попросил уделить ей внимание и по возможности поучаствовать в ее развитии. Собственно сегодня я ее скачаю и попробую написать пару демонстрационных схем, попутно комментируя и выделяя как плюсы программы, так и её минусы. Сразу оговорюсь, что я успел прочесть пару статей о данной программе и немного просмотреть ее официальный сайт, но саму программу я скачиваю впервые. Так же я поверхностно знаком c FBD и LAD, делали большой проект автоматизации завода лет шесть назад, правда программировали контроллеры на STL и SCL, но для общего развития и, понимая, я читал так же и об других, таких как FBD, LAD, GRAPH 7.

Теперь немного поговорим о самой программе. FLProg - это альтернативная среда разработки, эдакая обертка над Arduino IDE позволяющая программировать и задавать логику микроконтроллеру на двух дополнительных языках: FBD и LAD. Оба этих языка стали популярными благодаря старшим братьям микроконтроллеров - промышленным контроллерам от фирмы Siemens, гиганта в мире промышленных контролёров, заслуженно занимающий одно из лидирующих мест. Собственно автор программы частенько на это ссылается, будь то скриншоты контроллеров взятых с официального сайта Сименса или иконками, взятыми из программы Step7.

Немного информации из википедии (Хотя бы бегло прочтите, лишним не будет).

  • FBD – Графический язык программирования
  • LAD - Язык релейной (лестничной) логики.

На этом со вступлением мы закончим и перейдем к скачиванию и установке программы.


Скачивание и Установка

И так, переходим на официальную страницу скачивания программы. И видим мы тут первый ее плюс. Программа кроссплатформенная. Здесь есть несколько вариантов ОС, это Linux и Wondows. К сожалению дистрибутива, для Mac OS - нет, но мне она и не нужна (Минус не ставлю, но некоторым это не понравиться). Скачаем мы с вами портативную версию под Windows (Второй плюс, наличие портативной версии, порой удобней таскать все с собой, ну например на флэшке). Переходим по нескольким страницам, после чего попадаем в Яндекс.Диск и наконец скачиваем программу (Первый минус, в место прямых ссылок игра в прятки, дизайн сайта и вложенность запутывает). И так, после того как мы скачали последнюю версию (FLProg 2.2) и распаковали ее куда нам надо, приступим к ее изучению.


Первый запуск

После запуска нас приветствует главное окно программы с минимальным интерфейсом.

FLProg - Главное окно

В главном окне мы видим стандартное меню, и несколько кнопок (Открыть, закрыть, сохранить проект и тд).

Создадим свой первый проект. И по традиции ардуинщиков это будет стандартный Blink (моргание 13-м светодиодом).

Нажимаем кнопку "Создать новый проект" и в открывшемся окне выбираем FBD и Arduino UNO.

FLProg - Новый проект

 Проект создан, можно приступать.


Пример "Blink" на FBD

FLProg - FBD

Что мы тут видим. Окно поделенное на несколько оконных блоков. Предназначение левого мне неизвестно, но вот два центральных и правое выглядят знакомо.

  • Центральное верхнее - настройка портов и создание дополнительных переменных.
  • Центральный нижний  - само рабочее поле, где мы будем размещать наши блоки.
  • Правый - Список готовых блоков.

Первым делом мы настроим наши порты, а точнее только порт под номером 13 на котором распаян светодиод на плате Arduino UNO.

Кликаем в верхнем центральном блоке по надписи "Выходы" - "Добавить выход". В открывшемся окне выбираем "Тип" - Цифровой, "Номер контакта" - 13, "Имя" - любой текст (в примере - pin13). Все остальные поля игнорируем.

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

Вот  что в итоге у нас получилось.

FLProg - Добавление порта

Ищем в списке готовых блоков нечто похожее на таймеры или хотя бы delay. Таких "таймеров" оказалось два, и оба являются эдакими обертками с дополнительным функционалом. 

Блок "Timer" в разделе "Таймеры" - который как мы понимаем из названия и должен быть таймером, на самом деле оказалось реле задержки включения/выключения, использующее для своей работы таймер но не как не являющееся им. За это однозначно минус, наименования не соответствует работе блока.

Последний блок "Generator" в разделе "Таймеры" уже боле менее понятен и как раз впишется в наш пример. Предназначение блока создавать импульсы с заданной длительностью и паузой. Этот блок и будет включать и выключать наш светодиод.

Перетаскиваем блок в рабочее поле и соединяем его выход "Q" с блоком порта "pin13".

FLProg - Блок Generator

Теперь нам надо зайти в настройки блока генератора. И в настройках выбрать:

Тип генератора: Симметричный мультивибратор. (Вам не кажется, что подобные названия заставляют задуматься и как минимум прочитать мануалы?).

Длина импульса: Константа - Миллисекунды - 1000.

И тут мы видим, что блок поменял свое наименование с G-S на GS-M. То есть авторы решили не делать кучу блоков, а по возможности объединить их, и изменив тип блока мы по сути получили совсем другой блок работающий иначе чем первоначальный. Это еще один минус. Надо читать мануалы и настраивать блоки (Хорошо, что у программы мануалы есть и довольно таки неплохие, за это плюс). Я понимаю, что авторы решили упростить и не плодить кучу блоков, но это затруднило, например их поиск, и заставляет читать мануалы, настраивать, и тестировать так ли блок работает, как я его настроил.

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

Кликаем правой кнопкой мыши на входе "EN" блока G-SM и выбираем пункт "Вставить константану". В открывшемся окне выбираем "True" и жмем "Готово".

FLPog - FBD Blink

Все, на этом наш пример 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. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.