SE1BAC Project 2012 - European Train Control System ETCS - Specificatie 2.0

European Train Control System ETCS - SE1BAC - Ansymo 2011-2012

Prototype van ETCS-systeem

Documentsoort: Behoeftespecificatie
Versie: 2.0
Datum: 22 maart 2012
Auteurs: Jan Vlegels
Status: Opgeleverd

Samenvatting

Dit document bevat de specificaties voor een informaticasysteem dat als prototype dienst doet van het Europese trein controle systeem. Het is geschreven in het kader van het vak "Inleiding software Engineering" (1ste bachelor informatica - Universiteit Antwerpen). De opgave is een licht herwerkte versie van de projectopgave 2006-2007

Context

Zoals voor alle andere types van transport is het efficiënt beheren van het treinverkeer van groot belang om een klantvriendelijk en kost-efficiënt treinverkeer te kunnen aanbieden. Om hoofd te kunnen bieden aan de lage kosten vliegtuigmaatschappijen is het bovendien van belang dat het internationale treinverkeer gestroomlijnder kan verlopen. Omdat de treinnetten tot nu toe voornamelijk nationaal geregeld werden, moeten internationale treinen zoals o.a. de Thalys, vaak minutenlang stilstaan aan de grensovergangen. Om dit soort van synchronisatie problemen op te lossen hebben de Europese treinmaatschappijen samen ETCS (European Train Control System) uitgetekend. Dit systeem heeft als bijkomend doel het aantal treinbotsingen te verminderen.

De Universiteit Antwerpen is gevraagd om een prototype ter evaluatie van ETCS te ontwikkelen. In de eerste bachelor informatica zal onder de vakken "computer graphics" en "inleiding software engineering" gewerkt worden aan dit project. Tijdens de practica Computer Graphics zal de visualisatie van het prototype ontwikkeld worden, tijdens de practica Inleiding Software Engineering zal gewerkt worden aan de applicatie zelf.

Legende

De behoeftespecificatie is opgesteld aan de hand van zogenaamde use-cases. Elke use-case beschrijft een klein gedeelte van de gewenste functionaliteit, en het is de bedoeling dat tijdens elke fase van het project verschillende van die use cases geïmplementeerd worden.

Een typische use-case bevat de volgende onderdelen.

Refertenummer & titel:
Wordt gebruikt om naar een bepaalde use-case te verwijzen.
Prioriteit:
De specificatie van een systeem vraagt meer dan wat binnen de voorziene tijd op te leveren is. Vandaar dat we per use-case aangeven in hoeverre die functionaliteit belangrijk is. In volgorde van belangrijkheid kan hier staan: VERPLICHT (deze use-case moet opgeleverd worden), BELANGRIJK (niet essentieel maar bij voorkeur toch opleveren), NUTTIG (interessant maar kan weggelaten worden).
Doel:
Summiere beschrijving van het waarom van de use-case, t.t.z. wat de use-case bijdraagt tot de gehele functionaliteit.
Preconditie:
Summiere beschrijving van de uitgangspunten bij aanvang van de use-case.
Succesvol einde:
Summiere beschrijving van wat opgeleverd zal worden als er niks fout is gegaan.
Stappen:
Een sequentiële beschrijving van hoe de use-case precies zal verlopen als alles goed gaat (het zogenaamde "happy day scenario"). De stappen zijn genummerd en kunnen controle instructies (WHILE, IF, ...) bevatten.
Uitzonderingen:
Een lijst van mogelijke probleemgevallen en hoe die behandeld zullen worden. Een probleem geval (a) verwijst naar het nummer van de stap waar het probleem kan optreden, (b) bevat een conditie die aangeeft wanneer het probleemgeval optreedt, (c) omschrijft heel kort (een lijn) hoe het probleem behandeld zal worden.
Voorbeeld:
Een voorbeeld van wat in- of uitgevoerd kan worden.

Soms is een use-case een uitbreiding van een andere use-case, en dan zijn volgende onderdelen relevant.

Uitbreiding:
Een referte naar de use-case waarvan deze een uitbreiding is.
Stappen:
Een lijst van extra en/of aangepaste stappen t.o.v de use-case waarvan deze een uitbreiding is.
Een uitbreinding (a) verwijst naar het nummer van de stap die uitgebreid wordt, (b) zegt of de uitbreiding voor, na of tijdens de normale stap zal gebeuren, (c) omschrijft wat precies in de uitbreiding zal gebeuren.

Overzicht

Hieronder volgt een opsomming van alle use-cases inclusief hun prioriteit.

Use-case Prioriteit
1. Invoer
1.1. Treinnet inlezen VERPLICHT
1.2. Trein-informatie inlezen VERPLICHT
1.3. Meerdere spoorlijnen inlezen BELANGRIJK
1.4. Meerdere treinen inlezen VERPLICHT
2. Uitvoer
2.1. Treinnet uitschrijven VERPLICHT
2.2. Trein-informatie uitschrijven VERPLICHT
2.3. Meerdere spoorlijnen uitschrijven BELANGRIJK
2.4. Meerdere treinen uitschrijven VERPLICHT
2.5. Grafische Impressie BELANGRIJK
2.6. Integratie met graphics NUTTIG
3. Simulatie
3.1. Rijden van trein VERPLICHT
3.2. Reageren op signalisatie VERPLICHT
3.3. Traject afleggen VERPLICHT
3.4. Rijden met reele snelheid NUTTIG
3.5. Reageren op nieuwe signalisatie VERPLICHT
3.6. Uitvoeren gesignaleerde actie VERPLICHT
3.7. Meerdere treinen leggen traject af VERPLICHT
3.8. Dynamisch gebruik van stoplichten NUTTIG
3.9. Meerdere treinen leggen traject af met mogelijkheid tot inhalen NUTTIG
4. Gebruikersinterface
4.1. GUI voor signalen NUTTIG

Behoeftes

1. Invoer

1.3. Meerdere spoorlijnen inlezen

Prioriteit:
BELANGRIJK
Doel:
Doel van deze use-case is het inlezen van de benodigde XML-bestanden voor het creëren van een fysisch correct treinnet.
Preconditie:
Een XML-bestand met de beschrijving van de spoorlijnen
Een XML-bestand met de beschrijving van de signalisatie op de spoorlijn
(Zie Appendix 1 voor meer informatie over het XML formaat)
Succesvol einde:
Het systeem bevat een aantal correcte spoorlijnen waarover een trein kan rijden.
Uitbreiding:
Use Case 1.1
Stappen:
[1, vervang] Open bestand met de beschrijving van de spoorlijnen
[3, vervang] Creeer spoorlijnen
Voorbeeld:
File: spoorlijn.xml

        <SPOORLIJN>
                <locatie>AntwerpenCentraal</locatie>
                <locatie>A2</locatie>
                <locatie>A3</locatie>
                <locatie>A4</locatie>
                <locatie>A5</locatie>
                <locatie>A6</locatie>
                <locatie>A7</locatie>
                <locatie>A8</locatie>
                <locatie>A9</locatie>
                <locatie>Mechelen</locatie>
        </SPOORLIJN>

        <SPOORLIJN>
                <locatie>BrusselNoord</locatie>
                <locatie>B1</locatie>
                <locatie>Vilvoorde</locatie>
                <locatie>B2</locatie>
                <locatie>B3</locatie>
                <locatie>Mechelen</locatie>
                <locatie>B4</locatie>
                <locatie>B5</locatie>
                <locatie>B6</locatie>
                <locatie>GentSintPieters</locatie>
        </SPOORLIJN>

File: signalisatie.xml
        
        <signaal>
                <locatie>A4</locatie>
                <spoor>2</spoor>
                <type>maxSnelheid</type>
                <waarde>20</waarde>
        </signaal>
        <signaal>
                <locatie>A6</locatie>
                <spoor>2</spoor>
                <type>maxSnelheid</type>
                <waarde>90</waarde>
        </signaal>
        <signaal>
                <locatie>A9</locatie>
                <spoor>2</spoor>
                <type>maxSnelheid</type>
                <waarde>10</waarde>
        </signaal>

        <signaal>
                <locatie>B1</locatie>
                <spoor>2</spoor>
                <type>stoplicht</type>
                <waarde>rood</waarde>
        </signaal>

1.4. Meerdere treinen inlezen

Prioriteit:
VERPLICHT
Doel:
Doel van deze use-case is het inlezen van de benodigde XML-bestanden voor het creëren van een aaantal treinen.
Preconditie:
Geldig treinnet
Een XML-bestand met de beschrijving van de trein
Een XML-bestand met de beschrijving van de bestuurder van de trein
(Zie Appendix 1 voor meer informatie over het XML formaat)
Succesvol einde:
Het systeem bevat meerdere treinen met bestuurders die correct gepositioneerd zijn op de bestaande spoorlijn(en).
1. Parse invoerbestanden
2. FOR elke trein en bestuurder
2.1. Use Case 1.2
Uitzonderingen:
1. [Fout in xml-syntax] Foutboodschap
2. [Leeg bestand] Foutboodschap
Voorbeeld:
File: trein.xml

        <trein>
                <bestemming>A3</bestemming>
                <naam>GT120</naam>
                <snelheid>90</snelheid>
                <maxSnelheid>110</maxSnelheid>
                <locatie>Mechelen</locatie>
        </trein>
<trein>
<bestemming>B5</bestemming> <naam>GT200</naam> <snelheid>100</snelheid> <maxSnelheid>150</maxSnelheid> <locatie>GentSintPieters</locatie>
 File: bestuurder.xml
        
        <treinbestuurder>
                <naam>Hugo</naam>
<trein>GT120</naam>
<type>verstrooid</type>
<gemistSignaal>2</gemistSignaal>
</treinbestuurder>
<treinbestuurder> <naam>Frans</naam>
<trein>GT200</naam>
<type>kleurenblind</type>
<gemistSignaal></gemistSignaal>
</treinbestuurder>

2. Uitvoer

2.3. Meerdere spoorlijnen uitschrijven

Prioriteit:
BELANGRIJK
Doel:
Wegschrijven van de huidige toestand van het treinnet.
Preconditie:
Het systeem bevat een geldig treinnet, eventueel voorzien van een trein.
Succesvol einde:
Het systeem heeft een tekstbestand (ASCII) uitgevoerd, waarin de toestand van het treinnet netjes werd in uitgeschreven.
Uitbreiding:
Use Case 2.1
Stappen:
[3, voor] FOR elke spoorlijn
Uitzonderingen:
Voorbeeld: (input is het voorbeeld uit 1.3)
File: toestandTreinnet.txt

---Structuur Treinnet---
Spoorlijn - AntwerpenCentraal<->A2<->A3<->A4<->A5<->A6<->A7<->A8<->A9<->Mechelen
maxSnelheid op A4, spoor2 = 20 km/h
maxSnelheid op A6, spoor2 = 90 km/h
maxSnelheid op A9, spoor2 = 10 km/h

Spoorlijn - BrusselNoord<->B1<->Vilvoorde<->B2<->B3<->Mechelen<->B4<->B5<->B6<->GentSintPieters
stoplicht op B1, spoor2 = rood

2.4. Meerdere treinen uitschrijven

Prioriteit:
VERPLICHT
Doel:
Wegschrijven van de op het treinnet gepositioneerde treinen.
Preconditie:
Het systeem bevat op een geldig treinnet, eventueel voorzien van een trein.
Succesvol einde:
Het systeem heeft een tekstbestand (ASCII) uitgevoerd, waarin de toestand van het treinnet netjes werd uitgeschreven.
Stappen:
[3., voor] FOR elke trein
Uitzonderingen:
Voorbeeld: (input is het voorbeeld uit 1.1 en 1.2)
File: ToestandTrein.txt
---Toestand Trein---
Bestuurder: Hugo (mist vaak het 2de signaal)
Trein GT120 met bestemming A3
Huidige locatie Mechelen
Huidige snelheid 90 km/h (max 110 km/h)

---Toestand Trein---
...

2.5: Grafische impressie

Prioriteit:
BELANGRIJK
Doel:
Spoorlijn wordt grafisch weergegeven. In de weergave komt 1 ASCII symbool overeen met 1 entiteit uit de simulatie.
Uitbreiding:
Deze use case is een uitbreiding van [2.1 Treinnet wegschrijven]
Succesvol einde:
Het systeem heeft een tekstbestand (ASCII) uitgevoerd, waarin de situatie van de wereld staat beschreven.
Stappen:
[3., vervang] Teken gegevens voor de spoorlijn (= "-" per spoor, per locatie)
[4.1., vervang] Teken gegevens voor de signalen (= "M" voor maxSnelheid signaal, "R" voor een rood stoplicht en "G" voor een groen stoplicht)
Voorbeeld:
eerste spoorlijn uit Use Case 1.3.:
----------
---M-M--M-
 
tweede spoorlijn uit Use Case 1.3.:
----------
-R-------- 

2.6. Integratie met Graphics

Prioriteit:
NUTTIG
Doel:
Een 3D vizualisatie van de simulatie. Hiervoor kan je je graphics engine gebruiken.
Preconditie:
Het systeem is correct geïnitialiseerd.
Succesvol einde:
Het treinnet wordt weergegeven in een 3D omgeving.

3. Simulatie

3.4. Reële snelheid

Prioriteit:
NUTTIG
Doel:
Rijden van een trein aan een realistische snelheid.
Preconditie:
Een correct treinnet met een geldige trein
De trein bevindt zich niet op de laatste locatie
Aantal tijdseenheden dat de trein moet rijden
Succesvol einde:
De trein bevindt zich op een nieuwe locatie in het treinnet
Stappen:
1. FOR opgegevenTijdseenheden
1.1. afgelegdeAfstand = afgelegdeAfstandVorigeTijdseenheid + (snelheid/40)
1.2 IF afgelegdeAfstand >= 10 km
1.2.1. verplaats de trein 1 locatie in de gewenste richting
1.2.2. afgelegdeAfstand = 0
1.3. ELSE
1.3.1. afgelegdeAfstandVorigeTijdseendheid = afgelegdeAfstand
Uitzonderingen:
Voorbeeld: (toestand zoals ingelezen in 1.1 en 1.2)
Als de trein uit 1.2, die zich in Mechelen bevindt, 8 tijdseenheden moet
bewegen in de richting van AntwerpenCentraal, dan krijg je volgende situatie aan het einde van
elke tijdseenheid (bv. T1 = tijdseenheid 1):

T1: Mechelen, afgelegdeAfstand= 2km 
T2: Mechelen, afgelegdeAfstand= 4km
T3: Mechelen, afgelegdeAfstand= 6km 
T4: Mechelen, afgelegdeAfstand= 8km 
T5: A9, afgelegdeAfstand= 0km 
T6: A9, afgelegdeAfstand= 2km 
T7: A9, afgelegdeAfstand= 4km 
T8: A9, afgelegdeAfstand= 6km 

3.5. Reageren op nieuwe signalisatie

