Страница 3 из 6

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 16.09.2021{, 21:50}
ecoins
sergserg писал(а):
16.09.2021{, 21:16}
если завести таймер/ы на первой плате и по ним запускать другие платы - это же равнозначно диспетчеру задач вашему? принцип тот же?
Это уже хороший шаг.
rw6cm писал(а):
16.09.2021{, 01:21}
ESP32 Штатный дисплей 1.zip
В этом тесте с точки зрения использования времени процессора почти все сделано очень плохо.

Отправлено спустя 3 минуты 40 секунд:
Dryundel писал(а):
16.09.2021{, 21:24}
Приостановите слегка полет мыслей.
Если Вы что-то не понимаете в наших разработках, это совсем не значит что там "полет мыслей".
Dryundel писал(а):
16.09.2021{, 21:24}
ecoins, было бы не плохо, если бы Вы сделали вариант проекта из первого поста со штатными блоками дисплея и диспетчером задач и выложили здесь.
Завтра попробую сделать.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 08:13}
edyapd
Я конечно не очень силён в C, но мне кажется, что доработать родной блок для автора программы будет не так уж и сложно, чтобы он не так тормозил.
К примеру я это вижу так:
Убрать очистку дисплея. А вместо неё вставить функцию, которая бы добавляла пробелы, если новая строка оказалась короче старой.
При неактивном входе En не очищать строку, а просто игнорировать этот блок. Очистку же строки делать подачей пустой строки на вход.
Убрать сравнение на длину строки при выводе константы. И так понятно, что она одна и та же.
Возможно вставить сравнение строк. И если они равны, то пропускать вывод на дисплей.
Единственное неудобство я вижу только в том, что если будут помехи и на экран будет выводится мусор. Но думаю это тоже решаемо.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 09:37}
aidar_i
Я тоже задаюсь таким вопросом
ecoins писал(а):
16.09.2021{, 21:54}
Что такое 6cm мне понятно.
Это размер носа или .... :)

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 10:00}
Dryundel
edyapd писал(а):
17.09.2021{, 08:13}
но мне кажется, что доработать родной блок для автора программы будет не так уж и сложно, чтобы он не так тормозил.
К примеру я это вижу так:...
edyapd, скорей изучайте С++ и Редактор ПБ. У Вас отличные идеи. Надо воплощать.
А Автор пусть 8-ю версию допиливает. В этом гораздо больше пользы.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 10:17}
aidar_i
eduard писал(а):
17.09.2021{, 10:00}
доработать родной блок для автора
Dryundel писал(а):
17.09.2021{, 10:00}
А Автор пусть 8-ю версию допиливает
А допилить lcd можно и с помощью пользовательских блоков.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 11:59}
Sancho
Dryundel писал(а):
15.09.2021{, 11:01}
Реальное сравнение вывода информации:
DISP - примерно 5мс
LCD 2.18 - примерно 6 мс
.
Так в чем же фишка? А все дело в том, что штатный блок из цикла в цикл выводит информацию на дисплей. Т.е. берет данные со входа, стирает все что ранее было выведено (весь дисплей ) и пишет заново и это каждый цикл, независимо от того изменилась информация на входе или нет.
Еще по причине того, что стирается вся информация, любое изменение на дисплее приводит к его мерцанию. Попробуйте например вывести показания часов с мигающим двоеточием или мигающий символ для навигации по меню. Получите весьма неприглядную картинку.
Пример кода - инкрементируемую переменную _gtv2 unsigned long integer на дисплей

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

void loop()
{
if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
//Плата:1
if (1) {
_dispTempLength1 = (((String(_gtv2, DEC)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(1, 0);
_lcd1.print(((String(_gtv2, DEC))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
Переменная, флаг _isNeedClearDisp1, взводится при уменьшении длины выводимого содержимого по сравнению с предыдущим циклом, запоминается не вся строка а только её длина.
Так-же она взводится при выключении блока, EN, если в предыдущем цикле было количество символов, отличное от нуля; количество после взвода флага обнуляется для неповторения.
В начале цикла - контроль флага, при true очистка дисплея и сброс флага.
Информация на дисплей выводится в каждом цикле.
Стирание, команда очистки дисплея, при инкрементировании (увеличении на 1) происходить будет только при выводе 0.
Касательно часов и двоеточия - не знаю о чём точно идёт речь, каком конкретно случае, но при отсутствии в строке двоеточия её длинна не изменяется.
Мигающий символ - это интересно, ведь есть мигающий курсор, да много как обозначить.
Способов бороться с тормозами много, один из них я описывал в вышеупомянутой теме - выделение отдельного мк под дисплей(для esp32, возможно, передача задачи второму ядру), отказ от дисплея, и т.п. Не факт, что без дисплея всё ускорится до 10мкс/ц, может что-то другое так-же вносит задержку.
Временные характеристики дисплея описаны, команды разжёваны - всё заканчивается на задаче конкретного пользователя.
Как-то так.

Отправлено спустя 9 минут 56 секунд:
При желании Автора, сделать вариант выбора и дописать код под предложенный выше вариант, периодический вывод, не сложно.
Таким же образом третий вариант можно сделать по изменению, но за счёт оперативки.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 12:30}
Dryundel
Sancho писал(а):
17.09.2021{, 11:59}
Сразу понятно - полного анализа кода не было.
Пример кода - инкрементируемую переменную _gtv2 unsigned long integer на дисплей
... и далее по тексту
Sancho, ну зачем столько агресии.
Я уже писал:
Dryundel писал(а):
15.09.2021{, 17:52}
Я все понял. Блок LCD_V2.18 - г...но. Спорить не буду. :)
Предлагай свои версии блоков. На то и тема что бы решить проблему. (О как! Даже в рифму :) )
Те для кого написана статья нифига не поняли о чем ты тут вообще пытаешься сказать.
Пожалуйста, обрати внимание на самую первую строчку в самом первом посте.
А если уж взялся критиковать в данной теме, то попробуй все сказанное перевести на язык обывателя и обратить в простые формы. Слабо?
Sancho писал(а):
17.09.2021{, 11:59}
Мигающий символ - это интересно, ведь есть мигающий курсор, да много как обозначить.
А попробуй ка сделать мигающий курсор используя штатные средства. Вряд ли получится.
Sancho писал(а):
17.09.2021{, 11:59}
Временные характеристики дисплея описаны, команды разжёваны
Это на кого рассчитано? До кого пытаешься донести важную информацию? До новичков?
Или просто бубнишь по стариковски? :D
.
Не обижайся пожалуйста но данная агрессия здесь явно НЕ В ТЕМУ.

Отправлено спустя 2 минуты 46 секунд:
Sancho писал(а):
17.09.2021{, 12:08}
При желании Автора, сделать вариант выбора и дописать код под предложенный выше вариант, периодический вывод, не сложно.
Еще раз.
Dryundel писал(а):
15.09.2021{, 16:42}
Кабы у бабушки был.... Ну вы знаете.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 12:35}
Dryundel
Sancho писал(а):
17.09.2021{, 12:08}
Таким же образом третий вариант можно сделать по изменению, но за счёт оперативки.
А вот это уже конструктивный разговор. Хочешь предложить вариант - излагай. Поместим его в первые посты.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 13:27}
Sancho
цитатаПоказать
Sancho писал(а):
17.09.2021{, 12:08}
Dryundel писал(а):
15.09.2021{, 11:01}
Реальное сравнение вывода информации:
DISP - примерно 5мс
LCD 2.18 - примерно 6 мс
.
Так в чем же фишка? А все дело в том, что штатный блок из цикла в цикл выводит информацию на дисплей. Т.е. берет данные со входа, стирает все что ранее было выведено (весь дисплей ) и пишет заново и это каждый цикл, независимо от того изменилась информация на входе или нет.
Еще по причине того, что стирается вся информация, любое изменение на дисплее приводит к его мерцанию. Попробуйте например вывести показания часов с мигающим двоеточием или мигающий символ для навигации по меню. Получите весьма неприглядную картинку.
Сразу понятно - полного анализа кода не было.
Пример кода - инкрементируемую переменную _gtv2 unsigned long integer на дисплей

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

void loop()
{
if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
//Плата:1
if (1) {
_dispTempLength1 = (((String(_gtv2, DEC)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(1, 0);
_lcd1.print(((String(_gtv2, DEC))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
Переменная, флаг _isNeedClearDisp1, взводится при уменьшении длины выводимого содержимого по сравнению с предыдущим циклом, запоминается не вся строка а только её длина.
Так-же она взводится при выключении блока, EN, если в предыдущем цикле было количество символов, отличное от нуля; количество после взвода флага обнуляется для неповторения.
В начале цикла - контроль флага, при true очистка дисплея и сброс флага.
Информация на дисплей выводится в каждом цикле.
Стирание, команда очистки дисплея, при инкрементировании (увеличении на 1) происходить будет только при выводе 0.
Касательно часов и двоеточия - не знаю о чём точно идёт речь, каком конкретно случае, но при отсутствии в строке двоеточия её длинна не изменяется.
Мигающий символ - это интересно, ведь есть мигающий курсор, да много как обозначить.
Способов бороться с тормозами много, один из них я описывал в вышеупомянутой теме - выделение отдельного мк под дисплей(для esp32, возможно, передача задачи второму ядру), отказ от дисплея, и т.п. Не факт, что без дисплея всё ускорится до 10мкс/ц, может что-то другое так-же вносит задержку.
Временные характеристики дисплея описаны, команды разжёваны - всё заканчивается на задаче конкретного пользователя.
Как-то так.

Отправлено спустя 9 минут 56 секунд:
При желании Автора, сделать вариант выбора и дописать код под предложенный выше вариант, периодический вывод, не сложно.
Таким же образом третий вариант можно сделать по изменению, но за счёт оперативки.
Dryundel писал(а):
17.09.2021{, 12:32}
Sancho, успокойся, глотни валерианочки, не надо брызгать слюной в попытке отстоять штатный блок дисплея.
Dryundel писал(а):
17.09.2021{, 12:32}
Не обижайся пожалуйста но данная агрессия здесь явно НЕ В ТЕМУ.
Не понял кому последнее пожелание?
Dryundel писал(а):
17.09.2021{, 12:32}
Те для кого написана статья нифига не поняли о чем ты тут вообще пытаешься сказать.
Пожалуйста, обрати внимание на самую первую строчку в самом первом посте.
А если уж взялся критиковать в данной теме, то попробуй все сказанное перевести на язык обывателя и обратить в простые формы. Слабо?
Содержание темы, содержание постов, давно вышло за рамки новичков.
Критика касается только изложенных слов касательно описания ситуации.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 13:30}
ecoins
edyapd писал(а):
17.09.2021{, 08:13}
Я конечно не очень силён в C, но мне кажется, что доработать родной блок для автора программы будет не так уж и сложно, чтобы он не так тормозил.
Мы не обнаружили приемлемого способа изменения исходного кода C++ встроенных пользовательских блоков автора.
Те же проблемы, если мы сами делаем собственные встроенные блоки - поэтому мы перестали их пока делать. Поэтому блоки нашей разработки размещаем в разделе пользовательские блоки.
------------
Текущая тема "ВРЕМЯ ЦИКЛА" во многом заполнилась значительным кол-вом материала посвященной дисплеев типа HD44780 (лет 40 назад их разработали - удивительно, что так и не появилась модификация с полностью настраиваемым знакогенератором).
Возможно полезно автору темы выделить вопросы по HD44780 в отдельную тему.
------------
Субъективное мнение ecoins по HD44780:
1.Стандартную библиотеку LCD HD44780 следует прекратить - при росте проектов это всегда (ВСЕГДА!!!) источник проблем с быстродействием.
2.Есть библиотека от ecoins с существенно большим функционалом. Её несколько больший размер с лихвой компенсируется тем, что внешних обслуживающих LCD функций становится существенно меньше.
3.Дисплей LCD HD44780 весьма устаревшая конструкция и тратить усилия на бесконечное совершенствование программного обеспечения не стоит - на это справедливо обращает внимание и nalnik (правда в присущей для него "резковатой" форме.
4.Созданная тема "ВРЕМЯ ЦИКЛА" для обсуждения и исследования методов оптимизации про времени проектов для FLProg сама по себе более важная чем тема LCD.
5.Активные участники обсуждения темы довольно-таки поверхностно (прошу не обижаться - намерений таких нет, мнение субъективное) представляют глубину и важность проблемы. Она действительно важная и её разрешение предопределяет уход от разочарования "новичков" по мере усложнения проектов. В начале "магия" возможностей от визуального программирования в FLProg, а затем разочарования от того, что проекты "тормозят". Сами прошли через этого, помогли и некоторым участникам форума.
6.По нашим наблюдениям те участники форума - "новички" - которые освоили простые методы работы со временем, реализованные в проектах ecoins, продолжают их использовать уже естественным образом не испытывая каких-либо проблем и сложностей.
В этом ветке они не размещали своих отзывов - возможно по понятным для меня причинам.
-----------
Успехов с надеждой на сотрудничество.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 13:35}
nalnik
ecoins писал(а):
17.09.2021{, 13:30}
3.Дисплей LCD HD44780 весьма устаревшая конструкция и тратить усилия на бесконечное совершенствование программного обеспечения не стоит - на это справедливо обращает внимание и nalnik (правда в присущей для него "резковатой" форме.
Спасибо что услышали.
:smile9:

Отправлено спустя 5 минут 22 секунды:
Sancho писал(а):
17.09.2021{, 13:27}
Не понял кому последнее пожелание?
Если ваш оппонент перешёл на оскорбления — значит, вы его победили.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 13:58}
Dryundel
nalnik писал(а):
17.09.2021{, 13:40}
Если ваш оппонент перешёл на оскорбления — значит, вы его победили.
Здаюсь! Капитулирую!
Кто следующий?
Есть у кого то злая критика в мой адрес? К барьеру! :smile171:

Отправлено спустя 1 минуту 7 секунд:
Даю слово - дизлайков не будет.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 14:18}
edyapd
ecoins писал(а):
17.09.2021{, 13:30}
Мы не обнаружили приемлемого способа изменения исходного кода C++ встроенных пользовательских блоков автора
Можно по пунктам, что из предложенного мной невозможно реализовать? Это мне нужно, так сказать, для собственного развития.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 14:58}
Dryundel
Ну хорошо Sancho, с этим согласен.
Sancho писал(а):
17.09.2021{, 12:08}
Переменная, флаг _isNeedClearDisp1, взводится при уменьшении длины выводимого содержимого по сравнению с предыдущим циклом, запоминается не вся строка а только её длина.
Так-же она взводится при выключении блока, EN, если в предыдущем цикле было количество символов, отличное от нуля; количество после взвода флага обнуляется для неповторения.
В начале цикла - контроль флага, при true очистка дисплея и сброс флага.
Очистка производится не в каждом цикле. Давненько я писал блок и кое что запамятовал.
Однако это мало что меняет.
Потому как, не будешь же ты отрицать что:
Sancho писал(а):
17.09.2021{, 12:08}
Информация на дисплей выводится в каждом цикле.
А это не есть гут. И соответственно портит всю картину.
Да, да, да... можно решить эту проблему и не запускать блок в каждом цикле. Но я ведь уже указал на такой вариант в третьем посте.
.
Вот только не надо начинать с этого:
Sancho писал(а):
17.09.2021{, 12:08}
Сразу понятно - полного анализа кода не было.
А то ведь такое можно расценить как оскорбление. :)
.
К стати, nalnik, ради справедливости, поставь те ка дизлайк этому господину за хамство в соответствующем посте. :) А то как то предвзятость чувствуется.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 15:20}
nalnik
Dryundel писал(а):
17.09.2021{, 14:58}
К стати, nalnik, ради справедливости, поставь ка дизлайк этому господину за хамство в соответствующем посте. А то как то предвзятость чувствуется.
Во-первых - не "тыкайте".
Во-вторых - "этот господин" не обвинял Вас здесь публично в "греховных связях с Дионисом", и ни чем тут не брызгал.

:smile225:
И заберите свой плюсик!

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 15:30}
Dryundel
nalnik писал(а):
17.09.2021{, 15:20}
Во-первых - не "тыкайте".
Извиняюсь. Поправил.
nalnik писал(а):
17.09.2021{, 15:20}
Во-вторых - "этот господин" не обвинял Вас здесь публично в "греховных связях с Дионисом".
Ну как же, а это:
Sancho писал(а):
17.09.2021{, 12:08}
Сразу понятно - полного анализа кода не было.
С чего такое пренебрежение? С какой стати такие выводы? Типа показать кто здесь крут, а кто ничего в коде не понимает?
.
А вообще, лучше потереть последние препирательства и продолжить конструктивную беседу.
Кто ЗА?
Самую обидную фразу, сейчас поправлю. А остальное все по существу было.

Отправлено спустя 8 минут 2 секунды:
nalnik писал(а):
17.09.2021{, 15:20}
И заберите свой плюсик!
Ну уж нет! пусть останется как напоминание о предвзятости. :)

Отправлено спустя 2 минуты 11 секунд:
Вы же, уважаемый nalnik, не собираетесь забирать свой минусик.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 15:47}
nalnik
Dryundel писал(а):
17.09.2021{, 15:40}
Вы же, уважаемый nalnik, не собираетесь забирать свой минусик.
И не собираюсь!
Вы как ребенок - думаете что если "затерли" свое хамство - то стали лучше?
:nono: Вы просто запутали теперь всех окончательно.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 15:54}
com
Тема очень нужная и полезная, но как то... очень агрессивно что ли....

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 16:00}
Sancho
Для теста, просто железа уже нету никакого под рукой.
LCD 2.18_03.flp
(260.12 КБ) 55 скачиваний
Только одна строчка дополнительная.
Остальное штатными средствами.
Вроде почти полный повтор изначального.

Отправлено спустя 29 минут 6 секунд:
Есть при создании проектов, которые будут пользовать другие люди, а и самому тоже никогда не помешает, такое правило - одно дёрганье за цикл и из одного места. siemens-> читаем входы во входные переменные - цикл программы - запись выходов, повтор предыдущих шагов. Прерывания тоже есть, но это отдельные обработчики.
Иначе идём в С++. Пишем и комментируем. Комментариев много не бывает никогда, наоборот - часто, посему печально.
Другими словами, хотим мы, как в нашем конкретном случае, вывести данные на дисплей - нужно собрать необходимое и в одном месте это всё отправить. Выделить плату, две, три под эти цели, как посчитаете сами.
Главное в таком случае - Вы будете всё видеть, в пределах экрана РС, как формируется Ваша строка, переменная.
Иногда посмотришь на проекты - тут выводим одно, выключим, выводим в другом месте - потом запутались, одно поверх другого. Размер кода растёт вместе с блоками на платах.
Подобное часто наблюдается с выходами у новичков - здесь включат, на следующей плате выключат - потом хелп, "Щёлкает, но не работает!"
Касательно самой темы уже писал - можно и супер проц уложить нагрузкой, а можно распределить приоритеты.
Такое направление выбрал ecoins, можно и без его диспетчера для начала, просто выполнением по условию, которое Вы сами должны генерировать.
Как уже убедился - дисплей для момента отладок, настроек - когда конечное устройство работает дисплей не нужен.
Проверенно не раз - рисуешь скаду, даже на примитивах, стараешься, а когда спустя время всё работает то и забываешь о ней, максимум - а чего там было, на графиках гляну. Ну изредка уставку изменить.
Если это станок с несколькими настройками - сделать рецепты, настроить, сохранить, всё.
Я ни разу не видел оператора станка смотрящим на дисплей(экран) продолжительное время - запустил и до свидания.
Так может смотреть только наладчик, и то не продолжительное время - и даже в это время от дисплея не требуется максимальное участие в процессе. Конечно, бывают исключения, но это уже тот случай, когда проще посмотреть на график/лог/ подобное.
Я так вижу.

ВРЕМЯ ЦИКЛА или что убивает ваш проект.

Добавлено: 17.09.2021{, 16:46}
ingener
Sancho писал(а):
17.09.2021{, 16:29}
Для теста,
в углу дисплея еле заметно горит число 128361