Geld mit Delphi

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

Das Delphi4 Programm mit FishFa50.DCU

Der LLWin Terminal Baustein wurde durch eine Delphi Form ersetzt in die auch die Auswahl des Interface-Anschlusses integriert wurde. Nun die Delphi-Lösung zum LLWin Hauptprogramm :

procedure TfrmMain.cmdActionClick(Sender: TObject);
begin

  if ft.OpenInterface(cboPortName.Text) = ftiFehler then begin
    MessageDlg('InterfaceProblem', mtInformation, [mbOK], 0);
    exit;
    end;

  Home;

  lblStatus.Caption := 'Schacht Rechts';
  ft.SetMotor(mSchlitten, ftiRechts);
  ft.WaitForChange(eSchlittenImpuls, 20);
  ft.SetMotor(mSchlitten, ftiAus);
  Schieber(StrToInt(txtSchachtRechts.Text));

  lblStatus.Caption := 'Schacht Mitte';
  ft.SetMotor(mSchlitten, ftiRechts);
  ft.WaitForChange(eSchlittenImpuls, 70);
  ft.SetMotor(mSchlitten, ftiAus);
  Schieber(StrToInt(txtSchachtMitte.Text));

  lblStatus.Caption := 'Schacht Links';
  ft.SetMotor(mSchlitten, ftiRechts);
  ft.WaitForChange(eSchlittenImpuls, 70);
  ft.SetMotor(mSchlitten, ftiAus);
  Schieber(StrToInt(txtSchachtLinks.Text));

  ft.CloseInterface;
  lblStatus.Caption := '---Finis---';
  cmdEnde.SetFocus;

end;

Was passiert da :

Eine Menge, dass sich wiederholt : Das Anfahren der Schächte Rechts, Mitte und Links mit unterschiedlichen Werten für die Position und die Anzahl der auszugebenden Münzen.

ft.SetMotor startet jeweils den Schlittenmotor, ft.WaitForChange zählt die Tasterimpulse, bei Erreichen der vorgegebenen Anzahl (Positionsangabe) wird der Schlittenmotor mit ft.SetMotor wieder ausgeschaltet. Bei Erreichen der Position wird das Unterprogramm Schieber aufgerufen, das die gewünschte Anzahl Münzen (Wert aus dem entsprechenden Feld der Form) ausgibt. Das ist schon (fast) alles. Es fehlen noch ft.OpenInterface und ft.CloseInterface für die Verbindung zum fischertechnik Interface und das Unterprogramm Home zum Anfahren der Home Position.

Das Unterprogramm Schieber sieht so aus :

procedure TfrmMain.Schieber(Anzahl: Integer);
var i: Integer;
begin
  lblStatus.Caption := 'Münzausgabe';
  for i := 1 to Anzahl do begin
    ft.SetMotor(mSchieber, ftiLinks);
    ft.WaitForInput(eSchieberVorn, False);
    ft.SetMotor(mSchieber, ftiRechts);
    ft.WaitForInput(eSchieberHinten, False);
    ft.SetMotor(mSchieber, ftiAus);
    end;
end;

In einer For ... Next Schleife für die Anzahl der auszugebenden Münzen wird der Schiebermotor gestartet (ft.SetMotor), dann wird gewartet bis der Schlitten vorn ist (ft.WaitForInput, der Taster muß öffnen, die meiste Zeit liegt er auf dem Zahnstangegetriebe und ist geschlossen). Wenn der Schieber vorn angekommen ist, wird der Schiebermotor umgepolt, d.h. der Schieber fährt gleich wieder zurück, der Motor wird abgeschaltet.

Und noch das Unterprogramm Home :

procedure TfrmMain.Home();
begin
  lblStatus.Caption := 'Home';
  ft.SetMotor(mSchieber, ftiRechts);
  ft.WaitForInput(eSchieberHinten, False);
  ft.SetMotor(mSchieber, ftiAus);
  ft.SetMotor(mSchlitten, ftiLinks);
  ft.WaitForInput(eSchlittenEnde, True);
  ft.SetMotor(mSchlitten, ftiAus);
end;

Zuerst wird der Schiebermotor gestartet (ft.SetMotor), dann wird mit ft.WaitForInput gewartet bis der Schlitten hinten ist und der Schiebermotor abgeschaltet. Dann startet der Schlittenmotor in Richtung Endtaster ...

Variante : Betragsausgabe

Bislang mußte man genau angeben wieviel Stück der jeweiligen Münzsorte ausgegeben werden sollen, wie wäre es mit der Angabe des auszugebenen Betrages? Das Programm müßte dann die Stückelung bestimmen. Deshalb zunächst das Unterprogramm Stueckelung :

procedure Stueckelung(Betrag: Integer; out Z200, Z100, Z50: Integer);
begin
  
  Z200 := 0;
  while Betrag - 200 >= 0 do begin
    Dec(Betrag, 200);
    Inc(Z200);
    end;

  Z100 := 0;
  while Betrag - 100 >= 0 do begin
    Dec(Betrag, 100);
    Inc(Z100);
    end;

  Z50 := 0;
  while Betrag - 50 >= 0 do begin
    Dec(Betrag, 50);
    Inc(Z50);
    end;
end;

Was passiert da :

Dem Unterprogramm wird der auszugebenden Betrag als Parameter übergeben. Ergebnis des Unterprgramms sind die Anzahlen der auszugebenden Münzen (Z200, Z100, Z50 für 2€, 1€ und 50€Cent).

Die Anzahlen werden zunächst auf 0 gesetzt und dann wird in einer Schleife vom aktuellen Betrag immer der Cent-Wert einer Münze abgezogen - bis es nicht mehr geht. Das wird für jede Münzsorte gemacht. Man sieht : Die Rest-Cent werden verschlabbert, es dürfen also nur Beträge, die durch 50€Cent teilbar sind, eingegeben werden.

Der Einbau in das vorhandene Programm ist einfach :

procedure TfrmMain.cmdActionClick(Sender: TObject);
var Z200, Z100, Z50: Integer;
begin

......

Stueckelung(StrToInt(txtBetrag.Text), Z200, Z100, Z50);

lblStatus.Caption := 'Schacht Rechts';
ft.SetMotor(mSchlitten, ftiRechts);
ft.WaitForChange(eSchlittenImpuls, 20);
ft.SetMotor(mSchlitten, ftiAus);
Schieber(Z200);

.......

end;

Zu Beginn des Programms wird die Stückelung bestimmt und an den Stellen wo bisher ein Anzahlfeld aus der Form ausgelesen wurde, wird jetzt ein Z-Wert eingesetzt. Das war alles.

Man kann natürlich noch prüfen, ob der Betrag durch 50€Cent teilbar ist, auf Höchstbetrag prüfen, Zähler für die vorhandenen Münzen führen und ggf. eine modifizierte Stueckelung vornehmen .... Viel Vergnügen.