Опрос


Что для Вас Умный Дом?


Результаты


Реклама


Автоматизация системы отопления

24/11/2008 16:25:31

Не пора ли подбросить дров?

Теперь у нас есть информация от температурных датчиков и есть схема реализации исполнительного механизма, управляемого ключа на базе 1-wire. Нельзя ли управлять системой отопления? Легко!
Электропривод для смесителя ESBE В отличие от включения/выключения света регулирование системы отопления во-многом зависит от того, какое применяется отопительное оборудование. Очевидно, что регулировка мощности ТЭНов осуществляется не так, как регулировка посредством трех-ходовых смесителей. В моей системе используются 3-х ходовые смесители ESBE. 3-х ходовой смеситель - это кран, который в подачу подмешивает обратку. Этим достигается нужная температура подачи. Крутить этот кран можно вручную, а можно с помощью электропривода, например, той же фирмы ESBE. Приводы ESBE бывают с 2-х точечным, 3-х точечным регулированием, а также пропорциональным регулированием 0-10В. В нашем случае самым простым способом является 3-х точечное регулирование с питанием от 220В. Принцип простой. Замыкаем один контакт - привод движется в одну сторону. Замыкая другой контакт - в противоположную. Как не трудно догадаться нам потребуется всего лишь один модуль на бахе двухканальной микросхема DS2406P, чтобы реализовать такую регулировку на практике.

Устройство привода ESBE ARA661

Привод ESBE ARA661 со снятой крышкой. Как видно, устройство не очень сложное, но зато высокая цена.

Концевые выключатели привода ESBE ARA661

Концевые выключатели привода.
 

Несколько слов о механическом соединении 3-х ходового серии 3G и привода. Компания ESBE полагает, что достаточно одного фиксатора-упора, который вкручивается вместо штатного болта в 3-х ходовой, чтобы обеспечить нормальную работу привода. На деле оказалось, что установленный на кран привод с одним упором немного люфтит. Вроде бы ничего страшного, но самая большая неприятность заключается в том, что в момент включения привода, первые несколько секунд (около 10), он сначала выбирает люфт, как бы поворачивая сам себя, а уже потом начинает крутить кран. Этот эффект возникает в случае, если автоматика поворачивает привод в направлении, противоположном предыдущему включению. Такое положение вещей меня не устраивало. Потребовалось бы программно учитывать направление предыдущего включения и добавлять время работы привода, необходимое для компенсации люфта. Поэтому из подручных средств я изготовил еще две упора. Пазы для упоров в приводе совпадали только с одной стороны и в центре. Что получилось видно на фотографиях.

3-х ходовой ESBE 3G

Вот так предлагает делать фирма ESBE
для 3-х ходовых серии 3G

А вот так предлагаю делать я

После модификации привод сидит по-нашему, по-русски, железно! Никакого люфта. Это позволит программному обеспечению более четко, плавно и предсказуемо регулировать температуру теплоносителя в контуре.

Три упора - родной и два самодельных

3-х ходовой ESBE VRG

В 3-х ходовых серии VRG этой проблемы нет.
Крепление привода надежное

У привода ESBE нормируется время полного открытия. Это значит, что, замыкая контакт на 10 секунд, мы можем предположить в каком положении находится привод. Но мы можем судить о положении привода не только так. Достаточно повесить температурный датчик DS18B20 на подачу котла и такой же температурный датчик на подачу в контур после смесительного крана, чтобы достоверно говорить о положении привода и крана. Но даже и положение привода, по большому счету, знать вовсе не обязательно. Ведь если стоит задача поддержания в доме постоянной температуры в 24 градуса, мы можем крутить привод в ту или иную сторону, не заботясь о его текущем положении. В случае достижения крайних положений, концевики привода автоматически выключат электродвигатель.

Меня часто спрашивают о схеме подключения ESBE ARA661.
У привода 3 провода, окрашенные в разные цвета
Синий (BU) - N (ноль)
Черный (BK) - Подается 220. Движение привода против часовой стрелки
Коричневый (BN) - Подается 220. Движение привода по часовой стрелке
 

Плата 2-х канального ключа 1-wire для управления электроприводом 3-х ходового без корпуса.

Для управления отоплением я использовал 2-х канальный компонент DS2406P компании Dallas, предназначеный для работы в сетях 1-wire. На фотографии выше показан простой модуль на базе этого компонента. В текущий момент вся система управления строится на двух таких модулях. Один модуль управляет приводом 3-х ходового основного контура отопления (один канал для увеличения температуры, другой - для уменьшения). Второй модуль необходим для автоматического включения насоса контура (канал А) и запрос тепла от котла (канал Б). Кроме того, с помощью несложной платы на базе MAX232A удалось подключить к программе управления котел Vaillant VK INT, что дало мне возможнось напрямую задавать температуру работы котла. Статья о подключении котла Vaillant  к компьютеру.

Схема управления отоплением с помощью модулей 1-wire

Строго говоря, для регулирования температуры радиаторов отопления достаточно обеспечить автоматическое управление только приводом 3-х ходового крана с помощью 2-х канального модуля на базе компонента DS2406P. Однако, в целях экономии энергоресурсов в межсезонье я решил управлять также насосом системы управления и котлом. Это позволяет снизить затраты на электроэнергию и газ. Программа управления определяет, когда кран находится в закрытом состоянии и отключает насос и котел. Весной и осенью эта функция востребована, когда днем еще (или уже) тепло, а ночью необходимо подавать 35-40 градусов в систему, для поддержания постоянной комфортной температуры в доме. Кроме того компьютер управляет температурой подающей линии котла. Сделано это для того, чтобы не допускать перегрева котельного контура (в моей системе используется схема с гидравлическим разделитетем) в случае, когда разбор тепла минимален. Наименьшее значение максимальной температуры подачи для моего котла 60 градусов, что, впрочем, вполне достаточно для решения этой проблемы. Даже в случае полного отсутствия потребления тепла, температура в котельном контуре не превышает 73 градусов.

Прежде чем перейти к краткому описанию алгоритма приведу принципиальную гидравлическую схему системы отопления. В моей схеме применяется так называемый гидравлический разделитель. Это элемент, который позволяет разделить котельный (генерирующий тепло) контур и отопительный, радиаторный (потребляющий тепло) контур. Гидравлический разделитель (или по-другому "гидрострелка") представляет из себя кусок трубы с 4 отверстиями. Слева подключается подача и обратка котельного контура, а справа подача и обратка потребляющего коллектора (к которому может быть подключено любое количество контуров). Принцип работы прост. Если сделан правильный расчет по расходу воды, то в режиме максимального потребления тепла, подача котельного контура целиком поступает в подачу потребляющего коллектора. В случае если котел вырабатывает избыточное тепло, прикрылись 3-х ходовые, отключились некоторые контуры, теплоноситель частично поступает в потребляющий контур, а частично начинает циркулировать только в котельном контуре (подача поступает в обратку). Если же расход воды в потребляющем контуре выше чем расход воды в котельном, то потребляющий контур начинает подсасывать свою же обратку. Такая схема уникальна тем, что позволяет полностью избавиться от нежелательных эффектов вызванных ненормированным расходом теплоносителя через котлы, избежать гидравлические удары. Например, представим, что подача теплоносителя в потребляющие контуры перекрыта совсем. В этом случае ничего страшного не произойдет, котельный контур будет гонять теплоноситель по своему "малому" кругу. Эта схема крайне надежна, но что самое важное - чрезвычайно удобна с точки зрения автоматического региррования. Мы можем как угодно крутить краны, включать-выключать насосы, устанавливать любую температуру котла зная, что расход воды через котлы будет всегда одинаковым. Схема с гидравлическим разделителем также очень удобна в случае использования нескольких котлов. Грубо говоря, тот или иной потребляющий контур просто отбирает то количество тепла, которое ему нужно, а котельный контур автоматически с помощью любого количества котлов пытается обеспечить запрашиваемое количество тепла.

