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!
24.02.2008, 09:18 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2008 09:20 von mctommson.)
Also, ich möchte, dass (wie im angehängten Bild beschrieben) das Hauptprogramm eine Kopie für jedes Array-Element anlegt und diese Kopien immer wieder aufruft. Warum?
Das Hauptprogramm ist Queue gesteuert und besteht aus 81 SubVIs. Es soll nun die Kopie die aufgerufen wird, wenn das 1. Arrayelement "1" an der Reihe ist natürlich immer wieder aufgerufen werden, wenn dieses Array Element wieder dran ist, und immer brav die "1"er-Queues auffüllen, die anderen Queues aber unberührt lassen.
Gibt es eine Möglichkeit in LabVIEW dem Programm zu sagen: "Lege 5 Kopien in den Speicher und wenn das Array-Element 1 kommt nimm diese Kopie, wenn das Element 2 kommt diese, usw."? In 8.2 is es ja glaube ich so, dass jedes Mal eine neue Kopie angelegt wird und am Ende irgendwann 33 Kopien im Speicher liegen, oder? (Klon: 33).
Kennt ihr eine andere Möglichkeit den Aufruf so zu gestalten, dass sich die Queues nicht gegenseitig in die Quere kommen? Die Speicherauslastung sollte aber minimal sein...
Danke euch!
Lg,
Tommy!
Anzeige
24.02.2008, 10:45 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2008 10:48 von IchSelbst.)
' schrieb:den Aufruf so zu gestalten, dass sich die Queues nicht gegenseitig in die Quere kommen?
Geht es nicht auch, nur den Datensatz zu instanzieren, also 33 Datensätze anstelle von 33 Programmen? Array of Queues respektive Array of Cluster wäre dann eine Möglichkeit.
Das eine Haupt-VI hätte dann einen Eingang für die Instanznummer, die als Arrayindex dient. Das Array selbst würde sich in einem funktionalen SubVI befinden.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Das Problem ist, dass unterschiedliche Queues in unterschiedlichen SubVIs des Hauptprogramm aufgerufen werden. Es gibt also mehrere Queues abhängig von verschiedenen Messwerten iniziiert werden.
Hätte ich nur eine Queue im Hauptprogramm, könnt ich diese Queue als ein Array von Queue behandeln und je nach der eingehenden Nummer ein bestimmtes Element dieses Arrays ansprechen (ich glaube, dass du das gemeint hast). Das wollt ich mir aber eigentlich ersparen, denn dann müsst ich in jedem VI nachschauen, ob dort Queues gestartet werden und die dann alle extra behandeln...
Eine frage noch:
Ist es von der Speicherauslastung das selbe, wenn ich Kopien des Hauptprogramms anlege oder einfach das Hauptprogramm selbst vervielfälltige? Oder braucht letzteres mehr Speicher?
Und:
Gesetzt den Fall, dass ich es irgendwie schaffe für jede numerische Eingabe am Anfang der For-Schleife eine eigene Kopie anzulegen, werden die SubVIs auch kopiert oder muss ich das extra irgendwo festlegen?
Ich vermute mal, ich hab dein erstes Posting missverstanden. Ich gehe davon aus, dass du in einem quasi normierten SubVI mehrere gleichartige Queues bearbeiten willst.
Meinst du mit "Kopien" Kopien des Haupt-VIs anlegen oder Kopien von Daten?
' schrieb:Also, ich möchte, dass (wie im angehängten Bild beschrieben) das Hauptprogramm eine Kopie für jedes Array-Element anlegt und diese Kopien immer wieder aufruft.
Da das Array-Element in das SubVI ("Hauptprogramm") hineingeht, würde es auch wieder herausgehen können. Warum also im SubVI eine permanente Kopie anlegen? Du kannst im Prinzip das Gesamtkonzept so machen: SubVI in For-Schleife. An der For-Schleife ist das Array als Schieberegister. Dadurch ist es dann möglich, das HauptVI immer mit den letzten Daten eines Array-Indexes aufzurufen. Das würde jetzt in meinen Augen deinem Kopieren und Wiederverwenden entsprechen.
Um eine Kopie im SubVI anzulegen und zu verwalten, müsstest du noch einen zweiten Eingang am SubVI haben, der bestimmt, welcher Index verwaltet werden soll.
Zitat:Das Hauptprogramm ist Queue gesteuert und besteht aus 81 SubVIs.
Das an sich verstehe ich ja noch. Wobei ich vorausschauend sagen müsste: mehere Queues zu benutzen um ein VI zu steuern, halte ich für schlecht. Steuern tut man mit einer einzigen Queue. Hineinschreiben um andere VIs zu steuern kann das Vi natürlich in beliebig viele.
Zitat:Es soll nun die Kopie die aufgerufen wird, wenn das 1. Arrayelement "1" an der Reihe ist natürlich immer wieder aufgerufen werden, wenn dieses Array Element wieder dran ist, und immer brav die "1"er-Queues auffüllen, die anderen Queues aber unberührt lassen.
Wenn ich das jetzt richtig verstehe, soll das HauptVI eine ganz bestimmte Queue beschreiben (nicht aus ihr lesen). Den Queuenamen würde das HauptVI entweder aus einem Array lesen können, wenn es den Index beim Aufrufen mitgeteilt bekäme (mein erster Vorschlag).
Zitat:Gibt es eine Möglichkeit in LabVIEW dem Programm zu sagen: "Lege 5 Kopien in den Speicher und wenn das Array-Element 1 kommt nimm diese Kopie, wenn das Element 2 kommt diese, usw."?
5 Kopien von was? Vom HauptVI oder von den Queues?
Wenn ich deine Intension richtig verstanden habe, willst du folgendes machen: Du hast ein quasi normiertes Hauptprogramm. Dieses Hauptprogramm bedient im Prinzip eine einzelne Queue. Von diesen Queues hast du jetzt aber mehrere. Deine Frage ist nun, wie sage ich dem Hauptprogramm, welche Queue es bearbeiten soll.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Zitat:Das Problem ist, dass unterschiedliche Queues in unterschiedlichen SubVIs des Hauptprogramm aufgerufen werden.
Und das HauptVI soll nun die "richtige" Queue bearbeiten?
Zitat:Es gibt also mehrere Queues abhängig von verschiedenen Messwerten iniziiert werden.
Dieser Satz nun stellt ein besonderes Problem dar: Er ist unvollständig. Ich kann also nur erraten, was du damit meinst. Ich gehe davon aus, es soll "Es gibt also mehrere Queues, die abhängig von verschiedenen Messwerten iniziiert werden.". Was übertragen wohl bedeuten soll: "Jeder Messwert hat seine eigene Queue".
Zitat:Hätte ich nur eine Queue im Hauptprogramm, könnt ich diese Queue als ein Array von Queue behandeln und je nach der eingehenden Nummer ein bestimmtes Element dieses Arrays ansprechen (ich glaube, dass du das gemeint hast).
Ja das habe ich gemeint.
Aber: was du schreibst ist unlogisch - entweder du hast "eine Queue" oder du hast ein "Array of Queue". "diese Queue als ein Array von Queue behandeln" geht praktisch nicht.
Zitat:denn dann müsst ich in jedem VI nachschauen, ob dort Queues gestartet werden und die dann alle extra behandeln...
Das verstehe ich auch wieder nicht. Warum willst du in einen VI nachschauen, ob in genau diesem VI selbst - das genau beschreibst du hier - eine Queue gestartet ist?
Zitat:Ist es von der Speicherauslastung das selbe, wenn ich Kopien des Hauptprogramms anlege oder einfach das Hauptprogramm selbst vervielfälltige?
Was ist der Unterschied zwischen "Kopien des Hauptprogramms" und "Hauptprogramm selbst vervielfälltigen"?
Nein, da sollte kein Unterschied bestehen. Das eine sind SubVIs mit unterscheidlichem Namen, aber selben Inhalt. Das andere ist ein SubVI im Modus invariant. Dieser Modul nützt dir aber nur was, wenn das SubVI an unterschiedlichen Stellen im Sourcecode aufgerufen wird. An ein und der selben Stelle, also z.B. ein einziger Aufruf in einer For-Schleife, erzeugt nur ein einziges invariantes SubVI (anders würde es aussehen bei Aufruf über VI-Server).
Zitat:Oder braucht letzteres mehr Speicher?
Ich würde mir über Speicherverbrauch keine Gedanken machen.
Zitat:Gesetzt den Fall, dass ich es irgendwie schaffe für jede numerische Eingabe am Anfang der For-Schleife eine eigene Kopie anzulegen, werden die SubVIs auch kopiert oder muss ich das extra irgendwo festlegen?
Was meinst du jetzt mit SubVIs? Die SubVIs, die sich im "HauptVI" befinden, also die 81 SubVIs von ganz oben? Die werden nicht mitkopiert. Was du so auch nie auf die Reihe bekommen wirst.
Im übigen bin ich immer noch der Meinung, dass deine Aufgabe, von der ich allerdings noch gar nichts weiß, zu lösen geht derart, wie ich es bei meiner ersten Antwort gemeint habe.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
24.02.2008, 17:10 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2008 17:15 von mctommson.)
Ok, ich hab mal eben zwei VIs geschrieben, die mein Problem verdeutlichen sollen.
Das HauptVI "Queues":
Es sollen nach der Reihe die verschiedenen IDs an das Hauptprogramm (eigentlich das SubVI, ich nenne es nur Hauptprogramm, da ich es als fertig betrachte und so wenig da drinnen verändern will wie möglich) übergeben werden. Jede ID spricht einen uController an.
Es soll nun, wenn die ID1 übergeben wird, die Queue folgendes beinhalten:
ID1Hallo
ID1Ich
ID1bin
ID1eine
ID1kleine
ID1feine
ID1Queue
Dann is das Hauptprogramm alias SubVi fertig. Die nächte ID kommt rein, ID2. Dadurch soll aber nicht die vorhandene Queue gefüllt werden, sondern es soll eine neue "Kopie" des Hauptprogramms alias SubVI geöffnet werden, sodass eine neue Queue (NUR für den uController mit der ID2 geltend) iniziiert wird.
Demnach gibts dann 5 verschiedene Queues.
Kommt dann wieder die ID1 dran, soll die Queue mit den "ID1..."-Einträgen weiter aufgefüllt werden.
Sprich, das Ergebnis soll dann irgendwie so aussehen:
1. Queue:
ID1Hallo
ID1Ich
ID1bin
ID1eine
ID1kleine
ID1feine
ID1Queue
ID1Hallo
ID1Ich
ID1bin
ID1eine
ID1kleine
ID1feine
ID1Queue
ID1Hallo
ID1Ich
ID1bin
ID1eine
ID1kleine
ID1feine
ID1Queue
2. Queue
das selbe nur mit ID2.
usw.
Das war's.
Ich dachte mir also, dass es eventuell möglich wäre, dem Hauptprogramm alias SubVI zu verdeutlichen, dass es 5 Kopien anlegen soll, und jedes mal wenn eine ID reinkommt die dazugehörige Kopie öffnet, sodass es praktisch für ID1 ein Hauptprogramm gibt, für ID2 ein eigenes, für ID3 ebenso, etc.
Und da ich nicht das Hauptprogramm vervielfälltigen wollte (weil dann muss ich alle 81 SubVIs ebenfalls kopieren) dachte ich, vielleicht gäbe es die Möglichkeit das Hauptprogramm alias SubVI abhängig von der eingehenden ID-Nummer zu vervielfälltigen.
Versionen mit 8.2 erstellt.
Trotzdem schonmal danke für deine Mühe und Geduld!
Lg,
Tommy!
EDIT: Was vielleicht nicht ganz rübergekommen ist: Es werden nicht nur Queues im Hauptprogramm iniziiert, sondern auch an unterschiedlichen Stellen in unterschiedlichen SubVIs, die alle ein eigenes Modul des uControllers ansteuern (eine Queue fürs Mainboard, eine andere für was anderes, etc.), d.h.: der uController besteht aus mehreren Modulen. Und es gibt 5 Stück solcher uController, die abhängig von ihrer ID angesprochen werden.
' schrieb:Dann is das Hauptprogramm alias SubVi fertig. Die nächte ID kommt rein, ID2. Dadurch soll aber nicht die vorhandene Queue gefüllt werden, sondern es soll eine neue "Kopie" des Hauptprogramms alias SubVI geöffnet werden, sodass eine neue Queue (NUR für den uController mit der ID2 geltend) iniziiert wird.
Und genau das macht auch schon bereits das, was du gepostet hast.
Zitat:Demnach gibts dann 5 verschiedene Queues.
Jawohl, so wie du das gepostet hast, gibt es bereits 5 Queues!
Warum dann also was ändern wollen?
Im übrigen: Zu jeden Element "Queue anfordern" gehört ein Element "Queue freigeben" - auch wenn die Queue als solche weiterbestehen soll. Dann muss bei "Queue freigeben" der Eingang "Eliminieren" auf false bleiben.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Im übrigen: Zu jeden Element "Queue anfordern" gehört ein Element "Queue freigeben" - auch wenn die Queue als solche weiterbestehen soll. Dann muss bei "Queue freigeben" der Eingang "Eliminieren" auf false bleiben.
Danke für den Hinweis!
Zu meinen VIs...ich hab einen Fehler gemacht...der Name der Queue is nicht abhängig vom Eingang...Die Queues haben eigentlich einen fix vorgegebenen Namen.