Страница 1 из 2

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 15:07
Alias
Доброго всем времени суток!
Три недели назад набрел я на эту замечательную программу, хотя еще год назад на нее смотрел, но не зацепился. Давно собирался изучить вопрос Ардуино, как конструктора самодельщика, ибо в сети всего полно, но не алгоритмов под тебя. Но С++ не мое даже без плюсов и с маленькой буквы. Видео уважаемого Грачика и других сломали все психологические барьеры и, насмотревшись всяких видео понял, что пора начинать.
В сети очень много схем термостатирования. Но я ни одной не видел, чтобы применялся график для того же бытового водонагревателя. Как правило, все сводится к примитиву: выставил температуру и вперед! Но нет учета разбора воды потребителями в часы пик. Кроме того, крайне желательны периодические профилактические меры, среди которых - термическая дезинфекция.
Я на ютубе двум гуру закинул удочку на сей счет, но пока реакции нет и я попробовал разобраться сам. Дебют. Нужно же с чего-то начать. Пусть это будет не мигающий LED.
Итак, проект во вложении. Прошу гуру прокомментировать его и помочь с некоторыми вещами.
В общем - правильный ли подход в плане использования такого количества переменных для небольшой задачи? Это как-то сказывается на ресурсах Ардуино или переменные - просто для удобства программирования?
В частности - как преобразовать бинарное значение в число и как их складывать?
Никак, наверное.
Но я первоначально хотел именно это и использовать. Например, есть у нас три блока логики, на выходе которых нули или единицы. И я хотел использовать переменную, значение которой равно общему количеству единиц на этих выходах.
Допустим, если на всех трех выходах 1, то значение переменной - 3. Выкрутился с помощью аналогового переключателя. Это очень криво?
Для выбора уставки из трех значений применил мультиплексор. Может, правильно это сделать как-то иначе?
Для управления триггером часто рекомендуют применять не постоянный уровень, а одиночные импульсы. Насколько это оправданно? Ведь каждый блок - ресурсы микроконтроллера, хочется понапрасну не растрачивать их.
И, если кто-то будет смотреть схему, проверьте, пожалуйста, программу flprog на баг. Попробуйте удалить из первой платы последние три датчика, относящиеся к котлу и улице. Это я сначала на погодозависимость замахнулся. У меня после этого удаления отказываются сворачиваться все следующие платы, не выделяются и не редактируются в них элементы и связи. Перезагрузка программы, винды и прочего уже ничего не меняют и хорошо, если есть резервная копия. От версии не зависит.
Буду признателен за отклики!

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 15:38
pan
первое , что хочется сказать...
 модеры, закрепите эту тему с вопросом как эталон   

по проекту. в принципе всё сделано правильно. каждый конечно сделает одно и то же по разному. поэтому
тут как кому удобнее и понятнее.

по поводу триггера и одиночных импульсов:
лучше использовать в таких случаях не одновибратор из генератора а Rtrig .
оправданность зависит от каждой конкретной схемы.
иногда не принципиально, иногда он необходим.

если нужно будет наскрести немного памяти (при нехватке) то замените переменные integer  на byte там где это возможно.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 16:05
Dev1
Даю на_водку... Соответственно, бойлер должен выдавать вам пиковый расход, считали наверное... Нужно больше? Пожалуйста... Греем бойлер до 90°С, на выходе бойлера ставим 3х-ходовой термосмеситель, выставляем на нем 45-50°С и получаем больше ГВС за счет подмеса холодной. И термообработка постоянная. Без термосмесителя не советую греть до 90 

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 17:13
Sancho
Немного необходимо изменить плату 3.
Если оставить как есть - при отсутствии сигнала дезинфекция переменным "Режим бойлер_х" будут пере-присваиваться 0, т.к. это будет происходить перезапись переменной после "ДОГРЕВА". Посмотрите, проанализируйте, увидите.
Так-же можно, по Вашей схеме, уменьшить код, немного..

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 17:34
rw6cm
Alias писал(а):проверьте, пожалуйста, программу flprog на баг.
Это баг. Писал об этом. Автор вроде должен был устранить, но видно не успел.

