Содержание
Редактор пользовательских блоковРедактор Professional
Основные настройки
Код
Ветка «Элемент кода»
Ветка «Элемент кода»
Данная ветка служит для непосредственного создания элемента кода блока.
Так же этой ветке задаются имя элемента кода и при необходимости условие его вставки в код проекта.
Для выбора условия вставки доступны три варианта.
Для выбора условия вставки доступны три варианта.
В случае выбора варианта «Нет условия» код, безусловно, вставляется в скетч при необходимости.
В остальных двух случаях необходимо выбрать условие вставки кода в скетчь.
Это делается с помощью кнопки «Выбрать условие»(2). При этом открывается окно со списком условий доступных для данного элемента кода.
В остальных двух случаях необходимо выбрать условие вставки кода в скетчь.
Это делается с помощью кнопки «Выбрать условие»(2). При этом открывается окно со списком условий доступных для данного элемента кода.
При выбранном условии с помощью кнопки «Перейти на условие»(1), можно напрямую перейти на ветку настройки выбранного условия.
При выборе варианта «Условие истинно» код будет вставляться в скетчь, только если логическое выражение условия возвращает True. Соответственно если выбран вариант «Условие ложно» код будет вставляться в скетчь, только если логическое выражение условия возвращает False.
Тоолбар редактора кода зависит от расположения данного элемента кода.
Рассмотрим возможные варианты.
При выборе варианта «Условие истинно» код будет вставляться в скетчь, только если логическое выражение условия возвращает True. Соответственно если выбран вариант «Условие ложно» код будет вставляться в скетчь, только если логическое выражение условия возвращает False.
Тоолбар редактора кода зависит от расположения данного элемента кода.
Рассмотрим возможные варианты.
Общий код мультиблока, общий код группы блоков, общий код блока - секция Declare.
При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(1), «Вставить тэг параметра»(2) и чек бокс «Запретить компилятору видеть #Include»(3).
При нажатии на кнопку «Вставить UUID»(1) открывается окно выбора идентификатора.
При нажатии на кнопку «Вставить UUID»(1) открывается окно выбора идентификатора.
«Уникальное число» - при каждом выборе данного идентификатора, будет генерироваться уникальное число, и вставляться
в код в место расположения курсора.
«Идентификатор мультиблока» - при выборе этого идентификатора в код вставляется тэг. При компиляции проекта вместо него вставится ID мультиблока,
который будет одинаков во всём коде, входящем в данный мультиблок.
При нажатии на кнопку «Вставить тэг параметра»(2) открывается окно выбора тэга.
«Идентификатор мультиблока» - при выборе этого идентификатора в код вставляется тэг
При нажатии на кнопку «Вставить тэг параметра»(2) открывается окно выбора тэга.
После выбора тэга от вставляется в позицию курсора в редакторе.
Чек бокс «Запретить компилятору видеть #Include»(3) присутствует в тулбаре редактора элемента кода только при расположении этого элемента в секции Declare.
Он предназначен для управления компилятором проекта. Если его не отметить то компилятор соберёт все строки #Include из секций Declare всех экземпляров блоков и вставит их в код скетча в том месте, которое посчитает нужным,
подчиняясь своей логикой. Установка данного чек бокса сообщает компилятору, что в данном элементе кода нельзя трогать строку #Include и необходимо вставить её в скетчь в том месте, где её прописал разработчик блока.
В некоторых случаях это необходимо. Например, где включение одной библиотеки должно производиться только после включения другой, от которой первая зависит.
Но в этом случае возможно дублирование подключение библиотек. Это не страшно конечно, но как говорится – «не кошерно».
Общий код мультиблока, общий код группы блоков, общий код блока – остальные секции.
Общий код мультиблока, общий код группы блоков, общий код блока – остальные секции.
При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(1), «Вставить тэг параметра»(2) и «Вставить тэг временной переменной»(3).
Работу кнопок «Вставить UUID»(1) и «Вставить тэг параметра»(2) мы рассмотрели выше.
При нажатии кнопки «Вставить тэг временной переменной»(3) открывается окно выбора типа временной переменной.
Работу кнопок «Вставить UUID»(1) и «Вставить тэг параметра»(2) мы рассмотрели выше.
При нажатии кнопки «Вставить тэг временной переменной»(3) открывается окно выбора типа временной переменной.
После выбора тега, он вставляется в редактор в месторасположение курсора.
Теперь рассмотрим что такое временная переменная. Это такая переменная, которая может использоваться блоком для промежуточных расчётов. При компиляции проекта компилятор спрашивает у всех блоков (как стандартных, так и пользовательских) временная переменная какого типа им нужна. После этого при необходимости он создаёт по ОДНОЙ переменной каждого запрошенного типа. Вот как раз имя этой переменной и вставится в скетчь при компиляции вместо этого тэга.
Обратите внимание, что работа с этой переменной должна начаться (запись в неё) и закончится в пределах одного участка кода. Поскольку блок, компилируемый после данного блока, может записать в эту переменную другие значения.
Теперь рассмотрим что такое временная переменная. Это такая переменная, которая может использоваться блоком для промежуточных расчётов. При компиляции проекта компилятор спрашивает у всех блоков (как стандартных, так и пользовательских) временная переменная какого типа им нужна. После этого при необходимости он создаёт по ОДНОЙ переменной каждого запрошенного типа. Вот как раз имя этой переменной и вставится в скетчь при компиляции вместо этого тэга.
Обратите внимание, что работа с этой переменной должна начаться (запись в неё) и закончится в пределах одного участка кода. Поскольку блок, компилируемый после данного блока, может записать в эту переменную другие значения.
Пример использования временной переменной.
Блок вывода на экран значения из переменной.
Данный блок в зависимости от типа выбранной переменной преобразует значение этой переменной в String и потом выводит ее на экран. В этом блоке в секции Loop кода каждого инстанса в месте вставки блока созданы 4 элемента кода.
Первые три – условные и вставляются в код в зависимости от типа выбранной переменной.
В этих элементах кода во временную переменную типа String записывается сконвертированное значение выбранной переменной.
Данный блок в зависимости от типа выбранной переменной преобразует значение этой переменной в String и потом выводит ее на экран. В этом блоке в секции Loop кода каждого инстанса в месте вставки блока созданы 4 элемента кода.
Первые три – условные и вставляются в код в зависимости от типа выбранной переменной.
В этих элементах кода во временную переменную типа String записывается сконвертированное значение выбранной переменной.
В четвёртом элементе кода мы значение данной временной переменной выводим на экран. Данный элемент безусловный.
В результате компиляции при выбранной переменной типа Boolean получим такой код.
if (_gtv1)
{
_tempVariable_String = "Нет";
}
else {
_tempVariable_String = "Да"; }
if ((0))
{
myOLED.print(_tempVariable_String, 0, 0);
}
if (_gtv1)
{
_tempVariable_String = "Нет";
}
else {
_tempVariable_String = "Да"; }
if ((0))
{
myOLED.print(_tempVariable_String, 0, 0);
}
Код каждого экземпляра – секция Declare
При таком расположении элемента кода в тулбаре присутствуют кнопки «Вставить UUID»(4), «Вставить тэг параметра»(1) , «Вставить тэг входа»(5) , «Вставить тэг выхода»(6) и чек бокс «Запретить компилятору видеть #Include»(2).
Работу кнопки «Вставить тэг параметра»(1) и чек бокса «Запретить компилятору видеть #Include»(2) мы рассмотрели выше.
При нажатии кнопки «Вставить UUID»(4) при таком расположении элемента кода открывается расширенное окно выбора идентификатора.
Работу кнопки «Вставить тэг параметра»(1) и чек бокса «Запретить компилятору видеть #Include»(2) мы рассмотрели выше.
При нажатии кнопки «Вставить UUID»(4) при таком расположении элемента кода открывается расширенное окно выбора идентификатора.
В этом окне появился новый пункт - «Идентификатор экземпляра». При выборе этого пункта в место нахождения курсора в редакторе кода, вставляется тэг . При компиляции блока в проекте вместо него вставляется ID конкретного экземпляра блока.
Пример
В секции Declare кода каждого инстанса объявляем переменную.
А в секции Loop каждого инстанса в месте вставки блока записываем в неё значение.
В проект вставляем два экземпляра данного блока
В результате компиляции получаем код:
Секция Declare
int Var_176673836 ;
int Var_127258073 ;
Секция Loop место вставки первого экземпляра.
Var_176673836 =200;
Секция Loop место вставки второго экземпляра.
Var_127258073 =200;
Секция Declare
int Var_176673836 ;
int Var_127258073 ;
Секция Loop место вставки первого экземпляра.
Var_176673836 =200;
Секция Loop место вставки второго экземпляра.
Var_127258073 =200;
При нажатии кнопок «Вставить тэг входа»(5) , «Вставить тэг выхода»(6) открывается окно выбора соответствующего тэга из списка входов или выходов данного блока.
После выбора необходимого тэга он вставляется в место положения курсора в редакторе кода.
Рассмотрим работу тэга входа.
В отличие от старого (Basic) редактора пользовательских блоков в этом редакторе для входов переменные не создаются. Это сделано для экономии памяти микроконтроллера. Вместо тэга входа в код вставляется логическое выражение, полученное с входа заключённое в скобки. В большинстве случаев это имя переменой выхода блока подключенного к данному входу.
Например, рассмотрим такой код
Рассмотрим работу тэга входа.
В отличие от старого (Basic) редактора пользовательских блоков в этом редакторе для входов переменные не создаются. Это сделано для экономии памяти микроконтроллера. Вместо тэга входа в код вставляется логическое выражение, полученное с входа заключённое в скобки. В большинстве случаев это имя переменой выхода блока подключенного к данному входу.
Например, рассмотрим такой код
При подключении на вход константы получим следующий результат.
if ((50) ==20)
{
// Какой то код
}
Если подадим на вход, выход блока с переменной выхода, получим следующее.
{
// Какой то код
}
Если подадим на вход, выход блока с переменной выхода, получим следующее.
if (((_d18x2x1O)) ==20)
{
// Какой то код
}
Но на входе возможна и математика, которая для экономии памяти рассчитывается на лету.
Например, при такой схеме получим более сложный вариант.
{
// Какой то код
}
Но на входе возможна и математика, которая для экономии памяти рассчитывается на лету.
Например, при такой схеме получим более сложный вариант.
if ((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))) ==20)
{
// Какой то код
}
При данном использовании входа в блоке это не критично. Но возможен вариант, когда вход используют в качестве параметра какой-то функции в библиотеке. Далеко не все библиотеки «любят» когда им в качестве параметра подсовывают выражение.
Например, перепишем код блока.
{
// Какой то код
}
При данном использовании входа в блоке это не критично. Но возможен вариант, когда вход используют в качестве параметра какой-то функции в библиотеке. Далеко не все библиотеки «любят» когда им в качестве параметра подсовывают выражение.
Например, перепишем код блока.
Получим результат
Out_238022926_164280164 = abstractCrazyFunction((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))));
Функция abstractCrazyFunction скорее всего, заругается, когда получит в качестве параметра вот такое: ((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))).
Поэтому когда Вы не уверены что использование входа будет корректно для любых данных приходящих на вход, рекомендую использовать такую конструкцию.
Out_238022926_164280164 = abstractCrazyFunction((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))));
Функция abstractCrazyFunction скорее всего, заругается, когда получит в качестве параметра вот такое: ((((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L))).
Поэтому когда Вы не уверены что использование входа будет корректно для любых данных приходящих на вход, рекомендую использовать такую конструкцию.
Тогда результат компиляции удовлетворит любую функцию.
_tempVariable_int = (((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L)));
Out_238022926_164280164 = abstractCrazyFunction(_tempVariable_int);
Out_142227144_164280164 = abstractCrazyFunction1(_tempVariable_int);
Код каждого блока – остальные секции.
_tempVariable_int = (((((_d18x2x1O))+(100))*(85.00))-(((_d18x2x1O))*(45L)));
Out_238022926_164280164 = abstractCrazyFunction(_tempVariable_int);
Out_142227144_164280164 = abstractCrazyFunction1(_tempVariable_int);
Код каждого блока – остальные секции.
Здесь присутствуют кнопки, работу которых мы рассмотрели ранее.
А как упаковать PZEM-004T в remotexy?
Спасибо, Альберт
ошибка в описании блока «Блок обнаружения изменения числа»
«Блок служит для обнаружения изменения числа подаваемого на вход «EN» . При изменении значении на выходе»Q» формируется импульс длительностью в один цикл программы. Для блока возможно задание зоны нечувствительности раздельно для каждого направления изменения числа. Эти параметры задаются в редакторе блока.»
вместо первого «EN» должно быть «Value»
что то не так с массивами.
скетч использовал данные из той же строки другого массива. менял названия (ставил не совпадающие цифры), удалял/ ставил блоки — (не копировал а притаскивал новый), проверял / менял настройки. есть 3 разных массива. заполненных. но берёт почему то из одного … созданного первым.
костыль — использование не повторяющихся номеров строк (индексов) . (помогает)
ардуино uno. версия FLP- актуал.
Странно,но у меня поменялись функциями блоки AND и OR
Добрый день. помогите с блоком шаговый мотор. при добавлении второго мотора ( кнопка новый) ничего не происходит.
Здравствуйте ! Спасибо огромное всем кто внес свой вклад в этот проект! Программа сделана интуитивно понятно и за месяц я дошел до коммуникаций но с протоколом Modbus остановился на ошибке 244 . Scada мастер, Uno слейв соединены через Max485. Задача кнопкой на Scada включать диод на Uno и на оборот. Подскажите пожалуйста возможные решения этой проблемы и еще в каких случаях назначать пин pe-de ?
С уважением Влад!
«Переменная (Тэг) в области памяти Holding Registors внешнего слейва опрашиваемого с помощью мастера на данном контролере.» — не хватает запятых?
как добавить свой блок? хочу поделится с часами для матрицы 8*8 )))))
Запись переменной на SD карту. Плата Arduino UNO.
«Data Logger Module Logging Recorder Shield V1.0 For Arduino UNO SD Card One»
Digital #13 — SPI clock
Digital #12 — SPI MISO
Digital #11 — SPI MOSI
Digital #10 — SD Card chip
При выборе CS подключения дает только Pin до 9. Нужно 10.
Что делать?
Добрый день!
В справке по блоку SVCM (отправка переменной через коммуникации) показаны активными два устройства: Arduino Ethernet Wiznet 5100 и ESP8266 WiFi Module. В версии программы 4.3.4 можно выбрать только Arduino Ethernet Wiznet 5100.
В обновлении 6.3.1 ESP8266 WiFi Module также недоступен для выбора.
Подскажите пожалуйста, может нужно что-то доустановить или настроить?
В PID регуляторе параметр «TIME» что означает?
Здравствуйте!
Как осуществить хранение данных во флэш-памяти (программе) вместо SRAM?
Добрый день.
Параметр “Time” – на этот вход подаётся время регулирования (в миллисекундах).» — так и не смог понять на что именно он влияет… Можно где то узнать что это за параметр?
Речь идет о ПИД регуляторе?
Добрый день! Мне требуется отправка по UART данных для MIDI протокола. Нашёл на просторах интернета готовый скетч, там отправка происходит вот таким образом
void noteOn(int chan, int note, int velocity) {
Serial.write( (0x90 | chan) );
Serial.write(note);
Serial.write(velocity);
}
Вопрос: плата Arduino Nano strong (т.е. плата и шилд сразу) при использовании блока матричная клавиатура подключение 2 пин основной 3,4,5,6,7 уже исполняющие
так вот при такой раскладке после прошивки на 4 пине появляется сигнал и ничего с этим не сделать если-же подключать так-же с 8 по 13 то на 10 он наоборот пропадает и ничем его не получить.
Flprog стоит 5.3.0 для 64 виндовс, это можно как-то решить т.к. проект готов и затык только в этом (не резать-же шлейф да сейчас такие шлейфы что :))) )
спасибо
Вопрос: плата Arduino Nano strong (т.е. плата и шилд сразу) при подключении 2 пин основной 3,4,5,6,7 уже исполняющие
так вот при такой раскладке после прошивки на 4 пине появляется сигнал и ничего с этим не сделать если-же подключать так-же с 8 по 13 то на 10 он наоборот пропадает и ничем его не получить.
Flprog стоит 5.3.0 для 64 виндовс, это можно как-то решить т.к. проект готов и затык только в этом (не резать-же шлейф да сейчас такие шлейфы что :))) )
спасибо
Приветствую! Подскажите пожалуйста, какова длина/(время) импульса на выходе блока «Установка события по часам реального времени» и минимальная длина/(время) импульса на входе для срабатывания блоков типа «Триггер»? Плата, Arduino UNO. (Осциллографа нет, а монитором COM порта эти величины с нужной точностью замерять затруднительно.) Или существует формула для этих расчетов?
Добрый день. А если в схеме нужен F Trigger,как быть?
Здравствуйте!
Как из пользовательского блока передать массив?
Здравствуйте подскажите пожалуйста разницу между блоками Bit Change и R Triger
Bit Change выдает импульс при переходе от 0 к 1 и при переходе от 1 к 0. Rtrig только при переходе от 0 к 1.
…имеется в виду, длины импульса и длины паузы.
Здравствуйте уважаемый Сергей Глушенко.
У меня такой вопрос.
Есть ли способ понизить скорость мне случайных чисел в данном блоке, как например в блоке «Generator», с функцией «Несимметричный мультивибратор»…? А то данный блок «RANDOM», меняет случайные числа с бешеной скоростью, из-за чего на дисплее не успеваешь разглядеть эти числа…
Здравствуйте, Сергей!
Прежде всего хочу поблагодарить Вас за прекрасную программу. Мне, как в пошлом,инженеру, очень комфортно создавать свой проект в Вашей среде.
Но у меня вопрос, на который не нашел ответа: Я создаю проект с участием нескольких контроллеров ESP8266 NodeMCU с OLED дисплеем. Очень не хватает такого модуля и модуля ESP32 WiFi LoRa с OLED дисплеем в предустановке.Мои контроллеры должны выполнять некоторые действия, и обмениваться между собой данными и информацией по WiFi в реальном времени. Причем, радиус действия WIFI сети каждого из модулей не должен влиять на передачу данных между конечными контроллерами. Поэтому контроллеры самонастраиваются, и записывают данные для входа всех контроллеров WIFI сети в память для постоянного коннекта по цепи (от начального до конечного). Вопрос: Можно ли в Вашей среде создать подобный алгоритм взаимодействия между контроллерами сети?
С уважением, Аркадий
Здравствуйте! Не могу понять в чём причина. В счётчике на уменьшение, при подключении переменных к входу R и выходу <L он не считает вниз, а если убрать с R то счёт идёт но, не совсем правильно(на ноль не сбрасывается). Подскажите, в чём может быть причина?
Здравствуйте подскажите как округлить показания датчика до десятых чтобы температура выводилась в виде 10,1 а не 10,12.
Заходишь в параметры блока конвертации строк, там есть параметр «Количество знаков после запятой»
Подскажите, почему счетчик не видит вход, хотя он добавлен ? Регулируемые бегущие огни.
Добрый вечер!
Как определить и записать максимальное значение аналогового входа за минуту, и записать его на флешку?
Здравствуйте! Подскажите пожалуйста как создать двойное фазоимпульсное управление в char, для этой схемы.
Заранее огромное спасибо!
Добрый день. Подскажите пожалуйста как откорректировать датчик дс18б2хх есть отклонения 1-2 градуса в зависимости от температуры. Заранее спосибо.
Сложением или умножением в зависимости от характеристики отклонения
Здравствуйте, На сериал порт приходит сообщение 18 байт, мне нужно использовать несколько байт из него. Какой функцией выделить (извлечь) например 5-й байт? Или присвоить переменной значение 5-го байта из сообщения? Спасибо.
Здравствуйте! Подскажите пожалуйста как преобразовать String в char. Заранее огромное спасибо!
блоком «получить символ из строки»
Здравствуйте.
Скажите как сделать так что бы при достижении времени установленного в настройках блока на выходе установится высокий уровень не на 1 минуту, а до времени отключения будильник?
В данной версии блока будильника высокий сигнал на выходе пропадает через 1 минуту.
Будильник работает пока условие времени совпадает с будильником. Если необходимо более длительно время, то можно поставить блок TOF на выход Q
Здравствуйте!
В FLProg есть блок MCP23017.
Но ка только в «FLProg» начинает компилировать в «IDE» программа ругается и пишет, что нужны библиотеки MCP23x17.h и MCP23017.h. Без этой библиотеки блок не рабочий.
Где их можно скачать?
здравствуйте. есть ли модуль поддержки драйверов с управлением step-dir-enable? если нет то когда планируется?
Здравствуйте. Не могу запустить версию 5.00
—————————
flp.exe — Системная ошибка
—————————
Запуск программы невозможен, так как на компьютере отсутствует api-ms-win-crt-runtime-l1-1-0.dll. Попробуйте переустановить программу.
—————————
ОК
—————————
Что делать.
Установи Microsoft Visual C++ последний, и все заработает!!
Доброго времени суток! Скажите пожалуйста, какова максимальная частота счета для этого счетчика? При превышении какой частоты счета, следует выбирать «Скоростной счетчик»? Заранее спасибо.
Почему я невозможно соединить вход «R» с выходом «>L»?
Это баг 5 версии или что-то ещё?
Обратные связи запрещены
Доброго времени суток. Блок «умножение» FLProg 4.2.4 версия под Linux ( ось mint 19.1). умножает в 10 раз более установленного значения . Вставить скрин не получается.
Драйвер светодиодов MAX7219 в программе flProg версии 4.2.4 не работает. По крайней мере с семисегментными индикаторами. Попробовал в другой версии (2.5.1) — все работает корректно.