Ampel

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

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)?