Tutorial 3 - krat
Last modified by krat on 2023/07/19 11:50
T3A1: Round and Round!
T3A2: To boldly model where no one has modeled before...
Der Zug auf dem IC hat vorfahrt. Passiert er IC_LN_4 wir der Zug vom KH bei KIO_LN_0 sanft gebremst und wartet, bis der andere im Bahnhof ist. Sind beide Züge in der IC Station, hat der Zug auf IC_ST_1 vorfahrt, IC_ST_2 muss warten.
Fehlen tut noch, dass die Züge gestoppt werden, wenn die IC Station voll ist. Das sieht dann ungefähr so aus:
//Check, whether IC Station has space
region "isICfree":
initial state no_space
--> is_free with '!trackused(railway, IC_ST_1)'
| '!trackused(railway, IC_ST_2)'
| '!trackused(railway, IC_ST_3)'
/ IC_free = true;
state is_free
--> no_space with 'trackused(railway, IC_ST_1)'
& 'trackused(railway, IC_ST_2)'
& 'trackused(railway, IC_ST_3)'
/ IC_free = false;
//Is IC train in a critical section?
region "isCritical":
initial state ok
--> critical with IC_LN_4_1 / crit = true;
state critical
--> ok with IC_ST_1_1 | IC_ST_2_1 | IC_ST_3_1 / crit = false;
//Does KH train have to stop?
region "Stop KH train":
initial state init
--> slowdown with KIO_LN_0_1 & (!IC_free | crit) / 'settrack(railway, KIO_LN_0, REV, 40)';
state slowdown
--> stop with KIO_LN_0_0 / 'settrack(railway, KIO_LN_0, BRAKE, 0)';
state stop
--> init with IC_free & !crit / 'settrack(railway, KIO_LN_0, REV, 100)';
'setpoint(railway, 16, BRANCH)';
'setpoint(railway, 17, BRANCH)';
'setpoint(railway, 18, BRANCH)';
region "isICfree":
initial state no_space
--> is_free with '!trackused(railway, IC_ST_1)'
| '!trackused(railway, IC_ST_2)'
| '!trackused(railway, IC_ST_3)'
/ IC_free = true;
state is_free
--> no_space with 'trackused(railway, IC_ST_1)'
& 'trackused(railway, IC_ST_2)'
& 'trackused(railway, IC_ST_3)'
/ IC_free = false;
//Is IC train in a critical section?
region "isCritical":
initial state ok
--> critical with IC_LN_4_1 / crit = true;
state critical
--> ok with IC_ST_1_1 | IC_ST_2_1 | IC_ST_3_1 / crit = false;
//Does KH train have to stop?
region "Stop KH train":
initial state init
--> slowdown with KIO_LN_0_1 & (!IC_free | crit) / 'settrack(railway, KIO_LN_0, REV, 40)';
state slowdown
--> stop with KIO_LN_0_0 / 'settrack(railway, KIO_LN_0, BRAKE, 0)';
state stop
--> init with IC_free & !crit / 'settrack(railway, KIO_LN_0, REV, 100)';
'setpoint(railway, 16, BRANCH)';
'setpoint(railway, 17, BRANCH)';
'setpoint(railway, 18, BRANCH)';
Leider hängt sich Kieler ab dem Punkt beim C code generieren kommentarlos auf. Analog würde dann auch der Zug auf dem IC auf IC_LN_5 halten und warten bis ein Platz frei ist.
T3A3: Important Thoughts
- Einen *.sct zu *.c Knopf, der einem das von Hand transformieren spart
- Beim erstellen der .c vordefinierte Sachen automatisch hinzufügen (includes usw.)
- Ab und zu wären Fehlermeldungen sehr hilfreich, z.B. bei write-write Konflikten oder instantanen Schleifen. Sieht man zwar in den Zwischenschritten, aber grade wenn das Programm größer wird guckt man sich das ja nicht jedesmal bis ins Detail durch
- Sich einzelne regions ohne Umwege getrennt vom Rest anschauen zu können (also das Diagramm) wäre gerade bei größeren SCCharts sehr nützlich, die für sich zu unübersichtlich werden