Схема отопления с использованием гидравлического разделителя (гидрострелки)

Схема отопления с использованием гидравлического разделителя (гидрострелки)
Кликните, чтобы увеличить

Алгоритм программы управления построен на анализе температуры на улице и внутри. В этом смысле алгоритм в некотором роде является погодозависимым. Дело в том, что в отличие от промышленных решений, где температура за бортом вляется главным фактором регулирования, я применил несколько иной подход. Главным фактором в моей программе является температура внутри помещения. Замечено, что при одной и той же температуре на улице и в системе отопления, температура в помещении может быть разной. Например, при -10 и сильном северном ветре температура в доме будет значительно ниже, чем при -10 и отсутствии ветра. Естественно, готовые промышленные контроллеры не могут учитывать скорость и направление ветра и влажность, поэтому иногда хозяева домов жалуются на неправильно выбранную температуру в системе отопления.

Далее, моя программа учитывает не моментальные текущие значения температуры на улице и внутри помещения, а средние за определенный промежуток времени. Для улицы это 3 часа, для помещения - 1 час. Сделано это для того, чтобы минимизировать воздействия случайных факторов. При использовании высокочувствительных датчкиков температуры, таких как DS18B20, значение текущей температуры может быстро менятся, если, например, мы на несколько секунд открыли окно или поставили на плиту разогреть суп.

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

Для мониторинга температуры теплоносителя в подаче конкретного контура я использую те же самые датчики DS18B20 как накладные. Крепление датчика выполнено обычными пластиковыми хомутами. Датчик установлен на термопасту, которую можно купить в любом компьютерном магазине. Сверху место крепления датчика можно обернуть слоем утеплителя, например, пенополиэтилена. Это увеличит точность показаний. В такой конфигурации датчик отображает вполне реальную температуру теплоносителя. Использовать показания датчика на подаче в программном алгоритме управления отоплением сложно так как гистерезис котла +6-2 градуса относительно текущей установки. Но в целях мониторинга и понимания текущего состояния системы отопления эта информация очень важна, особенно вкупе с показаниями датчика на обратке контура и подаче котла, считанными одновременно.

Температурный датчик DS18B20 для системы отопления

В текущий момент программа управляет только одним контуром отопления, но построена таким образом, чтобы управлять несколькими контурами. В базе данных содержатся общие настройки системы отопления, а также настройки для каждого контура. Расчет подающей линии котла, а также комфортной температуры в помещении погодозависимые. Замечено, что если при -20 на улице комфортная температура внутри +23 градуса, то при +10 этого уже много. Видимо, имеет значение еще влажность и температура стен.

 Текущий алгоритм программы как есть (от 31.10.2010 года)

<?

$index = 2; 

require_once("page.php");
include("key.php");
$start = 1;

function log_heat($msg)
{
	$log = fopen("/var/www/log_heat.log", "a");
	fwrite($log, "".date('d/m H:i:s')." $msg");
	fclose($log);
} 

