Aufgabe
Die Ampel
soll im Normalfall auf Grün stehen. Wird der Taster E1 von einem Fußgänger
gedrückt, soll die Ampel 3 Sekunden (3000 MilliSekunden) später auf Gelb und
nach weiteren 4 Sekunden auf Rot wechseln. Die Rotphase soll 10 Sekunden dauern,
die anschließende Rot-Gelb-Fhase 3 Sekunden, dann soll es wieder Grün werden.
Soweit der "Computing Starter" Text von 3.2 Ampel. Hinweise : Die rote
Lampe an M1, die gelbe an M2 und die grüne an M1 schalten. An E1 den Taster
für die Anforderung der Fußgängerphase.
Anwendungskonstanten
mRot = 1; mGelb = 2;
eAnforderung = 1; eBlinken = 2;
Beschriftung der Textfelder
clblTitel = 'Ampel 1';
clblE: array[1..8] of string = ('Anforderung', 'Blinken',
'E3', 'E4', 'E5', 'E6', 'E7', 'E8');
clblM: array[1..4] of string = ('Rot', 'Gelb', 'Grün', 'M4');
fishMain
begin
repeat // --- Endlosschleife, Ende : HALT-Button
ftiSetMotor(mGruen, ftiEin);
ftiWaitForInput(eAnforderung, true);
ftiWaitForTime(300 * Werte(wFaktor));
ftiSetMotor(mGruen, ftiAus);
ftiSetMotor(mGelb, ftiEin);
ftiWaitForTime(400 * Werte(wFaktor));
ftiSetMotor(mGelb, ftiAus);
ftiSetMotor(mRot, ftiEin);
ftiWaitForTime(1000 * Werte(wFaktor));
ftiSetMotor(mGelb, ftiEin);
ftiWaitForTime(300 * Werte(wFaktor));
ftiSetMotor(mRot, ftiAus);
ftiSetMotor(mGelb, ftiAus);
until ftiFinish(0);
end;
Was passiert da?
Es gibt da zunächst eine Endlosschleife, die über den HALT-Button beendet
werden kann. In der Schleife dann im bunten Wechsel das Ein- und Ausschalten der
Lampen und zwischendurch wird gewartet. das ist alles.
Erweiterungen
Anzeige des Betriebszustandes in der Statuszeile durch printStatus.
Variable Zeiten.
Anlegen eines Steuerwertes Faktor mit dem die Wartezeit beeinflußt werden
kann (man muß dann beim Test nicht mehr solange warten. etwa so :
Const wFaktor = 1;
clblW: array[1..2] of string = ('Faktor', 'Wert 2');
ctxtW: array[1..2] of string = ('5', '0');
und in der Source von fishMain werden dann die entsprechende Zeilen geändert
:
ftiWaitForTime(300 * Werte(wFaktor));
usw.
Aufgabe 2
Modell wie bisher. Es soll jetzt aber noch eine (Nachts)Gelb-Blinken-Phase
geben. Das geht über eine Abfrage des Tasters E2 (dem Schiebeschalter).
modifiziertes fishMain
begin
repeat
// --- Endlosschleife, Ende : HALT-Button
if ftiGetInput(eBlinken) then begin
ftiSetMotor(mGruen, ftiAus);
Blinken();
end
else begin
ftiSetMotor(mGruen, ftiEin);
ftiWaitForInput(eAnforderung, true);
ftiWaitForTime(300 * Werte(wFaktor));
ftiSetMotor(mGruen, ftiAus);
ftiSetMotor(mGelb, ftiEin);
ftiWaitForTime(400 * Werte(wFaktor));
ftiSetMotor(mGelb, ftiAus);
ftiSetMotor(mRot, ftiEin);
ftiWaitForTime(1000 * Werte(wFaktor));
ftiSetMotor(mGelb, ftiEin);
ftiWaitForTime(300 * Werte(wFaktor));
ftiSetMotor(mRot, ftiAus);
ftiSetMotor(mGelb, ftiAus);
end;
until ftiFinish(0);
end;
Neu in der Schleife ist das If ftiGetInput(eBlinken) mit einem
"Blinken"-Teil und dem bisherigen Befehlen. Auch neu ist die Sub
Blinken :
procedure Blinken();
begin
ftiSetMotor(mGelb, ftiEin);
ftiWaitForTime(50 * Werte(wFaktor));
ftiSetMotor(mGelb, ftiAus);
ftiWaitForTime(50 * Werte(wFaktor));
end;
Sie enthält die Befehle für das Blinken. Auch wieder Lampe Ein/Aus, Warten.
Man sollte wieder die printStatus und den Faktor einfügen.
Aber wie ist denn das mit dem Umschalten zwischen Blinken (Nachtbetrieb) und
Normalbetrieb, wenn eBlinken beim Start des Programms gedrückt ist, blinkt es
schön. Wenn man im laufenden Betrieb eBlinken schaltet nicht immer, man muß
dann auf eAnforderung drücken um das Blinken einzuleiten. Kann man das noch
ändern. Etwa durch ein weiteres If anstelle des ftiFinish(0)?
|