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!
14.12.2010, 22:27 (Dieser Beitrag wurde zuletzt bearbeitet: 14.12.2010 22:28 von ungetuem.)
Hallo erstmal,
Programmiere noch nicht lange mit Labview und habe grad folgendes Problem:
Habe hier eine VI erstellt in der, wenn ein Boolean Schalter true gesetzt ist, in einer Schleife ein Wert X ständig aktualisiert wird.
Jetzt habe ich diese VI mit connectors ausgestattet und gespeichert und benutze sie in einer anderen VI. Wenn ich der SubVI nun in der VI den boolean wert übergebe und den Wert X auslesen möchte funktioniert das nicht.
Was mache ich falsch?
Danke im Vorraus,
kannst du einen screenshot des VIs posten? Aus deiner beschreibung kann man viel ableiten.
Folgendes VI stellt meine Interpretation des Problems dar, wo kein Problem besteht, also liege ich wohl falsch. Ich hoffe mal es dient als Denkanstoß.
Mit minimalbeispielen kann man immer besser helfen.
In meinem Fall ist es sehr ähnlich nur dass IN der SubVI eine Schleife ist. In dieser wird kontinuierlich ein Wert X neu berechnet. es ist also nicht nur eine "Funktion" mit in und output sondern ein
eigenes Programm das die ganze zeit läuft und aus der VI gesteuert und ausgelesen werden soll. Irgendwie seh ich da absolut keine Möglichkeit
Natürlich kommt aus dem SubVi nichts raus, es läuft und läuft und läuft... bis du auf den Roten Knopf drückst. Du wirst von diesem VI in dieser Konfiguration nie werte zurückbekommen. Aber dafür 100% CPU auslastung, da die Schleife mit vollgas läuft.
Was soll dieses VI tun? Messwerte erfassen?
Ein möglicher Workarround wäre falls das bei deinem VI umsetzbar ist:
Du bekommst die Daten aus dem SubVI erst übergeben, wenn dieses durchlaufen ist (Datenflussprinzip).
Alternativ kannst du über eine Queue, GFV, uvm. zwischen Schleifen/SubVIs kommunizieren, wenn sich diese in parallelen Schleifen befinden und somit gleichzeitig laufen. Um in diese Richtung weiterzuhelfen müssten wir wissen, was du damit eigentlich anstellen willst.
Gruß Richard
Murphy was an optimist
15.12.2010, 10:27 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2010 10:42 von ungetuem.)
Ja das Programm ist zur Aufnahme von Messdaten (in meinem Fall soll eine Temperatur immer wieder gemessen werden)
Ich verstehe dass die Schleife ewig weiterläuft und niemals einen wert zurückgeben wird, habe aber gehört dass es die Möglichkeit GIBT Werte aus/in eine/r laufenden Schleife ein-/auszulesen und z.b. in einer anderen Schleife synchron zu verwenden. Kommunikation zwischen schleifen ist kein Problem solange ich mich innerhalb einer VI befinde. Ich weiß nur nicht wie ich mit Schleifen kommuniziere die in einer SubVI laufen.
DIe Option die ich jetzt gefunden habe sind globale Variablen in der SubVI zu verwenden, was aber vermieden werden soll. Gibt es noch andere Möglichkeiten(das Wort Referenzen ist gefallen, kann aber nichts damit anfangen und was ich im internet dazu finde löst mein Problem nicht)?
Gruß ungetuem
15.12.2010, 10:41 (Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2010 10:42 von GerdW.)
Zitat:Alternativ kannst du über eine Queue, GFV, uvm. zwischen Schleifen/SubVIs kommunizieren, wenn sich diese in parallelen Schleifen befinden und somit gleichzeitig laufen.
Siehe, da haben wir doch schon zwei weitere Möglichkeiten: Queues und GFV (eigentlich FGV, FunctionalGlobalVariable). Es gibt auch u.a. noch Notifier (deutsch: Melder) - und zu allem schöne Beispiele, die schon mit LabVIEW mitgeliefert werden. Einfach mal im Hilfe-Menü den Beispiele-Finder starten...
Zitat:einer anderen Schleife synchron ... verwenden
Meinst du wirklich "synchron"? Oder doch etwa asynchron, zeitlich parallel?
Hi und danke für die Antwort,
ich bin mir nicht ganz sicher:)aber ich glaube ich meine synchron. der Boolean Wert aus der VI soll in der SubVI sobald der entsprechende Schalter geklickt wurde eingelesen und verwendet werden.
gruß ungetuem
Ich bin der Meinung, dass du dir die Verwendung von Queues anschauen solltest (in Verbindung mit dem Producer-Consumer-Prinzip).
Dazu wirst du hier im Forum sicherlich fündig.
Das Erzeuger-Verbraucher-Prinzip ermöglicht es dir kontinuierlich Daten einlesen und diese unabhängig weiterverarbeiten zu können. Je nach Umfang kannst du dir auch gleich das Prinzip der Statemachine anschauen.
Als genereller Hinweis, da es oft falsch gemacht wird:
Der Task zum Einlesen von Daten muss nur einmal zu Beginn des Programmes erstellt und beim Beenden zerstört werden. Alles Andere führt zu unnötig hoher Prozessorlast und Verzögerungen im Programmablauf, die den Verlust (Nichteinlesen) von Messdaten zur Folge haben kann.
EDIT: Da waren wieder welche schneller in der Beantwortung deiner Frage... -_- Das kommt davon, wenn man sich während dem Schreiben einer Anwort durch Arbeit "ablenken" lässt....