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 habe hier einige theoretische Fragen zu der Gestaltung eines main.vi.
Und zwar soll der Benutzer auf dem Frontpanel zwischen mehreren Ereignissen auswählen können. Seine Auswahl verändert dabei auch die Oberfläche, d.h. nur die benötigten Elemente sind noch eingeblendet, alles andere wird ausgeblendet. Über einen Startknopf werden dann die eingetragenen Werte weiter an das vorgesehene VI übertragen, alle anderen werden nicht aktiviert.
Für die Realisierung der Sichtbarkeit habe ich mit der Methode Sichtbar rumgespielt. Dabei kann ich per knopfdruck die Felder ein und ausblende. Und per logischer Verknüpfung mit dem Startknopf, habe ich auch die oben gewünschte Zuweisung erhalten.
Aber irgendwie finde ich das unübersichtlicht und auch ineffizient.
Deshalb habe ich mir überlegt, das ganze per Ereignisstruktur zu steuern. Aber kann ich den mein komplettes main.vi über eine Ereignissturktur steuern? Und kann mir da vll jmd genau erklären, wie ich denn diese Ereignisstruktur initializiere?
Mein ganzes Programm muss dabei noch dynamisch bleiben und das, so glaube ich, ist bei der momentanen Situation nicht gegeben. Ich brauche in der Funktion irgendwie noch eine Stopfunktion, aber eine, die die Maschine langsam runterfährt und nicht einfach alles auf nullsetzt und die verbindung sofort kappt. Das kann ich mit meinem Ansatz nicht realizieren oder mir fehlt die Eingebung.
Zum besseren Verständis habe ich meine vi angehangen.
Die enthaltenen globale Variable soll vorerst ingnoriert werden, so wie die Referenz auf dieses Vi. Da habe ich nur etwas ausprobiert, bzw. ist meine Notaus Funktion übertrieben.
Diese Themen recherchieren...verinnerlichen..."fertig"!
A.
Ok vielen Danke, diese Begriffe waren mir total fremd.
Ich habe mich da nun etwas schlau gemacht und habe auch einen kleinen überblick bekommen.
Kann ich beide Strukturen gleichzeitig benutzen, bzw wolltest du mir das sagen.
Also soll ich mein Hauptververfahren mit der Statemachine machen, also die Aufnahme der Messerte und verarbeitung dieser.
Das wäre dann gleichzeitig mein consumer. Und mein Producer könnte dann der Plot der Messwerte sein oder?
Automatischer Programmablauf:
State Machine = Consumer
Die State Machine verarbeitet alle Benutzereingaben, die sie per Queue oder Notifier bekommt, ansonsten steuert sie sich selbst. Hier wird die Visualisierung untergebracht, die eigentliche (kontinuierliche) Datenerfassung könnte auch in einer parallelen Schleife laufen. Wenn die State Machine gerade keine aktuellen Aufgaben hat, geht sie in eine Wartezustand...allgemein desöfteren als "idle" bezeichnet.
A.
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
Ok, nun versuche ich erstmal meine Benutzereingabe fertig zustellen, bzw erstmal nur für eine Eingabe.
Die Auswahl meiner Menüfelder funktioniert über eine Ereignissteuerung. Dann werden die entsprechenden Felder sichtbar und ich kann die gewünschte Werte eintragen.
Nun stellt sich mir eine Fragen.
Anmerkung: Ich habe für die Umsetzung die Erzeuger/Verbrauche Vorlage von Labview genutzt.
Es sind drei double Werte und diese sollen an ein subVI übergeben werden. So wie ich das nun verstanden habe, übergebe ich meine Werte an die Queue bzw reihe sie dort auf und die Queue überträgt meine Werte in die Verbraucherschleife und dort wird das dann an die entsprechende VI geleitet, oder?
Kann ich nur Strings in die Queue einreihen? Außerdem muss ich ja eigentlich noch den Wert meines Ereignisses übergeben, damit meine Verbraucherschleife weiß, welches subVI sie aufrufen soll.
Wie kann ich nun die Werte sauber in ein String lesen und wieder öffnen? Da gibt es doch die Funktion "write in to string" oder?
Ich glaube mein Problem ist, das ich nun versuche mein altes Vorhaben in eine neue Struktur anzupassen. Ist das den möglich, oder soll ich mein Vorhaben überarbeiten?
Lg Atilla
14.11.2012, 16:01 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2012 16:02 von GerdW.)
Zitat:Kann ich nur Strings in die Queue einreihen?
Nein, das funktioniert mit beliebigen Daten. Muss man nur beim QueueErstellen so angeben...
Zitat:Wie kann ich nun die Werte sauber in ein String lesen und wieder öffnen? Da gibt es doch die Funktion "write in to string" oder?
??? Wert in einen String lesen und wieder öffnen???
Welches "Write into String? Steht der Name echt so in der Kontexthilfe?
Tipp1: Erstelle einen (typdefinierten) Cluster, der alle benötigten Werte beinhaltet. Keine Probleme, mehrere Daten (synchronisiert) per Queue zu übertragen...
Tipp2: Wenn du von irgendwelchen Sachen redest und nicht die richtigen Namen verwendest, solltest du immer dein VI oder wenigstens ein Bild des BD mit anhängen...
Zitat:ich versuche mein altes Vorhaben in eine neue Struktur anzupassen. ... soll ich mein Vorhaben überarbeiten?
Ok danke für deine Info. Nun habe ich einfacher bei der Erzeugung der Queue eine Konstante an den eingang Datentyp gelegt. Diese wurde automatisch als Variant bezeichnet.
Nun überlege ich wie ich die werte einzeln auslesen kann. Übergebe ich nur einen Wert an die Queue, ist das kein Problem.
Ich weiß auch das die Queue nach dem FiFo prinzip funktioniert, und bei Java würde ich die Werte mit einer Schleife auslesen. Aber kann ich das hier auch so machen? Wenn ja wie kann ich das realizieren?
Außerdem stellt sich mir noch die Frage wie ich der Queue sagen kann, um welchen Cluster es sich handelt, da ich verschiedene habe und diese auch verschiedene größen haben. Der Verbraucher muss sich halt dann dementsprechend anpassen.
Hier möchte ich erstmal nur versuchen die Werte von der Ratensteuerung auszulesen.
Zitat:
Zitat:Wie kann ich nun die Werte sauber in ein String lesen und wieder öffnen? Da gibt es doch die Funktion "write in to string" oder?
??? Wert in einen String lesen und wieder öffnen???
Welches "Write into String? Steht der Name echt so in der Kontexthilfe?
Tipp1: Erstelle einen (typdefinierten) Cluster, der alle benötigten Werte beinhaltet. Keine Probleme, mehrere Daten (synchronisiert) per Queue zu übertragen...
Tipp2: Wenn du von irgendwelchen Sachen redest und nicht die richtigen Namen verwendest, solltest du immer dein VI oder wenigstens ein Bild des BD mit anhängen...
Tut mir leid ich habe die Funktion verwechselt mit "in txt schreiben".
Zitat:ich versuche mein altes Vorhaben in eine neue Struktur anzupassen. ... soll ich mein Vorhaben überarbeiten?
Zitat:Nun habe ich einfacher bei der Erzeugung der Queue eine Konstante an den eingang Datentyp gelegt.
Nein, du hast die Konstante per Rechtsklick auf den Eingang erzeugt... Du kannst auch eine selbstdefinierte Konstante dort anschließen!
Problem:
Es scheint, du willst verschiedene Cluster (=Datentypen!) über die Queue transportieren. Dies erlaubt LabVIEW nicht ohne weiteres, da es strikt typisiert arbeitet.
Optionen:
1) Erstelle einen Cluster mit einem Enum (notfalls String) und einem Variant. Verwende dieses als Datentyp für die Queue. Dann musst du zu jedem Daten-Cluster, den du in die Queue stopfen willst, auch eine Kennung mitschicken (eben dieses Enum oder String). Die Auswerteroutine muss dann anhand der Kennung den Cluster wieder aus dem Variant auspacken.
2) Erstelle einen Cluster, der alle deine (bisher unterschiedlichen) Daten aufnehmen kann. Versende diesen mit der Queue.
Zitat: bei Java würde ich die Werte mit einer Schleife auslesen. Aber kann ich das hier auch so machen? Wenn ja wie kann ich das realizieren?
Das hast du doch schon in deinem VI gelöst!? Wo ist das Problem?
Zitat:Es scheint, du willst verschiedene Cluster (=Datentypen!) über die Queue transportieren. Dies erlaubt LabVIEW nicht ohne weiteres, da es strikt typisiert arbeitet.
Also in erster linie sind das immer die selben datentypen im Cluster. Das sind jedesmal dbl Typ. Nur die Cluster haben unterschiedliche Größen. zählt das auch schon als verschiedene Typen?
Zitat:Optionen:
1) Erstelle einen Cluster mit einem Enum (notfalls String) und einem Variant. Verwende dieses als Datentyp für die Queue. Dann musst du zu jedem Daten-Cluster, den du in die Queue stopfen willst, auch eine Kennung mitschicken (eben dieses Enum oder String). Die Auswerteroutine muss dann anhand der Kennung den Cluster wieder aus dem Variant auspacken.
2) Erstelle einen Cluster, der alle deine (bisher unterschiedlichen) Daten aufnehmen kann. Versende diesen mit der Queue.
Deine erste Option finde ich gut und würde ich gerne ausprobieren.
Also wenn ich dich jetzt richtig verstanden habe Wandle ich meine eingegebenen Werte mit "to variant" in ein Variant um und bündel ist mit meinem String(oder enum) zu einem Cluster. Diesen übergebe ich dann der Queue. Danach wandel ich diese wieder mit "variant to data" um, analysiere das Emun, und dann vergreife ich mich an dem zwieten variant und schicke es weiter, da wo es gebraucht wird. Sehe ich das richtig?
Zitat:
Zitat: bei Java würde ich die Werte mit einer Schleife auslesen. Aber kann ich das hier auch so machen? Wenn ja wie kann ich das realizieren?
Das hast du doch schon in deinem VI gelöst!? Wo ist das Problem?
Habe ich das? Aber ich kann die einzelnen Werte nicht auslesen, bzw kp wie?
Ich finde jetzt habe ich das erst gelöst.
Da nutzte ich "variant to data" und sagte ihm dass der datentyp ein Cluster mit zwei dbl elemente ist. Aber das wirkt für mich, wie keine saubere lösung.
gruß Atilla
Danke GerdW, dass du so geduldig mit meinen Fragen bist.
Zitat:sind das immer die selben datentypen im Cluster. Das sind jedesmal dbl Typ. Nur die Cluster haben unterschiedliche Größen. zählt das auch schon als verschiedene Typen?
Ganz klares JA. Unterschiedliche Cluster = unterschiedliche Datentypen. Ist auch in anderen Programmiersprachen (meist) so geregelt...
Zitat:Also wenn ich dich jetzt richtig verstanden habe Wandle ich meine eingegebenen Werte mit "to variant" in ein Variant um und bündel ist mit meinem String(oder enum) zu einem Cluster. Diesen übergebe ich dann der Queue. Danach wandel ich diese wieder mit "variant to data" um, analysiere das Emun, und dann vergreife ich mich an dem zwieten variant und schicke es weiter, da wo es gebraucht wird. Sehe ich das richtig?
Ich glaube fast:
Zitat:Da nutzte ich "variant to data" und sagte ihm dass der datentyp ein Cluster mit zwei dbl elemente ist. Aber das wirkt für mich, wie keine saubere lösung.
Wenn du die Datenim Variant wieder verarbeiten willst, musst du sie in "normale" Daten umwandeln. Dazu musst du wissen, wie die Daten im Variant aufgebaut sind. Ergo musst du dem FromVariant den zu wandelnden Datentyp mitteilen.
Das ist der saubere Weg - den du hier dann einschlagen musst. Variants haben Vorteile (beliebige Datentypen) und Nachteile (explizite Umwandlung nötig)...