

{init}
	(M.L.Doors_Init)

	0 (S.L.Fahrschalter)
	0 (S.L.Schaltwerk_Stufe)
	1 (S.L.Bremse_Druck)

'E-Kupplungen aktivieren:

	1 (S.L.E-Kupplung_Front) (S.L.E-Kupplung_KK)

{end}

{trigger:ai_scheduled_settarget}

'Einfach immer das gewünschte schildern:

	(L.L.AI_target_index) (S.L.target_index_int)
{end}

{frame}
	(M.L.Doors_Frame)
	(L.L.AI)
	{if}
		(M.L.ai_frame)
	{endif}



'#########################################
'	Spannungsversorgung und Abrissfunken:
'#########################################

'Prüfen, ob ein Spannungsabfall am Stromabnehmer vorliegt. Falls ja, dann Abrissfunke!

'(L.L.Prev_volt_veh_R) (L.L.contactshoe_0_volt_veh) s0 - 800 / 0 max (S.L.Abrissfunke_R)
'(L.L.Prev_volt_veh_L) (L.L.contactshoe_1_volt_veh) s1 - 800 / 0 max (S.L.Abrissfunke_L)

'Wenn das der letzte Kontakt war und eingeschaltet war, dann richtig doll!

'(L.L.PrePrev_volt_veh_R) (L.L.CCR_800V) - 800 / 5 * 100 (L.L.Velocity) abs - 100 / * (L.L.CCR_THR_forward) (L.L.CCR_THR_back) || * (L.L.Abrissfunke_R) max (S.L.Abrissfunke_R)
'(L.L.PrePrev_volt_veh_L) (L.L.CCR_800V) - 800 / 5 * 100 (L.L.Velocity) abs - 100 / * (L.L.CCR_THR_forward) (L.L.CCR_THR_back) || * (L.L.Abrissfunke_L) max (S.L.Abrissfunke_L)

'Alte Werte speichern:

'(L.L.Prev_volt_veh_R) (S.L.PrePrev_volt_veh_R)
'(L.L.Prev_volt_veh_L) (S.L.PrePrev_volt_veh_L)

'l0 (S.L.Prev_volt_veh_R)
'l1 (S.L.Prev_volt_veh_L)

'800-Volt-Leitung versorgen:

'l0 l1 max (S.L.CCW_800V)



'(L.L.Prev_thirdrail_index_R) (L.L.contactshoe_0_rail_index) = !
'(L.L.Prev_thirdrail_index_L) (L.L.contactshoe_1_rail_index) = ! ||
'{if}
'	(L.L.Velocity) abs 45 >
'	{if}
'		"auflauf_schnell.wav"
'	{else}
'		"auflauf_langsam.wav"
'	{endif}
'	(T.F.ev_contactshoe)
'{endif}

'(L.L.contactshoe_0_rail_index) (S.L.Prev_thirdrail_index_R)
'(L.L.contactshoe_1_rail_index) (S.L.Prev_thirdrail_index_L)


'#########################################
'	Fahrschalter
'#########################################

'Setzen des Fahrschalters als Schmidt-Trigger, abhängig von der Geschwindigkeit:

	(L.L.Velocity) abs 20 >
	(L.L.Throttle) s0 0.3 > &&
	l0 0.8 > ||
	{if}
		1 (S.L.Fahrschalter)
	{endif}
	l0 0.1 <
	{if}
		0 (S.L.Fahrschalter)
	{endif}


'Setzen des Trennschuetzes (binär):
	(L.L.Fahrschalter)
	(L.L.AI_Engine) (L.L.AI) ! || &&
	(L.L.Bremse_Druck) 0.01 < &&
	(S.L.CCW_THR_forward)
	(L.L.CCR_THR_forward)
	(L.L.CCR_THR_back) ||
	(L.L.CCR_800V) 0 >=
'ENTWEDER es liegt Spannung an, ODER es ist ein KI-Zug - der darf immer fahren können! ;)
	(L.L.AI) || &&
	(S.L.Schaltwerk_Trennschuetz) s0 


'#########################################
'	Schaltwerk und Trennschütz:
'#########################################


'Wenn Trennschuetz aktiv:
	l0
	{if}
'Schaltwerk auf 1 setzen:
		(L.L.Schaltwerk_Stufe) 0.5 <
		(L.L.Schaltwerk_Schaltzeit) 0 < &&
		{if}
			1 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Trennschuetz_ein)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
'Schaltwerk weiterschalten lassen, wenn Geschwindigkeit erreicht:
		(L.L.Schaltwerk_Stufe) 1 + s1 (F.L.Schaltwerk_Stufe_vmin) (L.L.Velocity) abs <
		(L.L.Schaltwerk_Stufe) (C.L.Schaltwerk_Stufenzahl) < &&
		(L.L.Schaltwerk_Schaltzeit) 0 < &&
		{if}
			l1 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Schaltwerk)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
	{else}
		(L.L.Schaltwerk_Stufe) 0.5 >
		{if}
			0 (S.L.Schaltwerk_Stufe)
			(T.L.ev_Trennschuetz_aus)
			(C.L.Schaltwerk_Schaltzeit) (S.L.Schaltwerk_Schaltzeit)
		{endif}
	{endif}

'Schaltzeit verkleinern:
	
	(L.L.Schaltwerk_Schaltzeit) s0 0 >=
	{if}
		l0 (L.S.Timegap) - (S.L.Schaltwerk_Schaltzeit)
	{endif}

'#########################################
'	Traktion:
'#########################################

'Richtungswender:
	(L.L.CCR_THR_back) -2 * 1 + s1

	(L.L.Schaltwerk_Trennschuetz)
	{if}
		1 (L.L.Velocity) abs (C.L.AI_v_max_erreich) (L.L.Schaltwerk_Stufe) * (C.L.Schaltwerk_Stufenzahl) /  / - 0 max s0
'Verringerung ab Schaltstufe 8 (Parallel):
		(L.L.Schaltwerk_Stufe) 8 >=
		{if}
			l0 2 / s0
		{endif}
		l0 (S.L.relMoment) l1 * (C.L.AI_M_gas_max) * (S.L.M_Wheel)
	{else}
		0 (S.L.M_Wheel) (S.L.relMoment)
	{endif}

'#########################################
'	Bremskraft:
'#########################################

	(L.L.Brake) (S.L.CCW_Bremse)

'------------------------
'Reaktion auf den Zustand der Bremsleitung:

	(L.L.CCR_Bremse)
	(L.L.Velocity) abs 4 / min s0
	(L.L.Bremshebel) >
	{if}
		l0 (S.L.Bremshebel)
	{endif}
	l0 0.01 <
	{if}
		0 (S.L.Bremshebel)
	{endif}

	(L.L.Bremshebel) s0
	(L.L.Bremse_Druck) s1
	1.0 s2
	0.5 s3
	(M.L.traegheit)
	(S.L.Bremse_Druck)
	l5 20 * 1 min (S.L.Bremse_Luftstrom) s0

	l0 0 >
	{if}
		1 (S.L.Bremse_ReleaseSound)
	{endif}
	l0 -0.1 <
	(L.L.Bremse_Druck) 0.01 > &&
	(L.L.Bremse_ReleaseSound) &&
	(L.L.Velocity) abs 5 < &&
	{if}
		(T.L.ev_bremseloesen)
		0 (S.L.Bremse_ReleaseSound)		
	{endif}

	(L.L.Bremse_Druck) (C.L.AI_F_brems_max) * (S.L.Brakeforce)


'#########################################
'	Debug:
'#########################################


{end}

{trigger:railbond_0}
	(T.L.ev_railbond_a)
{end}

{trigger:railbond_1}
	(T.L.ev_railbond_a)
{end}

{trigger:railbond_2}
	(T.L.ev_railbond_b)
{end}

{trigger:railbond_3}
	(T.L.ev_railbond_b)
{end}

{macro:traegheit}

'Simuliert träges Verhalten (exponentiell)

'(c) Rüdiger Hülsmann, edited by Marcel Kuhnt

'Ladekonventionen:
'	Sollwert		l0
'	Istwert			l1
'	Konstante Anlauf	l2
'	Konstante Ablauf	l3

'Ausgabe:
'	neuer Istwert:		direkt
'	Ableitung:		l5

'Anlauf oder Auslauf?
	l0 l1 > 
	{if}
		l2 s4
	{else}
		l3 s4
	{endif}


'Sollwert:
	l0
'Istwert:
	l1
'Beschleunigung:
	- s4 * s5 (L.S.Timegap) *
'Addition zum Istwert:
	l1 + s1
{end}


