Новый редактор для создания пользовательских блоков.

Появился в версии 7.

Создаем свой блок. Вопросы, помощь знатоков.
ecoins
Полковник
Сообщения: 2923
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

Новый редактор для создания пользовательских блоков.

#281

Сообщение ecoins » 14.02.2023{, 07:35}

aidar_i писал(а):
14.02.2023{, 06:54}
Сообщение aidar_i » 35 минут назад
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#282

Сообщение Dryundel » 14.02.2023{, 09:06}

ecoins писал(а):
14.02.2023{, 07:35}
Лучше использовать переменную byte вместо bool.
Памяти занимает столько же.
Не факт. В одном байте можно хранить 8 флагов.
ecoins писал(а):
14.02.2023{, 07:35}
для большинства контроллеров проверка условия по байту работает побыстрее.
Спорить не буду. Не проверял. Но очень сомнительное заключение.

JonyBest, а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Новый редактор для создания пользовательских блоков.

#283

Сообщение JonyBest » 14.02.2023{, 09:35}

Dryundel писал(а):
14.02.2023{, 09:06}
а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать темпаральную переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.
Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#284

Сообщение Dryundel » 14.02.2023{, 09:40}

ecoins писал(а):
14.02.2023{, 05:50}
Действительно, блоки FLProg в режиме setup() не принимают входных данных.
Это обсуждалось как-то с разработчиком.
Интересная информация. Не задумывался над этим. Надо проверить.

JonyBest, тогда идём по пути указанному aidar_i.

Отправлено спустя 3 минуты 57 секунд:
JonyBest писал(а):
14.02.2023{, 09:35}
Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...
Интересная задачка. Надо потестить. Доберусь до компа....

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Новый редактор для создания пользовательских блоков.

#285

Сообщение Phazz » 14.02.2023{, 09:47}

Можно создать функцию и вызвать ее из сетап.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Новый редактор для создания пользовательских блоков.

#286

Сообщение aidar_i » 14.02.2023{, 10:42}

ecoins писал(а):
14.02.2023{, 07:35}
Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.
Может быть, тоже не проверял и не попадалась такая информация, в нашем случае быстрота не имеет значения, т.к. код выполняется в начале и один раз.:)

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#287

Сообщение Dryundel » 14.02.2023{, 14:03}

ecoins писал(а):
14.02.2023{, 05:50}
Действительно, блоки FLProg в режиме setup() не принимают входных данных.
Это как бы оказалось, мягко говоря, неправдой. :)
Может речь шла о секции Declare? Тогда еще поверю.
JonyBest писал(а):
13.02.2023{, 22:59}
Беда в том, что нужно значение типа constchar. А str.c_str() работает только в Loop.
Вот так все работает хоть в Setup, хоть в Loop !Показать

Код: Выделить всё

String tempString = <IN>;
const char *charString = tempString.c_str();
setName(charString);
Никогда не верь наслово. Всегда проверяй. :)
Тест_ВходString_ConvertConstChar_Setup.flp
(166.9 КБ) 26 скачиваний
Отправлено спустя 3 минуты 18 секунд:
aidar_i писал(а):
14.02.2023{, 10:42}
Может быть, тоже не проверял и не попадалась такая информация.
Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Новый редактор для создания пользовательских блоков.

#288

Сообщение aidar_i » 14.02.2023{, 14:20}

Dryundel писал(а):
14.02.2023{, 14:07}
Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.
От Setup никто же не требует скорости и никто не измеряет там.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#289

Сообщение Dryundel » 14.02.2023{, 14:33}

aidar_i писал(а):
14.02.2023{, 14:20}
Тебе лишь бы поспорить :)
Я сказал какую то ерунду? Что пошло не так?
Если человек что то утверждает, то пусть это делает не голословно. А то это уже становится системой и нормой. Разве так правильно?
И ладно бы если он признавал свои ошибки. Так ведь нет, это выше его достоинства. А вот обиженным прикинуться, это можно.

ecoins
Полковник
Сообщения: 2923
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

Новый редактор для создания пользовательских блоков.

