

{init}
	0 (S.L.Schaltwerk_Stufe)
	0.7 (S.L.Luefter)
{end}

{frame}

'Setzen des Trennschuetzes (binär):
	(L.L.Throttle) 0.5 >
	(L.L.Bremse_Druck) 0.01 < &&
	(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) <
		(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:
'#########################################

	(L.L.Schaltwerk_Trennschuetz)
	{if}
		1 (L.L.Velocity) (C.L.AI_v_max_erreich) (L.L.Schaltwerk_Stufe) * (C.L.Schaltwerk_Stufenzahl) /  / - 0 max (S.L.relMoment) (C.L.AI_M_gas_max) * (S.L.M_Wheel)
	{else}
		0 (S.L.M_Wheel) (S.L.relMoment)
	{endif}

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

	(L.L.Brake)
	(L.L.Velocity) 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) 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)

'#########################################
'	Luefter:
'#########################################

	(L.L.Throttle) 2 / 0.5 + 1 min s0
	(L.L.Luefter) s1
	0.1 s2 s3
	(M.L.traegheit)
	(S.L.Luefter)

'#########################################
'	Rauch:
'#########################################

	(L.L.Luefter) 1000 * 100 /  (S.L.fx_freq)
	(L.L.Luefter) 1000 * 2500 / (L.L.Throttle) 2 * * 3 + (S.L.fx_vel)
	(L.L.Throttle) 3 / 0.05 + (S.L.fx_alpha)
	(L.L.Throttle) 0.5 + 1.5 / 5 * (S.L.fx_leben)

'#########################################
' Falls Stationen, setze immer auf 0:
	(L.L.AI_Scheduled_AtStation) 0 <
	{if}
		0 (S.L.AI_Scheduled_AtStation)
	{endif}

'#########################################
'	Spitzen- und Schlusssignale:
'#########################################
'Prüfen, ob die Lok vorwärts oder rückwärts fährt:
	(L.L.train_Me_reverse)
	{if}
'		Lok fährt rückwärts
		(L.L.AI_Engine) 0.5 > (S.L.Lights_white_rear) 
		(L.L.train_frontcoupling) ! (S.L.Lights_red_front)
		0 (S.L.Lights_white_front) (S.L.Lights_red_rear)
	{else}
'		Lok fährt vorwärts
		(L.L.AI_Engine) 0.5 > (S.L.Lights_white_front) 
		(L.L.train_backcoupling) ! (S.L.Lights_red_rear)		
		0 (S.L.Lights_white_rear) (S.L.Lights_red_front)
	{endif}

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

(L.L.Throttle)
(S.L.Debug_0)
(L.L.Luefter)
(S.L.Debug_1)

{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}


