Zeitverzögerung bei Auswahl eines bestimmten Cases
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Zeitverzögerung bei Auswahl eines bestimmten Cases
Hey,
ich wende mich mal wieder mit einem Problem an euch, was ich alleine nicht gelöst bekomme.
Ich lasse in einer Whileschleife einen Matlab Skriptknoten laufen, der ca. 70 ms braucht. Insgesamt möchte ich diesen Knoten in der Sekunde 13x durchlaufen lassen, aber nicht öfter. Die Laufzeit des Knotens beträgt nie eine exakte Zeit sondern liegt zwischen 35 und 71 ms aber meistens um die 70.
Ich wollte das so realisieren, dass der 0. Durchaluf immer bei jeder vollen Sekunde gestartet wird, habe aber da keine Idee, wie genau ich das realisieren kann. Im angehängten VI wird bei count 0 der eine Case und bei 1-13 der andere Case ausgewählt.
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
Moin,
wenn ich dein Problem recht verstehe, könntest du doch um deine Schleife eine zweite mit dem VI "Wait until next multiple" mit 1000ms am Eingang bauen. Dann würde die innere Schleife immer zur vollen Sekunde anfangen.
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
(20.08.2012 11:38 )Schwand schrieb: Moin,
wenn ich dein Problem recht verstehe, könntest du doch um deine Schleife eine zweite mit dem VI "Wait until next multiple" mit 1000ms am Eingang bauen. Dann würde die innere Schleife immer zur vollen Sekunde anfangen.
Grüßle
S.
Diese Schleife läuft so lange, bis der Benutzer sie beendet, also eine unendliche Whileschleife. Wenn das Programm einmal drinnen ist, kommt es garnicht mehr in die äußere Schleife rein. Ich würde also beim ersten Mal bis zur vollen Sekunde warten und dann garnicht mehr in diese Schleife kommen.
(20.08.2012 11:54 )rasta schrieb: Hallo Herm,
im Anhang eine Alternative mit einfacher Ausregelung der Iterationszeit.
Gruß
Ralf
Ich möchte mit dem Programm evtl. auf andere Rechner gehen, die ein bischen weniger leistungsfähig sind. Wenn ich dann bei jedem Durchlauf warte bis die durchschnittliche Zeit erreicht ist funktioniert das so lange, bis einige Durchläufe über der Zeit von 1000/13=77 ms liegen. Wenn ich solche Durchläufe habe, würde sich das durch die kürzeren Schleifendurchläufe insgesamt ausgeleichen, nicht aber, wenn ich diese künstlich auf die Durchschnittszeit verlängere. Deswegen will ich nur den 0. Durchaluf zeitabhängig machen und nicht jeden einzelnen.
Ich habe da sowas im Sinn, dass ich eine zweite Casestruktur habe, wenn ich im 0. Durchlauf bin muss diese Case zusätzlich noch warten, bis 1 sec voll ist. In etwa so, wie im Anhang. Nur müsste da noch in den true-case ein "wait until true" für "Zeit verstrichen" hinein, gibt es sowas?
Gruß
Herm
20.08.2012, 14:15 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2012 14:16 von GerdW.)
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
Hallo Herm,
ich habe mal dein RubeGoldberg-Gefrickel mit den diversen "=0" und "Wenn Null Dann doch 1"-Abfragen rausgeschmissen und durch diesen Ansatz ersetzt:
Die Modulo-Funktion ersetzt den Zählervergleich. Die Case-Struktur wartet bei Case 0 auf die nächste volle Sekunde, sonst kannst du machen, was dir beliebt. Ob die zusätzliche "Wait for 70ms multiple" noch nötig ist, sei dahingestellt...
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
Das ist auf jeden Fall eine sehr einfache Idee. Bei mir klappt das nur nicht so ganz. Dadurch sind meine Durchgänge nicht exakt bei 1 Sekunde, sondern manchmal bis zu 1022 ms, woran kann das liegen?
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
Wenn ich das ganze ins Hauptprogramm einbaue, bzw. dieses durch die case mit einem wait until multiple, dann habe ich ja nur dieses eine wait until multiple drin. Und gerade das soll ja rein. Der Rest wird über die Durchlaufzeiten des Skriptknoten geregelt. Aber selbst wenn ich nur eine Waitfunktion drin habe, erhalte ich Laufzeiten, die meistens über einer Sekunde liegen. Wenns, wie du sagst, an diesem WaitVI liegt, dann kann ich das ja überhaupt nicht mit rein nehmen. Dann verstehe ich aber auch nicht den Vorschlag genau das zu tun.
Grüße
Herm
20.08.2012, 16:22 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2012 16:23 von GerdW.)
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
Hallo Herm,
die vorgestellte Struktur wartet bei ersten Durchlauf (Case 0) auf den Beginn der nächsten Sekunde. Dann kommen noch 13 weitere Durchläufe mit deiner Rechenfunktion. Ob diese zusammen evtl. länger als 1s brauchen, kann ich nicht beurteilen...
Zwei Sachen:
- der zusätzliche 70ms-Wait stört definitiv!
- wenn deine Rechenfunktionen länger als 1s brauchen, wird bei der jetzigen Konstellation ca. 0,9s auf den Beginn der nächsten Sekunde gewartet. Dies könnte sich störend auswirken.
Tipp:
- Schau dir die TimedWhileLoop an. Hier kannst du festlegen, ob (bei Zeitüberschreitung) auf den Beginn der nächsten Sekunde gewartet werden soll oder ob sofort weitergerechnet wird.
- Außerdem ist es ziemlich "eng gestrickt", wenn ich Rechenroutinen, die (nur) durchschnittlich 13*70=910ms brauchen, im Sekundentakt aufrufen will. Damit ist dein Prozess schon zu >90% ausgelastet, jede Störung von außen bringt dich aus dem Takt...
RE: Zeitverzögerung bei Auswahl eines bestimmten Cases
dasselbe Problem ist aber auch aufgetreten, wenn ich deutlich weniger Schleifen pro Durchlauf verwendet habe. Bspw. bei 9 Schleifen habe ich eine Laufzeit von ca. 630 ms, also mit sehr viel Toleranz. Ich hatte trotzdem Laufzeiten von über 1 s. Die Laufzeit von 70 pro Durchlauf ist auch die Maximaltzeit. Es gibt Ausnahmen mit 71 ms, aber meistens liegt es knapp unter 70.
Ich verzögere jetzt nicht mehr den 0. Case, sondern den letzten und das klappt wunderbar. Damit komme ich fast immer auf 1000 ms, ab und zu habe ich 999 oder 997, aber ich glaube viel exakter geht nicht mehr.
Zur "Timed whileloop". Ich muss sowiso unbedingt vermeiden, dass ich über eine Sekunde komme, das würde mich so oder so aus dem Takt bringen, ich denke mit der Wartezeit nach dem letzten Case klappts am Besten.