19.06.2008, 10:19
Beitrag #1
|
Labview-Beginner
LVF-Gelegenheitsschreiber
Beiträge: 114
Registriert seit: Oct 2007
6.1
2007
kA
67705
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
Hi folks,
wie der Name oben schon sagt arbeite ich gerade mit Sub VIs.
Dabei werden die Daten des Frontpanels an ein Sub VI übergeben, dass die entsprechenden Befehle ausführt. Z.B. einen bestimmten Temperaturwert in einer bestimmten Zeit erreichen.
Nun soll in dem Sub VI aber die (eben genannte) Zeit mitlaufen, sodass Lab View selbstständig reagieren kann, sobald diese abgelaufen ist. Mein Problem ist eben nur, sobald ich das Unterprogramm verlasse und wieder auf das Front Panel zurückkehre, kann ich da (scheinbar?!?) nicht mehr agieren, weil Lab View erst noch das Ende des Unterprogramms abwartet?!?
Vielleicht bissel verquer meine Beschreibung, aber genauso fühle ich mich auch gerade bei der Programmierung mit diesen verschiedenen "Ebenen". :-(
Cheers.
|
|
|
19.06.2008, 10:39
Beitrag #2
|
|
|
20.06.2008, 12:12
Beitrag #4
|
Labview-Beginner
LVF-Gelegenheitsschreiber
Beiträge: 114
Registriert seit: Oct 2007
6.1
2007
kA
67705
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
Hi folks,
also hier mal die Konkretisierung meines Problems: Ich denke es hängt echt an der globalen Variablen.
Und zwar in Kombination mit diesem Boolean und der Mechanical Action: Latch when Released.
Wenn ich diesen OK Button (Boolean) drücke, so schreibt das doch ein "true" in die globale Variable.
Nur dieser Button geht ja dann durch die eingestelle Mechanical Action wieder in den Ausgangszustand. Und steht somit wieder auf false.
Und schreibt das nicht "false" in die globale Variable?!?
Zumindest habe ich den Eindruck, dass es so ist. :-(
Cheers.
|
|
|
20.06.2008, 12:39
Beitrag #5
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
' schrieb:das mit der globalen Variablen war eine gute Idee.
"Globale Variablen" sind nie guten Ideen, wenn dann eine Lokale Variable (resepktive ein neues Bedien/Anzeige-Element).
Zitat:Leider habe ich immernoch ein Problem und weiß nicht genau ob es jetzt an der Verwendung der globalen Variablen liegt oder an der Programmstruktur von Lab View.
Wenn, dann nicht an der Programmstruktur von LV, sondern an "deiner". Du generierst ja die Programmstruktur.
Zitat:Und zwar habe ich zwei While Schleifen nebeneinander geschalten, wovon die erste mit einem Boolean beendet wird ("Stop if true" mit Boolean und "Waiting for front panel activity"), der gleichzeitig die globale Variable darstellt.
Wäre an sich nix gegen einzuwenden.
Zitat:Durch das Beenden werden ja die Daten aus der Whileschleife zum weiteren Verarbeiten frei gegeben...
Alle Daten, ob Global oder Lokal, sind grundsätzlich "freigegeben". Auch wenn die eine While-Schleife noch läuft, kann die andere While-Schleife auf deren Daten zugreifen.
Zitat:Meine Intention ist also:
Ich bestätige die Eingabe in der ersten While Schleife mit der Boolean Variable und somit kann auch die zweite Whileschleife loslaufen. Durch das Latch when released geht globale Variable wieder in den "false-Zustand" über, sodass doch die zweite Schleife nur einen Durchlauf der Sequenz erlauben dürfte, weil sie im letzten Schritt wieder angehalten wird.
Das klinkt aber sehr nach einen linearen Ablauf. D.h, du benötigst nicht unbedingt zwei parallel laufende Prozesse, sondern lediglich einen sequenzierten Ablauf: Erst soll die eine While-Schleife etwas machen, dann wird sie beendet, danach soll in der zweiten While-Schleife etwas gemacht werden. Ist dem so, oder hab ich dich falsch verstanden?
Wenn dem so ist, müssen die While-Schleifen nicht parallel sein - hintereinander, also sequenziert, wäre da doch ausreichend. Dass der Gesamtvorgang (erste While-Schleife, dann zweite While-Schleife) selbst wiederholbar sein soll (was mit einer übergeordneten While-Schleife ginge) ist ein anderer Aspekt.
Kannst du notfalls mal ein Muster-VI machen und posten?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
20.06.2008, 12:59
Beitrag #6
|
Labview-Beginner
LVF-Gelegenheitsschreiber
Beiträge: 114
Registriert seit: Oct 2007
6.1
2007
kA
67705
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
Zitat:Das klinkt aber sehr nach einen linearen Ablauf. D.h, du benötigst nicht unbedingt zwei parallel laufende Prozesse, sondern lediglich einen sequenzierten Ablauf: Erst soll die eine While-Schleife etwas machen, dann wird sie beendet, danach soll in der zweiten While-Schleife etwas gemacht werden. Ist dem so, oder hab ich dich falsch verstanden?
Wenn dem so ist, müssen die While-Schleifen nicht parallel sein - hintereinander, also sequenziert, wäre da doch ausreichend. Dass der Gesamtvorgang (erste While-Schleife, dann zweite While-Schleife) selbst wiederholbar sein soll (was mit einer übergeordneten While-Schleife ginge) ist ein anderer Aspekt.
Das mit dem linearen Ablauf ist eben das Problem.
Von meiner Programmierung her geht es in der ersten Schleife darum eine Befehlskette in Form eines 2D Arrays zusammenzustellen.
In der zweiten Schleife geht es nun darum diese Befehlskette auszuführen, indem die einzelnen Befehle an die entsprechende Portnummer geschickt werden.
ABER!
Weshalb ich diesen parallelen Aufwand betreibe, ist die Tatsache dass das Erstellen einer neuen Befehlskette möglich sein soll noch während das Ausführen im Gange ist.
Sprich der Benutzer hat eine Befehlskette eingegeben, welche den Temperaturverlauf für 4 verschiedene Öfen vorgibt.
Jetzt klickt er auf OK und die Befehle werden ausgefüht.
Jetzt bemerkt er nach einiger Zeit (der Temperaturverlauf ist noch nicht beendet), dass er sich bei einer der Öfen geirrt hat. D.h. er möchte für diesen einen neuen Befehl erstellen ohne dass die anderen davon beinträchtigt werden.
Hope that helps.
Was das Muster angeht, schaue ich mal, da ich das ganze auf verschiedene Unterprogramme verteilt habe.
Cheers.
|
|
|
20.06.2008, 13:27
(Dieser Beitrag wurde zuletzt bearbeitet: 20.06.2008 13:34 von IchSelbst.)
Beitrag #7
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
' schrieb:Von meiner Programmierung her geht es in der ersten Schleife darum eine Befehlskette in Form eines 2D Arrays zusammenzustellen.
In der zweiten Schleife geht es nun darum diese Befehlskette auszuführen, indem die einzelnen Befehle an die entsprechende Portnummer geschickt werden.
ABER!
Weshalb ich diesen parallelen Aufwand betreibe, ist die Tatsache dass das Erstellen einer neuen Befehlskette möglich sein soll noch während das Ausführen im Gange ist.
Sprich der Benutzer hat eine Befehlskette eingegeben, welche den Temperaturverlauf für 4 verschiedene Öfen vorgibt.
Jetzt klickt er auf OK und die Befehle werden ausgefüht.
Jetzt bemerkt er nach einiger Zeit (der Temperaturverlauf ist noch nicht beendet), dass er sich bei einer der Öfen geirrt hat. D.h. er möchte für diesen einen neuen Befehl erstellen ohne dass die anderen davon beinträchtigt werden.
Gut, jetzt bin ich dabei. (Jetzt brauch ich auch kein Muster mehr).
Vorschlag:
Mach ein VI, in dem der Benutzer seine Verläufe generiert. Dass dieses VI schon aufwändig werden kann, steht hier nicht zur Debatte. Irgendwann ist der Bediener mit Erstellen eines Verlaufes respektive mehrerer Verläufe fertig. Zu diesem Zeitpunkt klickt der Bediener auf einen Button "Daten zur Ausführung senden". Jetzt sendet dieses VI den Verlauf respektive die Verläufe mittels Queue an das ausführende VI. (Dass bei vier Öfen vier mal per Queue gesendet wird, steht auch nicht nicht zur Debatte. Hat den Vorteil: Oh, da passt einer nicht, dann ändern wir nur einen). Nach dem Senden läuft diese VI weiter. Der Benutzer will ja schließlich einen Verlauf anpassen können.
Außerdem hast du ein zweites VI (eigenlich einen zweiten "Prozess"), das die Verläufe abarbeitet. (Überlegung: Das VI abreitet nur einen einzigen Ofen ab. Durch Instanzierung des VIs (invariante Ausführung), können beliebig viele genau dieser VIs parallel laufen.) Dieses VI holt sich die Daten aus der Queue - und arbeitet genau diesen Ablauf ab.
Durch das Managemant der Verläufe mittels Queue/Melder entsteht eine Entkopplung zwischen Eingabe und Abarbeitung der Verläufe.
Bedenke, dass das Abarbeiten eines Verlaufes ggf. angehalten werden muss. Das würde auch per Queue aus der Eingabemaske heraus geschehen können.
Das, was du bisher als While-Schleife bezeichnet hast, fällt eher unter den Begriff "Task", "Prozess" etc. Im Endeffekt würdest du diese beiden "Haupt-VIs" ganz einfach parallel in ein übergeordnetes VI legen - dann würde beide parallel ausgeführt werden.
Kannst du meiner Intension, die beiden Vorgänge "Eingabe" und "Abarbeitung" so wie beschrieben zu trennen und entsprechend abzuarbeiten, folgen?
Und noch ein Nachtrag:
Ich sehe gerade du hast LV 61? Gibts denn da schon Queues? Kommst du nicht irgendwie an was aktuelles?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
20.06.2008, 14:02
Beitrag #8
|
Labview-Beginner
LVF-Gelegenheitsschreiber
Beiträge: 114
Registriert seit: Oct 2007
6.1
2007
kA
67705
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
Hi,
spontan sagt mir das alles nix. Dafür bin ich noch zu neu bei Lab View.
Aber wie es der Zufall so wollte hatte eben ein Kumpel Zeit, dem ich meine Problematik geschildert habe und der unabhängig von dir mit der Idee der Queues kam.
Hat mir eben mal schnell die grobe Programmskizze programmiert mit all den neuen Programmelementen, die ich noch nix zuvor gesehen hatte.
Werde mich da jetzt also einarbeiten, dass ich das in die Tat umsetzen kann.
Dank dir!
Cheers.
|
|
|
23.06.2008, 14:56
Beitrag #9
|
|
|
23.06.2008, 15:19
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Sub VI soll im Hintergrund weiterlaufen
' schrieb:Hängt das irgendwie an der Art wie ich die Queue fülle?
Ja, da kann ich doch beruhigt ja sagen - heißt: liegt im Endeffekt an deinem "Algorithmus".
Für was brauchst du denn die mittlere While-Schleife? Nur zum Weiterleiten des Array-Inhaltes? Dafür brauchst du keine While-Schleife.
Mach das Weiterleiten (Schreiben in die Queue) in die große Schleife - und zwar im True-Case nach dem Bedienelement Rampen.
So wie du das gepostet hast, besteht ein weiterer Fehler: Die Variable RampenArray hat immer den selben Wert. Deine Hauptschleife wird nie verlassen (außer Programmabbruch). Daher wird das Anzeigeelement nie beschrieben, sodass in der Lokalen Variablen nie was neues hineinkommt.
Im Schieberegister steht zwar immer die Aktuelle Eingabe - dort wird es aber niemals herausgeholt.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
| |