Уберите с нижнего датчика, на 1 плате, надпись к блоку, или передвиньте ее выше датчика, и все будет ок.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 18:26
Alias
Спасибо откликнувшимся!
По порядку.
pan писал(а):закрепите эту тему
Спасибо за одобрение, но перебор. Максимум - перенести в другой раздел, если будет польза.
Dev1 писал(а):3х-ходовой термосмеситель
Чтобы температура воды не гуляла, нужен очень шустрый и точный смеситель. Иначе при переходных процессах тот же ПИД будет постоянно рыскать, отдаваясь в ощущениях. Я боюсь их, и трехходовиков, и ощущений, натерпелся на колонке С трех накопителей получается стабильная температура, пока не будет исчерпан весь запас, и если один из них на дезинфекции, риск ошпариться невелик. Постоянно высокая температура - это потери как энергии, так и ресурса ТЭНов.
Sancho писал(а):проанализируйте, увидите
Да, видел, оставил на десерт, пока схема действительно реализована без обработки этого подмножества, поскольку пересечения нет: догрев идет до полуночи, дезинфекция - следом за ней. Но мысль Вашу понял, интересная. Успел даже ее часть применить, пока ждал ответов, во вложении. Чуть позже изучу, спасибо!
rw6cm писал(а):и все будет ок
Не нашел темы и не сообразил в редакторе. Потому откатился до не самой свежей копии. Но нет худа без добра - пока снова рисовал, перо легло иначе и получилось даже лучше. Прав был:
pan писал(а):каждый конечно сделает одно и то же по разному
Думаю, с третьего раза нарисую иначе. Но "Я не волшебник, я только учусь" (с)

А вообще, насколько разумно доверять Ардуино такие вещи, как котел? Не с точки зрения газовой безопасности, там все штатное и котлу безразлично, что манипулирует его сознанием - жидкостный термостат или робот. У него своя группа безопасности. Я имею в виду зависания, ведь можно не только разморозить систему, но и заварить в ней чай
Сейчас у меня на котел завязан Овеновский погодозависимый ТРМ-151, но у него нет поправки на теплоинерционность здания, а это та еще беда. Пока справляюсь с ней с помощью силикатного кирпича. Но не то это, не то, буду писать свой блок внесения поправки, чтобы все учесть. Может и получится.
В любом случае, спасибо за помощь!

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 18:31
support
rw6cm писал(а):Это баг. Писал об этом. Автор вроде должен был устранить, но видно не успел.
Исправил, в следующей версии её не будет.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 11 дек 2017, 21:01
Dev1
Alias писал(а):Чтобы температура воды не гуляла, нужен очень шустрый и точный смеситель. Иначе при переходных процессах тот же ПИД будет постоянно рыскать, отдаваясь в ощущениях.
Вообще то он термостатический и никакого привода, а тем более ПИД регуляторов не требует.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 12 дек 2017, 11:35
krom23
Alias писал(а):Допустим, если на всех трех выходах 1, то значение переменной - 3.
Есть такой блок Дешифратор.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 12 дек 2017, 12:03
Sancho
krom23 писал(а):Цитата Alias ()Допустим, если на всех трех выходах 1, то значение переменной - 3.
Есть такой блок Дешифратор.
Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.
Или таблицу, или ...
Проще, как есть в проекте, на selector

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 12 дек 2017, 12:43
Dev1
Sancho писал(а):Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.Или таблицу, или ...
Может быть шифратор...

[spoiler=Спойлер]Блок "Номер входа"

[img]file:///E:/SOFT/FLProg_beta/FLProg_3-0-2/Help_html/rus/images/InputNumberBlock1.PNG[/img]

Блок служит для определения входа, на котором присутствует высокий логический уровень. На выходе блока будет значение соответствующее номеру такого входа. Если высокого уровня не будет ни на одном входе блока, на выходе будет 0.[/spoiler]

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 11:03
Alias
Dev1 писал(а):Может быть шифратор
Действительно! Ведь я смотрел на него и что-то упустил. Мало того, этот вариант меньше отнимает ресурсов. Я правильно оцениваю эффективность? Скопировать нужную плату в новый проект, "Компилировать проект" -> в IDE "Проверить" и сравнить в нижнем черном окне цифры для разных вариантов.
В моем случае с Аналоговым переключателем и Шифратором разница соответственно такая:
Скетч использует 474 байт / 466 байт
Глобальные переменные используют 15 байт / 13 байт
Считаю правильным сразу по возможности оптимизировать схему, спасибо за подсказку! Скриншот платы с двумя вариантами для удобства сравнения в приложении.
И еще можно вопрос по подходу к проектированию? На анализе логики не настаиваю, но если будут ошибки, готов к советам. Схема тоже во вложении. Я создал массивы, указав им конкретный тип, однако, судя по цвету связей, пошла пересортица. Как этого избежать, нужно ли конвертировать или пусть как есть остается?

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 12:19
krom23
Sancho писал(а):Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.
Вы верно не прочли описание блока. И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор. Если надо уменьшить число(разрядность) входов, то на входе старшего разряда(D4(8)) устанавливаем "0" и получаем восьмеричный дешифратор. А с числами полученными на выходе можно производить любые операции.

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 13:02
Sancho
по скрину - Нижние компараторы(сравнение) заменить на один ==23, убрав заодно &.
По шифратору - попробуйте ещё раз прочитать мой пост 10, и ответить по Вашему шифратору - какой номер графика будет ночью вечером при ветре?
По горелкам - зачёт.
krom23,
krom23 писал(а):Вы верно не прочли описание блока. И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор. Если надо уменьшить число(разрядность) входов, то на входе старшего разряда(D4(8)) устанавливаем "0" и получаем восьмеричный дешифратор. А с числами полученными на выходе можно производить любые операции.
Вам также нужно ответить на мой выше озвученный вопрос.
То, что описывает топикастер изображено на моём аватаре!!!! Только четырёх-разрядный(на аватаре).
А потом уже шифраторы....
P.S. Если Вы узнаете сами, без инета, то, что изображено на нём, то Ваши вопросы касательно моих знаний шифраторов/дешифраторов должны отпасть...
И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор.
это всё-таки ШИФРАТОР  , т.к. при преобразовании нескольких единичных сигналов в более сложные штучные (byte,int) происходит их "шифрование"

