Prototype van ETCS-systeem
Documentsoort: |
Behoeftespecificatie |
Versie: |
1.0 |
Datum: |
01 maart 2012 |
Auteurs: |
Jan Vlegels & Joris Van Geet & Filip Van Rysselberghe |
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.
Overzicht
Hieronder volgt een opsomming van alle use-cases inclusief hun prioriteit.
Behoeftes
1. Invoer
1.1. Treinnet inlezen
- Prioriteit:
- VERPLICHT
- Doel:
- Doel van deze use-case is het inlezen van de benodigde XML-bestanden voor het creëren van een fysisch correcte spoorlijn.
- Preconditie:
- Een XML-bestand met de beschrijving van de spoorlijn
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 correcte spoorlijn waarover een trein kan rijden.
- Stappen:
- 1. Open bestand met de beschrijving van de spoorlijn
- 2. Parse invoerbestand
- 3. Creeer spoorlijn adhv ingelezen data
- 4. Open bestand met de beschrijving van de signalisatie
- 5. Parse invoerbestand
- 6. FOR elk signaal in het invoerbestand
- 6.1. Creëer signaal ahv ingelezen data
- 7. Verifieer fysische consistentie
- Uitzonderingen:
- 1. [Onbestaand bestand] Foutboodschap
- 4. [Onbestaand bestand] Foutboodschap
- 2. [Fout in xml-syntax] Foutboodschap
- 5. [Fout in xml-syntax] Foutboodschap
- 7. [Fysische inconsistentie] Foutboodschap
- 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>
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>
1.2. Trein inlezen
- Prioriteit:
- VERPLICHT
- Doel:
- Doel van deze use-case is het inlezen van de benodigde XML-bestanden voor het creëren van een fysisch correcte trein.
- 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 een trein die correct gepositioneerd is op de bestaande spoorlijn.
- 2. Parse invoerbestand
- 3. Creëer trein adhv ingelezen data
- 4. Herhaal 1 t/m 3 voor het bestand met de beschrijving van de bestuurder
- 5. Verifieer fysische consistentie
- Uitzonderingen:
- 2. [Fout in xml-syntax] Foutboodschap
- 4. [Fout in xml-syntax] Foutboodschap
- 5. [Fysische inconsistentie] Foutboodschap
- Voorbeeld:
-
File: trein.xml
<trein>
<bestemming>A3</bestemming>
<naam>GT120</naam>
<snelheid>90</snelheid>
<maxSnelheid>110</maxSnelheid>
<locatie>Mechelen</locatie>
</trein>
File: bestuurder.xml
<treinbestuurder>
<naam>Hugo</naam>
<gemistSignaal>2</gemistSignaal>
</treinbestuurder>
2. Uitvoer
2.1. Treinnet uitschrijven
- Prioriteit:
- VERPLICHT
- 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.
- Stappen:
- 1. Creëer uitvoerbestand
- 2. Open uitvoerbestand
- 3. Schrijf gegevens uit voor de spoorlijn
- 4. FOR elk signaal
- 4.1. Schrijf gegevens uit voor het signaal
- 5. Sluit uitvoerbestand
- Uitzonderingen:
- 1. [Creatie mislukt] Foutboodschap, schrijf naar console ipv file
- Voorbeeld: (input is het voorbeeld uit 1.1 en 1.2)
-
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
2.2. Trein-informatie uitschrijven
- Prioriteit:
- VERPLICHT
- Doel:
- Wegschrijven van de op het treinnet gepositioneerde trein.
- 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:
- 1. Creëer uitvoerbestand
- 2. Open uitvoerbestand
- 3. Schrijf gegevens uit voor de bestuurder
- 4. Schrijf gegevens uit voor de trein
- 5. Sluit uitvoerbestand
- Uitzonderingen:
- 1. [Creatie mislukt] Foutboodschap, schrijf naar console ipv file
- 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)
3. Simulatie
3.1. Rijden van trein
- Prioriteit:
- VERPLICHT
- Doel:
- Rijden van een trein op het treinnet.
- Preconditie:
- Een correct treinnet met een geldige trein
- Succesvol einde:
- De trein bevindt zich op een nieuwe locatie in het treinnet
- Stappen:
- 1. FOR de af te leggen afstand
- 1.1. Verplaats de trein 1 locatie in de gewenste richting
- 1.2. Verminder de af te leggen afstand
- Uitzonderingen:
- 1.1. einde spoorlijn
- Voorbeeld: (toestand zoals ingelezen in 1.1 en 1.2)
-
Als de trein uit 1.2 40km moet afleggen in de richting van
AntwerpenCentraal, dan krijg je volgende verplaatsingen:
Mechelen -> A9 (10km)
A9 -> A8 (20km)
A8 -> A7 (30km)
A7 -> A6 (40km)
3.2. Reageren op signalisatie
- 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 doorgevoerd
- Stappen:
- 1. IF aantal gepasseerde signalen +1 = gemist signaal THEN
- 1.1. negeer signaal
- 2. ELSE
- 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.
- Uitzonderingen:
- 2.1. [Onbekend signaal] Negeer signaal
- Voorbeeld:
3.3. Traject afleggen
- Prioriteit:
- VERPLICHT
- Doel:
- Trein beweegt van beginlocatie tot eindlocatie rekening houdend met de gepasseerde signalisatie
- Preconditie:
- Een correct treinnet met een geldige trein
- Succesvol einde:
- De trein bevindt zich op zijn uiteindelijke bestemming
- Stappen:
- 1. WHILE bestemming niet bereikt
- 1.1. Reageer op de signalisatie
- 1.2. Rij 10 km
- Uitzonderingen:
- Geen
- Voorbeeld:
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 |
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.
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.