Es soll eine kleine Ampelsteuerung geschrieben werden. Diese soll auf Ereignisse reagieren und entsprechende Lichtzeichen setzen.
Das Hauptaugenmerk liegt dabei nicht auf der einzelnen "low-level" Umschaltvorgängen, sondern auf der Sicherheit der Verkehrsteilnehmer.
Wir gehen einfach davon aus, dass ein automatischer Übersetzer "verwendete Programmiersprache" -> Microcontrollercode existiert
und nutzen das Programm als Prototyp der endgültigen Implementierung.
Die Aufgabe ist in 2 Teilaufgaben aufgespalten (je nach Zeit/Lust reicht schon die erste aus )
Die Umsetzung dürfte vom Code her kürzer, als die Beschreibung, sein (also nicht abschrecken lassen )
Man soll sich im wesentlichen um "logsiche" Sicherheitsaspekte Gedanken machen - hierzu liefert die detailierte Beschreibung
einige Ansätze.
Eine ganz einfache Kreuzung:
Es gibt 2 Fussgängerampeln (F1 und F2) und 2 Autoampeln (A1,A2).
Hauptstrasse = senkrecht
Querstrasse = waagerecht
(anfangs hatte ich eine deutlich komplizierte Kreuzung geplant - mit Linksabbiegespuren und entsprechenden Ampeln. Falls die Aufgabe zu einfach wird, kommt diese auch dran )
Da es sich um eine sicherheitskritische Anwendung handelt, sollte die Implementierung in mindestens 2 Module aufgespalten werden.
Ein Modul kümmert sich unmittelbar um die richtige Schaltung und ein Modul reagiert auf die Außenwelt und kümmert sich nur um die "timings".
Das Schaltmodul ist für das korrekte Setzen der Lichtsignale verantwortlich! Die Sicherheit soll NICHT von der richtigen Reihenfolge der Aufrufe abhängen! Es soll also unmöglich sein, von "außen" einen ungültigen Zustand zu setzen. Notfalls soll die Funktion einen Fehler signalisieren (Fehlervariable, Rückgabewert usw.) und keine Aktion durchführen.
Teilaufgabe 1: setzte ein Schaltmodul um. Es geht also nur um das Setzen der Lichtzeichen.
Dabei soll eine Ausgabe der Ampelzustände sowie eine Interaktion möglich sein(Konsole reicht aus) - Umsetzung z.B als Extramodul/Code der die Funktionen aufruft:
Teilaufgabe 2: setzte das "Außenwelt" Modul um, dieses soll die Schnittstellen des Schaltmoduls nutzen, um die Ampelzustände zu setzen. Hier geht es daru, die Lichtzeichen entsprechend einem "Programm" zu setzen (also "live-schaltung"
Ausgabe der Lichtzeichen sowie einfache Interaktion (Konsole reicht aus) soll möglich sein:
Überlegt euch, wie man eine mögliche Fehlerfreiheit/Korrektheit des Codes erreicht (optimalerweise nachweist).
Tipp: Testcases sowie einfacher, schrittweise nachvollziehbarer Code wären ein Anfang. Es geht hier also nicht um möglichst elegange Lösungen mit spezifischen Sprachtricks (OOP, x?y:z) sondern um Nachvollziehbarkeit .
Bitte keine Triviallösungen (alle Autoampeln auf rot => Fussgänger auf grün).
Das Hauptaugenmerk liegt dabei nicht auf der einzelnen "low-level" Umschaltvorgängen, sondern auf der Sicherheit der Verkehrsteilnehmer.
Wir gehen einfach davon aus, dass ein automatischer Übersetzer "verwendete Programmiersprache" -> Microcontrollercode existiert
und nutzen das Programm als Prototyp der endgültigen Implementierung.
Die Aufgabe ist in 2 Teilaufgaben aufgespalten (je nach Zeit/Lust reicht schon die erste aus )
Die Umsetzung dürfte vom Code her kürzer, als die Beschreibung, sein (also nicht abschrecken lassen )
Man soll sich im wesentlichen um "logsiche" Sicherheitsaspekte Gedanken machen - hierzu liefert die detailierte Beschreibung
einige Ansätze.
Eine ganz einfache Kreuzung:
Code:
| | |
| | . |
| | /|\ |
| | | |
| | | |
|#########| |
(F)| | | | | | | | | (F)
(1)| | | | | | | | | (1)
| | | | | | | | |
(F)(2) | | | (F)(2)
------------------ (A)(1)( ) -------------------------
------- (A) ------- ##
/____ (2) ##
\ ------- ( ) ------- ##
##
------------------- -------------------------
## ------- (A) -------
## (2) _____\
## ------- ( ) ------- /
##
------------------- (A)(1)( ) -------------------------
(F)(2) | | | (F)(2)
| | | | | | | | |
(F)| | | | | | | | |(F)
(1)| | | | | | | | |(1)
| |#########|
| | | |
| | | |
| \|/ | |
| ' | |
| | |
Hauptstrasse = senkrecht
Querstrasse = waagerecht
(anfangs hatte ich eine deutlich komplizierte Kreuzung geplant - mit Linksabbiegespuren und entsprechenden Ampeln. Falls die Aufgabe zu einfach wird, kommt diese auch dran )
Eine Autoampel hat 4 Zustände: {grün,rot,zwischen,notbetrieb}
Eine Fussgängerampel hat 3 Zustände {grün, rot, notbetrieb}
Für die "Ampelschaltung" reicht es aus, einer Ampel(variable,array, was auch immer) den jeweiligen Zustand zuzuweisen.
Die Fussgängerampeln sind Bedarfsampeln. Sie sollen also nur dann überhaupt auf grün geschaltet werden, wenn ein Signal von einem Fussgänger kommt (Knopf). Und zwar möglichst in der nächsten sinnvoll verfügbaren Phase (es sollen also nicht sofort alle Autoampeln auf rot gestellt werden )
Die Autoampeln sollen je nach Tagesszeit zwischen Zeit-und Bedarfsmodus wechseln können.
Die Ampeln im Zeitmodus sollen jeweils nacheinander den Verkehrsteilnehmern die Durchfahrt ermöglichen. Im Bedarfsmodus
soll der Verkehr auf der Hauptstrasse grün haben und Querstrassenverkehr nur bei Bedarf grün geschaltet bekommen ("Bedarf" = Sensoren, die ein Auto feststellen)
Keine Angst, ihr müsst keine Sensoren abfragen oder Zeit bestimmen
Eine Fussgängerampel hat 3 Zustände {grün, rot, notbetrieb}
Für die "Ampelschaltung" reicht es aus, einer Ampel(variable,array, was auch immer) den jeweiligen Zustand zuzuweisen.
Die Fussgängerampeln sind Bedarfsampeln. Sie sollen also nur dann überhaupt auf grün geschaltet werden, wenn ein Signal von einem Fussgänger kommt (Knopf). Und zwar möglichst in der nächsten sinnvoll verfügbaren Phase (es sollen also nicht sofort alle Autoampeln auf rot gestellt werden )
Die Autoampeln sollen je nach Tagesszeit zwischen Zeit-und Bedarfsmodus wechseln können.
Die Ampeln im Zeitmodus sollen jeweils nacheinander den Verkehrsteilnehmern die Durchfahrt ermöglichen. Im Bedarfsmodus
soll der Verkehr auf der Hauptstrasse grün haben und Querstrassenverkehr nur bei Bedarf grün geschaltet bekommen ("Bedarf" = Sensoren, die ein Auto feststellen)
Keine Angst, ihr müsst keine Sensoren abfragen oder Zeit bestimmen
Da es sich um eine sicherheitskritische Anwendung handelt, sollte die Implementierung in mindestens 2 Module aufgespalten werden.
Ein Modul kümmert sich unmittelbar um die richtige Schaltung und ein Modul reagiert auf die Außenwelt und kümmert sich nur um die "timings".
Das "Schaltmodul" implementiert:
peds_go(eine Fussgängerampel: F1 oder F2)
peds_stop(eine Fussgängerampel: F1 oder F2)
cars_go(eine Autoampel: A1 oder A2)
cars_stop(eine Autoampel: A1 oder A2)
cars_yellow(eine Autoampel: A1 oder A2)
error(): es wurde ein Hardwaredefekt festgestellt, die Ampel soll in den Notbetriebmodus gehen.
dabei soll "yellow" die Umschaltung zur Grünphase/Rotphase der jeweiligen Ampel vorbereiten (also Zwischenphase einleiten), "go" entsprechend grün setzen,
"stop" auf rot setzen
peds_go(eine Fussgängerampel: F1 oder F2)
peds_stop(eine Fussgängerampel: F1 oder F2)
cars_go(eine Autoampel: A1 oder A2)
cars_stop(eine Autoampel: A1 oder A2)
cars_yellow(eine Autoampel: A1 oder A2)
error(): es wurde ein Hardwaredefekt festgestellt, die Ampel soll in den Notbetriebmodus gehen.
dabei soll "yellow" die Umschaltung zur Grünphase/Rotphase der jeweiligen Ampel vorbereiten (also Zwischenphase einleiten), "go" entsprechend grün setzen,
"stop" auf rot setzen
Es gibt folgende Schnittstellen zur Außenwelt, die euer Programm in einem Modul implementieren soll:
init(): das Signal kommt, wenn die Anlage in Betrieb genommen wird. Hier können notwendige Initialisierungen vorgenommen werden.
tick(): wenn ein Zeitabschnitt vergeht. Wird automatisch von einer Zeitgebereinheit aufgerufen.
require_peds({eine der Fussgängerampeln: F1 oder F2}) : Signal einer Fussgängerampel(Knopf/Berührfläche).
require_cars({A2}) : Signal von einem Sensor
set_mode(Zeit oder Bedarf)
error(): es wurde ein Hardwaredefekt festgestellt, die Ampel soll in den Notbetriebmodus gehen.
Prinzipiell müsste noch sowas wie "set_time_slices" rein, damit die Verkehrzentrale die Dauer der Grün/Zwischenphasen der jeweiligen Ampeln dem Verkehrsaufkommen anpassen kann - der einfachheitshalber lassen wir das mal weg .
Die Software selbst hat KEINE Möglichkeit die Zeit zu messen. Sie soll nur auf die Events von der Außenwelt reagieren und entsprechende Ampeln setzen. Zum setzen soll das "Außenweltmodul" nur die Schnittstellen des Schaltmoduls nutzen (Funktion/Methodenaufruf oder Event feuern - je nach Sprache/Umsetzung).
init(): das Signal kommt, wenn die Anlage in Betrieb genommen wird. Hier können notwendige Initialisierungen vorgenommen werden.
tick(): wenn ein Zeitabschnitt vergeht. Wird automatisch von einer Zeitgebereinheit aufgerufen.
require_peds({eine der Fussgängerampeln: F1 oder F2}) : Signal einer Fussgängerampel(Knopf/Berührfläche).
require_cars({A2}) : Signal von einem Sensor
set_mode(Zeit oder Bedarf)
error(): es wurde ein Hardwaredefekt festgestellt, die Ampel soll in den Notbetriebmodus gehen.
Prinzipiell müsste noch sowas wie "set_time_slices" rein, damit die Verkehrzentrale die Dauer der Grün/Zwischenphasen der jeweiligen Ampeln dem Verkehrsaufkommen anpassen kann - der einfachheitshalber lassen wir das mal weg .
Die Software selbst hat KEINE Möglichkeit die Zeit zu messen. Sie soll nur auf die Events von der Außenwelt reagieren und entsprechende Ampeln setzen. Zum setzen soll das "Außenweltmodul" nur die Schnittstellen des Schaltmoduls nutzen (Funktion/Methodenaufruf oder Event feuern - je nach Sprache/Umsetzung).
:
Zeitfenster für die Grünphase/Zwischenphase:
der einfachheitshalber konstant (und Pi * Daumen festgelegt, falls es nicht passen sollte, können diese natürlich auch geändert werden)
Dauer der Zwischenphase(gelb): 1 Tick
Fussgängerampeln: bei Bedarf 3 Ticks(grün), sowie 2 Ticks für "Nachzügler" (die Ampel ist schon rot, es dürfen aber hier noch keine Autos fahren).
Zeitmodus:
Hauptstrassenverkehr(grün): 10 Ticks
Querstrassenverkehr(grün): 5 Ticks
Im Bedarfsmodus:
Hauptstrassenverkehr: default grün
Querstrassenverkehr(grün): bei Bedarf 2 Ticks
Zeitfenster für die Grünphase/Zwischenphase:
der einfachheitshalber konstant (und Pi * Daumen festgelegt, falls es nicht passen sollte, können diese natürlich auch geändert werden)
Dauer der Zwischenphase(gelb): 1 Tick
Fussgängerampeln: bei Bedarf 3 Ticks(grün), sowie 2 Ticks für "Nachzügler" (die Ampel ist schon rot, es dürfen aber hier noch keine Autos fahren).
Zeitmodus:
Hauptstrassenverkehr(grün): 10 Ticks
Querstrassenverkehr(grün): 5 Ticks
Im Bedarfsmodus:
Hauptstrassenverkehr: default grün
Querstrassenverkehr(grün): bei Bedarf 2 Ticks
1. Ampeln der Hauptstrasse auf grün <=> Querstrassenampeln auf rot(kein gelb, kein grün!) und umgekehrt.
Es darf NIEMALS dazu kommen, dass beide Richtungen auch nur für kurze Zeit gleichzeitig grün- und/oder zwischenphase zeigen.
2. Fussgängerampeln zeigen grün: nur parallel verlaufender Autoverkehr erlaubt.
3. (Teilaufgabe2) Fussgänger können sich nicht teleportieren . Also dürfen Autofahrer nicht sofort grün bekommen, sondern es muss eine Mindestzeit für "Nachzügler" vergehen (siehe oben).
4. Autoampeln dürfen nicht direkt zwischen grün und rot wechseln (dafür gibt es die Zwischenphase gelb)
5. Deadlocks sollten möglichst vermieden werden.
6. denkt euch weitere Punkte aus
Es darf NIEMALS dazu kommen, dass beide Richtungen auch nur für kurze Zeit gleichzeitig grün- und/oder zwischenphase zeigen.
2. Fussgängerampeln zeigen grün: nur parallel verlaufender Autoverkehr erlaubt.
3. (Teilaufgabe2) Fussgänger können sich nicht teleportieren . Also dürfen Autofahrer nicht sofort grün bekommen, sondern es muss eine Mindestzeit für "Nachzügler" vergehen (siehe oben).
4. Autoampeln dürfen nicht direkt zwischen grün und rot wechseln (dafür gibt es die Zwischenphase gelb)
5. Deadlocks sollten möglichst vermieden werden.
6. denkt euch weitere Punkte aus
Dabei soll eine Ausgabe der Ampelzustände sowie eine Interaktion möglich sein(Konsole reicht aus) - Umsetzung z.B als Extramodul/Code der die Funktionen aufruft:
Code:
1.peds_go
2.peds_stop
3.cars_go
4.cars_stop
5.cars_yellow
6.error
your input:
Ausgabe der Lichtzeichen sowie einfache Interaktion (Konsole reicht aus) soll möglich sein:
Code:
1.next tick
2.switch_mode
3.require_peds(F1)
4.require_peds(F2)
5.require_cars(A2)
6.error
your input:
Überlegt euch, wie man eine mögliche Fehlerfreiheit/Korrektheit des Codes erreicht (optimalerweise nachweist).
Tipp: Testcases sowie einfacher, schrittweise nachvollziehbarer Code wären ein Anfang. Es geht hier also nicht um möglichst elegange Lösungen mit spezifischen Sprachtricks (OOP, x?y:z) sondern um Nachvollziehbarkeit .
Bitte keine Triviallösungen (alle Autoampeln auf rot => Fussgänger auf grün).
Zuletzt bearbeitet: