Erfassen von Meßwerten als Kurven
Aufgabe
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.
- Im ersten Teil werden die Variablen lastX ...definiert, die später
beim Zeichnen verwendet werden.
- Verwendet wird die Unit FumFish20EX.PAS.
- 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.
- Gezeichnet wird in die PaintBox picPlot. Maßeinheit sind Pixel
(500,500) mit dem Nullpunkt in der linken oberen Ecke.
- 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.
- Dann wird die Schleife For i := 0 to 500 gestartet.
- 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.
- 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.
- Anschließend sind die aktuellen Werte schon veraltet und werden als lastX,
lastY gespeichert.
- 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.
- 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;
- Setzen Brush und Pen auf clBlack um die PaintBox zu löschen
(Rectangle). Danach dann die Pen auf clGreen.
- In einer while Schleife wird dann das Gitter gezeichnet.
- 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
|