Управление отоплением 0-10в / ПИД регулятор


#1

Добрый день!

Если взять вот такое устройство вывода - 6 каналов 0-10в, и подключить к нему вот такую элекротермическую головку - управление 0-10в для 3х ходовых клапанов, тепмературу мерить по 1-wire … то встает вопрос, как правильно реализовывать на wiren board ПИД регулятор? насколько я понял rules engine stateless, где хранить прошлые значения тепературы? где (как) правильно его реализовывать? или правильно взять готовый ПИД регулятор и просто туда отправлять целевую температуру?

схема классическая - 5 контуров отопления с 3х ходовыми клапанами, на подаче теплоаккумулятор - надо управлять трёхходовыми в зависиомости от множетсва факторов - температура на улице, температура воздуха, наличия людей, фазы луны и тд


#2

Неторопливо присматриваюсь к Danfoss’овскому термостату с Z-Wave. Мне кажется, что он должен решать эту задачу полностью (но могу ошибаться).

Если идти по Вашему пути, то есть несколько вариантов:

  • Найти готовый ПИД регулятор (тогда зачем на вообще WB, RS-485 etc ?)
  • Написать свой скрипт для движка правил. Движок не совсем stateless. Все глобальные переменные скрипта живут постоянно, плюс есть история mqtt. Я бы хранил последние показания тупо в массиве скрипта. Ну и для того, чтобы при перезапуске скрипта, движка правил не потерять историю - при старте поднимал её из базы…
  • Третий, более сложный, но более надежный путь - написать отдельный сервис, который реализует ПИД регулятор, хранит сколько-то истории и т.п. Плюс в том, что можно найти готовую проверенную реализацию ПИД. Мне кажется написать самому на JS будет не очень просто, а уж тестировать и отлаживать его работу…

#3

Оно не stateless, там можно хранить состояния. Там есть обычные глобальные переменные, которые сохраняются между выполнениями правил.

Так что можно реализовать и там.


#4

Добрый день!
Тоже хочу сделать погодозависимую автоматику. лучше http://www.salus-controls.ru/ пока не нашел. есть какие идеи? Если кто -то решил - прошу отозваться. У меня регулирование на коллекторе. Руками уже устал регулировать.


#5

Определитесь с требованиями к системе, потом смотрите что подходит, потом компромиссы и срезание углов
Я вот решил есть кактус :slight_smile:


#6

у меня все просто - 2 коллектора по 8 и 4 выхода. нужно управлять ими по датчикам в комнате от wiren’a.
а как это сделать по какому алгоритму я не знаю. чем регулировать 8 и 4 выхода 0-10в?


#7

Я этой задачей занимаюсь как раз сейчас. Котёл в сцепке с уличным датчиком регулирует температуру теплоносителя. В доме три контура отопления на каждый этаж. Стоят балансировочные клапаны Ballorex с сервоприводом 0-10в, которые управляются контроллером wb5. На каждом этаже выведены датчики температуры. Остаётся только управлять выходом 0-10в «условно пропорционально» в зависимости от считываемых показаний температурных датчиков.
Я написал алгоритм управления клапанами с вычислением оптимального положения сервоприводов с тонкой подстройкой при подходе к заданной температуре ( отклонение < 0.8 гр) и грубой, если отклонения больше чем на градус. Вообщем есть расчетные значения пропускной способности клапана Q (л/ч), которые программа корректирует и ищет равновесное положение. Здесь важно было изначально правильно подобрать клапаны с нужными характеристиками.
Теперь я отлаживаю свой алгоритм. Если интересно, то спрашивайте. Могу позже поделиться результатами.


#8

Добрый день!

Правильно ли я понимаю, что вам нужно Modbus-устройство с четырьмя выходами 0-10В?
У нас есть https://contactless.ru/wiki/index.php/WB-MAO4_Modbus_Dimmer , но оно пока не в свободной продаже - образцы отдали нескольким клиентам, ждём отзывов.


#9

Добрый день!

Очень интересно. А какие именно модели клапанов у вас установлены, и почему их выбрали?


#10

Очень интересно!!! я все думал что нужно какой либо пид регулятор поставить которым нужно управлять по кы485,но он работает напрямую с датчиками. А мне нужна информация с датчиков в WB, поэтому и регулировать нужно по алгоритму и давать команды уже непосредтсвенно из WB. если будет управление от wiren - возьмем его.


#11

BROEN Ballorex Dynamic с сероприводами 24В АС 0-10В
У приводов нет механической части, они работают по принципу термоголовок у радиаторов (с мембраной). Да, реагируют 2-3 минуты на изменение управляющего сигнала, зато долговечные, тихие и стоили сравнительно недорого. Тут не надо управлять подмешиванием воды с обратки. Тут идет регулирование потока (литров/час) на подаче.


#12

Евгений, все-таки глюк с отображением положения ползунка (MOD) в интерфейсе подтверждается. Ставлю, к примеру значение 10000. Захожу в скрипт, правлю, открываю раздел Devices/Analog Outputs и вижу, что значение сохраняется (еще и не входит целиком в окно), а ползунок стоит в нулевой точке. Исправьте, плиз


#13

добрый день!
как я понимаю BROEN Ballorex Dynamic регулируют температуру пропускной способностью - расходом, это не всегда подходит. Например когда котел работает на теплый пол и батарею, на теплый пол надо 35 градусов, на батарею - 50. может я не верно представил всю схему, но таким клапаном в теплый пол все равно поступит 50 градусов, просто с меньшей скоростью, формально количество тепла будет правильное, но неравномерность прогрева и т.д.

А не выложите ваш алгоритм условно пропорционального регулирования? интересно посмотреть. я выкладывал свой тут


#14

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

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


#15

Если позволяют правила - вот товарищ (обращение) сделал контроллер на ардуино. но это не главное - он запихнул туда программный pid регулятор на node.js. пока не разбрался, но выглядит красиво.


#16

Господа разработчики, скажите, если я выставляю значение ПИД регулятора, то на выходе напряжение всегда будет неизменным пока я не поменяю его на новое и не может быть так, что оно падает до нуля? Вопрос возник потому, что мои тестируемые приводы по какой-то пока не установленной причине произвольно закрываются, хотя управляющий сигнал выше 0В.


#17

Удалось разобраться с управлением приводами и логикой ПИД регулятора? Очень интересует этот вопрос, т.к. собираюсь реализовать подобное. Подскажите пожалуйста, если не сложно.


#18

Добрый день. Разобрался. Контроллер все четко выдаёт в диапазоне от 0 до 10в. У меня проблема была с питанием приводов клапанов отопления из-за странных особенностей, с которыми я не до конца разобрался. А так все просто и надежно.
Я не знаю, что Вам рассказать даже. В качестве приводов и клапанов я брал комплект серии Ballorex компании BROEN. По приводам надо смотреть, чтобы Управление было 0-10, способ открытия открытия и закрытия при отсутствии питания и само напряжение. Клапан я выбирал тоже исходя из пропускной способности своих контуров. У клапанов есть ручной режим управления для страховки - головка привода скидывается за секунду и можно вручную призакрыть клапан. А так я написал скрипт, отслеживающий температуру на этажах и по их значениям меняю положение сервопривода управляющим сигналом 0-10в.


#19

Спасибо! А управляющая логика реализована как ПИД регулятор или просто при превышении порога - отключаем, при понижении - включаем? Если первый вариант, то можете поделиться логикой или хотя бы указать на какие моменты нужно обратить внимание и что было труднее всего отладить?


#20

Вот основная функция, которая все и выполняет. Алгоритм построен по принципу поиска оптимального положения открытия клапана (нулевая точка) в процессе отслеживания изменения температуры (delta_t) и сравнения с предыдущими замерами через заданный интервал времени (я взял 15мин, а хотел и время проверки менять, но в cron не получилось подставить динамическую переменную). А дальше я смотрю на скорость изменения температуры и смещаю эту нулевую точку (SM_ZERO) с целью найти баланс. Чем меньше значение изменения температуры через установленный и6тервал времени, тем тоньше коррекция привода и наоборот.
Думаю все ясно в алгоритме. Уже год работает и колебания температуры доходят до 0,5градуса в длинном диапазоне установленной температуры. Бывает влияние ветра или приточно-вытяжной вентиляции на изменение температуры в помещении, поэтому я взял за норму находить ту самую нулевую отметку, которая стремится сместиться. На этом и построено ПИД регулирование.

function get_valve_dac($i, delta_t, delta_t1) {
var k_valve = 0;
var $t_diff = (delta_t-delta_t1);// Находим величину изменения температуры по истечению интервала времени
// (разницу между delta_t текущего и предыдущего вычисления)

// $i - номер контура отопления (всего 3)

if (delta_t > 0.3) {SM_ZERO[$i] = 0; time_interval[$i] = 30;} 
else
if (delta_t < -0.3) {SM_ZERO[$i] = 1; time_interval[$i] = 30;}
else
    if (delta_t > 0.1 && $t_diff > 0) {k_valve = 0.1 ;time_interval[$i] = 15;}
    else
    if (delta_t < -0.1 && $t_diff < 0) {k_valve = -0.1 ;time_interval[$i] = 15;}
    else
    if (Math.abs($t_diff) >= 0.15) {k_valve = $t_diff.toFixed(1); time_interval[$i] = 10;}
    else
    if (Math.abs($t_diff) < 0.15 && Math.abs($t_diff) >= 0.1) {k_valve = Math.ceil($t_diff)*0.15; time_interval[$i] = 15;}
    else
    if (Math.abs($t_diff) < 0.1 && Math.abs($t_diff) >= 0.05) {k_valve = $t_diff.toFixed(1); time_interval[$i] = 20;}
    else
    if (Math.abs($t_diff) < 0.05 && Math.abs(delta_t) <= 0.1) {k_valve = Math.ceil($t_diff)*0.05; time_interval[$i] = 25;}
    else  {k_valve = 0; time_interval[$i] = 30}
          
SM_ZERO[$i] -= k_valve;   
if (SM_ZERO[$i]>1) {SM_ZERO[$i]=1} else if (SM_ZERO[$i]<0) {SM_ZERO[$i]=0}

dev["wb-dac"]["MOD"+Mod_id[$i]] = SM_ZERO[$i]*10000; //Перевод в миливольты [0-10000 млВ]
log("  ➥  [TEMP has changed on: {}°, TEMP efficient: {}°. ZERO point corrected on: {}. Next checking in {}min. Signal level: {}V]",$t_diff.toFixed(2),delta_t.toFixed(2),k_valve,time_interval[$i],SM_ZERO[$i]*10);
return (delta_t);

}