Array mit Zeitwerten füllen

MPH

Level-1
Beiträge
75
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich habe leider schon wieder ein Problem und hoffe ihr könnt mir helfen.
Ich messe ja die Laufzeit einer Schleife mit folgemdem Code:

Timer(IN:=Start, PT:=t#100s);




IF Start=TRUE THEN
U:=230;

Zeit1:=Timer.ET;


FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U) /RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR;

Timer(IN:=#Start,PT:=t#100s);
Zeit2:= Timer.ET;

#Start:=False;

END_IF;

Dauer:=Zeit2-Zeit1;

Jetzt ist es so, dass bei der zyklischen Programmabarbaitung der Wert der gemessen Zeit also "Dauer" geringfügig variiert.
Nun würde ich gerne 10 Werte von der Variablen "Dauer" in einem Array speichern um dann später einen Mittelwert bilden zu können.

Ich habe aber keinen Schimmer wie ich das machen kann. Wenn ich ein Array anlege, und dieses automatisch füllen will funktioniert es nicht.

Habt ihr vieleicht eine Idee wie ich das machen könnte????

Vielen Dank schonmal für eure Hilfe

Grüße
 
Hallo,
willst du alle (z.B.) 10 Messungen unmittelbar hintereinander machen ?
In dem Fall mit der Flanke von Start einen Index (Typ INT) auf 0 setzen.
Am Ende deiner bisherigen Routine den Wert Dauer in das Array-Element[Index] schreiben und den Index um 1 erhöhen.
Ist Index >= Array_max. dann die ganze Sache abbrechen oder überspringen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
willst du alle (z.B.) 10 Messungen unmittelbar hintereinander machen ?
In dem Fall mit der Flanke von Start einen Index (Typ INT) auf 0 setzen.
Am Ende deiner bisherigen Routine den Wert Dauer in das Array-Element[Index] schreiben und den Index um 1 erhöhen.
Ist Index >= Array_max. dann die ganze Sache abbrechen oder überspringen ...

Gruß
Larry

Hi Larry vielen Dank für deine schnelle Antwort.

idealerweise wäre natürlich, wenn die Werte nur gespeichert werden, wenn sie sich auch unterscheiden.

Meinst du so???



Timer(IN:=Start, PT:=t#100s);


IF Start=TRUE THEN
j:=0;
U:=230;


Zeit1:=Timer.ET;


FOR i:=0 TO 30000 BY 1 DO
wert:=wert+1;
x:=x+1;
RR:=RR+1;
P:=(U*U) /RR;
y:=SQRT(x);
z:=SIN(y);
e:=EXP(x);
m:=ATAN(e);
END_FOR;

Timer(IN:=#Start,PT:=t#100s);
Zeit2:= Timer.ET;

#Start:=False;

END_IF;

Dauer:=Zeit2-Zeit1;

Dauerwerte[j]:= Dauer;
j:=j+1;



Array_max versteh ich nicht ganz. Muss ich das Max definieren? Ich weiss ja nicht welcher Wert der größte wird? Und Array_max ist kein fester Ausdruck oder?

So wie ich es oben jetzt gemacht habe funzt es leider nicht. Der einzige Unterschied zu vorher ist nun, das ich an der Stelle Dauerwerte[0] nun den Wert Dauer beobachtenn kann. Es wird aber kein fester Wert gespeichert sondern er ändert sich wie in der normalen Variable Dauer auch ständig!!!!

Hab ich Bockmist gebaut? Hast du es anders gemeint???

Danke

Gruß
 
Hallo,
so, wie du den Code jetzt hast würde "j" bei jedem neuen Zyklus immer wieder "0" werden - deshalb habe ich etwas von "Flanke" geschrieben ...
Code:
if Start and not Start_FM then
   j := 0 ;
end_if ;
Start_FM := Start ;  // das Start_FM keine TEMP-Variable sein darf versteht sich hoffentlich von selbst ...
"Array_max" ist die Anzahl der Elemente, die du als Größe für dein Array vorgegeben hast - also bei "ARRAY [0..20] of" dann eben die "20". Die Bearbeitung muß dann zu Ende sein.
Ob es jeden Zyklus oder nur dann speichert, wenn der aktuelle Werte anders als der vorherige ist, liegt ja ein bißchen bei dir.
Du könntest ja am Ende schreiben :
Code:
if Dauerwerte[j] <> Dauer then
   Dauerwerte[j]:= Dauer;
   j:=j+1
end_if ;
Das Bit "Start" würde ich vielleicht nicht generell löschen sondern sondern erst wenn "j >= Array_max" ...

Gruß
Larry
 
Hallo,
so, wie du den Code jetzt hast würde "j" bei jedem neuen Zyklus immer wieder "0" werden - deshalb habe ich etwas von "Flanke" geschrieben ...
Code:
if Start and not Start_FM then
   j := 0 ;
end_if ;
Start_FM := Start ;  // das Start_FM keine TEMP-Variable sein darf versteht sich hoffentlich von selbst ...
"Array_max" ist die Anzahl der Elemente, die du als Größe für dein Array vorgegeben hast - also bei "ARRAY [0..20] of" dann eben die "20". Die Bearbeitung muß dann zu Ende sein.
Ob es jeden Zyklus oder nur dann speichert, wenn der aktuelle Werte anders als der vorherige ist, liegt ja ein bißchen bei dir.
Du könntest ja am Ende schreiben :
Code:
if Dauerwerte[j] <> Dauer then
   Dauerwerte[j]:= Dauer;
   j:=j+1
end_if ;
Das Bit "Start" würde ich vielleicht nicht generell löschen sondern sondern erst wenn "j >= Array_max" ...

Gruß
Larry


Hi Larry

vielen Dank für deine Hilfe. Ich sollte manchmal erst etwas nachdenken bevor ich gleich antworte.
Des mit der Flanke habe ich verpeilt und mir ist auch kurz danach klar geworden was mit Array_max gemeint war. Sorry.

SO funktioniert es.
Ich habe am Schluss eine weitere IF Anweisung verwendet als Abbruchbedingung.

IF j<50 THEN
IF Dauerwerte[j] <> Dauer THEN
Dauerwerte[j]:= Dauer;
j:=j+1;
END_IF ;
END_IF;


So geht es. Oder gibt es noch eine elegantere Lösung?
Noch ne andere Frage.
Bei CoDesys und Beckhoff kann ich mir schön die Werte anschauen die in dem deklarierten Array stehen. Bei Step7 geht das nicht. Ich habe das Array genau so angelegt. Aber ich kann mir den Inhalt des Arrays nicht anschauen nachdem das Programm durchgelaufen ist?
Hast du oder Ihr eine Idee was ich da falsch mache. Geht bei Step 7 immer nur alles mit DB Bausteinen wenn ich mal werte speichern und weiterverarbeiten will???

Vielen Dank nochmal für die super Hilfe

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ja ... bei Step7 landet schlußendlich (Codesys & Co weiß ich nicht) alles in einem DB.
Step7 selbst kann keine komplexen Datenstrukturen anzeigen sondern nur Einzel-Elemente bis Doppelwort-Breite. In deinem Instanz-DB allerdings wird dein Array ja als Sammlung von Einzelwerten abgebildet und da kannst du es dir dann auch anschauen ...

Gruß
Larry
 
Hallo,
ja ... bei Step7 landet schlußendlich (Codesys & Co weiß ich nicht) alles in einem DB.
Step7 selbst kann keine komplexen Datenstrukturen anzeigen sondern nur Einzel-Elemente bis Doppelwort-Breite. In deinem Instanz-DB allerdings wird dein Array ja als Sammlung von Einzelwerten abgebildet und da kannst du es dir dann auch anschauen ...

Gruß
Larry

Hi Larry,

alles klar. Ich danke dir.
Irgendwie werden mir aber im Step7 V11 keine Werte in das Array geschrieben.
Beim Beobachten steht

IF Dauerwerte[j] <> Dauer THEN
Dauerwerte[j] := Dauer;
j:=j+1;
END_IF;

beim fettgedruckten nur drei Fragezeichen drin. Also Dauerwerte[???] Und es passiert überhaupt nichts. Also es stehen nie Werte im Array. Weder beim Beobachten noch im Instanz DB wenn ich da hineinschaue?
Woran könnte das liegen???
Erkennt er die Laufvariable nicht in diesem Fall?

Danke

Gruß
 
HAAAAAAALT

DIE WERTE STEHEN DOCH DRIN!!!!!

Sorry. Habe mal wieder zu früh geschrieben.
Im DB des Bausteins stehen die Werte. Ich hatte nicht auf beobachten gedrückt beim DB ich Deppchen.

Vielen Dank nochmal für deine Hilfe.

Gruß
 
Zurück
Oben