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

Создаем свой блок. Вопросы, помощь знатоков.
ecoins
Полковник
Сообщения: 4009
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

aidar_i писал(а): 14 фев 2023, 06:54 Сообщение aidar_i » 35 минут назад
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

[ref]JonyBest[/ref], а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.
JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18 ноя 2015, 22:42
Откуда: Близко к Ставрополю
Имя: Евгений
Поблагодарили: 2 раза

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

Сообщение JonyBest »

Dryundel писал(а): 14 фев 2023, 09:06 а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать темпаральную переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.
Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

[ref]JonyBest[/ref], тогда идём по пути указанному [ref=#ff8000]aidar_i[/ref].

Отправлено спустя 3 минуты 57 секунд:
JonyBest писал(а): 14 фев 2023, 09:35 Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...
Интересная задачка. Надо потестить. Доберусь до компа....
Аватара пользователя
Phazz
Полковник
Сообщения: 3129
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 233 раза
Поблагодарили: 114 раз

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

Сообщение Phazz »

Можно создать функцию и вызвать ее из сетап.
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

ecoins писал(а): 14 фев 2023, 07:35 Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.
Может быть, тоже не проверял и не попадалась такая информация, в нашем случае быстрота не имеет значения, т.к. код выполняется в начале и один раз.:)
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

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

String tempString = <IN>;
const char *charString = tempString.c_str();
setName(charString);
[/spoiler]
Никогда не верь наслово. Всегда проверяй. :)
Тест_ВходString_ConvertConstChar_Setup.flp
Отправлено спустя 3 минуты 18 секунд:
aidar_i писал(а): 14 фев 2023, 10:42 Может быть, тоже не проверял и не попадалась такая информация.
Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Dryundel писал(а): 14 фев 2023, 14:07 Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.
От Setup никто же не требует скорости и никто не измеряет там.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

aidar_i писал(а): 14 фев 2023, 14:20 Тебе лишь бы поспорить :)
Я сказал какую то ерунду? Что пошло не так?
Если человек что то утверждает, то пусть это делает не голословно. А то это уже становится системой и нормой. Разве так правильно?
И ладно бы если он признавал свои ошибки. Так ведь нет, это выше его достоинства. А вот обиженным прикинуться, это можно.
ecoins
Полковник
Сообщения: 4009
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

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

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

Сообщение artemka19 »

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

*значения со входов можно получить только для секции КОД КАЖДОГО ЭКЗЕМПЛЯРА
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

artemka19 писал(а): 14 фев 2023, 18:01 теперь попробуй получить значение со входа в ОБЩЕМ КОДЕ)
Это что? На слабо что ли? :smile171:
[ref]artemka19[/ref], а вот если подумать, Вы в проекте что используете? Не экземпляр ли блока?
У каждого экземпляра свой вход. И входное значение разное на них подается.
Именно поэтому парамерт может распространяться на все экземпляры, а входы только на конкретный.
Ну вот как менять общий параметр со входа каждого экземпляра? На всех экземплярах писать одно и то же значение?
К чему была эта ваша реплика? :)
JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18 ноя 2015, 22:42
Откуда: Близко к Ставрополю
Имя: Евгений
Поблагодарили: 2 раза

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

Сообщение JonyBest »

Dryundel писал(а): 14 фев 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 фев 2023, 22:07, всего редактировалось 1 раз.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

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

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

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

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

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

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

void setup() {
    device.setName(<Параметр> );
   } 
JonyBest
Сержант
Сообщения: 269
Зарегистрирован: 18 ноя 2015, 22:42
Откуда: Близко к Ставрополю
Имя: Евгений
Поблагодарили: 2 раза

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

Сообщение JonyBest »

Dryundel писал(а): 14 фев 2023, 21:42 Выкладывай проект, посмотрим.
Старый проект блоков для НА чуть доработал и решил добавить входы для удобства.
esp32_test34.rar
Вот описание функций. Вроде все просто, а не получается...
Dryundel писал(а): 14 фев 2023, 21:42 очему стринговой переменной присваиваешь const char
Поправил, не правильно вставил на форум.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

Завтра гляну.
kilemch5
Рядовой
Сообщения: 40
Зарегистрирован: 03 сен 2020, 15:55
Имя: Николай
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение kilemch5 »

artemka19 писал(а): 14 фев 2023, 18:01 получить значение со входа в ОБЩЕМ КОДЕ
подтверждаю - в проф редакторе это невозможно
ivansidor012
Лейтенант
Сообщения: 310
Зарегистрирован: 10 сен 2020, 14:37
Имя: Иван
Благодарил (а): 3 раза
Поблагодарили: 5 раз

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

Сообщение ivansidor012 »

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

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

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

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

Отправлено спустя 1 минуту 4 секунды:
Dryundel писал(а): 14 фев 2023, 14:07 Это как бы оказалось, мягко говоря, неправдой
но ведь это тоже спорное утверждение
kilemch5
Рядовой
Сообщения: 40
Зарегистрирован: 03 сен 2020, 15:55
Имя: Николай
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение kilemch5 »

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

п.с. - это вы еще даже не проверили а уже утверждаете?
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость