' schrieb:ich moechte drei While Schleifen parallel, voneinander abhaengig laufen lassen.
Auch wenn die drei Schleifen applikationsspezifisch gesehen gegenseitig abhängig sind, so laufen sie als While-Schleifen gesehen doch unabhängig. Ich empfehle die drei While-Schleifen auf jeden Fall in ein eigenen SubVI auszulagern.
Zitat:1. Loop bekommt Daten vom Bus (kann keine delays einbauen, da ich sonst frames verpasse), loop period ist ca. 700-800ms
Diese Daten können bereits in Loop 1 entsprechend aufgearbeitet werden und dann mittels einer Queue (eigentlich gehört hierher prinzipiell eine Queue, ein Melder würde bei bestimmten Applikationen aber auch gehen) der Allgemeinheit (also nicht speziell Loop 2) zur Verfügung gestellt werden. Ein Wert in der Queue könnte z.B. einen Samplepunkt entsprechen.
Vorgriff auf das zweite Posting: Wenn Loop 1 im Raster von 750ms einem Melder sendet, Loop 2 den aber im Raster von 1000ms abholt, dann kannst du ausrechnen, nach wie vielen Loops von Loop 1 ein Sample von Loop 2 ignoriert wird => "ruckeln im Graph". 750ms, 1500ms, 2250ms, 3000ms, 3750ms. Da Loop 2 nur einen Sample pro 1000ms macht, wird auch pro 1000ms nur ein Wert gelesen. Es fehlt also 3000 oder 3750.
Zitat:2. Loop soll die Daten von 1. Loop erhalten und zusaetzlich kriegt sie noch Daten aus einer GPIB und USB Schnittstelle. Manche der Daten werden im einem Chart dargestellt.
Loop 2 liest diese eine Queue aus, wenn eben da gerade was drinnensteht. Im Prinzip ist es dieser Loop egal, wo die Daten, die in der Queue stehen herkommen. Sie sind halt da.
Zitat:3. Loop dient zur Erstellung einer Log file (Excel); muss auch im Sekundentakt laufen muessen!
(Erstellung der Log file in Loop 2 dauert zu lang, u irgendwann stimmt das Timing von Loop 2 (bzw Chart) nicht mehr!)
Das klingt also so, als ob Loop 2 und Loop 3 auch applikationsspezifisch unabhängig wären. Auch ich würde für das File-Schreiben (hier Excel) eine eigene Loop machen.
Zitat:-mit lokale Variablen vom 1. zum 2. Loop ist es nicht moeglich;
Vergiss das mit den Variablen gleich mal.
Zitat:Loop 2 zwinge auch auf eine Loopdauer von 1000ms, was auch von Loop 3 angenommen wird.
Loop 1 laeuft vor sich hin und beeinflusst Loop 2 nicht, was super ist. U sendet die Notification wie erwartet in Loop 2.
Auch wenn ich andere Loopdauer fuer Loop 2 setze ist alles in Ordnung. So erhalte ich auch keine unerklaerlichen Erscheinungen u ich habe eine Abhaengigkeiten zwischen allen Loops. Start/Stop problemlos!
Ja genau so geht das auch. Prinzipiell.
Zitat:ABER lauter Theorie sollte das auch nicht gehen, weil: Both loops are synchronized to the master loop. The slave loop only executes when the master loop sends a notification. [LV Basics II s. 2-35]
Wenn du für jede Loop z.B. ein SubVI machst muss alles richtig funktionieren.
Erstens: "Both loops are synchronized to the master loop" gilt hier nicht (resepktive wird durch eine entsprechende Programmierung eben umgangen), da jede Loop für sich gesehen sowohl zeitlich als auch datentechnisch unabhängig läuft. Wenn du Melder benutzt, dann benutzt du nicht die Funktion "Warte, bis was im Melder steht", sondern die Funktion "Meldestatus lesen". Wenn dein Melder schneller beschrieben als ausgelesen wird (was bei 750 zu 1000 der Fall ist), dann funktioniert auch "Warten, bis was neues im Melder steht.
Zweitens: "The slave loop only executes when the master loop sends a notification" stimmt so gesehen auch nicht, da du - respektive ich mit meinen Queues - eben nicht wartest. Die Abarbeitung der "Slave-Loop", also Loop 2, hängt nicht an vorhandenen Daten von Loop1. Loop2 arbeitet grundsätzlich. Ist eine Sekunde um, so wird eben der Graph refresht. Wenn zwischendrinn Daten da sind (beachte die Wortwahl: nicht "ankommen", sondern "da sind"), wenn werden die halt übernommen und gespeichert. Sind keine Daten da, wird eben nichts übernommen und nach einer Sekunde wird eben "nichts" (mehr) angezeigt.
Zitat:Warum Loop 1 nichts beeiflusst, obwohl sie Master-Funktion hat?
Trenn dich von der Audrucksweise "Loop 1 ist Master von Loop2". Ich mach das eben so: Loop 1 sampled Daten und stellt die per Queue zur Verfügung. In die Queue würde also alle 750ms was geschrieben werden. Das heißt aber nicht, dass Loop 2 die Queue nur alle 750ms lesen muss!. Loop 2 ließt die Queue alle 25ms aus. Sind Daten da, werden die eben weiterverarbeitet. Diese 25ms werden jetzt genau 40 Mal gemacht. Dann ist eine Sekunde um. Was jetzt an Daten da ist, wird angezeigt. Usw.
Zitat:Kann ich mir da sicher sein, dass es immer funktionieren wird
Das funktioniert immer. Du musst es nur entsprechend programmieren.
Es gibt natürlich Grenzfälle für "immer". Da Loop 2 in einen Graphen schreiben soll, tut man sich natürlich mit 1000,000 ms etwas schwer. +-250ms könnten da schon mal drinn sein.
Ach, noch ein Hinweis:
Meine Ausführungen sind allgemeiner Natur. Und da ich deine Applikation nicht genau kenne, weis ich natürlich nicht in wie weit ich jetzt deine Frage auch richtig verstanden und demzufolge beantwortet habe.