WHILE in IF verschachtelt. WHILE übergeordnet?

KingHelmer

Level-1
Beiträge
1.076
Reaktionspunkte
139
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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. :ROFLMAO:


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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zurück
Oben