Добавлено (13.12.2017, 13:02)
---------------------------------------------
P.S. Дополню насчёт селекторов.
Не смотрел( не создавал повтор платы из картинки топикастера с sel и шифратором), но при правильном расположении строк в коде при "ветре" вычисления, укладывается ли время в диапазон, выполнятся не будут, вообще, т.к. они будут не нужны, т.е. будут стоять после else в части кода sel .....

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 13:48
Alias
Sancho писал(а):заменить на один ==23
Я пока оставил так на случай, если придется расширить интервал, например, 22-23. Хотел было сделать на какой-нибудь таблице состояний, но как-то громоздко получается. Возможно, и переделаю. Найду более красивое решение - покажу.
Sancho писал(а):какой номер графика будет
Второй. Тот, что добавит температуры теплоносителя. Если ветер сильный, тут уже не до экономного режима. Хотел добавить логику, чтобы при ветре ночью вместо первого был  дневной нулевой режим, а днем - усиленный второй, но пока оставил. Тем более, что вообще не знаю, на чем сделать датчик ветра. Понятно, что это будет на герконе или оптике с большой интегрирующей цепочкой. Поэтому хвост и подвис. Но спасибо за беспокойство!
Про аватарку заинтриговали, но слишком мелко, чтобы понять:)
Sancho писал(а):т.е. будут стоять после else в части кода sel
Вы про уже скомпилированный код? Недопонял, о каком времени речь. Про то, что до того, как дойдет до опроса переменной Ветер, на выходе платы уже будет принято решение о Режиме? Мне всегда было слегка не понятно, как компилируется код, но если в блоке есть входы, все они должны ведь учитываться?
ЗЫ Перерисовал, если правильно понял
ЗЫ2 Во вложении два варианта - на компараторах и таблице Номера режимов поплыли, но это не критично. Несмотря на то, что элементов поубавилось, ресурсов поубавилось тоже:
Скетч использует 466 / 498 байт

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 14:18
Sancho
Alias писал(а):Перерисовал, если правильно понял
Немного не правильно. Я имел ввиду вариант с селекторами. На скрине здесь всё было верно.
krom23 писал(а):Вы верно не прочли описание блока
Каюсь, не читал. А если Вы нажмёте описание и сумеете мне показать, что это шифратор, слово такое в тексте или на скринах, - буду должен.... Даже в справке - номер входа, что, конечно, понятнее.
Хотя по описанию это приоритетный шифратор (или шифратор приоритета). Думал, такого в FLProg нет
Была мысль, что ЭТОТ ШИФРАТОР упаковывает биты в integer, что иногда НАМНОГО НУЖНЕЕ....

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 14:39
Alias
Совсем запутался Который же вариант более надежен?

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 14:52
Sancho
Alias писал(а):Совсем запутался
Ок, начнём с простого.
Как должна вести себя система(график) по случаю двух слагаемых ветер и время?
1. всего 3 режима: эконом, норма, тепло.  По времени = эконом/норма, ветер + по времени = норма/тепло.
2. ... ?

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 15:09
Alias
Вообще, днем нормальный режим. Ночью - экономный. Однако, в случае сильного ветра - тепло. Сейчас реализовано по логике с приоритетом во ветру, то есть при ветре уже не важно, ночь сейчас или день.
Позже введу избирательность, то есть +1 к любому режиму при ветре.
Я то недопонял и переспросил про схему в плане компиляции кода, мол, одна из цепочек логики на плате может просто проигнорироваться по непонятной мне причине.
На скриншоте в предыдущем сообщении опечатка в блоке CD - перепутаны входы. Просто рисовал иллюстрацию и не заметил сразую

Подход новичка к программированию на примерах Графика ГВС

Добавлено: 13 дек 2017, 15:58
Sancho
Опечатку видел, догадался. На нижнем - при ветре 0 2.
Итого, схемы по функционалу равнозначны, смотрите размер.
По коду. При генерации кода для IDE почему-то всегда flprog пытается вставить в IF максимальное условие, а в else минимальное, а не наоборот. Если сделать наоборот, то при определённых условиях, if=true, время цикла заметно сократится.
Примеры:
С switch оригинал от FLProg
[spoiler=Спойлер]

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

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
int _swi3;
int _swi4;
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_swi3=1;}
else
{_swi3=0;}
if(_gtv6)
{_swi4=2;}
else
{_swi4=_swi3;}
_gtv13 = _swi4;
}
[/spoiler]
С switch переделан в минимум
[spoiler=Спойлер]

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

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if(_gtv6)
{_gtv13=2;}
else
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_gtv13=1;}
else
{_gtv13=0;}
}
[/spoiler]Чуть позже попробую ещё один вариант...

P.S. Правильный вариант от FLProg но с рисунка внизу поста
[spoiler=Спойлер]

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

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
int _swi1;
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if (_gtv6) {
_gtv13 = 2;
}
//Плата:2
//Наименование:Time
//Комментарии:Временные режимы
if (_gtv6 == 0) {
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_swi1=1;}
else
{_swi1=0;}
_gtv13 = _swi1;
}
}
[/spoiler]