Prioriteit:
VERPLICHT
Doel:
Een treinbestuurder observeert een signaal en reageert erop door de toestand van de trein aan de geobserveerde signalisatie aan te passen.
Preconditie:
Een correct treinnet met een geldige trein
Succesvol einde:
De treinbestuurder heeft correct op het signaal gereageerd.
Uitbreiding:
Use Case 3.1
Stappen:
1. IF verstrooide bestuurder
1.1. IF aantal gepasseerde signalen +1 = gemist signaal THEN
1.1.1. negeer signaal
1.2. ELSE
1.2.1. Reageer op signalisatie
2. ELSE IF kleurenblinde bestuurder
2.1. IF stoplicht
2.1.1. negeer signaal
2.2. ELSE
2.2.1. Reageer op signalisatie
Uitzonderingen:
Voorbeeld:

3.6. Uitvoeren gesignaleerde actie

Prioriteit:
VERPLICHT
Doel:
Een treinbestuurder past de toestand van de trein aan aan de geobserveerde signalisatie
Preconditie:
Een correct treinnet met een geldige trein
Succesvol einde:
De treinbestuurder heeft de juiste verandering aan de trein doorgevoerd
Uitbreiding:
Use Case 3.1
Stappen:
[1-2, verwijder]
2. IF maxSneldheid signaal THEN
2.1. IF aangegeven snelheid van maxSnelheid-signaal < snelheid trein THEN
2.1.1. reduceer snelheid tot aangegeven snelheid
2.2. ELSE
2.2.1. verhoog snelheid tot aangegeven snelheid.
3. ELSE IF stoplicht THEN
3.1. IF rood THEN
3.1.1. stop trein
3.2. ELSE IF groen THEN
3.2.1. rij door
Uitzonderingen:
2. [Onbekend signaal] Negeer signaal
Voorbeeld:

3.7. Meerdere treinen leggen traject af

Prioriteit:
VERPLICHT
Doel:
Elke trein beweegt van beginlocatie tot eindlocatie rekening houdend met de gepasseerde signalisatie
Preconditie:
Een correct treinnet met geldige trein(en)
Succesvol einde:
Elke trein bevindt zich op zijn uiteindelijke bestemming
Uitbreiding
Use Case 3.3
Stappen:
[1., voor] FOR elke trein
[1.2., voor] IF trein niet gestopt
Uitzonderingen:
1.2. [Andere trein op nieuwe locatie] stop simulatie en geef foutmelding
1.2. [Use case 3.4 geimplementeerd] rij 1 tijdseenheid ipv 10km
Voorbeeld:

3.8. Dynamisch gebruik van stoplichten

Prioriteit:
Nuttig
Doel:
Indien een trein op een bepaald spoor van een bepaalde spoorlijn een signaal negeert, dan springen alle stoplichten op dat spoor op rood.  Indien die trein toekomt op zijn bestemming worden alle stoplichten weer op groen gezet.
Preconditie:
Een correct treinnet met geldige trein(en)
Succesvol einde:
Elk stoplicht op een bepaald spoor van een bepaalde spoorlijn staat op rood indien een signaal op dat spoor genegeerd werd.  De betrokken stoplichten worden weer groen indien de overtredende trein zijn bestemming bereikt heeft.
Uitbreiding
Stappen:
IF trein negeert signaal THEN
FOR elk stoplicht op betrokken spoor
verander waarde naar rood
IF overtredende trein aangekomen in bestemming THEN
FOR elk stoplicht op betrokken spoor
verander waarde naar groen
Uitzonderingen:
Voorbeeld:

3.9. Meerdere treinen leggen traject af met mogelijkheid tot inhalen

Prioriteit:
Nuttig
Doel:
Indien een trein toekomt in een locatie waar reeds een andere trein staat dan wordt de simulatie verdergezet volgens een procedure waarmee inhalen mogelijk is
Preconditie:
Een correct treinnet met geldige trein(en)
Succesvol einde:
Elke trein bevindt zich op zijn uiteindelijke bestemming
Uitbreiding
Use Case 3.4
Use Case 3.7
Stappen:
[3.7 - 1.2., vervang] IF andere trein op nieuwe locatie THEN
trein met laagste snelheid (indien zelfde snelheid dan heeft eerst eerste trein voorrang) wordt op zijspoor geplaatst gedurende 3 tijdseenheden.  Snelste trein kan passeren.  Indien trein op zijspoor op bestemming dan blijft hij op zijspoor staan
Uitzonderingen:
Voorbeeld:

4.1. GUI voor signalen

Prioriteit:
NUTTIG
Doel:
Een signaal (type en waarde) wordt ingegeven of aangepast via een grafische user interface.  Gebruik hiervoor een willekeurige GUI library voor C++.
Stappen:
1. Bepaal het type signaal (maxSnelheid of stoplicht)
2. Geef de waarde van het signaal op

Appendix 1: Invoer formaat

Dit is het algemene formaat dat gebruikt wordt voor XML bestanden. De tag-identifiers en waarden zijn afhankelijk van het probleem-domein.

XML-file = { TagValuePair }
TagValuePair = "<" TagIdentifier ">" [ Content ] "</" TagIdentifier ">"
Content = Value | { TagValuePair } 
TagIdentifier = String
Value = String
String = StringCharacter { StringCharacter }
StringCharacter = Number | Letter | "-" 
Number = "0" ... "9"
Letter = "a" ... "z" | "A" ... "Z" 

Geldige informatie

We moeten nu nog de tags en hun waarde vastleggen die gelden voor ons probleem-domein. Dit bestaat uit het vastleggen van de mogelijke tags en de verwachte inhoud ("Content").

De mogelijke tag-identifiers zijn: trein, treinbestuurder, spoorlijn, signaal, naam, snelheid, locatie, bestemming, gemistSignaal, type, waarde en spoor.
Tag-identifiers zijn niet hoofdletter gevoelig, inhouden zijn dit wel.

De inhoud van deze tags is vastgelegd op:

Tag identifier Content
Trein naam, snelheid, locatie, bestemming, maxSnelheid
Treinbestuurder gemistSignaal, naam, type, trein
SPOORLIJN locatie
Signaal locatie, type, waarde, spoor

Bovendien moet de openingstag steeds overeenkomen met de sluitingstag.

(In)consistentie

Het bestand met de in te lezen situatie wordt met de hand geschreven. Om de ingelezen situatie te kunnen simuleren moet de informatie consistent zijn.

Een spoorlijn is consistent als:

  • Het bestaat uit minstens 2 locaties.
  • Elke locatie aangeduid wordt met een willekeurige opeenvolging van cijfers en letters.

Een trein is consistent als:

  • Zijn naam bestaat uit een willekeurige opeenvolging van cijfers en letters.
  • Zijn snelheid behoort tot het interval [0,zijn maximale snelheid].
  • Zijn huidige locatie behoort tot een bestaande spoorlijn.
  • Zijn bestemming behoort tot een bestaande spoorlijn.
  • Zijn maximale snelheid (maxSnelheid) strikt positief is en niet groter dan 400 km/h.

Een treinbestuurder is consistent als:

  • Hij een naam heeft die bestaat uit een willekeurige opeenvolging van letters.
  • Hij een bestaande trein opgeeft die nog geen andere bestuurder heeft.
  • Hij van het type "verstrooid" of "kleurenblind" is.
  • Een "verstrooid" bestuurder een gemistSignaal opgeeft.
  • Een "kleurenblind" bestuurder geen gemistSignaal opgeeft.

Een signaal is consistent als:

  • Zijn locatie behoort tot een bestaande spoorlijn.
  • De waarde voor een maxSnelheid-signaal een geldige snelheid uitgedrukt in km/h is. Bovendien zijn enkel positieve waarden toegestaan.
  • De waarde voor het spoor enkel 1 of 2 mag zijn. Met 1 een signaal in de richting van het laatste station van een spoorlijn en 2 de omgekeerde richting.
  • Als er geen ander signaal op dezelfde locatie en hetzelfde spoor voorkomt.