while ( true )
{
	$heat_conf_id = get_id_cl("heat_conf", 1);
	$heat_mode = show_list($heat_conf_id, "#heat_mode#", "", 1, "", 1);
	$heat_boiler = show_list($heat_conf_id, "#heat_boiler#", "", 1, "", 1);
	$heat_boiler_status = show_list($heat_conf_id, "#heat_boiler_status#", "", 1, "", 1);
	$heat_boiler_temp = show_list($heat_conf_id, "#heat_boiler_temp#", "", 1, "", 1);
	$heat_boiler_temp_calc_db = show_list($heat_conf_id, "#heat_boiler_temp_calc#", "", 1, "", 1);
	$boiler_id = get_id_cl("boiler", 1);

	$eco_mode = show_list(get_id_cl("keys", 1), "#key_pio#", "", 1, "key_label='gsm_arm'", 1);

	if ( $eco_mode == 1 )
	log_heat("Включен экономичный режим");

	# Восстановление состояния котла в случае некорректного выключения компьютера
	if ( $start == 1 )
	key_sw($heat_boiler, $heat_boiler_status);

	$my_p = page(0, "", "heat_circ");
	$circ_ContID = $my_p['ContID'];	
	$circ_ListID = $my_p['ListID'];	

	$circ_pump_total = 0;

	$my_p = page(0, "", "temp_out");
	$my_temp = $my_p['ContID'];
	$my_temp_list = $my_p['ListID'];

	$sql="	SELECT SUM(dev_value)/COUNT(tmpID)
		FROM tmp_$my_temp_list
		WHERE ContID=$my_temp AND dev_date>=(NOW() - INTERVAL 2 HOUR) AND dev_date<=NOW()
		ORDER BY dev_date";
	if(!($result=mysql_query($sql,$conn)))
	{}
	else
	{
		while(($data=mysql_fetch_row($result)))
		$temp_out = number_format(round($data[0], 2), 2);
	}


	# Делаем рассчет максимальной температуры подающей линии котла
	if ( $heat_boiler_status == 1 )
	{
		$heat_boiler_temp_new = $heat_boiler_temp;
		$heat_boiler_temp_calc = round(8 - $temp_out + 60);
		if ( $heat_boiler_temp_calc < 60 )
		$heat_boiler_temp_calc = 60;
		elseif ( $heat_boiler_temp_calc > 70 )
		$heat_boiler_temp_calc = 70;
		//elseif ( $heat_boiler_temp_calc > 83 )
		//$heat_boiler_temp_calc = 83;

		log_heat("Расч. t котла = ".$heat_boiler_temp_calc);

		# Изменяем расчетную температуру подачи котла не более чем на градус
		if ( $heat_boiler_temp_calc > $heat_boiler_temp )
		$heat_boiler_temp_new = $heat_boiler_temp + 1;
		elseif ( $heat_boiler_temp_calc < $heat_boiler_temp )
		$heat_boiler_temp_new = $heat_boiler_temp - 1;
		else
		$heat_boiler_temp_new = $heat_boiler_temp;

		## Устанавливаем новую расчетную температуру подачи котла 
		if ( $heat_boiler_temp_calc_db != $heat_boiler_temp_new )
		{
			write_list($heat_conf_id, "heat_boiler_temp_calc='$heat_boiler_temp_new'", "tmpID>0");

			log_heat("Новая t котла = $heat_boiler_temp_new");
		}
	}

	$sql="	SELECT tmpID AS circ_tmpID, circ_title, circ_type, circ_summer, circ_winter,
		circ_hyst, circ_temp_calc, circ_mix_up, circ_mix_down, circ_pump,
		circ_pump_status, circ_temp_in, circ_flap, circ_eco
		FROM tmp_$circ_ListID
		WHERE ContID=$circ_ContID";
	if(!($result=mysql_query($sql,$conn)))
	{}
	else
	{
		while(($data=mysql_fetch_assoc($result)))
		{
			foreach ($data as $key => $val)
			$$key = $val;			

			# Восстановление состояния насоса в случае некорректного выключения компьютера
			if ( $start == 1 )
			key_sw($circ_pump, $circ_pump_status);

			$circ_pump_total = $circ_pump_total + $circ_pump_status;


			if ( $circ_data[$circ_tmpID]['delay'] <= 0 )
			{

				$my_p = page(0, "", $circ_temp_in);
				$my_temp = $my_p['ContID'];
				$my_temp_list = $my_p['ListID'];

				if ( $circ_type == "Теплый пол" )
				{
					// Нестандартная функция. Смотрим какая температура на 2 этаже.
					$sql1="	SELECT SUM(dev_value)/COUNT(tmpID)
						FROM tmp_$my_temp_list
						WHERE ContID=54 AND dev_date>=(NOW() - INTERVAL 30 MINUTE) AND dev_date<=NOW()
						ORDER BY dev_date";
					if(!($result1=mysql_query($sql1,$conn)))
					{}
					else
					{
						while(($data1=mysql_fetch_row($result1)))
						$temp_in_sf = number_format(round($data1[0], 2), 2);
					}

					$new_circ_temp_calc = $circ_summer;

					// Считываем температуру комфорта 1 этажа
					$circ_temp_calc_ff = show_list($circ_ContID, "#circ_temp_calc#", "", 1, "tmpID=1", 1);

					if ( empty($temp_in_sf_old) )
					$temp_in_sf_old = $temp_in_sf;

					// Изменяем базовую температуру
					if ( $temp_in_sf > $circ_temp_calc_ff - 0.1 )
					{
						if ( $temp_in_sf < $temp_in_sf_old )
						log_heat("$circ_title: Температура понижается. Наблюдаем");
						else
						{
							$new_circ_temp_calc = $circ_summer - 0.1;
							log_heat("$circ_title: Понижаем расчетную температуру подачи: $new_circ_temp_calc");
						}
					}
					if ( $temp_in_sf < $circ_temp_calc_ff - 0.3 )
					{
						if ( $temp_in_sf > $temp_in_sf_old )
						log_heat("$circ_title: Температура повышается. Наблюдаем");
						else
						{
							// Базовая коррекция
							$temp_corr_tp = 0.1;
							// Если разница между расчетом 1 этажа и фактом 2 этажа более 0.3 градуса, повышаем на 0.2 градуса
							if ( ($circ_temp_calc_ff - $temp_in_sf) > 0.4 )
							$temp_corr_tp = 0.2;
							// Если разница между расчетом 1 этажа и фактом 2 этажа более 0.4 градуса, повышаем на 0.3 градуса
							if ( ($circ_temp_calc_ff - $temp_in_sf) > 0.5 )
							$temp_corr_tp = 0.3;

							$new_circ_temp_calc = $circ_summer + $temp_corr_tp;
							log_heat("$circ_title: Повышаем расчетную температуру подачи на $temp_corr_tp: $new_circ_temp_calc");
						}
					}
					$temp_in_sf_old = $temp_in_sf;

					if ( $new_circ_temp_calc >=61 )
					{
						log_heat("$circ_title: Внимание! Расчетная температура подачи не можем превышать 60 градусов!");
						$new_circ_temp_calc = 60;
					}

					if ( $new_circ_temp_calc != $circ_temp_calc )
					{
						write_list($circ_ContID, "circ_summer='$new_circ_temp_calc'", "tmpID=$circ_tmpID");
						write_list($circ_ContID, "circ_winter='$new_circ_temp_calc'", "tmpID=$circ_tmpID");
						$circ_summer = $new_circ_temp_calc;
						$circ_winter = $new_circ_temp_calc;
					}

					$temp_interval = 5;
				}
				else
				$temp_interval = 30;

				$sql1="	SELECT SUM(dev_value)/COUNT(tmpID)
					FROM tmp_$my_temp_list
					WHERE ContID=$my_temp AND dev_date>=(NOW() - INTERVAL $temp_interval MINUTE) AND dev_date<=NOW()
					ORDER BY dev_date";
				if(!($result1=mysql_query($sql1,$conn)))
				{}
				// echo ("$sql1");
				else
				{
					while(($data1=mysql_fetch_row($result1)))
					$temp_in = number_format(round($data1[0], 2), 2);
				}

				# Сохраняем температуру в помещении
				$sql1="	SELECT dev_value
					FROM tmp_$my_temp_list
					WHERE ContID=$my_temp
					ORDER BY dev_date DESC
					LIMIT 1";
				if(!($result1=mysql_query($sql1,$conn)))
				{}
				else
				{
					while(($data1=mysql_fetch_row($result1)))
					$cur_temp = $data1[0];
				}

				if ( $heat_mode == "Зима" )
				$temp_base = $circ_winter;
				elseif ( $heat_mode == "Лето" )
				$temp_base = $circ_summer;
				elseif ( $heat_mode == "Авто" )
				{
					if ( $temp_out >= 15 )
					$temp_base = $circ_summer;
					elseif ( $temp_out <= 0 )
					$temp_base = $circ_winter;
					else
					$temp_base = $circ_winter - round(($circ_winter - $circ_summer) * ($temp_out / 15), 2);

					# Если включен режим экономии, изменяем температуру на заданное значение
					if ( $eco_mode == 1 )
					$temp_base = $temp_base + $circ_eco;

				}
	
				write_list($circ_ContID, "circ_temp_calc='$temp_base'", "tmpID=$circ_tmpID");

				log_heat("$circ_title: Норма: $temp_base; Улица: $temp_out; Помещение: $temp_in; Текущая: $cur_temp");

				# Если температура внутри выше базовой - убавляем
				if ( $temp_in > $temp_base + $circ_hyst && $cur_temp > $temp_base + $circ_hyst  )
				{

					if ( $circ_type == "Отключен" )
					log_heat("$circ_title: Контур отключен. Снижение температуры невозможно.");
					elseif ( $circ_type == "Прямой" )
					{
						if ( $circ_pump_status == 1 )
						{
							write_list($circ_ContID, "circ_pump_status='0'", "tmpID=$circ_tmpID");
							$circ_pump_total--;
							key_sw($circ_pump, 0);

							log_heat("$circ_title: Выключаем насос");

						}
						else
						log_heat("$circ_title: Насос выключен");
					}
					elseif ( $circ_type == "Теплый пол" )
					{
						if ( $circ_pump_status == 1 )
						{
							$circ_flap_down = 2;

							key_sw($circ_mix_up, 0);
							key_sw($circ_mix_down, 1);
							sleep($circ_flap_down);
							key_sw($circ_mix_down, 0);

							$circ_flap = $circ_flap - $circ_flap_down;

							if ( $circ_flap < 0 )
							$circ_flap = 0;

							# Привод в полностью закрытом положении. Отключаем насос
							if ( $circ_flap <= 0 )
							{
								write_list($circ_ContID, "circ_flap='0'", "tmpID=$circ_tmpID");
								write_list($circ_ContID, "circ_pump_status='0'", "tmpID=$circ_tmpID");
								$circ_pump_total--;
								key_sw($circ_pump, 0);
								key_sw($circ_mix_up, 0);
								key_sw($circ_mix_down, 1);
								sleep(40);
								key_sw($circ_mix_down, 0);

								log_heat("$circ_title: Закрываем привод. Отключаем насос");
							}
							else
							{
								write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");
								log_heat("$circ_title: Понижаем x $circ_flap_down c. Положение привода $circ_flap с");
							}

						}
						else
						log_heat("$circ_title: Насос выключен");
					}
					else
					{
						# Если температура на улице выше чем внутри и работает насос, выключаем насос
						if ( $temp_out > $temp_base + $circ_hyst && $circ_pump_status == 1 )
						{
							write_list($circ_ContID, "circ_pump_status='0'", "tmpID=$circ_tmpID");
							$circ_pump_total--;
							key_sw($circ_pump, 0);

							# Устанавливаем привод в закрытое положение
							write_list($circ_ContID, "circ_flap='0'", "tmpID=$circ_tmpID");

							key_sw($circ_mix_up, 0);
							key_sw($circ_mix_down, 1);
							sleep(120);
							key_sw($circ_mix_down, 0);

							log_heat("$circ_title: Выключаем насос");
						}
						# Убавлять имеет смысл только если включен насос и котел и при этом нет снижения температуры на котле
						elseif ( $circ_pump_status == 1 && $heat_boiler_status == 1 && $heat_boiler_temp_new >= $heat_boiler_temp )
						{
		
							if ( $circ_data[$circ_tmpID]['act'] == "down" && ( $cur_temp < $circ_data[$circ_tmpID]['temp'] ) )
							{
								log_heat("$circ_title: Понижаем. Температура снижается. Наблюдаем");
								$circ_data[$circ_tmpID]['delay'] = 2;
							}
							else
							{
								# Если мы убавляем температуру, а она растет, да еще и сильно отличается от расчетной убавляем сильнее
								if ( $circ_data[$circ_tmpID]['act'] == "down" && ( $cur_temp > $circ_data[$circ_tmpID]['temp'] ) && $cur_temp > $temp_base + 0.4 )
								$circ_flap_down = 5;
								# Если температура сильно выше расчетной, убавляем сильнее
								elseif ( $cur_temp > $temp_base + 0.4 )
								$circ_flap_down = 4;
								# Если мы убавляем температуру, а она растет, убавляем сильнее
								elseif ( $circ_data[$circ_tmpID]['act'] == "down" && ( $cur_temp > $circ_data[$circ_tmpID]['temp'] ) )
								$circ_flap_down = 3;
								else
								$circ_flap_down = 2;

								key_sw($circ_mix_up, 0);
								key_sw($circ_mix_down, 1);
								sleep($circ_flap_down);
								key_sw($circ_mix_down, 0);

								$circ_flap = $circ_flap - $circ_flap_down;
								write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");

	
								$circ_data[$circ_tmpID]['act'] = "down";
								$circ_data[$circ_tmpID]['delay'] = 3;
								# Если включен режим экономии и разница между требуемой и текущей температурой больше 0.4 градуса (режим экономии только что включен),
								# пауза длиннее, чтобы не допустить резкого снижения температуры и последующей инерционной раскачки
								if ( $eco_mode == 1 && $cur_temp > $temp_base + 0.4 )
								$circ_data[$circ_tmpID]['delay'] = $circ_data[$circ_tmpID]['delay'] + 2;


								log_heat("$circ_title: Понижаем x $circ_flap_down c. Положение привода $circ_flap с");
									
								# Если привод закрывается, а температура котла не минимальна, снижаем температуру подачи котла
								if ( $circ_flap <= 22 && $heat_boiler_temp > 60 )
								{

									// Если привод фактически закрыт, снижаем температуру котла до минимума
									if ( $circ_flap <= 19 )
									$heat_boiler_temp_new = 60;
									else
									$heat_boiler_temp_new = $heat_boiler_temp - 1;

									## Устанавливаем новую расчетную температуру подачи котла 
									write_list($heat_conf_id, "heat_boiler_temp_calc='$heat_boiler_temp_new'", "tmpID>0");
	
									log_heat("Новая расч. температура котла = ".$heat_boiler_temp_new);

									write_list($boiler_id, "boiler_write=1", "tmpID>0");

									$circ_data[$circ_tmpID]['delay'] = 3;
			
									log_heat("Снижаем температуру подачи котла");
								}
							
								# Привод в полностью закрытом положении. Отключаем насос
								elseif ( $circ_flap <= 20 && $heat_boiler_temp == 60 )
								{
									write_list($circ_ContID, "circ_flap='0'", "tmpID=$circ_tmpID");
									write_list($circ_ContID, "circ_pump_status='0'", "tmpID=$circ_tmpID");
									$circ_pump_total--;
									key_sw($circ_pump, 0);
									key_sw($circ_mix_up, 0);
									key_sw($circ_mix_down, 1);
									sleep(40);
									key_sw($circ_mix_down, 0);

									log_heat("$circ_title: Закрываем привод. Отключаем насос");
								}
	
							}
						}
						elseif ( $heat_boiler_status == 1 && $heat_boiler_temp_new < $heat_boiler_temp )
						{
							write_list($boiler_id, "boiler_write=1", "tmpID>0");
	
							$circ_data[$circ_tmpID]['delay'] = 3;
	
							log_heat("Снижаем температуру подачи котла");

						}
						else
						{
							# Тепло, конечно, но что делать...
							log_heat("$circ_title: Отопление выключено. Понижение температуры невозможно.");
	
							# Если по каким-то причинам включен насос - выключаем
							if ( $circ_pump_status == 1 )
							{
								write_list($circ_ContID, "circ_pump_status='0'", "tmpID=$circ_tmpID");
								$circ_pump_total--;
								key_sw($circ_pump, 0);

								# Устанавливаем привод в закрытое положение
								write_list($circ_ContID, "circ_flap='0'", "tmpID=$circ_tmpID");
								key_sw($circ_mix_up, 0);
								key_sw($circ_mix_down, 1);
								sleep(120);
								key_sw($circ_mix_down, 0);

								log_heat("$circ_title: Закрываем привод. Отключаем насос");
							}
						}
					}
				}
				# Если температура внутри ниже базовой - прибавляем
				elseif ( $temp_in < $temp_base - $circ_hyst && $cur_temp < $temp_base - $circ_hyst )
				{
					if ( $circ_type == "Отключен" )
					log_heat("$circ_title: Контур отключен. Повышение температуры невозможно.");
					elseif ( $circ_type == "Прямой" )
					{
						if ( $circ_pump_status == 0 )
						{
							write_list($circ_ContID, "circ_pump_status='1'", "tmpID=$circ_tmpID");
							$circ_pump_total++;
							key_sw($circ_pump, 1);

							log_heat("$circ_title: Включаем насос");
						}
						else
						log_heat("$circ_title: Насос уже включен");

					}
					elseif ( $circ_type == "Теплый пол" )
					{
						if ( $circ_pump_status == 0 )
						{
							write_list($circ_ContID, "circ_pump_status='1'", "tmpID=$circ_tmpID");
							$circ_pump_total++;
							key_sw($circ_pump, 1);

							# Если привод на момент включения насоса в закрытом положении, открываем его.
							if ( $circ_flap <= 0 )
							{
								$circ_flap = 32;
								write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");
								key_sw($circ_mix_down, 0);
								key_sw($circ_mix_up, 1);
								sleep(32);
								key_sw($circ_mix_up, 0);

								log_heat("$circ_title: Повышаем x 32 с. Положение привода $circ_flap с.");
							}


							log_heat("$circ_title: Включаем теплый пол");
						}
						else
						{
							$circ_flap_up = 2;
 
							key_sw($circ_mix_down, 0);
							key_sw($circ_mix_up, 1);
							sleep($circ_flap_up);
							key_sw($circ_mix_up, 0);

							$circ_flap = $circ_flap + $circ_flap_up;

							if ( $circ_flap > 120 )
							$circ_flap = 120;

							write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");
							log_heat("$circ_title: Повышаем x $circ_flap_up с. Положение привода $circ_flap с.");
						}

					}
					else
					{
						if ( $circ_pump_status == 0 )
						{
							write_list($circ_ContID, "circ_pump_status='1'", "tmpID=$circ_tmpID");
							$circ_pump_total++;
							key_sw($circ_pump, 1);

							$circ_data[$circ_tmpID]['delay'] = 3;

							# Если привод на момент включения насоса в закрытом положении, открываем его.
							if ( $circ_flap <= 0 )
							{
								$circ_flap = 32;
								write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");
								key_sw($circ_mix_down, 0);
								key_sw($circ_mix_up, 1);
								sleep(32);
								key_sw($circ_mix_up, 0);

								log_heat("$circ_title: Повышаем x 32 с. Положение привода $circ_flap с.");
							}

							log_heat("$circ_title: Включаем насос");
	
						}
						# Прибавляем если нет увеличения температуры на котле
						elseif ( $heat_boiler_temp_new <= $heat_boiler_temp )
						{
							if ( $circ_data[$circ_tmpID]['act'] == "up" && ( $cur_temp > $circ_data[$circ_tmpID]['temp'] ) )
							{
								log_heat("$circ_title: Повышаем. Температура повышается. Наблюдаем");
								$circ_data[$circ_tmpID]['delay'] = 2;
							}
							else
							{
								if ( $heat_boiler_temp == 60 && $circ_flap < 32 )
								$circ_flap_up = 32 - $circ_flap;
								# Если мы прибавляли температуру, а она все равно падает, да еще и сильно отличается от расчетной, прибавляем сильнее.
								elseif ( $circ_data[$circ_tmpID]['act'] == "up" && ( $cur_temp < $circ_data[$circ_tmpID]['temp'] ) && $temp_base > $cur_temp + 0.4 )
								$circ_flap_up = 5;
								# Если температура сильно ниже расчетной, прибавляем сильнее
								elseif ( $temp_base > $cur_temp + 0.4 )
								$circ_flap_up = 4;
								# Если мы прибавляли температуру, а она все равно падает, прибавляем сильнее.
								elseif ( $circ_data[$circ_tmpID]['act'] == "up" && ( $cur_temp < $circ_data[$circ_tmpID]['temp'] ) )
								$circ_flap_up = 3;
								else
								$circ_flap_up = 2;
 
								key_sw($circ_mix_down, 0);
								key_sw($circ_mix_up, 1);
								sleep($circ_flap_up);
								key_sw($circ_mix_up, 0);

								$circ_flap = $circ_flap + $circ_flap_up;

								if ( $circ_flap > 120 )
								$circ_flap = 120;

								write_list($circ_ContID, "circ_flap='$circ_flap'", "tmpID=$circ_tmpID");


								$circ_data[$circ_tmpID]['act'] = "up";
								$circ_data[$circ_tmpID]['delay'] = 3;

								log_heat("$circ_title: Повышаем x $circ_flap_up с. Положение привода $circ_flap с.");
							}
						}
						elseif ( $heat_boiler_temp_new > $heat_boiler_temp )
						{
							write_list($boiler_id, "boiler_write=1", "tmpID>0");

							$circ_data[$circ_tmpID]['delay'] = 3;
	
							log_heat("Повышаем температуру подачи котла");

						}
					}
				}
				else
				{
					# Температура в области базовой - ничего не делаем
	
					log_heat("$circ_title: Температура соответствует норме");
					$circ_data[$circ_tmpID]['act'] = "";


				}
	
	                        $circ_data[$circ_tmpID]['temp'] = $cur_temp;
			}

			if ( $circ_data[$circ_tmpID]['delay'] > 0 )
			$circ_data[$circ_tmpID]['delay'] = $circ_data[$circ_tmpID]['delay'] - 1;
		}
	}

	# Если котел выключен, а есть запрос тепла - включаем котел.
	if ( $heat_boiler_status == 0 && $circ_pump_total > 0 )
	{
		write_list($heat_conf_id, "heat_boiler_status='1'", "tmpID>0");
		$heat_boiler_status = 1;
		key_sw($heat_boiler, 1);

		log_heat("Включаем котел");
		sleep(300);

	}
	# Если котел включен, а запроса тепла нет - выключаем котел.
	elseif ( $heat_boiler_status == 1 && $circ_pump_total == 0 )
	{
		write_list($heat_conf_id, "heat_boiler_status='0'", "tmpID>0");
		write_list($heat_conf_id, "heat_boiler_temp_calc='60'", "tmpID>0");
		$heat_boiler_status = 0;
		key_sw($heat_boiler, 0);

		log_heat("Выключаем котел");
	}

	sleep(300);
	unset($start);
}



 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:



