Schleife ... jeden 3ten Wert lesen.

Für Fragen von Einsteigern und Programmieranfängern...
Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

Hey,

habe folgenden Code.

Code: Alles auswählen

 
procedure TForm1.Timer1Timer(Sender: TObject);
var i     : Integer;
    inB   : Integer;
    inW   : String;
 
begin
 
 
Chart1BarSeries1.Clear; {Balkenlöschen}
 
  Label2.Caption:='Messung gestartet';
  Label2.Refresh;
 
  SendByte (4);
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('s'));
  SendByte (ord('r'));
  SendByte (2);
  SendByte (ord('f'));
  SendByte (ord('e'));
  SendByte (ord('t'));
  SendByte (ord('c'));
  SendByte (ord('?'));
  SendByte (10);
  SendByte (3);
 
  ReadByte;
 
  SendByte (4);
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('p'));
  SendByte (ord('o'));
  SendByte (5);
 
  ReadByte;           
 inW:='';
  i:=0;
  repeat
  inc(i);
  inB:=ReadByte;
  inW:=inW+chr(inB);
  until (inB=13) or (i>20);
 
  ReadByte;
  ReadByte;
 
  y_wert:=StrToFloat2(inW)*1000;  
 
  if RadioButton1.Checked=true then
  begin
  if (y_wert>0.1) and (n_wert<7) then    {Schleife 6-Teil}
     begin
     inc(n_wert);
     if n_wert=1 then EditR1.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=2 then EditR2.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=3 then EditR3.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=4 then EditR4.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=5 then EditR5.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=6 then EditR6.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=7 then EditRA.Text:=   FormatFloat('0.0',y_wert);
     end;
 
  if n_wert<7 then Label2.Caption:='Messung: OK';
  if n_wert=7 then Label2.Caption:='!!! FERTIG !!!';
 
  end;   
Ich messe hier Widerstände. Bisher war es so wenn messe Widerstand und sobald ich sehe das der Wert stimmt konnte ich eine Taste betätigen um ihn ins Edit zu übertragen.
Nun möchte ich nicht immer die Taste drücken und habe einen Timer mit reingemacht. Der mir alle 0,7sec Werte liefert. Funktioniert auch gut.. ABER er trägt mir jeden gemessen Wert sofort in die Edits.
MEINE FRAGE: Ich habe herausgefunden das, das jeder 3te Wert erst brauchbar ist. Nun möchte ich eine Schleife die mir jeden 3ten Wert in die Edits schreibt.

Hoffe es ist nun verständlicher formuliert.


Gruß Foxi
Zuletzt geändert von Foxi1896 am Fr 19. Jul 2013, 12:16, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von theo »

Könntest du das etwas verständlicher formulieren? Eine Frage mit Fragezeichen und so?
Und noch etwas, kann man den Timer nur beim Werte lesen benutzt , da der das Programm sehr verlangsamt.
Welche Sprache ist das?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Foxi1896 hat geschrieben:Nun möchte ich nicht immer die Taste drücken und habe einen Timer mit reingemacht. Der mir alle 0,7sec Werte liefert. Funktioniert auch gut.. ABER er trägt mir jeden gemessen Wert sofort in die Edits.
MEINE FRAGE: Ich habe herausgefunden das, das jeder 3te Wert erst brauchbar ist. Nun möchte ich eine Schleife die mir jeden 3ten Wert in die Edits schreibt.
Wenn ich dich richtig verstanden habe (was leider nicht ganz so einfach ist) brauchst du keine Schleife sondern eine globale Zählvariable. Die setzt du zu Beginn auf 0, erhöhst sie bei jeder Messung um 1 und überträgst die Daten in die Edit-Felder nur dann, wenn sie durch 3 teilbar ist.

Wenn du dabei bist, könntest du auch gleich deinen Code etwas besser strukturieren und den Ausleseteil vom Ausgabeteil trennen. :)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

Sorry, ist schwer zu beschreiben...

ich möchte zum Starten auf nen Button klicken. Danach den Widerstand messen und erst den 3ten gesendeten Messwert vom Messgerät eingetragen bekommen.
Und dann den nächsten Widerstand und wieder den 3ten usw... ohne nach jedem Widerstand wieder nen Button klicken zu müssen.

Habe es jetzt so gemacht?

Code: Alles auswählen

