Jump to content
FLProg.PRO

Делаем пользовательский блок из скетча (мастер-класс)


Dryundel
 Share

Recommended Posts

Этот пример взят из темы запроса создания ПБ "Сверхскоростной" счётчик.

Автор запроса дает ссылку на страницу со скетчем Оценка методов измерения низких частот на Arduino

 

Начну со ссылок уже существующих статей на эту тему.

Создание пользовательского блока из скетча(примера)

Создание пользовательского блока (Code-Basic) простым языком

Ссылки на сторонние материалы о Редакторах ПБ FLProg

 

Итак, что нам потребуется.

- Скетч пример

- Текстовый редактор Notepad++

- Базовый редактор ПБ (Справка здесь)

 

Открываем Notepad++, создаем новый файл и выбираем синтаксис C++.

После чего копипастим в него скетч-пример. Синтаксис прекрасно подсвечивается и читать код на много приятней.

 

Как правило из скетча надо вырезать взаимодействие с UART (Serial). Выводить в консоль мы можем и штатными средствами.

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

 

image.thumb.png.f0e31e55fe48b9acf7467b10645a471c.png

 

Но перед тем как удалять, смотрим что выводится в порт. А это две переменные ttime и f (с одним знаком после точки).

Вот их то и сделаем выходами нашего блока.

 

image.thumb.png.a3c4f16b80fd30644732987136289c78.png

 

image.thumb.png.908e0f31446ba45209e31ef7a19366a3.png

 

Открываем базовый редактор FLProg и создаем два соответствующих выхода.

 

image.png.6a4bd56653544234ee7c1bcf8a483941.png

 

После этого удаляем из скетча все что связано с Serial. Теперь вывод данных направлен на выходы блока.

Кроме этого удаляем еще и delay(500); Такие паузы в примерах служат для того, чтобы вывод в консоль происходила не каждый цикл, а 1 раз в 500 мс. В дальнейшем для этого создадим вход En.

 

1986908521_SerialDelete.thumb.jpg.bc945b193a25df6c209c04427ee4e890.jpg

 

Всё, скетч готов к вставке в пользовательский блок.

Находим базовые функции скетча setup() и loop(). Сразу после них есть фигурная скобка. Ставим курсор рядом с ней и нам подсвечивается ответная фигурная скобка. Все что между этими скобками (без самих скобок) переносим в соответствующие разделы редактора Basic.

 

image.thumb.png.941d2b0be02850f7d33595d99f9a67e6.png

 

image.png.10cf716427be2f04e74a7b3cc9e1eb65.png

 

 

После того, как закончили с setup() и loop(), смотрим другие функции скетча. В данном случае это periodInLong. После нее тоже есть фигурная скобка. Тело функции определяется так же как и в setup() и loop(), по фигурным скобкам. 

В секции FunctionSection добавляем нашу функцию. Обязательно с ее типом и параметрами. 

 

image.thumb.png.8af2698f374619c003d37343bda0c575.png

 

Следующим шагом, разбираемся с остатками того, что еще не перенесено в блок. Это декларирование переменных и директивы в самом начале скетча. Переменные просто копируем в DeclareSection

 

image.thumb.png.ab03e8041be6160504ab8ef25ecb7013.png

 

image.png.914dbda0e27e32c0475819353e2535a6.png

 

 

Все что осталось, это создать пользовательские параметры для задания входных и выходных пинов. В скетче они заданы 12 и 8. 

Идем на вкладку "Пакраметры пользователя". Создаем два параметра Out (выход) и In (вход), а в коде заменяем 12 и 8 на Out и In соответственно.

Далее смотрим директивы define#. Их синтаксис очень прост. Все что будет найдено в первой части дефайна, заменится в скетче на вторую часть этого же дефайна. Поэтому в блоке они нам не нужны. Вместо них параметры пользователя.

 

image.thumb.png.c0b453b461331c6d26d70de2e5150571.png

 

А инициализация пинов всегда в setup(). Там и вставляем наши параметры.

 

image.png.46ca99c6a6d31835fc865ee40e7a04d2.png

 

Не забываем прописать блоку Имя и Лейбл, сохраняем и можно пользоваться.

 

image.png.3d8227871d7766e04e3e25690f4f4ced.png

 

Проверяем на компиляцию и получаем ошибку. В создании блоков не без этого. :classic_smile:

 

image.thumb.png.488896fa5a8ce71e7e8387225521d9f8.png

 

 

Ничего страшного в этом нет. Внимательно читаем то, что написано. "Конфликт декларирования переменной ttime".

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

 

image.png.fbc1160a690b31c06afc0f6871c078ea.png

 

Просто удаляем декларирование ttime из DeclareSection

Вот теперь компиляция проходит успешно и блок готов.

 

image.png.c86d7ed39bf75366a963071c9ea8ac4f.png

Тестовый_блок_(Code_-_Basic).ubi

 

 

Единственное, за что я не могу ручаться, так это за реальную работоспособность кода. Это на совести автора статьи.

 

.

 

 

 

  • Haha 5
Link to comment
Share on other sites

Да, совсем забыл про обещанный вход En.

 

Открываем созданный блок для редактирования добавляем сам boolean вход En, и переходим в LoopSection.

В самом начале кода пишем:

if (En) {

 

А в самом конце, ставим закрывающую фигурную скобку.

}

 

Теперь при подаче на вход En true, код блока будет выполняться, а при false просто пропустится. 

 

844426384_2.jpg.56b06a26322a3ccde3feda1e31879d9f.jpg

Тестовый_блок_2_(Code_-_Basic).ubi

 

 

.

 

  • Thanks 3
  • Haha 6
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...