Zweites, dynamisch aufgerufenes SubVI startet nicht
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!
Zweites, dynamisch aufgerufenes SubVI startet nicht
Hallo miteinander!
Der Titel sagt es schon, ich rufe aus meinem HauptVI über Referenz öffnen nacheinander 2 Unterprogramme auf (Lüfterregelung und Heizerregelung).
In der Sequenz werden nacheinander die VIs aufgerufen, gestartet und ihr Status in "Hidden" bzw. "nicht sichtbar" gesetzt. Klicke ich zur Laufzeit im HauptVI
auf eine Schaltfläche, so wird in der Ereignisstruktur der SubVI Status auf Standart gesetzt und dadurch im Vordergrund aufgerufen.
Das Klappt für die "Lüfter"-Steuerung sehr gut. (Schaltfläche geklickt, VI erscheint ausgeführt)
Wenn ich die Schaltfläche für das 2. aufgerufene VI anklicke "Heizer.VI erscheint das Frontpanel, leider jedoch unausgeführt. Versuch ich es über das "Ausführen" ICON
von Labview zu starten, so bricht es wieder ab... Woran könnte das liegen?
Wenn ich zu beginn zuerst "Heizer.vi" aufrufe und dann "Lüfter.vi" wird entsprechend "Lüfter.vi" nicht ausgeführt. :
Anzeige
18.03.2014, 10:28 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2014 10:29 von GerdW.)
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Hallo Belimo,
erstmal vorneweg: es gibt nicht ohne Grund spezielle Pfad-Befehle, da muss man nicht mit dubiosen fehlerträchtigen String-Operationen rumwerkeln…
Zitat:Standart
Wenigstens Abschreiben sollte funktionieren, oder willst du hier irgendwelche Kunst verkaufen?
Zitat:Wenn ich die Schaltfläche für das 2. aufgerufene VI anklicke "Heizer.VI erscheint das Frontpanel, leider jedoch unausgeführt. Versuch ich es über das "Ausführen" ICON von Labview zu starten, so bricht es wieder ab... Woran könnte das liegen?
Wenn irgendwas nicht funktioniert, sollte es Fehlermeldungen geben. Hast du da was für uns?
Sind die Referenzen gültig?
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Hey,
tut mir leid das passiert mir ab und zu mit "standard"
Gut die Pfad Befehle kann ich bei gelegenheit nochmal ersetzen, dass stimmt.
Bei ansetzen eines Fehlerknotens hinter dem Methodenknoten "VI ausführen"
wird kein Fehler angezeigt. Die Referenzen werden für jedes SubVI ja in einer Globalen Variable
eingefügt. Kann da irgendwas durcheinander geraten Das Labview nicht mehrere Referenzen (auch wenn unter anderem Namen)
speichern kann?
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Hallo Belimo,
das Problem ist hier die unnötige Verwendung von TimedWhileLoops!
Dummerweise hast du die subVIs durch Kopieren erzeugt. Damit hat die Kopie bei der TWL den exakt gleichen Namensbezeichner für die TWL übernommen - und LabVIEW kann nun einmal keine zwei TWL mit exakt dem gleichen Namen laufen lassen…
- Verzichte bei dieser Anwendung auf TWL, sie bringen keinen Vorteil und nur unnötigen Overhead.
- Eine Event-Struktur in einer TWL ist schlichtweg Blödsinn!
- Versuche die globalen Variablen zu reduzieren, das läuft früher oder später auf RaceConditions hinaus!
- (Stacked)Sequenzen erhöhen nicht die Lesbarkeit eines VIs!
- Warum bindest du die VIs nicht wirklich als subVI ein, sondern rufst sie per VIServer auf? Was soll hier der Vorteil sein?
Lesson learned:
VIs anhängen erläutert Probleme viel besser als "bricht wieder ab"…
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Die TWL musst ich nehmen, da es sonst arge Probleme mit der Synchronisation meines Host mit dem cRIO system gibt.
Das bedeutet, als ich vorher normale While loops hatte und dann z.B. auf "Lüfter einschalten" geklickt habe, dauerte es eine Ewigkeit
eh der simple "True" befehl mit der SharedVariable an den digitalen Output ging... hab lange mit den Variablen Eigenschaften rumprobiert,
(RT FIFO, Puffer etc.) aber nichts hat geholfen bis ich dann die TWL auf dem Host verwendet hab.
Würd die gern beibehalten, gibts da trotzdem noch ne Möglichkeit?
achso, ja das reine "reinziehen" des SubVIs ginge natürlich auch. Wusste nicht ob das im Hintergrund weiterlaufen und erscheinen/verschwinden dann so gut funktionert
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Hallo Belimo,
in deinem Beispiel sind nirgends SVs zu sehen…
Zitat:Das bedeutet, als ich vorher normale While loops hatte und dann z.B. auf "Lüfter einschalten" geklickt habe, dauerte es eine Ewigkeit eh der simple "True" befehl mit der SharedVariable an den digitalen Output ging...
Ich kann mir jetzt keinen Grund ausdenken, warum das mit einer TWL besser funktionieren sollte als mit einer normalen WhileLoop.
Oder halt:
Hast du irgendwo in deinem Programm eine Schleife (z.B. irgendeine Polling-Loop) laufen, die viel CPU-Last erzeugt? Dann ist natürlich die CPU ausgelastet und arbeitet andere Sachen nicht im gewünschten Takt ab. TWLs sind höher priorisiert und können dann evtl. doch ausgeführt werden… Also eher mal die "normalen" Schleifen kontrollieren und alle mit einer Wartezeit versehen!
Zitat:Wusste nicht ob das im Hintergrund weiterlaufen und erscheinen/verschwinden dann so gut funktionert
Dieses ständige (Un)Sichtbar-Schalten würde ich im subVI (und nur dort) erledigen. Nur eine Instanz, die sich darum kümmert, und zwar abhängig von irgendwelchen Settings, die du da in den globalen Variablen speicherst…
RE: Zweites, dynamisch aufgerufenes SubVI startet nicht
Danke Gerd fürs weiterhelfen!
Das mit dem "Warten" in einer normalen While Schleife hat ich gerad auch nochmal probiert und klappt gut.
Das Problem mit dem "nicht ausführen besteht leider weiterhin, aber ich werd das jetzt so machen wie du
vorgeschlagen hast. (VI im HauptVI als SubVI behandeln und dann die sichtbarkeit im SubVI klären)
Vielen Dank!
18.03.2014, 12:31 (Dieser Beitrag wurde zuletzt bearbeitet: 18.03.2014 12:50 von GerdW.)
Zitat:Dummerweise hast du die subVIs durch Kopieren erzeugt. Damit hat die Kopie bei der TWL den exakt gleichen Namensbezeichner für die TWL übernommen - und LabVIEW kann nun einmal keine zwei TWL mit exakt dem gleichen Namen laufen lassen…
Wie wäre es damit, die TWL mit einem anderen Namen zu versehen?
Falls dir das nicht klar sein sollte, verweise ich mal auf die LabVIEW-Hilfe…