#290

Сообщение ecoins » 14.02.2023{, 16:19}

Дополнительная ремарка по использованию флагов bool:
1.Как-то в процессе оптимизации кода одной из достаточно большой библиотек заменили все флаги и короткие переменные в отдельные биты и поля переменной. Это нужно было прежде всего для контроллера Nano,у которого обычно доступно не более 1.5к оперативной памяти. Некоторого сокращения использованния оперативной памяти удалось достичь, но неожиданно ощутимо возрос загружаемый код программы и снизилось быстродействие. Источник этого явления - конечный код для каждого использования набора битовых значений, в зависимости от типа контроллера и компилятора код может быть побольше или поменьше. Но всегда больше, чем проверка по условию байтовой переменной. Тем кто сталкивался с машинными кодами и программированию на ассемблере написанное должно быть знакомо. Получше вроде должно быть в контроллере STM32 где работа с битами вроде реализовано аппаратно. Но все равно и это буде зависеть от версиии и возможностей компилятора. Компилятор C++ конечно мощный инструмент, но для программирования микроконтроллеров полезно знать и учитывать особенности его работы, влияющих на конечный код программы.
2.Исследования по быстродействию проводились с использованием логического анализатора.
3.ecoins в своих библиотеках там где флаги используются гарантированно чаще (например при каждом входе) использует только флаги типа uint8-t - это один из источников быстродействия быстродействия наших библиотек.
4.По использованию условий вызова плат в FLProg. Переменную в тэгах создавать все равно надо - bool и uint8_t будут занимать одно и тоже место. Непосредственное побитовое значение переменных в условиях вызова задач(плат) не предусмотренно.
———
Спасибо.

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

Новый редактор для создания пользовательских блоков.

#291

Сообщение artemka19 » 14.02.2023{, 18:01}

Dryundel писал(а):
14.02.2023{, 14:07}
Это как бы оказалось, мягко говоря, неправдой
теперь попробуйте получить значение со входа в ОБЩЕМ КОДЕ)

*значения со входов можно получить только для секции КОД КАЖДОГО ЭКЗЕМПЛЯРА

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#292

Сообщение Dryundel » 14.02.2023{, 18:21}

artemka19 писал(а):
14.02.2023{, 18:01}
теперь попробуй получить значение со входа в ОБЩЕМ КОДЕ)
Это что? На слабо что ли? :smile171:
artemka19, а вот если подумать, Вы в проекте что используете? Не экземпляр ли блока?
У каждого экземпляра свой вход. И входное значение разное на них подается.
Именно поэтому парамерт может распространяться на все экземпляры, а входы только на конкретный.
Ну вот как менять общий параметр со входа каждого экземпляра? На всех экземплярах писать одно и то же значение?
К чему была эта ваша реплика? :)

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Новый редактор для создания пользовательских блоков.

#293

Сообщение JonyBest » 14.02.2023{, 21:24}

Dryundel писал(а):
14.02.2023{, 17:48}
у Вас получилось сделать задуманное?
Стесняюсь влезать в Ваши разборки, зашибете и не заметите...
По существу. Не получается. Уже всё за день перепробовал что знал или подсмотрел на форумах.
Уже без входов, в IDE
так работет:

Код: Выделить всё