Сортировка комментариев: Последние сверху | Первые сверху

2009-10-09 14:39:50 | Andy
Сразу влюбился в Вашу систему.
Есть интерес, есть и вопросы.
1. Неплохо бы привести хотя бы упрощенную гидравлическую схему отопления. Думаю, восприятие рассказа об управлении только выиграет.
2. Правильно ли я понимаю суть управления? - Считываются показания температуры на улице, в помещении и после трехходового смесителя. Принимается решение о температуре подачи. Котлу дается команда на температуру подачи. Если нужна температура меньше, чем котел может минимально выдать, прикрывае трехходовик. Не силен в С. Поэтому не все понятно из листинга.
3. Интересно глянуть на график (таблица, формула?) "погодной зависимости внутренней температуры". Никогда об этом не читал, но по моим наблюдением это очень здоровая идея!


2009-10-09 23:59:17 | Andrey_B
Andy,
1. гидравлическую схему отопления добавил к статье. Посмотрите.
2. Насчет алгоритма управления вы все правильно поняли. Кстати, программа написана не на C, а на PHP. Не совсем типичная для этого языка задача, но почему бы и нет? Работает.
3. Не совсем понял этот вопрос. У меня в программе заложено две расчетные температуры (формулы в коде), зависимые от температуры на улице. Первая - температура в помещении. Чем выше температура на улице, тем ниже расчетная в помещении. Вторая - температура котла. Чем ниже температура на улице, тем выше температура котла. Но прибавляю температуру котла я не скачкообразно, а на один градус за цикл и только в том случае, когда требуется сделать в помещении теплее. Это позволяет значительно снивилировать эффект маятника. В инерционных системах обязательно нужно демпфировать регулировки, иначе система будет "раскачиваться".
Хочу добавить, что практически все погодозависимые контроллеры работает по таблице, по графику, не учитывая температуру внутри. И в этом есть большая проблема. Дело в том, что при +10 и сильном северном ветре, температура теплоносителя такая же как при -5 в штиль. Понимаете о чем я?
Практика показала, что моя программа очень эффективно управляет отоплением и только потому что за основу берет не температуру на улице, а температуру в помещении. Нужно только ОЧЕНЬ тщательно выбрать место размещения датчика. Например, телевизор, расположенный в метре от датчика дает +0.2С к показаниям, а это многовато.


