KurvenSchreiber

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

Erfassen von Meßwerten als Kurven

Erfassen von MesßwertenAufgabe

Erfassen von 500 Werten des Analogeinganges EX und deren Darstellung als Kurve in Abhängigkeit von der Zeit. Verwenden eines Photowiderstandes.

Hinweis : Die Erfassung der Werte erfolgt in einer For ... Next-Schleife. Gezeichnet wird in eine PaintBox. Das Zeichnen des Gitters geschieht in einem separaten Unterprogramm. Interface und Interfaceanschluß werden über eine ComboListe eingestellt.

Die Quellen sind in Curve.ZIP zu finden. Zusätzlich ist noch delphiFish20Setup.EXE erforderlich.

Die HauptRoutine : cmdActionClick


procedure TfrmMain.cmdActionClick(Sender: TObject);
var lastX, lastY, actY, i: Integer;
begin
  ftiDCB.AnalogScan := 1;
  if ftiOpenInterface(cboPortName.Text) = ftiFehler then
  begin
  MessageDlg('InterfaceProblem', mtInformation, [mbOK], 0);
  exit;
  end;
  Gitter;
  lastX := 0;
  lastY := 0;
  for i := 0 to 500 do begin
    actY := ftiGetAnalog(0) div 2;
    if (actY > 500) or (actY < 1) then actY := 500;
    picPlot.Canvas.MoveTo(lastX,lastY);
    picPlot.Canvas.LineTo(i,actY);
    lastX := i;
    lastY := actY;
    ftiWaitForTime(32);
    end;
  ftiCloseInterface;  
  cmdEnde.SetFocus;
end;

Fast der größere Teil des Programmes spielt sich in der procedure cmdActionClick ab.

  1. Im ersten Teil werden die Variablen lastX ...definiert, die später beim Zeichnen verwendet werden.
  2. Verwendet wird die Unit FumFish20EX.PAS.
  3. ftiOpenInterface stellt die Verbindung zum Interface her. Der PortName wird dabei der ComboListe cboPortName entnommen. Schlägt die Verbindung fehl, wird eine entsprechende Nachricht ausgegeben und dieprocedure abgebrochen. Vor dem OpenInterface muß noch ftiAnalogScan := 1; gesetzt werden um das (interne) AnalogScannen zu aktivieren.
  4. Gezeichnet wird in die PaintBox picPlot. Maßeinheit sind Pixel (500,500) mit dem Nullpunkt in der linken oberen Ecke.
  5. Die Initialisierung und das Zeichnen des Gitters geschieth in einer separaten proceure. Hier werden noch die Startpunkte für die Kurve (lastX = 0, lastY = 0) gesetzt.
  6. Dann wird die Schleife For i := 0 to 500 gestartet.
  7. Mit actY := ftiGetAnalog(0) div 2; wird der aktuelle Meßwert bestimmt, auf Pixelmaßstab gebracht und mit if actY ... auf den Bereich 1 ... 500 begrenzt.
  8. Das eigentliche Zeichnen erfolgt mit picPlot.Canvas.Moveto(lastX, lasty); und picPlot.Canvas.LineTo(i, actY); D. h. der jeweils zuletzt gezeichnete Punkt (lastX, lastY) wird mit dem aktuellen verbunden. Als X-Wert wird der Schleifenzähler genommen, in der Y-Richtung wird der aktuelle Meßwert aufgetragen.
  9. Anschließend sind die aktuellen Werte schon veraltet und werden als lastX, lastY gespeichert.
  10. Dann kommt noch eine Pause (ftiWaitForTime), damits nicht zu schnell geht. Hier eine Pause für Ungeduldige 32 MilliSekunden. Eine Sekunde (1000) oder eine Minute (60000) gehen aber auch.
  11. Nach Schleifen-Ende folgt nur noch ein CloseInterface und ein Setzen des Fokus auf den Ende-Button um den Abschluß des Plottens anzuzeigen.

Das war auch schon die Hauptarbeit. Jetzt noch die Routine zum Zeichnen des Gitters :

Das Zeichnen des Gitters : Gitter

procedure TfrmMain.Gitter;
var i: Integer;
begin
  picPlot.Canvas.Brush.Color := clBlack;
  picPlot.Canvas.Pen.Color := clBlack;
  picPlot.Canvas.Pen.Width := 1;
  picPlot.Canvas.Rectangle(0,0,500,500);
  picPlot.Canvas.Pen.Color :=clGreen;

  i := 50;
  while i <= 450 do begin
    picPlot.Canvas.MoveTo(i,0);
    picPlot.Canvas.LineTo(i,500);
    picPlot.Canvas.MoveTo(0,i);
    picplot.Canvas.LineTo(500,i);
    i := i + 50;
    end;
  picPlot.Canvas.Pen.Width := 2;
end;

  1. Setzen Brush und Pen auf clBlack um die PaintBox zu löschen (Rectangle). Danach dann  die Pen auf clGreen.
  2. In einer while Schleife wird dann das Gitter gezeichnet.
  3. Die Pen-Breite wird für die nachfoolgenden Kurven auf 2 gesetzt.

Fertig

Mögliche Erweiterungen

Eher dringend :

Eine Verriegelung der Buttons während das Programm läuft, sonst kann es sich durch wiederholtes Drücken "aufhängen". Erstellen einer Paint procedure um das Verschwinden der Graphik zu vermeiden, wenn die Form durch andere Formen überdeckt wird.

Eher spannend :

Kontinuierliche Anzeige der Werte in einer Endlos-Schleife. Dazu müssen die anzuzeigenden Werte in einer Tabelle zwischengespeichert werden. Der jeweils aktuell gemessene Wert überschreibt dabei einen alten. Ein entsprechendes Beispielprogramm ist im Download-Päckchen enthalten (aber dummerweise in Visual Basic, man muß also ein wenig umdenken).

Und natürlich : Umrechnen in Maßeinheiten, die den Meßungen entsprechen. Hier werden nur die Original-Meßwerte 1:2 durch gereicht.

Und wenn das noch nicht reicht : einen Motor unter den Photowiderstand setzen und die Umgebung abtasten.

Eher was für Spezialisten :

Umwandlung in eine Komponente.

Siehe auch :

Das fischertechnik Modell Kennlinienschreiber