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!
Ich wuerde Euch erneut bitte etwas fragen, weil ich eine Anfaengerin bin.
In meiner Main.vi sind drei PushButton.vis, die jeweils ein Cluster namens 'Memory' ausgeben. Da mein Frontpanel schon zu voll ist, moechte ich diese Daten gerne in einem zweiten Fenster oder mit der Hilfe eines Tabs als Liste einbauen. Im zweiten Fenster (oder zweitem Tab) sollen diese Cluster in der Reihenfolge aneinander angehaengt werden, wie die entsprechenden Knoepfe (Sample, Air, Buffer) im Main.VI gedrueckt worden sind. Ich moechte sozusagen aufzeichnen, was passiert. Am Ende soll eine Liste wie folgt im Fenster stehen:
Sample 5 ml 1
Air 5 ml 0
Buffer 10 ml 1
1 oder 0 sind Flags, die mir sagen, ob die entsprechende Fluessigkeit injiziert oder herausgesaugt worden ist.
Wie sammelt man Daten und schickt sie in eine Sub.vi in ein zweites Zimmer bzw. wie schickt man sie auf Kommando in die Sub.Vi und in das zweite Fenster?
Koennte mir bitte jemand ein paar Tips geben? Das waere klasse.
Ueber Stichworte freue ich mich auch. Eventstrukturen kann ich leider nicht nutzen.
Ich haenge meine Main_v1.vi an und die Pushbutton_X.vi an. Die Pushbutton_X.vi produziert das Memory-Cluster.
Es ist.
Aber im Prinzip, kannst du die Cluster, sofern sie vom Typ identisch sind, in ein Array speichern, sobald einer der Buttons gedrückt wird.
Da du keine Events nutzen kannst, musst du hierfür halt mit Fallunterscheidungen arbeiten. Das Array kannst du leicht in einem Schieberegister halten und somit immer nur bei Betätigung eines Buttons ein weiteres Element (Cluster) einfügen.
Upps, tut mir leid. Ich dachte,ich haette das Main angefuegt. Sie funktioniert gerade nicht, weil ich mit dem Cluster rumprobiere, aber ich haenge sie trotzdem an.
Ja, die Cluster sind immer identisch. Zumindest sind sie alle gleich aufgebaut.
Um sie in ein Array abspeichern zu koennen, muss ich irgendwas beachten?
Mein bisheriger Ansatz war auch, ein Cluster vor dem Schieberegister (links) zu initialisieren, um dann die anderen Cluster anzufuegen. Ich haette den Cluster unveraendert durch die False-Schleife laufen lassen und ein 'Append' im True-Case versucht. Ich nehme an, das hast du gemeint, falls ich dich richtig verstanden habe.
Im Moment kaempfe ich gerade noch mit dem Anhaengen eines Cluster an einen anderen. Vielleicht muss man doch den Weg ueber Insert Array oder Replace Subset Array gehen. Ich probier das einmal aus.
Vielen Dank
Gruesse Blue
LabVIEW Version
05.03.2010, 17:32 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2010 17:32 von GerdW.)
ich habe der Einfachheit halber mal ein "Build Array" an der fraglichen Stelle eingefügt
Warum initialisierst du das Shiftregister mit einem Array mit einem Element? Sollte das Array nicht leer sein, d.h. 0 Elemente haben?
Hallo Gerd,
bevor ich deinen Beitrag gesehen habe, hatte ich diese Funktion auch endlich gesehen:)Ich kenne noch nicht alle Funktionen und so hat es ein wenig gedauert. (:rolleyes:auf mich bezogen). Man muss halt selber lernen ...
Ja, das Array sollte am Anfang leer sein. Ich habe das jetzt wie folgt geloest: Einen fastleeren Cluster (warum kann man kein empty double haben? empty strng geht doch auch?) als Element fuer "Initialize Array.vi" angehaengt. Die Dimension auf 0 gesetzt. Das sollte mir ein leeres Array geben, dass ich spaeter zum Anhaengen der Cluster nutze.
Das Programm funktioniert jetzt insofern, als dass die Cluster solange angehaengt werden, bis die Schleife stoppt.
Leider existiert aber noch folgende Probleme, um die ich mich kuemmern moechte:
1. Die gesammelten Cluster muss ich noch in ein anderes Fenster oder einen Tab auslagern und am besten Speichern.
2. Die Main.vi besteht ja im wesentlichen aus einer Schleife und einzelnen Cases, die zusammen eine Event-Struktur ergeben. So habe ich das bisher verstanden. Drueckt man den Sample-Knopf, wird das Programm, was sich dahinter verbirgt, ausgefuehrt. Zuvor hat man z.B. das zu injizierende Sample-Volumen eingegeben. Dann laeuft die Main.vi kontinuierlich.
Hier jetzt das Problem: Man kann zwar im Run Continuously Mode immer noch ein anderes Sample-Volume am Control-Icon eingeben, jedoch wird das nicht akzeptiert. Man muss rest den Stop-Button druecken, damit dieser Wert aktualisiert wird.
Das wiederum ist total daemlich, weil ich dann meine Liste, die aus den oben genannten Clustern hervorgeht, verliere, weil die Schleife wieder von vorne startet und das Schieberegister mit dem Array neu initialisiert wird. Gibt es fuer solche Faelle auch eine Loesung?
Ich dachte daran, dass man vielleicht eine Vi an das Schieberegister anbaut, die entweder die alte Liste, die zuvor als Textdatei auf Platte geschrieben wird, einliest und weiterbenutzt, oder ggf. eine neue Liste anfaengt. Das kaeme mir jetzt als erstes in den Sinn, aber vielleicht gibt es bessere Moeglichkeiten?
Ich haenge nochmal meine aktuelle Version an.
Beste Gruesse und vielen Dank fuer Eure Geduld. Ich bemuehe mich wirklich.
Blue
05.03.2010, 22:02 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2010 22:16 von GerdW.)
"Hier jetzt das Problem: Man kann zwar im Run Continuously Mode..."
Uh-oh, rotes Tuch - tief durchatmen, bis 10 zählen.
Benutze bitte nie, niemals, unter keinen Umständen den "Run Continuous Mode" für ein "lauffähiges" Programm. Der ist nur, wirklich nur, kannste mir wirklich glauben, zum Debuggen gedacht! Es gibt im NI IdeaExchange einen Vorschlag, den per Default zu verstecken - ich habe den Vorschlag unterstützt
So, jetzt wo ich das gesagt habe, kann's weitergehen. Puls wieder unter 120
Das Problem liegt z.T. am Run Continuous Mode und zum anderen an deinem VI. Mach einfach eine Schleife um deinen bisherigen Code, dann hast du schon mal das gleiche wie im RunCont*** erreicht. Jetzt musst du noch den Datenfluß beachten. Wenn die Änderung eines Controls in einer Schleife ausgewertet werden soll, dann muss das Control auch in der Schleife liegen. Datenfluß!!!
"warum kann man kein empty double haben?"
Kannst du mal erklären, wie das aussehen soll? Egal in welcher Programmiersprache? Du definierst eine "Variable" als Zahl, es wird Speicher reserviert und es steht ein Wert im Speicher (egal ob ein definierter wie Null oder irgendwelcher Datenmüll). Die Zahl beansprucht Speicherplatz und hat per se einen Wert. Bei einem String ist das was anderes. Der besteht aus 2 Werten: der Zeichenkette und einer Längenangabe. Da kann der String leer sein, dann ist die Länge halt Null. Du siehst aber nicht, das LV im Hintergrund mindestens 4 Byte Speicherplatz belegt hat (eher 8 Byte auf einem 32bit-OS: LONG length + [empty] MEMPTR)...
Um ein leeres Array zu definieren, brauchst du keinen leeren Cluster. Der dient beim InitArray (quasi) nur als TypDefinition, wenn du als Dimensionsgröße Null angibst..
Hat mit der Sache um die es geht nichts zu tun: Habe mal durch zusätzliches Clustering einen Teil des BD eleganter gestaltet. Die Cluster sind transparent, so daß sich am Aussehen des FP überhaupt nichts ändert.
"Hier jetzt das Problem: Man kann zwar im Run Continuously Mode..."
Uh-oh, rotes Tuch - tief durchatmen, bis 10 zählen.
Benutze bitte nie, niemals, unter keinen Umständen den "Run Continuous Mode" für ein "lauffähiges" Programm. Der ist nur, wirklich nur, kannste mir wirklich glauben, zum Debuggen gedacht! Es gibt im NI IdeaExchange einen Vorschlag, den per Default zu verstecken - ich habe den Vorschlag unterstützt
So, jetzt wo ich das gesagt habe, kann's weitergehen. Puls wieder unter 120
Das Problem liegt z.T. am Run Continuous Mode und zum anderen an deinem VI. Mach einfach eine Schleife um deinen bisherigen Code, dann hast du schon mal das gleiche wie im RunCont*** erreicht. Jetzt musst du noch den Datenfluß beachten. Wenn die Änderung eines Controls in einer Schleife ausgewertet werden soll, dann muss das Control auch in der Schleife liegen. Datenfluß!!!
"warum kann man kein empty double haben?"
Kannst du mal erklären, wie das aussehen soll? Egal in welcher Programmiersprache? Du definierst eine "Variable" als Zahl, es wird Speicher reserviert und es steht ein Wert im Speicher (egal ob ein definierter wie Null oder irgendwelcher Datenmüll). Die Zahl beansprucht Speicherplatz und hat per se einen Wert. Bei einem String ist das was anderes. Der besteht aus 2 Werten: der Zeichenkette und einer Längenangabe. Da kann der String leer sein, dann ist die Länge halt Null. Du siehst aber nicht, das LV im Hintergrund mindestens 4 Byte Speicherplatz belegt hat (eher 8 Byte auf einem 32bit-OS: LONG length + [empty] MEMPTR)...
Um ein leeres Array zu definieren, brauchst du keinen leeren Cluster. Der dient beim InitArray (quasi) nur als TypDefinition, wenn du als Dimensionsgröße Null angibst..
Hallo Gerd,
danke fuer deine Geduld und entschuldige, dass ich dich auf die Palme gebracht habe. Entschudige fuer die verspaetete Rueckmeldung, ich war leider krank.
Ich muss kurz etwas zu meiner Verteidigung sagen:
Meine Main.vi basiert auf einem Beispiel der Firma Harvard Apparatus. Ein Programmierer dieser Firma hat diese Treiber ins Netz gestehlt und eben dieses Beispiel, was ich weiter modifiziert habe, auch. Da ich leider absolute Anfaengerin bin, dachte ich mir nix weiter. Ich habe erstmal nicht vermuten, dass hier etwas falsch programmiert wurde. Das ist dann auf meine eigene Unwisseneit zurueckzufueren.
Gerd, der gesamte Code soll in eine Schleife? Okay, daran probiere ich mich einmal heute. Den Datenfluss schaue ich mir auch einmal genauer an.
Empty double: Danke fuer die sehr gute Erklaerung. Ja, ich meinte soetwas wie einen leeren String.
Um ein empty array mit Typdefinition Cluster anzugeben, ist es notwenig InitArray dem Typ Cluster mitzuteilen. Habe ich das richtig verstanden, dass man, wenn der Cluster selbst aus String, Double, String besteht, diese Art Cluster InitArray auch mitteilen muss, damit man solche Cluster spaeter auch anhaengen kann? Jedenfalls habe ich gerade probiert, ein leeres Cluster an InitArray zu haengen (Rest gleich) und es gab eine Fehlermeldung, dass die Cluster unterschiedlich sind.
Viele Gruesse
Blue
10.03.2010, 12:47 (Dieser Beitrag wurde zuletzt bearbeitet: 10.03.2010 12:49 von GerdW.)
InitArray legt ein Array mit einem bestimmten Datentyp an. Um welchen Datentyp es sich handelt, musst du natürlich mitteilen. Und ein leerer Cluster (d.h. nur die Cluster-Konstante ohne irgendwelche Elemente) ist da wenig hilfreich. Ein Cluster ist erstmal nur eine Art Container oder Hülle - aber keine gültige Datentyp-Beschreibung.
Wenn du also ein Array von Cluster von (String, DBL, String) haben willst, dann musst du als Datentyp ein Cluster(String, DBL, String) vorgeben!
Ich sagte nicht "soll". Aber der RunCont.Mode macht nichts weiter als dein VI immer wieder neu zu starten (leider mit Nebeneffekten,wie du gemerkt hast). Deshalb der Rat, eine Schleife zu benutzen - die macht genau das gleiche, ohne diese Nebeneffekte.
Gruß
' schrieb:Hat mit der Sache um die es geht nichts zu tun: Habe mal durch zusätzliches Clustering einen Teil des BD eleganter gestaltet. Die Cluster sind transparent, so daß sich am Aussehen des FP überhaupt nichts ändert.
[attachment=53388:Main_v1_WA.vi] [attachment=53389:PushButton_X_WA.vi] [attachment=53390:Settings.ctl]
Guten Tag, Lucki.
Danke fuer deine Hilfe. Wenn ich es richtig verstanden habe, versteckst du die drei Cluster in diesem Settings.ctl (Control Element?), was anscheinend ein non-strict array ist. Magst du vielleicht bitte kurz erklaeren, was die Vorteile eines non-strict arrays sind. Ich lese darueber auch gleich etwas.
Was bedeutet bitte BD und "die Cluster sind transparent, so dass sich das Aussehen des FrontPanels nicht aendert"?
Hast du den Cluster Settings in Main.vi dadurch erzeugt, dass du dreimal setings.ctl darin eingefuegt hast?
Lucki, eine Frage bitte noch, hat es einen besonderen Grund, warum du close.vi ausgetauscht hast? Das sieht jetzt ganz anders aus als vorher.