'##############
'Heizungs-Script
'##############

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

'(c) 20.02.2009 Rüdiger Hülsmann
'(c) 04.11.2011 Marcel Kuhnt

'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
'- Marcel Kuhnt		19.06.2011	Parking Heater runs only if cooling circuit through front heater is open
'					zweistufige Heizlüfter hinten und vorne
'- Marcel Kuhnt		28.06.2011	Dachluken werden mit doppeltem Durchsatz berücksichtigt
'- Marcel Kuhnt		04.11.2011	Added "cockpit_heizregler_temp_mikrotaster"
'- Marcel Kuhnt		19.01.2012	Umwälzpumpensound + korrigiertes Verhalten der Standheizungs-Treibstoffpumpe ("Stufe 1")
'- Marcel Kuhnt		09.07.2012	Angepasst auf neue Busbar-Logik
'- Marcel Kuhnt		12.07.2012	Stromverbrauch Umwälzpumpe und Standheizung (Leitwertgenerierung)

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

'----------------------
'	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.cabinair_frame)
	(M.L.levegokalyha_frame)
	(M.L.legbefuvo_frame)
{end}

{macro:legbefuvo_frame}

	(L.L.Cabinair_Temp) 3 + (L.S.Weather_Temperature) <
	(L.S.Weather_Temperature) 15 < ||
	{if}
	1 (S.L.legbefuvo_hut_kikapcs)
	{else}
	0 (S.L.legbefuvo_hut_kikapcs)
	{endif}


	(L.L.cp_legbefuvo_RPM) 90 >
	(L.L.legbefuvo_hut_kikapcs) ! &&
	{if}
	18000 (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_legbefuvo1) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

	(L.L.cp_legbefuvo_RPM) 47 >
	(L.L.cp_legbefuvo_RPM) 90 <= &&
	(L.L.legbefuvo_hut_kikapcs) ! &&
	{if}
	18000 (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_legbefuvo2) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

	(L.L.cp_legbefuvo_RPM) 35 >
	(L.L.cp_legbefuvo_RPM) 47 <= &&
	(L.L.legbefuvo_hut_kikapcs) ! &&
	{if}
	18000 (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_legbefuvo3) / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}
{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) (L.L.Cabinair_Temp) - (C.L.cabinair_Qrate_engine_factor) * (S.L.cabinair_Qrate_engine)

'	Berechnung der Solltemperatur am Frontheizgerät
	(L.L.cp_kapcsolokar2_sw) s0 0 =
	{if}
		(L.L.Cabinair_Temp) 70 (L.L.Cabinair_Temp) - 1 * (C.L.heat_exchanger_effectivity) * + (S.L.fanheater_t_target)
	{else}
		(L.S.Weather_Temperature) 65 (L.S.Weather_Temperature) - 1 * (C.L.heat_exchanger_effectivity) * + (S.L.fanheater_t_target)
	{endif}

'	Légbefúvó
	(L.S.Weather_Temperature) (S.L.legbefuvo_t_target)

'Berechnung der effektiven Gesamt-Luftaustauschfläche:
	(L.L.door_0) (L.L.door_2) + (C.L.cabinair_A_perdoor) *

	(L.L.cp_fortochka_pass_anim_1_pos) (L.L.cp_fortochka_pass_anim_2_pos) (L.L.cp_fortochka_pass_anim_3_pos) (L.L.cp_fortochka_pass_anim_4_pos) + + +
	(L.L.cp_fortochka_pass_anim_5_pos) (L.L.cp_fortochka_pass_anim_6_pos) (L.L.cp_fortochka_pass_anim_7_pos) (L.L.cp_fortochka_pass_anim_8_pos) + + + +
	(L.L.cp_fortochka_pass_anim_9_pos) (L.L.cp_fortochka_pass_anim_10_pos) (L.L.cp_fortochka_pass_anim_11_pos) (L.L.cp_fortochka_pass_anim_12_pos) + + + +
	(L.L.cp_fortochka_pass_anim_13_pos) (L.L.cp_fortochka_pass_anim_14_pos) (L.L.cp_fortochka_pass_anim_15_pos) (L.L.cp_fortochka_pass_anim_16_pos) + + + +
	(L.L.cp_fortochka_pass_anim_17_pos) (L.L.cp_fortochka_pass_anim_18_pos) + +
	(C.L.cabinair_A_perwindow) * +

	(L.L.cp_dachluke_1) (L.L.cp_dachluke_2) (L.L.cp_dachluke_3) + +
	(C.L.cabinair_A_perluke) * +

	(L.L.cp_fahrerfenster_pos) (L.L.cp_fahrerfenster2_pos) +
	(C.L.cabinair_A_driverwindow) * +

	(L.L.sirocco_szellozes1) (C.L.cabinair_A_persirocco) * + 
	(L.L.sirocco_szellozes2) (C.L.cabinair_A_persirocco1) * + 

'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)

'Légbefúvó
	(C.L.cabinair_A_legbefuvo) (L.L.cp_legbefuvo_RPM) 100 / * (S.L.cabinair_Vrate_legbefuvo)

'Berechnung des Volumenstroms durchs Frontheizgerät
	(C.L.cabinair_A_frontheater) (L.L.cp_klimator_RPM) 100 / * (S.L.cabinair_Vrate_fanheater)

'Berechnung des Volumenstroms durch die Raumheizgeräte
'MC 2011 0619: Es hängt natürlich von der tatsächlichen Drehzahl der "cabinheater" ab! Nicht von der Schalterstellung! ;-)
	(C.L.cabinair_A_cabinheater) (L.L.cp_cabinheater_RPM) 100 / * (S.L.cabinair_Vrate_cabinheater)
	(C.L.cabinair_A_cabinheater1) (L.L.cp_cabinheater1_RPM) 100 / * (S.L.cabinair_Vrate_cabinheater1)
'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.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_fanheater) * +
'...und des Légbefúvó...
	(L.L.legbefuvo_t_target) (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_legbefuvo) * +
'...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_cabinheater) * +

	(L.L.engine_temperature) (C.L.heat_exchanger_effectivity) * (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_cabinheater1) * +
'...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.engine_temperature) (C.L.heat_exchanger_effectivity) * (L.L.Cabinair_Temp) max (L.L.Cabinair_Temp) - (C.L.cabinair_V) / (L.L.cabinair_Vrate_cabinheater) *
	(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) * +
	(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_kapcsolokar2_sw) 1 = * + (S.L.cabinair_test)
'... aufintegrieren:
	(L.S.Timegap) * (L.L.Cabinair_absHum) + (S.L.Cabinair_absHum)
{end}

{macro:levegokalyha_frame}

'                    Levegõs kályha üzemmódkapcsoló

                     (L.L.cockpit_levegokalyha) 1 =
                     {if}
                     1 (S.L.cp_levegokalyha_be)
                     0 (S.L.cp_levegokalyha_szelloz)
                     {endif}

                     (L.L.cockpit_levegokalyha) 0 =
                     {if}
                     0 (S.L.cp_levegokalyha_be)
                     0 (S.L.cp_levegokalyha_szelloz)
                     {endif}

                     (L.L.cockpit_levegokalyha) -1 =
                     {if}
                     0 (S.L.cp_levegokalyha_be)
                     1 (S.L.cp_levegokalyha_szelloz)
                     {endif}

'                    Levegõs kályha fokozatkapcsoló

                     (L.L.cockpit_levegok_fok) -1 = 
                     {if}
                     1 (S.L.cp_levegokalyha_fokozat)
                     {endif}

                     (L.L.cockpit_levegok_fok) 1 =
                     {if}
                     2 (S.L.cp_levegokalyha_fokozat)
                     {endif}

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


'Ventillátor be és ki + 1 és 1/2-ed fokozat

                     (L.L.cp_levegokalyha_be)
                     (L.L.cp_levegokalyha_szelloz) ||
	(L.L.cp_levegokalyha_fokozat) 1 = &&
	(L.L.elec_megszakito) &&
	{if}
	5 / (L.S.Timegap) * (L.L.sirocco_vent) + 0 max 1 min (S.L.sirocco_vent)
	{else}
	(L.L.sirocco_vent) (L.S.Timegap) 5 / - 0 max 1 min (S.L.sirocco_vent)
	{endif}

                     (L.L.cp_levegokalyha_be)
                     (L.L.cp_levegokalyha_szelloz) ||
	(L.L.cp_levegokalyha_fokozat) 2 = &&
	(L.L.elec_megszakito) &&
	{if}
	5 / (L.S.Timegap) * (L.L.sirocco_vent1) + 0 max 1 min (S.L.sirocco_vent1)
	{else}
	(L.L.sirocco_vent1) (L.S.Timegap) 5 / - 0 max 1 min (S.L.sirocco_vent1)
	{endif}

'Szellõzõüzem

	(L.L.sirocco_vent) 1 =
                     (L.L.sirocco_kalyha) 0 = &&
	{if}
	1 (S.L.sirocco_szellozes1)
	{else}
	0 (S.L.sirocco_szellozes1)
	{endif}

	(L.L.sirocco_vent1) 1 =
                     (L.L.sirocco_kalyha) 0 = &&
	{if}
	1 (S.L.sirocco_szellozes2)
	{else}
	0 (S.L.sirocco_szellozes2)
	{endif}

'Kályha izzítása

	(L.L.cp_levegokalyha_izzitas)
	(L.L.elec_megszakito) &&
	{if}
	30 / (L.S.Timegap) * (L.L.sirocco_izzitott) + 0 max 1 min (S.L.sirocco_izzitott)
	{endif}

	(L.L.cp_levegokalyha_izzitas) !
                     (L.L.cp_levegokalyha_be) ! &&
                     (L.L.cp_levegokalyha_szelloz) ! &&
	(L.L.elec_megszakito) ! ||
	{if}
	(L.L.sirocco_izzitott) (L.S.Timegap) 952 / - 0 max 1 min (S.L.sirocco_izzitott)
	{endif}

'Kályha bekapcsolása (0 fok alatt izzítani kell)

                     (L.L.cp_levegokalyha_be)
                     (L.S.Weather_Temperature) 5 > &&
	(L.L.elec_megszakito) &&
	{if}
	10 / (L.S.Timegap) * (L.L.sirocco_kalyha) + 0 max 1 min (S.L.sirocco_kalyha)
	{endif}

                     (L.L.cp_levegokalyha_be)
                     (L.S.Weather_Temperature) 5 < &&
                     (L.S.Weather_Temperature) -5 > &&
                     (L.L.sirocco_izzitott) 0.5 > &&
	(L.L.elec_megszakito) &&
	{if}
	18 / (L.S.Timegap) * (L.L.sirocco_kalyha) + 0 max 1 min (S.L.sirocco_kalyha)
	{endif}

                     (L.L.cp_levegokalyha_be)
                     (L.S.Weather_Temperature) -5 < &&
                     (L.L.sirocco_izzitott) 1 = &&
	(L.L.elec_megszakito) &&
	{if}
	27 / (L.S.Timegap) * (L.L.sirocco_kalyha) + 0 max 1 min (S.L.sirocco_kalyha)
	{endif}

                     (L.L.cp_levegokalyha_be) !
                     (L.L.Cabinair_Temp) 35 > ||
	(L.L.elec_megszakito) ! ||
	{if}
	(L.L.sirocco_kalyha) (L.S.Timegap) 8 / - 0 max 1 min (S.L.sirocco_kalyha)
	{endif}

'Fûtõüzem

	(L.L.sirocco_vent) 1 =
	(L.L.sirocco_kalyha) 1 = &&
	{if}
	(C.L.heizung_Qrate_levegokalyha) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_levegokalyha1) 1000 * / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

	(L.L.sirocco_vent1) 1 =
	(L.L.sirocco_kalyha) 1 = &&
	{if}
	(C.L.heizung_Qrate_levegokalyha) (L.L.cabinair_Qrate_envir) - (C.L.heizung_cvm_levegokalyha2) 1000 * / (L.S.Timegap) * (L.L.Cabinair_Temp) + (S.L.Cabinair_Temp)
	{endif}

{end}