2009-10-11 18:16:59 | Andy
Спасибо за оперативную реакцию. Судя по гидравлической схеме, у Вас целый дворец.
Мой третий вопрос как раз касался формулы в коде для расчета зависимости темп. в помещении от наружней температуры. Просто я не могу в листинге найти этот кусок.
Согласно вашей схемы, температура подачи на радиаторы первого и второго этажей зависит (в основном) от температуры в эталонном помещении. Насколько комфортно в других, неэталонных помещениях? Ведь даже при отбалансированной системе есть много факторов (соляризация, ветер с разных направлений), влияющих на температуру в конкретном помещении.
Также интересно, на которое время программа повышает темп. подачи на 1 градус ?
Еще вопрос: "при +10 и сильном северном ветре, температура теплоносителя такая же как при -5 в штиль" - это Вы образно, или действительно так бывает? Я знал про влияние ветра, но не думал, что оно так сильно.


2009-10-12 11:06:37 | Andrey_B
Andy, у меня сделано следующим образом.
1. Каждый смесительный (то есть управляемый 3-х ходовым) контур имеет свои собственные настройки. В настройках задается т.н. зимняя температура (если на улице меньше 0 градусов) и летняя - если выше 15 градусов. Расчет температуры в помещении производится в том случае, если температура на улице выше 0 и ниже +15. Вот кусок кода.
if ( $temp_out >= 15 )
$temp_base = $circ_summer;
elseif ( $temp_out <= 0 )
$temp_base = $circ_winter;
else
$temp_base = $circ_winter - round(($circ_winter - $circ_summer) * ($temp_out / 15), 2);
Чтобы понять логику, нужно просто поставлять разные значения в переменные. Весьма простой, но устраивающий меня расчет.
Таким образом каждый контур имеет свои расчетные температуры.
2. Насчет эталонного помещения вы правы. В случае использования только одного датчика температуры необходимо очень тщательно выбирать его расположение. Но ведь в том и плюс самодельной системы. Датчик DS18B20 1-wire стоит 70 руб. Можно повесить 3-5-7 датчиков и рассчитывать среднее значение по дому. У меня пока используется только один, но я планирую установить несколько. Каждому датчику задать некоторый вес, относительно которого будет производится расчет. В тех помещениях, где температура более стабильна (или всегда ниже) - вес показателя больше. Поясню. Дело в том, что на радиаторах нужно установить термоголовки. В этом случае регулировка будет в большей степени ориентирована на более прохладные помещения. А в более теплых помещениях термоголовки будут несколько зажимать подачу теплоносителя. (Важно, чтобы в контурах с использованием термоголовок были предусмотрены перепускные клапаны!) Такая система - частично автоматическая, частично механическая позволяет в значительной степени решить проблему разной температуры в помещениях.
3. Не совсем ясен вопрос относительно времени, за которое программа повышает температуру подачи. Какое время имеется ввиду?
4. Насчет ветра я выразился, конечно, образно, но, тем не менее, это не так далеко от истины. Действительно сильный ветер 5-7 м/с, особенно влажный, с дождем или мокрым снегом, значительно влияет на температуру внутри. Насколько значительно зависит от многих факторов. Высоты дома, количество окон по направлению ветра, материал стен и т.д. Но моя практика действительно подтвердила, что количество потребляемого газа при -15 в солнечную погоду без ветра такое же как при -3 и сильном февральском южном ветре.


2009-10-12 15:03:49 | Andy
1. За формулу отдельное спасибо. Интересно, за какое время пользования системой вы пришли к ней и подобрали $circ_summer и $circ_winter ? Кстати, а чему у вас равны эти константы для ТП и радиаторов? И в каком климатическом поясе живете?
2. а не эффективней ли (комфортней?) раз уж в комнатах будут свои термодатчики, установить на радиаторном коллекторе термоэлектрические клапана для каждой батареи? Конечно, это предложение справедливо, только если разводка от коллектора лучевая.
3. вопрос о времени звучал "НА которое время", а не "ЗА которое время". Вы писали, что учитывая инерционность системы, изменяете подачу на 1 градус. Потом, видимо, выжидаете некоторый интервал, и снова (если нужно) изменяете подачу на 1 градус. Так вот интересует каковы эти интервалы в вашем конкретном случае?
4.понятно.
з.ы. Приятно пообщаться с человеком, который вместо трескотни на форуме взял да и сделал свою систему. Я свою хибару из ГС блоков планирую в следующем году достроить. Масштабы у меня, конечно не те, но руки чешутся Купил 20 штук 18s20. Этого должно хватить в каждое помещения, на улицу, на контроль подач/обраток да еще хочу мерять темп стяжки в каждом контуре ТП. Поэтому ваш практический опыт для меня суперценен.


2009-10-12 16:45:47 | Andrey_B
1. Один отопительный сезон я жил без автоматики. За это время сложилось представление о комфортной температуре. Я обратил внимание, что комфортная температура зависит от температуры на улице. И это свое наблюдение заложил в код.
Хочу обратить внимание, что комфортная температура у каждого человека своя. Кому-то 23 градуса в доме очень жарко, а кому-то очень холодно.
Для меня.
Температура зимой: 24,4С (на улице меньше 0С)
Температура летом: 23,5С (на улице выше +15С)
Здесь делается расчет температуры внутри помещения. Не температуры подачи теплоносителя! Цель программы - достичь нужной температуры именно в помещении. С моей точки зрения ошибочно делать автоматику на расчете температуры теплоносителя именно по тем причинам, которые мы уже обсуждали: ветер и его направление, влажность воздуха, солнечное излучение вносят свое иногда очень существенное влияние на теплопотери дома.
В моей программе действительно делается расчет "максимальной температуры" котла. Вот этот код:

$heat_boiler_temp_calc = round(5 - $temp_out + 60);
if ( $heat_boiler_temp_calc < 60 )
$heat_boiler_temp_calc = 60;
elseif ( $heat_boiler_temp_calc > 82 )
$heat_boiler_temp_calc = 82;

if ( $heat_boiler_temp_calc > $heat_boiler_temp )
$heat_boiler_temp_new = $heat_boiler_temp + 1;
elseif ( $heat_boiler_temp_calc < $heat_boiler_temp )
$heat_boiler_temp_new = $heat_boiler_temp - 1;

Да, в программе реальная установка регистра котла делается ТОЛЬКО в том случае, если требуется прибавить или убавить температуру (а не только на основании того, что программа рассчитала иную температуру). Это значительно снижает количество ненужных обращений к котлу.

Для чего я это делаю? Ведь можно было бы обойтись только регулировкой с помощью 3-х ходового? Представим, что котел выставлен на максимальную температуру подачи (в моем случае 82-83С), а 3-х ходовой закрылся, а других потребителей нет. Котел будет гонять воду только по малому кругу (до гидрострелки). В этом случае температура теплоносителя поднимется до 100С, вырастет давление, что очень нежелательно. Вот поэтому у меня при температуре на улице выше +5 температура подачи котла не более 60С. (а это для моего котла нижний порог для регистра "максимальная температура подачи"). Даже если потребителей тепла нет, температура в котельном контуре не превышает 72С. 60С на подаче оптимальный вариант - любой радиаторный контур всегда сможет забрать нужное количества тепла, хватит даже бойлеру косвенного нагрева.
2. Можно, конечно устанавливать и термоэлектрические клапана. Это, вероятно, будет работать лучше. Но это а) дороже, б) сложнее в программно-аппаратной реализации, в) потребует установки своего датчика в каждой комнате. К тому же смесительная регулировка более точно и предсказуемо работает, чем количественная. Я для себя еще на уровне проектирования системы разделил всю площадь на зоны, которые а) имеют примерно одинаковую структуру стен, а значит теплопотери, б) требуют примерно одинаковой температуры внутри, в) требуют одинаковую логику управления. Таким образом вместо управления десятками радиаторов (или группами радиаторов) управляется контурами: дом, подвал, чердак. Однако управление каждым радиатором в отдельности, наверное, не лишено смысла. Впрочем, в моем случае это можно реализовать, если чего-то не будет хватать, так как разводка как раз лучевая.
3. Время пришлось подбирать эмпирическим путем. Пока остановился на значении 15 минут. При этом программа отслеживает поведение температуры. Например температура в помещении ниже расчетной. Надо прибавить. Прибавляем. Ждем 15 минут. Проверяем. Опять ниже, но она выше чем предыдущее значение, значит не прибавляем, а ждем еще 10 минут. НО! если вдруг она после предыдущего прибавления не только не растет, но и падает,то крутим привод не на 2 секунды, а уже на 3. Такая логика была подсказана практикой. Если не учитывать температурный тренд, то система входит в "раскачку", а если не компенсировать резкие изменения, то выход на расчетную температуру занимает слишком много времени. В общем, это что-то вроде программного амортизатора.
4. Ну тем и полезнее чужой опыт, что позволяет достичь результата быстрее и не делать лишних ошибок ;)


2009-10-12 17:06:08 | Andy
1. Все ясно, спасибо
2. Позиция понятна. Не соглашусь только с "а) дороже" - термоэлектрический клапан я нашел у себя в Минске за 22 евро, но ведь термоголовки, о которых вы ранее упоминали, тоже не бесплатные. б) сложнее в программно-аппаратной реализации" - Из железа нужен только 1w ключ, а насчет программы вы явно скромничаете. К тому же регулировка расходом не отменяет регулировку. По сути, это те же термоголовки, о которых вы пишете "на радиаторах нужно установить термоголовки" с но с управлением с компа. Так хочется, что бы поставили термоклапаны и описали свои наблюдения :)
3. Большое спасибо, понятно.


2009-12-16 20:03:47 | Олег
А где вы нашли если не секрет термоэлектрический клапан за 22 евро? Не поделитесь ссылкой?


2010-01-14 08:04:30 | Andy
www.sanimet.by. Торгуют Watts-ом. Вот выдержка из их прайса. Первая цифра - артикул, последняя - цена.
2050600 ; VTZ22C-230NC2-5;Stellantrieb 230V stromlos zu;;1 St./Karton & 120 St./Umkarto 22,20
2050601 ; VTZ22C-24NC2-5;Stellantrieb 24V stromlos zu;;VPE : 50 St&252;ck 22,20
2050610 ; VTA22C-230NA2-5;Stellantrieb 230V stromlos auf;; 22,20
2050611 ; VTA22C-24NA2-5;Stellantrieb 24V stromlos auf;; 22,20


2010-01-14 09:57:48 | Andy
Сорри, я зарапартовался. Я имел ввиду не термостатические клапана, а термоэлектрические сервоприводы.


2010-01-15 15:20:18 | Andy
Интересно, Ваше мнение, какой точности достаточно для управления трехходовым. Я хочу на смеситель ТП установить привод с пропорциональным управлением и мне интересно, сколько градаций ЦАП сделать. Судя по всему, Вы пользуетесь максимум 30 градациями – 60 сек/ 2 сек. Здесь 60 сек – максимальное время закрытия у ESBE, 2 сек -минимальное время включения трехходового в Вашей программе. Я правильно понял?


2010-01-15 19:05:04 | Andrey_B
Время полного открытия/закрытия моего привода 120 секунд, значит градаций 60. Для радиаторной системы отопления это оптимальный вариант. Но для ТП, думаю, будет многовато. Во-первых, диапазон регулировок радиаторного отопления в моем случае от 25 до 83, а для ТП это в пределах от 25 до 55 (градаций нужно меньше). А во-вторых, уж очень велика инерция системы ТП... Думаю, 30 градаций более чем достаточно.


2010-01-15 20:06:34 | Andy
Спасибо! Кстати, может, у Вас дойдут руки нарисовать топологию Вашей микросети? Чтобы было видны примерные длины проводов. Рекомендации по топологии на Элиновском сайте лежат. Интересно, насколько Вы их придерживались?


2010-01-15 22:48:03 | Andrey_B
Я не стал экспериментировать с топологиями и применяю с первого дня только общую шину. Несмотря на то, что большая часть коммутации находится в одном месте, от которого уходят разные ветки - все соединено общей шиной. Ответвлений нет вообще. (точнее, они в пределах 10 см). Думаю, общая длина всего сегмента на текущий момент составляет порядка 50 метров. Примечательно, что все температурные датчики, а они находятся на разных участках шины используют паразитное питание и работают при этом вполне надежно. Я в ближайшее время намерен в 2 или 3 раза увеличить протяженность сети, так как заканчиваю отделку второго этажа. Вот тогда и поделюсь опытом.


2010-11-21 01:23:08 | sergMinsk
парни , что почитать предметно по 1-wire.
сам радиофизик , но с железом не работал.
а задача такая же стоит . тем более , что ваше упоминание про учет ветра - это серьёзный козырь в понимании теплового комфорта.
может Andy что подскажет- земляк всё же.(подозреваю за ним РТИ)


2010-11-21 23:52:03 | Andrey_B
sergMinsk, предметно по 1-wire можно почитать Datasheet'ы от производителя (Maxim/Dallas). Можно скачать SDK на их сайте. Научно-популярной литературы по 1-wire много в сети. Также можно найти массу примеров использования.
Если говорить о тепловом комфорте, то я бы начал с влажности в помещении, так как, на мой взгляд, температурная норма, функция от влажности.
Скорость и направление ветра можно учитывать только для того, чтобы заранее изменять температуру теплоносителя не дожидаясь пока температура воздуха начнет изменяться.


2010-11-23 13:56:24 | sergMinsk
полазил я и понял , что "предметно" я могу только горбатого налепить.
хорошо , что хоть знакомых есть , кто контроллеры программирует.
"осталось " только алгоритмы и функции описать.
в любом случае , то что я у вас увидел- это больше чем на 4-5 известных форумах по автоматизации управления ИТП и умных домов.


2010-12-15 14:19:19 | Andy
sergMinsk, если еще актуальна инфа по 1w, то звони на мтс 7511309. я быстрее говорю, чем набираю :)


2011-11-02 14:02:16 | Николай
А Вы не рассматривали систему водяного отопления полов?
Ведь если дом очень большой, то электрические теплые полы будут много электричества кушать.
С другой стороны если заказывать установку водяных теплых полов, то получится очень круглая сумма.


2011-11-02 16:55:45 | Andrey_B
Николай, у меня в доме есть водяные теплые полы. Только я не совсем понимаю в чем суть вашего вопроса.
Трубу брал 16-ый металлопластик Valtec, хотя с точки зрения теплоотдачи, возможно, лучше будет использовать 20-ый сшитый полиэтилен. Брал оптом четыре бухты по 100 метров за 25 руб/п.м. (цены 2009 года) То есть на трубу ушло примерно 10 000 руб. Укладывалась труба "улиткой" с расстоянием между труб 20 см. Чтобы ускорить процесс, нанимал специалистов. Стоимость составила 200 руб за квадратный метр и на площадь в 150 м2 - 30 000 руб, хотя ничего сложного в укладке труб нет, можно сделать самостоятельно. Расстояние между труб лучше делать 10-12 см, так как при 20 см чувствуется "полосатость". Стяжка над трубой составила примерно 40-45 мм. Тонкую стяжку над теплым полом делать нельзя по ряду причин. К системе отопления подключал сам. По минимуму это насос (у меня Grundfos UPS 25-60), коллектор (у меня Kermi с расходомерами) и запорная арматура. Все вместе ориентировочно 10 тыс рублей, но можно сделать значительно дешевле, если взять более дешевый насос и коллектор. Для автоматизации использовал 3-х ходовой и привод ESBE и двухканальный 1-wire ключ - это еще порядка 6 тыс.
Однако если на улице держится долго -30, с одними только теплыми полами можно замерзнуть (если теплоэффективность стен на среднем уровне). В контуре ТП нельзя держать температуру выше 50 градусов, иначе ходить по нему босиком будет сложно. Для морозов нужно иметь еще радиаторы отопления. Кроме того, теплые полы - очень инертны, тогда как радиаторы могут прогреть помещение значительно быстрее.


2011-11-03 09:47:18 | Николай
Огромное спасибо за такой подробный ответ. То, что надо.


2012-02-23 19:31:27 | dimonix
ищу исходники алгоритма PID-регулирования (применяется в профессиональных погодозависимых контроллерах). может кто-нибудь встречал?


2012-04-08 12:44:55 | Роман
Подскажите пжлст. Я только строю дом, и систему отопления только планирую. В идеале котел на твердом топливе в пристройке, и электро на втором этаже и газовый на первом. Я смогу реализовать на этом систему подобную вашей? И кто может проконсультировать по поводу проэктирования системы отопления?


2012-04-09 06:01:15 | Али
Роман, а зачем вам столько котлов? Если у вас есть газ, то почему не воспользоваться одним газовым котлом?


2012-04-09 11:02:10 | Andrey_B
Пишите на нашем форуме. Расскажите о своей схеме, можно с картинками. Все, что знаем - расскажем.


2012-09-03 08:07:05 | Алекс
Андрей, а как делали расчет гидрострелки и коллекторов? и какие диаметры у Вас?
Спасибо.


