Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   dynamische Verwaltung von Objekten - Fahrstuhlsteuerung (https://www.delphipraxis.net/175307-dynamische-verwaltung-von-objekten-fahrstuhlsteuerung.html)

Sir Rufo 14. Jun 2013 12:05

AW: dynamische Verwaltung von Objekten - Fahrstuhlsteuerung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Fehler in der Umsetzung ist der, dass bei der Anweisung "Schließe die Tür" der komplette Vorgang abgearbeitet wird.
In der Praxis wäre es so, dass beim Drücken des Schließen-Knopfes alle Knöpfe ihre Funktion verlieren (blockiert sind), bis die Tür geschlossen ist.

Im Anhang habe ich mal ein kleines Projekt für eine Fahrstuhltür, die man auch im laufenden Betrieb wieder öffnen kann.

Basisklasse
Delphi-Quellcode:
  EElevator = class( Exception );

  TElevatorDoorState = ( edsClosed, edsClosing, edsOpening, edsOpen );

  TElevatorDoor = class( TProgressEntity )
  protected
    function GetPosition : Integer; virtual; abstract;
    function GetState : TElevatorDoorState; virtual; abstract;
  public
    // Nur zur Visualisierung (0-100)
    property Position : Integer read GetPosition;
    // Status
    property State :   TElevatorDoorState read GetState;
    // Befehle
    procedure Open; virtual; abstract;
    procedure Close; virtual; abstract;
  end;
und konkret
Delphi-Quellcode:
  TDumbElevatorDoor = class( TElevatorDoor )
  private
    // Öffnen-/Schließ-Geschwindigkeit in m/s
    FDirection : Extended;
    // Position der Tür in m (0m - 1m)
    FPosition : Extended;
  protected
    function GetState : TElevatorDoorState; override;
    function GetPosition : Integer; override;
    procedure Progress( const IntervalMS : Cardinal ); override;
  public
    procedure Open; override;
    procedure Close; override;
  end;

implementation

uses
  System.Math;

const
  cEpsilon = 0.001;

  { TDumbElevatorDoor }

procedure TDumbElevatorDoor.Close;
begin
  FDirection := - 0.3; // 0.3m/s Schließgeschwindigkeit
end;

function TDumbElevatorDoor.GetPosition : Integer;
begin
  Result := 100 - Round( FPosition * 100 );
end;

function TDumbElevatorDoor.GetState : TElevatorDoorState;
begin
  if FDirection > 0
  then
    Result := edsOpening
  else if FDirection < 0
  then
    Result := edsClosing
  else if SameValue( FPosition, 0, cEpsilon )
  then
    Result := edsClosed
  else if SameValue( FPosition, 1, cEpsilon )
  then
    Result := edsOpen
  else
    raise EElevator.Create( 'Fahrstuhltür defekt' );
end;

procedure TDumbElevatorDoor.Open;
begin
  FDirection := 0.5; // 0.5m/s Öffnen-Geschwindigkeit
end;

procedure TDumbElevatorDoor.Progress( const IntervalMS : Cardinal );
var
  LNewPosition : Extended;
begin

  LNewPosition := FPosition + FDirection / 1000 * IntervalMS;

  if LNewPosition >= 1
  then
    begin
      FPosition := 1;
      FDirection := 0;
    end
  else if LNewPosition <= 0
  then
    begin
      FPosition := 0;
      FDirection := 0;
    end
  else
    FPosition := LNewPosition;

end;

StuRic 15. Jun 2013 11:05

AW: dynamische Verwaltung von Objekten - Fahrstuhlsteuerung
 
Moin,

Zitat:

Zitat von generic (Beitrag 1218588)
Du kannst doch jederzeit eingreifen.
Hauptsache der Übergang ist erlaubt. So ein Zwischenstand ist doch "Tür geht zu".
Dieser Zustand dauert ja an bis die Tür vollständig zu ist oder jemand die Lichtschranke unterbricht oder den Tür auf Knopf drückt.

...

Übergänge werden immer durch Ereignisse ausgelöst. Um dann den Übergang zu finden, ist die Ereignisart und Regeln erforderlich.

Pinzip hab ich verstanden. Danke dir für die ausführliche Erklärung :)

Zitat:

Zitat von Sir Rufo (Beitrag 1218595)
Im Anhang habe ich mal ein kleines Projekt für eine Fahrstuhltür, die man auch im laufenden Betrieb wieder öffnen kann.

Vielen Dank für die Mühe! Ich werde mit Sicherheit nen paar Tage brauchen bis ich (fast) alle Details verstanden hab.
Bis denn!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz