Programmablauf zufällig - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +--- Thema: Programmablauf zufällig (/Thread-Programmablauf-zufaellig) |
Programmablauf zufällig - WolfiB - 17.01.2008 09:27 Hallo Users, das angehängte Programm ist ein Teil eines großen Programms. Ich möchte hiermit Ergebnisse (über Variablen) in einen String abspeichern. Wenn eine bestimmte Variable gesetzt wird, soll eben wie in der dafür Programmierten Case-Seite vorgegebenen Werte an den String angehängt werden. Am Ende möchte ich den String dann in eine Datei speichern und evtl ausdrucken. Das geht auch immer. Allerdings wird nicht zuverlässig jeder neue String-Teil an den gesamten angehängt. Kann ich die ganze Case-Auswahl auch in eine Ereignisgesteuerte Struktur ändern? Hatte dies mal versucht, allerdings hat es mit den Variablen nicht funktioniert. Ich weiss, es sind viele Variablen verwendet. Wusste mir aber bei der größe des gesamten Programms nicht anders zu helfen. Danke für eure Tips. Gruß Wolle Ich benutze LV Version 8.5. Programmablauf zufällig - WolfiB - 18.01.2008 11:55 Hey, hab da nochmals was versucht. Kann ich denn eine Ereignisgesteuerte Struktur nicht über die Abfrage von Anzeigeelementen steuern? Gibt es da eine Möglichkeit? Zeige die benutzten Anzeigelemente nicht ans, sondern blende Sie sowieso aus, benutze Sie nur als Variable. Danke, Gruß Wolle Programmablauf zufällig - IchSelbst - 18.01.2008 21:03 Zu deinem ersten Posting: Hierzu muss ich sagen - und ich glaube da geht es vielen LV-Programmierern so: So ein Programm kuck ich gar nicht weiter an. So viele Variablen. So eine komplizierte Reihenfolge von Case-Sequenzen. Ich werfe da mal folgendes in den Raum: Statemachine, While-Schleife, Schieberegister, Queues/Melder und SubVIs, funktionale SubVIs - und die allgemeine LV-Hilfe. Vielleicht kannst du was brauchen, ich kann das nicht entscheiden. ' schrieb:Kann ich denn eine Ereignisgesteuerte Struktur nicht über die Abfrage von Anzeigeelementen steuern?Nein. So wie du diesen Satz formuliert hast nicht. Ein Ereignis wird ausgelöst, wenn der Anwender im Frontpanel eine Aktion ausführt. z.B. einen Wert in einem Eingabeelement ändert. Vom Blockdiagramm aus kann man ein Ereignis auslösen, indem man auf den Eigenschaftsknoten "Wert (signalisierend)" schreibt. Programmablauf zufällig - IchSelbst - 19.01.2008 17:21 ' schrieb:Wusste mir aber bei der größe des gesamten Programms nicht anders zu helfen.Eine Lösung, wenn nicht gar die Lösung für vieles in LV, sind: Unterprogramme, also SubVIs. Ich hab mal dein VI etwas angepasst. Siehe Anhang. Dieses VI funktioniert jetzt als Unterprogramm innerhalb deines Hauptprogrammes. Das SubVI speichert solange alle Daten, bis zuletzt "Speichern" aufgerufen wird. Diesen Sachverhalt hattest du bereits selbst derart programmiert. Dieses SubVI wird jetzt - siehe Muster.VI - immer dann aufgerufen, wenn genau der Zustand, der über den Enumerator auswählbar ist, im Hauptprogramm eingetreten ist. Und da es nur genau einen Zeitpunkt gibt, an dem z.B. "P2 HSP3 speichern" gilt, wird im Datenfluß genau zu dieser Zeit das SubVI einmal mit genau diesem Enumerator-Wert (und natürlich den erforderlichen Werten) aufgerufen - und schon stehen die zu speichernden Daten im SubVI. Es ist immer möglich, alle Variablen zu vermeiden. Das Arbeiten mit Unterprogrammen unterstützt diese Forderung (Variablen zu vermeiden). Programmablauf zufällig - WolfiB - 22.01.2008 12:37 Hallo, danke IchSelbst für deine Antworten. Es tut mir echt leid, dass es so viele Variablen sind. Wusste mir in der kurzen Zeit, in der ich erst mit LabVIEW arbeite und welche für das ganze Projekt zur Verfügung stand, nicht anders zu helfen. Nun auf dein geändertes Programm zu kommen: Ich habe die Funktion bzw. die Umsetzung noch nicht ganz verstanden. Hier nochmals meine Soll-Funktionsweise: Die MAschine besitzt 3 gleiche Stationen, daher hatte ich die Ergebnisse jeweils in eigene VAriablen geschrieben. Da nicht garantiert ist welche des 3 Stationen verwendet wird. Wenn nun ein Durchlauf der jeweiligen Station und der jeweiligen Prüfung beendet ist, sollten die Ergebnisse in den String gespeichert werden. Nach beendigung aller Prüfungen sollen diese gespeichert bzw. gedruckt werden. Wie erfolgt bei deiner Umsetzung nun die Auswahl? Muss ich die Ergebnissspeicher nun auf einen reduzieren? Wo packe ich die beiden Programme nun hin? Wäre nochmals sehr dankbar für die Hilfe. Gruß Wolle Programmablauf zufällig - IchSelbst - 22.01.2008 19:28 ' schrieb:Ich habe die Funktion bzw. die Umsetzung noch nicht ganz verstanden.Was genau hast du denn noch nicht verstenden? Benenne das hier und ich (oder wer gerade noch Lust hat) versuche dir das zu erklären. Zitat:Die MAschine besitzt 3 gleiche Stationen, daher hatte ich die Ergebnisse jeweils in eigene VAriablen geschrieben.Und genau so, wie du dir das denkst, tust du das auch programmieren: Ein SubVI, das maschinenunabhängig alles tut, was mit der Station zusammenhängt. Das SubVI bekommt dann einen Eingang, der die Maschine spezifiziert (Enumerator). Intern muss das SubVI natürlich so aufgebaut sein, dass mehrere Maschinen gesteuert respektive dass die Daten bzw. die Ergebnisse der einzelnen Maschienen irgendwo hinterlegt sind. Das Hinterlegen könnte in funktionalen SubVIs geschehen. Zitat:Da nicht garantiert ist welche des 3 Stationen verwendet wird.Da das eine SubVI maschinenunabhängig arbeitet, spielt es überhaupt keine Rolle, welche Station verwendet wird und welche nicht. Ein solches SubVI hat einen weiteren Vorteil: Keiner kann sagen, mit dieser Station geht es, mit jener aber nicht. Ist das SubVI - so wie es sein soll - maschinenunabhängig, kann dieser Zustand gar nicht eintreten. Oder nur sehr schwierig. Zitat:Wenn nun ein Durchlauf der jeweiligen Station und der jeweiligen Prüfung beendet ist, sollten die Ergebnisse in den String gespeichert werden.Alles kein Problem - wenn du alles schön mit SubVIs machst. SubVIs sind wie "globale Variablen": Überall verfügbar und einsetzbar. Dein Speicher-VI z.B. bekommt über den Enumerator-Eingang mitgeteilt, welche Station gespeichert werden soll. Dieses SubVI holt sich dann mittels des Enumerators aus dem funktionalen SubVI, das die Ergebnisse aller Maschinen (z.B. in einem Array of Cluster ect) enthält, die Ergebnisdaten eben dieser einen zu speichernden Station. Hast du z.B. String wie "Station 1", "Station 2" usw. dann geht das stationsunabhängig über den String-Formatier-Befehl "Format('Station %d',[MaschEnum])" (Beachte das %d und den Enumerator). Zitat:Wie erfolgt bei deiner Umsetzung nun die Auswahl?Vom SubVI aus gesehen über den Eingang, ein Enumerator mit den Werten "Station1", "Station2", "Station3" etc. Irgendjemand im Hauptprogramm nun muss entscheiden welche Station benutzt werden soll. Diese Entscheidung liefert nun den Enumerator, der in Datenfluß-technischer Manier nun durch das ganze Programm läuft bis hin zum Speichern. Zitat:Muss ich die Ergebnissspeicher nun auf einen reduzieren?Dein Ergebnisspeicher könnte ein funktionales SubVI sein, das in einem Array of Cluster die Ergebnisse aller Maschinen enthält. Ein Index entspricht dabei immer einer Maschine. Ein Cluster sind die Ergebnisse genau einer Maschine. Zitat:Wo packe ich die beiden Programme nun hin?Meine beiden SubVIs sind nur Muster. Wo du welches SubVI hintust, musst du in deiner Applikation entscheiden. |