void setup() {
    const char *charString =  "Test1";
    device.setName(charString);
и так
void setup() {
    device.setName( "Test1");
    
Так нет

Код: Выделить всё

void setup() {
String tempString = "Test1";
    const char *charString = tempString.c_str();
    device.setName(charString);
    
И через функции и в лоопе. Результат один. Компилируется без ошибок, но функция device.setName() значение не видит.
Последний раз редактировалось JonyBest 14.02.2023{, 22:07}, всего редактировалось 1 раз.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#294

Сообщение Dryundel » 14.02.2023{, 21:42}

JonyBest, почему стринговой переменной присваиваешь const char?
В примере смотрел? Там разве так?
Там привязка ко входу, как ты и просил.

А если из параметра, то не надо никакой конвертации. Напрямую в функцию вставляешь.

И что за функция? Что она делает?
Выкладывай проект, посмотрим.

Отправлено спустя 26 минут 19 секунд:
Так для входа

Код: Выделить всё

void setup() {
    String tempString = <Вход>;
    const char *charString = tempString.c_str();
    device.setName(charString);
   } 
}
Или так для параметра

Код: Выделить всё

void setup() {
    device.setName(<Параметр> );
   } 

JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18.11.2015{, 22:42}
Репутация: 89
Откуда: Близко к Ставрополю
Имя: Евгений

Новый редактор для создания пользовательских блоков.

#295

Сообщение JonyBest » 14.02.2023{, 22:15}

Dryundel писал(а):
14.02.2023{, 21:42}
Выкладывай проект, посмотрим.
Старый проект блоков для НА чуть доработал и решил добавить входы для удобства.
esp32_test34.rar
(1.72 МБ) 35 скачиваний
Вот описание функций. Вроде все просто, а не получается...
Dryundel писал(а):
14.02.2023{, 21:42}
очему стринговой переменной присваиваешь const char
Поправил, не правильно вставил на форум.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#296

Сообщение Dryundel » 14.02.2023{, 22:26}

Завтра гляну.

kilemch5
Рядовой
Сообщения: 18
Зарегистрирован: 03.09.2020{, 15:55}
Репутация: 0
Имя: Николай

Новый редактор для создания пользовательских блоков.

#297

Сообщение kilemch5 » 14.02.2023{, 23:28}

artemka19 писал(а):
14.02.2023{, 18:01}
получить значение со входа в ОБЩЕМ КОДЕ
подтверждаю - в проф редакторе это невозможно

ivansidor012
Сержант
Сообщения: 279
Зарегистрирован: 10.09.2020{, 14:37}
Репутация: 43
Имя: Иван

Новый редактор для создания пользовательских блоков.

#298

Сообщение ivansidor012 » 14.02.2023{, 23:30}

Dryundel писал(а):
14.02.2023{, 14:33}
Если человек что то утверждает, то пусть это делает не голословно.
вы же сказали что можно получать значения со входа

и это голословно получается

Отправлено спустя 4 минуты 40 секунд:
aidar_i писал(а):
14.02.2023{, 06:54}
Я тоже в loop запускаю со входом.
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Например:
В DeclareSection
bool flag = 1;
В LoopSection
if(flag) { flag = 0;
Код
}

Код будет выполняться при запуске программы один раз, и входы будут работать.
вот тут тоже сообщили об этой проблеме и предложили даже вариант решения

Отправлено спустя 1 минуту 4 секунды:
Dryundel писал(а):
14.02.2023{, 14:07}
Это как бы оказалось, мягко говоря, неправдой
но ведь это тоже спорное утверждение

kilemch5
Рядовой
Сообщения: 18
Зарегистрирован: 03.09.2020{, 15:55}
Репутация: 0
Имя: Николай

Новый редактор для создания пользовательских блоков.

#299

Сообщение kilemch5 » 14.02.2023{, 23:38}

Dryundel писал(а):
14.02.2023{, 14:07}
Может речь шла о секции Declare? Тогда еще поверю.
в этой секции также как и артемка сказал - из входа можно получить только если код не в общем

п.с. - это вы еще даже не проверили а уже утверждаете?

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Новый редактор для создания пользовательских блоков.

#300

Сообщение Dryundel » 14.02.2023{, 23:39}

anton2 писал(а):
14.02.2023{, 23:25}
подтверждаю - в проф редакторе это невозможно
Читаем внимательно пост
viewtopic.php?p=121206#p121186
Там все описано почему.
Ещё раз
В проекте может быть несколько экземпляров одного блока.
Каким образом этот общий параметр можно ввести со входа, если у каждого экземпляра будет свой вход для этого?
На какой конкретно экземпляр ориентироваться программе для определения общего параметра для всех экземпляров?
Именно поэтому в общий код невозможно вообще вставить тег входа. Любого входа. Не только для параметра.

Ответить

Вернуться в «Разработка пользовательских блоков»