Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Array mit Zeitwerten füllen

  1. #1
    Registriert seit
    18.09.2012
    Beiträge
    75
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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
    Zitieren Zitieren Array mit Zeitwerten füllen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    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

  3. #3
    MPH ist offline Benutzer
    Themenstarter
    Registriert seit
    18.09.2012
    Beiträge
    75
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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ß

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    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

  5. #5
    MPH ist offline Benutzer
    Themenstarter
    Registriert seit
    18.09.2012
    Beiträge
    75
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    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

  7. #7
    MPH ist offline Benutzer
    Themenstarter
    Registriert seit
    18.09.2012
    Beiträge
    75
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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ß

  8. #8
    MPH ist offline Benutzer
    Themenstarter
    Registriert seit
    18.09.2012
    Beiträge
    75
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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ß

Ähnliche Themen

  1. Array [index] gleichzeitig füllen
    Von good_mike im Forum Programmierstrategien
    Antworten: 13
    Letzter Beitrag: 17.01.2012, 19:56
  2. Mit Schleife DB füllen
    Von htw im Forum Simatic
    Antworten: 59
    Letzter Beitrag: 23.05.2011, 18:29
  3. Array füllen
    Von elmoklemme im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 31.08.2010, 18:23
  4. Array mit berechneten Werten füllen
    Von Yogixxx im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 12.05.2010, 13:35
  5. Array indirekt füllen
    Von Woto im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.05.2009, 19:40

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •