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!
29.06.2010, 13:09 (Dieser Beitrag wurde zuletzt bearbeitet: 29.06.2010 13:13 von Matze.)
vielleicht habe ich falsch gesucht, aber leider konnte ich hier nichts finden.
Ich habe 2 Schleifen:
- eine zur Abfrage einer Ereignisstruktur
- parallel dazu eine für das Hauptprogramm
Nun möchte ich im Hauptprogramm Code ausführen, wenn sich über die Ereignisstruktur ein Wert geändert hat.
Ich kann mir nicht vorstellen, dass diese Kommunikation nur über lokale bzw. globale Variablen funktioniert bzw. einen DUmmy-Control:
In der Ereignisstruktur einen boolschen Wert auf "true" setzen und im Hauptprogramm auf diesen Wert prüfen. Ist dieser "true", wird eine Case-Struktur abgearbeitet und der boolsche Wert auf "false" gesetzt.
Wobei das Datenflussprinzip hier soweiso nicht funktionieren kann, da die Scheifen parallel laufen. Dennoch kommen mir lokale/globale Variablen in LabVIEW generell unauber vor.
Such mal (auch im NI-Examplefinder) nach Schlagworten wie "Queues", "Notifiers" (Melder), und/oder Producer-Consumer-Struktur (als Template unter File->New...).
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Dennoch danke. Das bestätigt mir die Aussage von Jens (auch wenn ich daran nicht gezweifelt habe).
Mit diesen ganzen Konstrukten (Melder, separate Ereignis-Schleife etc) ist es schier unmöglich, das Blockdiagramm auf eine Bildschirmauflösung zu bekommen. Das wird zwar überall empfohlen und schafft Übersicht, keine Frage. Aber in dem Fall bekomme ich das nicht hin.
Naja, was soll's.
Nachtrag: Mit der Producer-Consumer-Struktur funktioniert es einwandfrei.
' schrieb:Die Hauptschleife wird 1 x durchlaufen und dann wartet das VI "Element aus Queue entfernen" vermutlich auf das nächste Ereignis (das es nicht gibt):
Ja, "Element aus Queue entfernen" wartet bis wieder was in die Queue geschrieben wurde. So funktioniert das. Wie hättest du es denn gerne? Ist der Timeout vielleicht etwas für dich?
Und bitte das komplette BD auf's Bild packen ...
Edit: Du wirst auf diese Weise deine Consumer Loop kaum beenden können, denn das VI wartet, wie gesagt, bis wieder was los ist. Am einfachsten ist, du verbindest den Error-Cluster von "Queue lesen" mit dem Stop-Terminal der Schleife. So wird sie beendet sobald die Queue zerstört wird.
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Ich habe das BD nur schnell vereinfacht zusammengeklickt, um es auf das Relevante zu reduzieren.
Das links ist wie in den LV-Beispielen.
Ich hätte es gerne so, dass die Hauptschleife immer läuft und wenn ein nummerischer Wert vom Benutzer geändert wird, soll in der Hauptschleife ein zusätzlicher Code ausgeführt werden, der diese Werte verarbeitet (die oben angehänge Case-Struktur "kein Fehler").
Aber du hast Recht: Wenn ich das Timeout auf 1 ms setze, scheint es zu funktionieren, wie ich mir das vorstelle. 1 ms könnte riskant sein, vermute ich, doch ich möchte meine Hauptschleife nicht zu sehr ausbremsen.
' schrieb:Aber du hast Recht: Wenn ich das Timeout auf 1 ms setze, scheint es zu funktionieren, wie ich mir das vorstelle.
Für die Queue als solche reicht ein Timeout von z.B. 250ms. Entweder beendet sich das Queue-Element nach dieser Zeit von selbst oder dann, und dann sofort, wenn in der Queue was drinnen steht.
Zitat:1 ms könnte riskant sein, vermute ich, doch ich möchte meine Hauptschleife nicht zu sehr ausbremsen.
Eine Schleife, die mit 1ms Schleifendauer läuft, ist immer kritisch.
Ich mach eine Schleife nie kleiner als 50ms. Ggf. muss ich halt den Algorithmus anpassen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).