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

Ergebnis 1 bis 10 von 10

Thema: WHILE in IF verschachtelt. WHILE übergeordnet?

  1. #1
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    995
    Danke
    115
    Erhielt 130 Danke für 103 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    eine kleine Frage, bevor ich gleich auf die Schnauze falle.
    Ich möchte den Mittelwert eines eindimensionalen "Zeit-Arrays" ermitteln. Heirzu möchte ich eine Whileschleife durch eine positive boolsche Flanke "anstoßen".
    Wenn ich eine WHILE Schleife in einer IF Funktion verschachtele, also so:

    Code:
    IF xFlankbool1 THEN
    
        WHILE i<Wert DO
        i:= i +1;
        END_WHILE;
    
    i:= 0;
    
    END_IF;
    Dann wird die WHILE-Schleife ALLEINE ohne andere Programmteile, auch ohne andere Baustein im Hauprprogramm bearbeitet, richtig?
    Also es wird praktisch alles eingefroren und nur diese Anweisung bearbeitet bis schließlich die boolsche Bedingung erfüllt ist, richtig?

    ich möchte nur noch einmal sichergehen.
    Falls dies wirklich so ist, muss ich eventuell diese Zeit der While-Schleife bei einem anderen Programmteil berücksichtigen.

    Danke schon mal und Grüße,
    Flo
    Zitieren Zitieren WHILE in IF verschachtelt. WHILE übergeordnet?  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    es ist so, wie du vermutest. Es könnte aber darüber hinaus auch noch so sein, dass eine Aktualisierung der jeweiligen Variablen gar nicht mehr stattfinden kann - bitte beachten (ich weiß ja nicht, wo du dich technologisch gerade befindest (Visu - PC - SPS)).

    Gruß
    Larry

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    KingHelmer (24.09.2014)

  4. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.335
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Der Programmteil mit der WHILE-Schleife könnte durch höherpriore Programme (Alarme, Interrupts, ...) unterbrochen werden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #4
    Avatar von KingHelmer
    KingHelmer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    995
    Danke
    115
    Erhielt 130 Danke für 103 Beiträge

    Standard

    Hallöchen,

    danke euch schon mal!
    Was denkt ihr, wie lange eine WAGO 750-881 benötigt, um maximal 2mio INT Werte zusammenzurechnen und den MIttelwwert zu bilden?
    Der Rede wert sind für mich Zeiten ab 100ms für die Schleife.

    Danke und Gruß,
    Flo

  6. #5
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Bau dir doch einfach ein kleines Programm das die Zeit vor und nach der Schleife misst dann weist du es genau.
    Sänd from mei Kombjudder mitse Dastadurr.

  7. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.335
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Wo kommen die Millionen Meßwerte her? Die tauchen doch bestimmt nicht alle im selben Zyklus plötzlich auf... kannst Du die Berechnung nicht auf mehrere Zyklen aufteilen?

    Man könnte schon beim Zufügen eines Meßwertes zum Puffer den Meßwert zur Summe addieren (und den ggf. herausfallenden Meßwert abziehen) und die Summe mit abspeichern. Stehen die Werte in einem Ringpuffer?

    Außerdem: Wie groß sind die INT-Werte? Für die Summe von 2 Millionen INT-Werten können 32 Bit DINT schon zu klein sein.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    KingHelmer (24.09.2014)

  9. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Bei der Anzahl würde ich für den Mittelwert den Block in einzelne Blöcke zerlegen. Den Mittelwert über die Blöcke, und dann damit den Mittelwert über die Gesamtanzahl bilden. Bei Ganzzahlen bieten sich Blöcke in der Größe von Zweierpotenzen an, dann kann man den Mittelwert durch Schieben der Summe bilden.

  10. #8
    Avatar von KingHelmer
    KingHelmer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    995
    Danke
    115
    Erhielt 130 Danke für 103 Beiträge

    Standard

    Hallo zuusammen.

    Es handelt sich hierbei um zeitwerte welche auf dem TIME in den INT Typen konvertioert werden.
    Bei Zeiten von ca. 10-15 Sekunden kommt man hier auf INT Werte von 10000-15000 Pro Wert.

    Diese Zeiten werden über einen sehr langen Zeitraum im Rahmen eines Zyklus-Tests gemessen.

    Es wäre also denkbar, dass ich nur eine bestimmte Anzahl an Werten (z.B. momentaner Zyklus +- 1000 Zyklen, also nur insgesamt 2000 Werte verrechne.
    Aus diesen ganzen Werten könnte dann auch der Mittelwert gebildet werden, danke für den Hinweis.

    Da ich ja Zeiten messe, wäre so eine zu lange "Berechnungszeit" etwas gewesen, was ich ab, wie schon erwähnt, ca. 100ms Zykluszeit auch berücksichtigen müsste.
    Theoretisch wäre auch eine FOR Schleife möglich...

    Aber irgendwann möchte ich auch mal ein WHILE-Schleifchen benutzen.


    Also vielen Dank mal für die Hinweise, morgen baue ich den Code mal fertig und schaue dann nächste Woche, wenn die Hardware da ist, wie alles läuft.

    Grüße,
    Flo

  11. #9
    Registriert seit
    28.07.2014
    Beiträge
    17
    Danke
    8
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Könnte man nicht auch mit weniger Rechenaufwand je Zyklus den Mittelwert über alle Zeiten wie folgt bilden?
    tNeuerDurchschnitt := ((tAlterDurchschnitt*anzahl_bisheriger_Werte)+tAktuellerWert)/(anzahl_bisheriger_Werte+1)
    Damit würde das Durchlaufen eines großen Arrays wegfallen.

  12. #10
    Avatar von KingHelmer
    KingHelmer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    995
    Danke
    115
    Erhielt 130 Danke für 103 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi und danke nochmal für die tips. Ich hab jetzt mal ein paar der Lösungen programmiert und teste sie alle mal nächste woche.

    @buzzer.

    Hier kann es auch passieren, dass ich einen wert von 10000 mit einem wert von 1000000 multipliziere, Sollte aber eigentlich auch keine Probleme geben.

    Wird auch getestet!

    Grüße,
    Flo



    Sent from my iPhone using Tapatalk

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 16.01.2012, 16:54

Stichworte

Lesezeichen

Berechtigungen

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