'##############
'Heizungs-Script
'Скрипт отопления
'##############

'Simuliert Wagenheizung, Zusatzheizung (evtl. auch gleich den Kьhlkreislauf mit...)

'(c) 20.02.2009 Rьdiger Hьlsmann

'Script Version: 1.1
'Omsi release: 1.0

'Needs:
'cockpit (fьr Taster und Regler)
'engine (for cooling circuit)
'door (for door opening status)

'Revision History:
'- Rьdiger Hьlsmann	17.02.2009	File created
'- Rьdiger Hьlsmann	20.02.2009	Batterietrennschalter eingefьgt (v1.1)
'- Marcel Kuhnt		10.08.2009	Added Revision History
'- Marcel & Rьdiger	23.09.2010	Parking Heater, room temperature
'- RЬdiger Hьlsmann	16.11.2010	Front heater
'- Rьdiger Hьlsmann	18.11.2010	Improved front heater
'- Rьdiger Hьlsmann	20.11.2010	Cabin heater, values adjusted
'- Rьdiger Hьlsmann	22.11.2010	Auxheat Schmitt-triggered, engine coolable by fan heaters
'- Rьdiger Hьlsmann	10.01.2011	Driver window airflow
'- Яковлев Вячеслав	05.01.2011	Добавлен блок жидкостного подогревателя (котел) и циркуляционного насоса
'- Яковлев Вячеслав 08.01.2011	Отладка жидкостного подогревателя
'- Яковлев Вячеслав 09.01.2011	Изменен и добавлен скрипт отопителей
'- Яковлев Вячеслав 11.01.2011	Отладка отопителей


'------------------------------------------------------------------------------------------






'----------------------
'	Init
'----------------------
{macro:heizung_init}
	(L.S.Weather_Temperature) (S.L.Cabinair_Temp)
	(L.S.Weather_AbsHum) (S.L.Cabinair_absHum)
{end}


{macro:heizung_frame}

'	(M.L.standheizung_frame)	
	(M.L.cabinair_frame)
	(M.L.EFU_frame)
	(M.L.CN_frame)
{end}







'Климат в салоне
{macro:cabinair_frame}

'	Berechnung der Raten: Расчет параметров
	(L.L.Cabinair_Temp) 
	(L.S.Weather_Temperature) - 
	(C.L.cabinair_Qrate_envir_factor) * 
	(S.L.cabinair_Qrate_envir)

'	Direkte Ableitung der Motorwдrme in den Fahrgastraum Уход тепла двигателя в салон (газенваген, ёпта)
	(L.L.engine_temperature_envir) 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_Qrate_engine_factor) * 
	(S.L.cabinair_Qrate_engine)

'	Звук отопителей
	(L.L.cp_salon_otopitel_1) 
	(L.L.elec_busbar_main) &&
	{if}
		1 (S.L.salon_otopitel_1)
	{else}
		0 (S.L.salon_otopitel_1)
	{endif}
	
	(L.L.cp_salon_otopitel_2) 
	(L.L.elec_busbar_main) &&
	{if}
		1 (S.L.salon_otopitel_2)
	{else}
		0 (S.L.salon_otopitel_2)
	{endif}
	
	(L.L.cp_kabina_otopitel) 
	(L.L.elec_busbar_main) &&
	{if}
		1 (S.L.kabina_otopitel)
	{else}
		0 (S.L.kabina_otopitel)
	{endif}

'	(L.L.cp_potolok_vent)
'	(L.L.elec_busbar_main) &&
'	{if}
'		(L.S.Weather_Temperature) (S.L.fanheater_t_target)
'		
'		(C.L.cabinair_A_frontheater) 
'		(L.L.velocity) 20 / abs 
'		(C.L.cabinair_windowdoor_minkmh) + 
'		(C.L.cabinair_windowdoor_effectivity) * 2 / * 
'		(S.L.cabinair_Vrate_fanheater)
		
'	{else}


	
'	Berechnung der Solltemperatur am Frontheizgerдt Расчет требуемой температуры на переднем обогревателе
'	(L.L.cockpit_heizregler_ventilation_mode) s0 0 =
'	{if}
'		(L.L.Cabinair_Temp) 
'		(L.L.engine_temperature) 
'		(L.L.Cabinair_Temp) - 
'		(L.L.cockpit_heizregler_temp) * 
'		(C.L.heat_exchanger_effectivity) * + 
'		(S.L.fanheater_t_target)
'	{else}
'		l0 2 =
'		{if}
'			Frischluftheizung: Нагрев свежего воздуха
'			(L.S.Weather_Temperature) 
'			(L.L.engine_temperature) 
'			(L.S.Weather_Temperature) - 
'			(L.L.cockpit_heizregler_temp) * 
'			(C.L.heat_exchanger_effectivity) * + 
'			(S.L.fanheater_t_target)
'		{else}
'			Direktbelьftung: Прямое поступление воздуха
'			(L.S.Weather_Temperature) (S.L.fanheater_t_target)
'		{endif}		
'	{endif}
	
'Berechnung des Volumenstroms durchs Frontheizgerдt Расчет объемного расхода на передний отопитель
'	(L.L.cockpit_heizregler_ventilation_mode) 1 =
'	(L.L.cp_salon_otopitel_1)
'	{if}
'		(C.L.cabinair_A_frontheater) 
'		(L.L.velocity) 20 / abs 
'		(C.L.cabinair_windowdoor_minkmh) + 
'		(C.L.cabinair_windowdoor_effectivity) * 3.6 / * 
'		(S.L.cabinair_Vrate_fanheater)
'	{else}
'		(C.L.cabinair_A_frontheater) 
'		(L.L.cp_klimator_RPM) 100 / * 
'		(S.L.cabinair_Vrate_fanheater)
'	{endif}


'Berechnung der effektiven Gesamt-Luftaustauschflдche: Расчет полной эффективности воздухообмена
'	При открытых дверях
	(L.L.door_0) 
	(L.L.door_1) +
	(L.L.door_2L) +
	(L.L.door_2R) +
	(L.L.door_3L) +
	(L.L.door_3R) + 
	(C.L.cabinair_A_perdoor) *

'	Для люков и форточек
	(L.L.cp_fort_R1_pos) (L.L.cp_fort_R2_pos) +
	(L.L.cp_fort_L1_pos) (L.L.cp_fort_L2_pos) (L.L.cp_fort_L3_pos) + + +
	(L.L.cp_luk_1) (L.L.cp_luk_2) (L.L.cp_luk_3) + + + 
	(L.L.cp_luk_1_rot) (L.L.cp_luk_2_rot) (L.L.cp_luk_3_rot) + + +
	(L.L.cp_luk_1_trans) (L.L.cp_luk_2_trans) (L.L.cp_luk_3_trans) + + +
	(C.L.cabinair_A_perwindow) * + 
	
'	Для форточки водителя
	(C.L.cabinair_A_driverwindow) (L.L.cp_fort_vod_pos) * +

'Berechnung des Gesamtvolumenstroms in die AuЯenwelt und umgekehrt (V zдhlt je Richtung, d.h. insgesamt wird 2*V bewegt)
'Расчет потока воздуха в окружающем мире и наоборот (кароче зависимость быстроты охлаждения\нагрева салона от скорости автобус)	
	(L.L.velocity) 20 / abs 
	(C.L.cabinair_windowdoor_minkmh) + 
	(C.L.cabinair_windowdoor_effectivity) * 3.6 / * 
	(S.L.cabinair_Vrate_doorwindow)


'Berechnung des Volumenstroms durch die Raumheizgerдte 
'Если циркуляционный насос включен, то жидкость в системе движется быстрее-> эффективность работы отопителей выше
	(L.L.CN_on)
	{if}

'		Для отопителей салона
		(C.L.cabinair_A_cabinheater) 1.2 *
		(L.L.cp_salon_otopitel_1) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater1)
		
		(C.L.cabinair_A_cabinheater) 1.2 *
		(L.L.cp_salon_otopitel_2) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater2)

'		Для отопителей кабины
		(C.L.cabinair_A_cabinheater) 0.5 * 
		(L.L.cp_kabina_otopitel) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater3)
		
		(C.L.cabinair_A_frontheater) 0.3 *
		(L.L.cp_pered_otopitel) 1 = * 		
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_fanheater)
	{else}

'		То же, только при выключенном циркуляционном насосе
		(C.L.cabinair_A_cabinheater) 0.4 * 
		(L.L.cp_salon_otopitel_1) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater1)
		
		(C.L.cabinair_A_cabinheater) 0.4 *
		(L.L.cp_salon_otopitel_2) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater2)
		
		(C.L.cabinair_A_cabinheater) 0.1 * 
		(L.L.cp_kabina_otopitel) 1 = * 
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_cabinheater3)
		
		(C.L.cabinair_A_frontheater) 0.08 *
		(L.L.cp_pered_otopitel) 1 = * 		
		(L.L.elec_busbar_main) 1 = * 
		(S.L.cabinair_Vrate_fanheater)
	{endif}
	




'Berechnung der Temperaturrate durch Motor und Abstrahlung an die Umwelt... 
'Расчет повышения температуры из-за двигателя
	
	(L.L.cabinair_Qrate_engine) 
	(L.L.cabinair_Qrate_envir) - 
	(C.L.cabinair_cvm) /
	
'...und Temperaturrate durch Passagiere... температуры и количество пассажиров
	
	(C.L.cabinair_T_passenger) 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(C.L.cabinair_Vrate_passenger) * 
	(L.L.humans_count) * +
	
'...und dieser durch die Volumenstrцme durch Fenster und Tьren: 
'Расход тепла через форточки и двери
	
	(L.S.Weather_Temperature) 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_doorwindow) * +
	
'...und des Frontheizgerдtes... и передний отопитель
	
'	(L.L.fanheater_t_target) 
	(L.L.engine_temperature) 
	(C.L.heat_exchanger_effectivity) *
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_fanheater) * +
	
'...und der Raumheizgerдte... салонный отопитель
	
	(L.L.engine_temperature) 
	(C.L.heat_exchanger_effectivity) * 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_cabinheater1) * +
	
	(L.L.engine_temperature) 
	(C.L.heat_exchanger_effectivity) * 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_cabinheater2) * +
	
'	Кабинный отопитель
	(L.L.engine_temperature) 
	(C.L.heat_exchanger_effectivity) * 
	(L.L.Cabinair_Temp) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_cabinheater3) * +
	
'...aufintegrieren: интеграция
	
	(L.S.Timegap) * 
	(L.L.Cabinair_Temp) + 
	(S.L.Cabinair_Temp)

'Berechnung der Motorkьhlrate durch die Wдrmetauscher in den Heizgerдten:
'Расчет скорости прохода тепла двигателя через теплообменник в отопители

		(L.L.fanheater_t_target) 
		(L.L.Cabinair_Temp) - 0 max 
		(C.L.cabinair_V) / 
		(L.L.cabinair_Vrate_fanheater) * 
	
		(L.L.engine_temperature) 
		(C.L.heat_exchanger_effectivity) * 
		(L.L.Cabinair_Temp) max 
		(L.L.Cabinair_Temp) - 
		(C.L.cabinair_V) / 
		(L.L.cabinair_Vrate_cabinheater1) * +
		
		(L.L.engine_temperature) 
		(C.L.heat_exchanger_effectivity) * 
		(L.L.Cabinair_Temp) max 
		(L.L.Cabinair_Temp) - 
		(C.L.cabinair_V) / 
		(L.L.cabinair_Vrate_cabinheater2) * +
		
		(L.L.engine_temperature) 
		(C.L.heat_exchanger_effectivity) * 
		(L.L.Cabinair_Temp) max 
		(L.L.Cabinair_Temp) - 
		(C.L.cabinair_V) / 
		(L.L.cabinair_Vrate_cabinheater3) * +
		
		(C.L.cabinair_cvm) * 8 * 
		(S.L.cabinair_Qrate_engine_fanheatcooling)



'Berechnung der Feuchtigkeitsrate durch Volstrцme mit den Passagieren:
'Расчет скорости увеличения влаги с пассажирами
	
	(C.L.cabinair_absHum_passenger) 
	(L.L.Cabinair_absHum) - 
	(C.L.cabinair_V) / 
	(C.L.cabinair_Vrate_passenger) * 
	(L.L.humans_count) *
	
'Berechnung der Feuchtigkeitsrate durch Volumenstrцme mit der AuЯenwelt:
'Расчет скорости увеличения влажности от окружающего мира
	
	(L.S.Weather_AbsHum) 
	(L.L.Cabinair_absHum) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_doorwindow) * +
	
'Berechnung der Feuchtigkeitsrate durch Frontheizgerдt Расчет скорости увеличения владжности от переднего отопителя
	
	(L.S.Weather_AbsHum) 
	(L.L.Cabinair_absHum) - 
	(C.L.cabinair_V) / 
	(L.L.cabinair_Vrate_fanheater) * 
	(L.L.cp_pered_otopitel) 1 >= * + 
	(S.L.cabinair_test)
	
'... aufintegrieren: интеграция
	
	(L.S.Timegap) * 
	(L.L.Cabinair_absHum) + 
	(S.L.Cabinair_absHum)



{end}





'Предпусковой подогреватель
{macro:standheizung_frame}


	(L.L.cp_taster_standheizung_target) (L.L.elec_busbar_avail) &&
	{if}
		(L.L.standheizung_running) !
		{if}
			0 (S.L.standheizung_volume_stufe1) (S.L.standheizung_volume_stufe2)
			1 (S.L.standheizung_running)  
			0 (S.L.standheizung_stufe1_time_elapsed)
			1 (S.L.standheizung_stufe1) 
		{endif}
		1 (S.L.standheizung_target)
	
	{else}
		0 (S.L.standheizung_target)
	{endif}
	



'	Raufrцdeln der Timer: Счетчик времени с последнего включения отопителей
	(L.L.standheizung_running)
	{if}
		(L.L.standheizung_stufe1_time_elapsed) (L.S.Timegap) + (S.L.standheizung_stufe1_time_elapsed)
		(L.L.standheizung_stufe2_time_elapsed) (L.S.Timegap) + (S.L.standheizung_stufe2_time_elapsed)
	{endif}

'	Einschalten der 2. Stufe: Включение второго режима
	(L.L.standheizung_target) 
	(L.L.standheizung_stufe1_time_elapsed) >
	(C.L.standheizung_vorlauf) &&
	(L.L.engine_temperature) <
	(C.L.standheizung_brenner_t_ein) &&
	{if}
		(L.L.standheizung_stufe2) !
		{if}
			0 (S.L.standheizung_stufe2_time_elapsed)
		{endif}
		1 (S.L.standheizung_stufe2)
	{endif}

'	Ausschalten der 2. Stufe: Относится ко второму режиму
	(L.L.standheizung_target) ! 
	(L.L.standheizung_stufe2_time_elapsed) > 
	(C.L.standheizung_minlauf) &&
	(L.L.engine_temperature) >
	(C.L.standheizung_brenner_t_aus) ||
	{if}
		(L.L.standheizung_stufe2)
		{if}
			0 (S.L.standheizung_stufe1_time_elapsed)
		{endif}
		0 (S.L.standheizung_stufe2) 
	{endif}

'	Ausschalten der 1. Stufe: Относится к первому режиму
	(L.L.standheizung_target) ! 
	(L.L.standheizung_stufe1_time_elapsed) >
	(C.L.standheizung_nachlauf) && 
	{if}
		0 (S.L.standheizung_stufe1)
	{endif}

	(L.L.standheizung_stufe1) 
	{if}
		(L.L.standheizung_volume_stufe1) 
		(L.S.Timegap) 3 / + 1 min 
		(S.L.standheizung_volume_stufe1)
	{else}
		(L.L.standheizung_volume_stufe1) 
		(L.S.Timegap) 3 / - 0 max 
		(S.L.standheizung_volume_stufe1)
		0.01 <
		{if}
			0 (S.L.standheizung_running)
		{endif}
	{endif}

	(L.L.standheizung_stufe2) 
	{if}
		(L.L.standheizung_volume_stufe2) 
		(L.S.Timegap) 4 / + 1 min 
		(S.L.standheizung_volume_stufe2)

'		Berechnung der Temperaturverдnderung:
		(C.L.heizung_Qrate_standheizung) 
		(L.L.cabinair_Qrate_envir) - 
		(C.L.engine_cvm_engine) / 
		(L.S.Timegap) * 
		(L.L.engine_temperature) + 
		(S.L.engine_temperature) 


	{else}
		(L.L.standheizung_volume_stufe2) 
		(L.S.Timegap) 4 / - 0 max 
		(S.L.standheizung_volume_stufe2)
	{endif}



{end}


'Жидкостный подогреватель Webasto 320
{macro:EFU_frame}

'Если включена масса и выключатель, то ЭФУ готов к работе
	(L.L.elec_busbar_main) 
	(L.L.EFU_target) &&
	{if}
		1 (S.L.EFU_running)
	{else}
		0 (S.L.EFU_running) (S.L.EFU_rozhig) (S.L.EFU_gorelka) (S.L.EFU_rozhig_delay)
	{endif}
	
'Если ЭФУ готов к работе, то идет проверка на температуру антифриза в системе охлаждения двигателя
	(L.L.EFU_running)
	{if}
'		Если температура меньше 65 градусов, то через некоторое время происходит розжиг
		(L.L.engine_temperature) (C.L.EFU_t_rozhig) <
		{if}
			1 (S.L.EFU_rozhig)
		{else}
'			Если температура больше 78 градусов, то выключается горелка и розжиг (на всякий случай)
			(L.L.engine_temperature) (C.L.EFU_t_off) >
			{if}
				0 (S.L.EFU_rozhig) (S.L.EFU_gorelka)
			{endif}
		{endif}
	{endif}
	
'Если розжиг возможен, то через 20 секунд происходит розжиг и горелка начинает работать
	(L.L.EFU_rozhig)
	{if}
		(L.L.EFU_rozhig_delay) 20 <
		{if}
			(L.L.EFU_rozhig_delay) (L.S.Timegap) + (S.L.EFU_rozhig_delay) 
		{else}
			(L.L.engine_tank_content) 0 >
			{if}
				1 (S.L.EFU_gorelka)
				0 (S.L.EFU_rozhig) (S.L.EFU_rozhig_delay)
			{else}
'			Если включить горелку неудалось из-за отсутствия топлива то ЭФУ отключается полностью
				0 (S.L.EFU_rozhig) (S.L.EFU_gorelka) (S.L.EFU_running) (S.L.EFU_rozhig_delay)
			{endif}
		{endif}
	{endif}
	
'Если горелка включена, то происходит расчет температуры нагрева двигателя и расчет потребления топлива
	(L.L.EFU_gorelka)
	{if}
		(C.L.heizung_Qrate_standheizung) 
		(L.L.cabinair_Qrate_envir) - 
		(C.L.engine_cvm_engine) / 
		(L.S.Timegap) * 
		(L.L.engine_temperature) + 
		(S.L.engine_temperature)
		
		(L.L.EFU_toplivo_delay) 60 <
		{if}
			(L.L.EFU_toplivo_delay) (L.S.Timegap) + (S.L.EFU_toplivo_delay)
		{else}
			(L.L.engine_tank_content) (C.L.EFU_toplivo) 60 / - (S.L.engine_tank_content)
			0 (S.L.EFU_toplivo_delay)
		{endif}
	{endif}
	
{end}

'Циркуляционный насос
'Нужен для циркуляции антифриза в системе отопления- если он выключен эффективность отопления очень мала
{macro:CN_frame}

	(L.L.EFU_target)
	(L.L.CN_running) ||
	(L.L.elec_busbar_main) &&
	{if}
		(L.L.CN_on)
	{endif}
	
	
{end}