until (inB=13) or (i>20);
 
  ReadByte;
  ReadByte;
 
  y_wert:=StrToFloat2(inW)*1000;   {wenn Messbereich '2 OHM' ist, dann x1000!}
 
 
  if RadioButton1.Checked=true then
  begin
 
 
  if (y_wert>0.1) and (n_wert<4) then  {Schleife 8-Teil}
     begin
     inc(n_wert);
     if n_wert=1 then Edit3.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=2 then Edit4.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=3 then Edit5.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=4 then beep;
     end;
     EditR1.Text:= Edit5.Text;
 
  if (y_wert>0.1) and (n_wert<4) then  {Schleife 8-Teil}
     begin
     inc(n_wert);
     if n_wert=1 then Edit3.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=2 then Edit4.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=3 then Edit5.Text:=   FormatFloat('0.0',y_wert);
     if n_wert=4 then beep;
     end;
     EditR2.Text:= Edit5.Text;
 
 
 
 
  end;
 
Bisher nur die ersten zwei Widerstände. Mit dem Beep möchte ich sagen nächster Widerstand kann gemessen werden.
Aber nun ist es so das er direkt den ersten Edit5 wert in EditR1 und EditR2 schreibt. und nicht neu misst.

Hoffe es ist diesmal verständlich =/


Edit: Globare geht glaube nicht da das Messgerät ununterbrochen Werte sendet und nicht wartet bis ich den nächsten Widerstand ranhalte.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Foxi1896 hat geschrieben:Hoffe es ist diesmal verständlich =/
Leider nicht. Mein Tipp: Trenne deinen Code in einzelne Methoden auf und/oder gibt eine genaue Schritt-für-Schritt-Beschreibung (Stichpunkte reichen), was du machst und was du erreichen willst.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

- Messgerät starten
- 3 Messungen von einem Widerstand machen und in Edits1/Edit2/Edit3 schreiben.
- Nun die 3te Messung aus Edit3 in EditR1 schreiben
- nun den nächsten Widerstand und die neuen Messwerte in Edit1/Edit2/Edit3 schreiben.
- Hier wieder dann aus aus Edit3 nur halt in EditR2 schreiben

dies mit den nächsten Widerständen weiter...

- Messung stoppen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Das sieht doch recht simpel aus, da braucht man weder Schleife noch Zählvariable.

Nur eins:
Foxi1896 hat geschrieben:- nun den nächsten Widerstand und die neuen Messwerte in Edit1/Edit2/Edit3 schreiben.
An welchem Ereignis machst du fest, dass der nächste Widerstand gemessen wird?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

Das Messgerät liefert mir ohne Widerstand 0 und sobald ich einen Wiederstand ranhalte mist er in Secundentakt. Und da ist dann erst der 3te Wert brauchbar.

Wollte das es beep macht wenn ins EditR1 geschrieben worden ist damit ich dann weiß ok kann nächsten Widerstand messen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Das heißt es kommt jede Sekunde ein Wert an? Entweder 0 wenn nix dran hängt oder etwas anderes wenn der Widerstand dran ist. Und ab der dritten Messung, ist dieser Wert dann auch korrekt.
Also würde eine Liste die alle Messwerte enthält so aussehen (Beispiel):

0
0
73
93
52 -> echter Wert
52
52
0
0
0
0
11
17
23 -> echter Wert
23
0
0
0
...
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

genau =)


0
0
73
93
52 -> echter Wert => beep (damit man aufhört den Widerstand dran zu halte) und den Wert in EditR1 schreiben
52
52
0
0
0
0
11
17
23 -> echter Wert => beep (damit man aufhört den Widerstand dran zu halte) und den Wert in EditR2 schreiben
23
0
0
0

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Achtzig »

Ist es denn wirklich immer der dritte Wert nach einer 0? Ich würde eher darauf testen, wann sich der Wert stabilisiert, also zwei bis drei Messungen hintereinander der gleiche Wert geliefert wird.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

hatte ich auch erst gedacht ... aber es ist eigentlich schon der erste Wert gut nur bei 20/1 mal erst der zweite .. und der dritte ist immer perfekt.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Dann würde ich so vorgehen: Du besorgst dir eine globale Variable ReadStep: Int64, die beim Messungsstart auf 0 gesetzt wird. Deine Leseroutinen lagerst du aus in eine Funktion ReadValue, die einfach den aktuellen Wert abgreift und zurückliefert.

Dann noch einen Timer mit dieser OnTimer-Methode:

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Value: Integer;
begin
  Value := ReadValue;
  if Value = 0 then
    ReadStep := 0
  else begin
    Inc(ReadStep);
    if ReadStep = 3 then begin
      ListBox1.Items.Add(IntToStr(Value));
      Beep;
    end;
  end;
end;
Ich habe jetzt mal eine ListBox anstelle von mehreren Edit-Feldern benutzt. Dann geht es einfacher und man ist nicht in der maximal Zahl der gemessenen Widerstände beschränkt (Zero One Infinity).

Ein bisschen Absicherung noch damit ReadStep nicht überläuft, ListBox beim Messbeginn leeren und das wars.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von Foxi1896 »

oha ... ok (bin noch nicht so weit in Sachen Programmiersprache)
Du besorgst dir eine globale Variable ReadStep: Int64

heißt doch einfach oben so reinschreiben oder wie?
Funktion ReadValue

Code: Alles auswählen

function ReadValue (inW: String) : extended;
 
var i     : Integer;
    inB   : Integer;
    inW   : String;
begin
  SendByte (4);
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('s'));
  SendByte (ord('r'));
  SendByte (2);
  SendByte (ord('f'));
  SendByte (ord('e'));
  SendByte (ord('t'));
  SendByte (ord('c'));
  SendByte (ord('?'));
  SendByte (10);
  SendByte (3);
 
  ReadByte;
 
  SendByte (4);
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('0'));
  SendByte (ord('p'));
  SendByte (ord('o'));
  SendByte (5);
 
  ReadByte;
 
  inW:='';
  i:=0;
  repeat
  inc(i);
  inB:=ReadByte;
  inW:=inW+chr(inB);
  until (inB=13) or (i>20);
 
  ReadByte;
  ReadByte;
 
  y_wert:=StrToFloat2(inW)*1000;  end;    
Meinst du das so? Was muss ich oben in die Klammern schreiben?

Und letztes Problem ich soll das mit den Edits machen. Es kommen nur die Fälle 6, 8 und 12 vor.
Kann ich das dann so eintragen wie ich es schon hatte mit dem:

Code: Alles auswählen

inc(n_wert);
            if n_wert=1 then EditR1.Text:=   FormatFloat('0.0',value);
            if n_wert=2 then EditR2.Text:=   FormatFloat('0.0',value);
            if n_wert=3 then EditR3.Text:=   FormatFloat('0.0',value);
            if n_wert=4 then EditR4.Text:=   FormatFloat('0.0',value);
            if n_wert=5 then EditR5.Text:=   FormatFloat('0.0',value);
            if n_wert=6 then EditR6.Text:=   FormatFloat('0.0',value);
            if n_wert=7 then EditRA.Text:=   FormatFloat('0.0',value);     

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schleife ... jeden 3ten Wert lesen.

Beitrag von m.fuchs »

Foxi1896 hat geschrieben:oha ... ok (bin noch nicht so weit in Sachen Programmiersprache)
Kein Problem, dafür gibt es ja das Forum. :)
Foxi1896 hat geschrieben:
Du besorgst dir eine globale Variable ReadStep: Int64

heißt doch einfach oben so reinschreiben oder wie?
Genau. Ich unterstelle mal dass dein Code komplett in der Unit1 steht wo auch dein Form1 drin ist.
Dann sieht das so aus:

Code: Alles auswählen

var
  Form1: TForm1;
  ReadStep: Int64;
Foxi1896 hat geschrieben:
Funktion ReadValue

Code: Alles auswählen

function ReadValue (inW: String) : extended;
(...)
Meinst du das so? Was muss ich oben in die Klammern schreiben?
Das müssen wir mal genauer auseinander nehmen. Wozu gibt es den Übergabeparameter inW? Was für Daten enthält er?

Foxi1896 hat geschrieben:Und letztes Problem ich soll das mit den Edits machen. Es kommen nur die Fälle 6, 8 und 12 vor.
Das wäre der typische Fall, wo man den Kunden davon überzeugen sollte dass es bessere Lösungen gibt. :wink:
Foxi1896 hat geschrieben:Kann ich das dann so eintragen wie ich es schon hatte mit dem:
(...)
Da würde ich eine gesonderte Routine schreiben, die alle Editfelder der Reihe nach durchgeht. Sowie sie ein Feld findet, in dem nichts steht wird der Wert da rein geschrieben.
Zu Beginn jeder Messung alle Feld leeren und dann geht das auch.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten