Zustandsbasierte Modellierung Material Beispiele Ampel Getränkeautomat Pawlowscher Hund
Pfad: Startseite / Fächer / Informatik / Zustandsbasierte Modellierung / Ampel
Autor: mk
28.03.2009 15:03
1378
einfache Ampelsteuerung

zu Python-Realisierungen von Ampel-Automaten

Automat

Steuerung ampel1.jff

Klassendiagramm

Klassendiagramm

Delphi-Realisierung

Es wird die Unit uAmpel zum Zeichnen der Ampel benutzt. Die Steuerung löst über das Ereignis OnChange selbstständig den Aufruf von update auf.

Ausschnitt aus dem GUI-Quelltext
....
procedure TForm1.update;
var
  zustand : TZustand;
begin
  zustand := steuerung.GetZustand;
  case zustand of
    q0 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,true,false,false);
    q1 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,true,true,false);
    q2 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,false,false,true);
    q3 : TAmpel.zeichne_Ampel(canvas,100,50,30,0,false,true,false);
  end;
end;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
  steuerung := TSteuerung.create;
  steuerung.OnChange := update;  // Ereignisbehandlung mit Ereignis verbinden
end;
....
Steuerungsunit

Da die Steuerung einen Timer 'hat', ist sie für Erzeugung und Vernichtung verantwortlich. Das geschieht durch eine Erweiterung von Konstruktor und Destruktor. Bitte die Stellung des Schlüsselwortes 'inherited' beachten.

UNIT mTSteuerung;

interface

//--------------------  ggf Uses-Liste anpassen !  --------------------
uses
  ExtCtrls;

type
  TZustand = (q0,q1,q2,q3);

type
  TEreignis = procedure of object;

  TSteuerung = class

  private   //Attribute
    timer    : TTimer;
    zustand  : TZustand;

  public
    OnChange : TEreignis;
    //Methoden
    constructor create; virtual;
    procedure neuerZustand(Sender : TObject);
    procedure SetZustand (pZustand: TZustand);
    function GetZustand : TZustand;
    destructor destroy; virtual;

   end;

implementation

const        // Phasenlängen in ms
  rotZeit     = 2000;
  rotgelbZeit = 500;
  gruenZeit   = 2000;
  gelbZeit    = 500;

//+---------------------------------------------------------------------
//|         TSteuerung: Methodendefinition
//+---------------------------------------------------------------------

//-------- create (public) ---------------------------------------------
constructor TSteuerung.create;
begin
  inherited create;
  timer := TTimer.Create(nil);
  zustand := q0;
  timer.Interval := rotZeit;
  timer.OnTimer := neuerZustand;
end;

//-------- neuerZustand (public) ---------------------------------------
procedure TSteuerung.neuerZustand(Sender : TObject);
begin
  case zustand of
    q0: begin zustand := q1; timer.Interval := rotgelbZeit; end;
    q1: begin zustand := q2; timer.Interval := gruenZeit;   end;
    q2: begin zustand := q3; timer.Interval := gelbZeit;    end;
    q3: begin zustand := q0; timer.Interval := rotZeit;     end;
  end;
  if Assigned(OnChange) then OnChange;
end;

//-------- SetZustand (public) -----------------------------------------
procedure TSteuerung.SetZustand (pZustand: TZustand);
begin
  zustand := pZustand;
end;

//-------- GetZustand (public) -----------------------------------------
function TSteuerung.GetZustand : TZustand;
begin
  result  := zustand;
end;

//-------- destroy (public) --------------------------------------------
destructor TSteuerung.destroy;
begin
  timer.Free;
  inherited destroy;
end;

end.

Download

GUIAmpel1.zip

Valid XHTML 1.0! lokal