2012-09-27 16:01:46 | Александр
Андрей, если не секрет, почему для включения привода открытия/закрытия крана, Вы используете 2406P? А не 2413Р? Последний вроде дешевле, да и функционал такой же..


2012-09-30 21:25:53 | Дмитрий
Али, вполне может быть, что Роман с Украины. У них там цирк с конями относительно газа. Типа первые 100 или 200 не важно сколько, но не много, стоит дешево, а вот дальше очень дорого. В результате получается зависимость интересная. До 100 квм дешевле топить газом , больше 100 чем-то еще. Например, пеллетами.

P.s. Ну или Роман - это выросший мальчик, который снимался в Еролаше. У него в одном кармане один билет на автобус, в другом запасной, ну а на крайний случай проезной месячный есть :-)


2012-10-01 13:26:48 | Дима
Андрей, вопрос такого рода по исполнительным ключам. Предположим, тьфу3, что линуксоидный комп издох и вся автоматизация встала. Как продублировать работу системы отопления в ручном режиме? Например, я собираюсь включать циркуляционный насос с помощью 1-wire, ручное включение его как сделать?

Или такой вопрос. Для включения горелки в моем котле надо замкнуть контакт и ни в коем разе туда не должно попасть 220 вольт. На каких элементах это сделать и опять же как сделать вышеназванное ручное дублирование? Или я не дочитал? :-)


2012-10-01 17:32:34 | Andrey_B
Александр, я использовал то, что было на тот момент под рукой. Действительно, по большому счету, для управления нагрузками можно с успехом применять как DS2413, так и DS2406/P.


2012-10-01 17:37:25 | Andrey_B
Дима, ручное управление сделать достаточно просто.
У меня сделано так. Висит небольшой щиток, в котором стоят самые дешевые автоматы параллельно 1-wire ключам, включающим насосы и прочее. Эти автоматы выполняют роль выключателей и в нормальной ситуации выключены. Если компьютер сдох, то я просто подхожу к щитку и перевожу нужные мне автоматы во включенное положение. Вот и все.
Что касается управления вашим котлом, но вам нужно использовать реле, а не электронный ключ.


2012-11-26 19:24:12 | usergey
У ESBE есть еще пропорциональный привод ARA 639 с управлением 0-10В (2-10В), а также с выходом 2-10В для чтения текущего положения. Использовать его можно с 3-ходовым смесителем VRG-131.

Я правильно понимаю принцип управления пропорциональными приводами, что подав на его управляющие контакты напряжение 5В (если входной диапазон 0-10В), то он мне автоматом выставит 3-ходовик в среднее положение? А если подам 0В или 10В, то выставит в крайние положения?

Если это так, то пропорциональный привод по идее является более предпочтительным, нежели 3-точечные. Ведь используя какой-нибудь 1-wire модуль с ЦАП с выходным диапазоном 0-10В я легко смогу выставлять нужное положение 3-ходовика.

Аналогично, используя АЦП смогу прочитать текущее положение, вдруг его руками выкручивали...


2012-11-26 23:57:02 | Andrey_B
usergey, да, пропорциональное регулирование действительно позволяет знать в каком положении находится привод. Но тут уж каждый сам выбирает, исходя из возможностей автоматики. 3-х точечное регулирование в плане реализации и использования различных средств проще. Да и в случае перебоев с автоматикой, реализовать ручное управление приводом (я имею ввиду электрическое управление) значительно проще. А что касается положения, то я реализовал контроль с помощью записи в БД данных от движении привода. (то есть повернули на 2 секунды, записали +2 и т.д.) Как ни странно, получил очень точные данные о положении.


2012-11-27 17:00:24 | usergey
Andrey_B, Фиксировать при 3-точечном управлении в базе величину последнего поворота - идея неплохая. Но быть с ситуацией, если по БД мы считаем что текущее положение среднее, а на самом деле кто-то вручную нажал кнопки поворота (или чисто механически) выкрутил до упора, к примеру, по часовой стрелке.

При этом программа у нас находится в заблуждении и управляет некорректно 3-ходовиком.

Также приходит ли какой-то сигнал на компьютере в случае достижения приводом крайних положений? Чисто внутри он как я понимаю останавливает двигатель при достижении одной из двух крайних точек. Но, по идее, неплохо бы об этом сообщать программе.

Также как Вы инициализируете начальное положение привода. Крутите программно, например, по часовой стрелке 30сек + 2 сек и устанавливаете в базе крайнее правое положение положение?


2012-11-27 23:47:22 | Andrey_B
usergey, по большому счету программе управления и не нужно знать положение привода. Она должна контролировать только температуру подачи и температуру в помещении. Знай себе крути мотор.
Крайнее положение привода можно также определить программно. Если алгоритм крутит привод, а температура подачи не меняется, значит, возможно, привод находится в крайнем положении.
Также при инициализации алгоритма (на случай если привод поворачивал человек), программа может сначала выкрутить привод в одно из крайних положений, а затем уже отодвинуть его на нужное количество секунд.
Но в реальности в своем доме привод никто просто так (я имею ввиду людей) не крутит. Я месяцами не захожу в котельную, а когда на всякий случай проверяю, привод находится именно в том положении, о котором мне сообщает программа. Для себя выбрал 3-х точечное управление. Мне с ним и проще и понятнее. Хотя, конечно, указанные вами нюансы в действительности могут иметь место.


2012-11-28 19:00:54 | usergey
Andrey_B,
> Знай себе крути мотор.
Кстати, а попытка крутить мотор в сторону, которая уже на пределе, на ресурсе привода никак не сказывается?
Там что, микрик-датчик крайнего положения какой-то стоит, который даже не позволит запустить мотор?

> Если алгоритм крутит привод, а температура подачи не меняется, значит, возможно, привод находится в крайнем положении.
Да, точно, можно это как повод для необходимости реинициализации крайнего положения использовать. Спасибо!


2012-11-28 23:15:21 | Andrey_B
В приводах ESBE используются концевики (микрики), которые физически размыкают электрическую цепь. Но моторы там надежные. Я тут как-то замкнул оба контакта, то есть напряжение подалось в обе стороны. Причем в таком положении привод находился несколько часов. Он жужжал, дергался, но не умер! До сих пор работает как часы.


2014-03-30 14:02:31 | Александр
Посоветуйте, какой лучше выбрать кран для перекрытия воды в квартире в случае протечки. Управление по 1-wire от ПК. Везде упоминается про нормально закрытый и нормально открытый. Есть ли модели, у которых положение не зависит от подачи электричества?


2014-03-31 16:38:40 | Andrey_B
Александр, вам тогда нужно смотреть в сторону шаровых кранов с электроприводом. Вот там можно выставить кран в нужное положение и отключить подачу напряжения. Сам он не закроется. Но такие краны (а точнее приводы к ним) существенно дороже клапанов.


2014-10-06 11:37:57 | Тимофей
Андрей, а вы не думали использовать вместо привода ESBE модельный сервопривод с высоким крутящим моментом? Такие есть с моментами 20,30,40 кг/см по цене долларов 50 в Китае, сейчас сам ищу альтернативу европейскому оборудованию


2014-10-06 11:50:58 | Тимофей
Например такой: /www.servodatabase.com/servo/xq-power/xq-s5040d


2014-10-06 11:51:35 | Andrey_B
Тимофей, нет, не думал. Все-таки отопление - это та система, которая должна работать максимально надежно. Приводы ESBE зарекомендовали себя очень хорошо. Здесь, в области механики для системы отопления, лично я не склонен экспериментировать с китайскими комплектующими. Но вполне допускаю такие эксперименты при условии контроля со стороны автоматики. Например, если датчик зафиксирует 90 градусов на подаче в системе теплого пола, автоматика может отключить насос и просигнализировать об аварии владельца.


2014-10-12 18:21:33 | Александр
Преклоняюсь!!!!