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 ein Programm, indem sehr viele lokale Varibalen vorhanden sind (es müssen so viele sein, da das Programm riesig ist).
Nun kopiere ich bestimmte Programmteile in dem sich auch Variablen befinden. Um nun die Variablen neu anzupassen, nutze ich die Hand und wähle aus der erscheinenden Liste mit den vorhandenen "Variablennamen" die neuen Variable aus, die ich benötige.
Dabei ist diese erscheinende Liste scheinbar willkürlich durcheinander. Wie schaffe ich es, diese Liste zum Beispiel nach Namen zu sortieren, falls es überhaupt solch eine Option im Konfigurationsmenü gibt?
Denn ich finde dazu nichts passendes, und eine Liste mit 100 oder mehr Einträgen zu durchforsten stregt doch ziemlich an, und dauert mir zu lange.
ich glaube die werden in der Reihenfolge ihrer Erzeugung aufgelistet, und so auch nummeriert! Wenn du die entsprechenden Controls auf dem FrontPanel neu sortierst (Change Tabbing Order), dann wird vermutlich auch die Liste anders aussehen!
Aber mal unter uns: Das gibts überhaupt nicht, dass man so ne lange Liste hat! Irgendwas machst du da falsch...Lokale Variablen sind wahnsinnig speicherintensiv, weil für jede Variable im BD eine Kopie der Daten im Speicher angelegt wird! Kannst du nicht z.B. Cluster bauen mit deinen Daten? Oder über Referenzen arbeiten (wieder Schließen nicht vergessen!)?
Gruss
Achim
"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)
' schrieb:<div align="left">
ich habe ein Programm, indem sehr viele lokale Varibalen vorhanden sind (es müssen so viele sein, da das Programm riesig ist).
</div>
Dazu zwei Anmerkungen:
- es gibt kein 'Muss' für lokale Variable! In der Regel kommt man ganz ohne aus. Lokale Variable haben auch Performance- und Speicherplatz-Nachteile
- Wenn das Programm riesig ist (Definition von riesig: Frontpanel oder Blockdiagramm passen nicht mehr auf je eine Bildschirmseite), sollte man das Programmdesign sowieso mal überdenken
Zu der Frage, wie denn die Liste sortiert ist: ist m.W. durch die Reihenfolge der Erzeugung der controls bestimmt. Nachträgliches Umsortieren ist möglich: Menü->Bearbeiten->Tabulatorreihenfolge festlegen... usw. Ist aber genauso umständlich
ich glaube die werden in der Reihenfolge ihrer Erzeugung aufgelistet, und so auch nummeriert! Wenn du die entsprechenden Controls auf dem FrontPanel neu sortierst (Change Tabbing Order), dann wird vermutlich auch die Liste anders aussehen!
Aber mal unter uns: Das gibts überhaupt nicht, dass man so ne lange Liste hat! Irgendwas machst du da falsch...Lokale Variablen sind wahnsinnig speicherintensiv, weil für jede Variable im BD eine Kopie der Daten im Speicher angelegt wird! Kannst du nicht z.B. Cluster bauen mit deinen Daten? Oder über Referenzen arbeiten (wieder Schließen nicht vergessen!)?
Gruss
Achim
<div align="left">
Hallo Achim,
erstmal vielen Dank für den Tip.
Da muß ich dann wohl damit leben, daß die Liste so sortiert ist, wie sie erzeugt wird.
Nun zu dem anderen "Problem":
Ich bin kein Programmierer, aber mein Projekt ist wirklich riesig. Ich habe die Aufgabe eine MSR-Software für einen Prüfstand zu schreiben, mit dem gleichzeitig mehrere Prüflinge untersucht werden können.
Nun habe ich in meinen LabVIEW-Programm eine Hauptschleife (Do-While) und viele weitere Do-While-Schleifen für die Prüfstände. Die Dateneingabe für jeden Prüfstand erfolgt über die "Prüstandschleifen". Diese Werte werden der Hauptschleife übergeben werden, da sie dort verarbeitet werden.
Der Vorteil an dieser Methode war, daß ich nur für einen Prüfstand die Schleife programmieren brauchte und für die anderen diese einfach kopieren konnte -mit den entsprechenden anderen Varibalennamen-.
In der Hauptschleife werden dann diese Varibalen ausgelesen und zur Ansteuerung der Hardware verarbeitet.
Welche Möglichkeiten hätte ich denn bei diesem Aufbau des Programms noch gehabt, auf Variablen zu verzichten? Denn ich kenne leider nur diese Methode um von einer While-Schliefe in die andere mittels Varibalen Werte zu übergeben.
Gruß
Bernd
</div>
' schrieb:Dazu zwei Anmerkungen:
- es gibt kein 'Muss' für lokale Variable! In der Regel kommt man ganz ohne aus. Lokale Variable haben auch Performance- und Speicherplatz-Nachteile
- Wenn das Programm riesig ist (Definition von riesig: Frontpanel oder Blockdiagramm passen nicht mehr auf je eine Bildschirmseite), sollte man das Programmdesign sowieso mal überdenken
Zu der Frage, wie denn die Liste sortiert ist: ist m.W. durch die Reihenfolge der Erzeugung der controls bestimmt. Nachträgliches Umsortieren ist möglich: Menü->Bearbeiten->Tabulatorreihenfolge festlegen... usw. Ist aber genauso umständlich
<div align="left">
Hallo ahlers01,
danke für den Tip.
In Bezug auf meine Antwort an Achim:
Welche Möglichkeiten gibt es Werte von einer Do-While-Schleife in eine anderen zu übergeben, ohne Varibalen zu benutzen?
' schrieb:<div align="left">
Ich bin kein Programmierer, aber mein Projekt ist wirklich riesig.
</div>
Ein riesiges Projekt ist genau der Fall, der eigentlich einen Programmierer erfordert. Da ist es eben nicht mehr mit 'einfach drauflos programmieren' getan. Zumindest solltest Du einen 'Programmierer Deines Vertrauens' zu Rate ziehen (o.k., mit Deiner Frage an das Forum hast Du das ja auch irgendwie getan).
' schrieb:<div align="left">
Welche Möglichkeiten hätte ich denn bei diesem Aufbau des Programms noch gehabt, auf Variablen zu verzichten? Denn ich kenne leider nur diese Methode um von einer While-Schliefe in die andere mittels Varibalen Werte zu übergeben.
Welche Möglichkeiten gibt es Werte von einer Do-While-Schleife in eine anderen zu übergeben, ohne Varibalen zu benutzen?
</div>
<div align="left">
Die best geeignete Möglichkeit sind Queues. Das Beispiel-VI "<LabVIEW>examplesgeneralqueue.llbQueue Multiplexer.vi" zeigt einen Anwendungsfall, der Deinem vielleicht nahe kommt.
Weitere Möglichkeiten sind
- sogenannte LV2-style globals. Im Prinzip wird dabei ein Schieberegister in einer subVI als Datepuffer genutzt. Eine uralte aber extrem flexible Methode.
- normale globale Variablen
- Ab LV8: shared variables (Umgebungsvariablen in der deutschen LV Version).
All diese Methoden können auch über subVI-Grenzen hinaus kommunizieren, und die shared variable in einem Netzwerk sogar über Rechnergrenzen. Das wirst Du auch brauchen, denn mit nur einer VI kannst due ein 'riesiges' Projekt eh nicht bewältigen (siehe unten).
Welche Methode Du auch nutzt, Du solltest auf jeden Fall überlegen, ob Deine Daten, z.B. in Clustern, sinnvoll zusammengefasst werden können. Eine sinnvoll konzipierte Datenstruktur ist oft schon mehr als die Hälfte der Problemlösung!
Des weiteren: es hört sich so an, als würdest Du die verschiedenen Prüflinge in Deinem Programm alle dadurch bedienen, dass Du jeweils die entsprechende Schleife in einem Diagramm kopierst (da Du ja von lokalen Vars sprichst). Sinnvoll wäre aber hier eine subVI, die Du dann halt für jeden Prüfling (eventuell dynamisch) aufrufst. Dann wärst Du aber mit locals eh am Ende. Queues gehen dann aber immer noch.
Wenn Du noch relativ neu in LabVIEW bist, wird Dir einiges von dem Gesagten spanisch vorkommen.
Das ist normal, frag einfach weiter hier im Forum nach, ein Spanisch-Übersetzer findet sich immer.
' schrieb:Ein riesiges Projekt ist genau der Fall, der eigentlich einen Programmierer erfordert. Da ist es eben nicht mehr mit 'einfach drauflos programmieren' getan. Zumindest solltest Du einen 'Programmierer Deines Vertrauens' zu Rate ziehen (o.k., mit Deiner Frage an das Forum hast Du das ja auch irgendwie getan).
<div align="left">
Die best geeignete Möglichkeit sind Queues. Das Beispiel-VI "<LabVIEW>examplesgeneralqueue.llbQueue Multiplexer.vi" zeigt einen Anwendungsfall, der Deinem vielleicht nahe kommt.
Weitere Möglichkeiten sind
- sogenannte LV2-style globals. Im Prinzip wird dabei ein Schieberegister in einer subVI als Datepuffer genutzt. Eine uralte aber extrem flexible Methode.
- normale globale Variablen
- Ab LV8: shared variables (Umgebungsvariablen in der deutschen LV Version).
All diese Methoden können auch über subVI-Grenzen hinaus kommunizieren, und die shared variable in einem Netzwerk sogar über Rechnergrenzen. Das wirst Du auch brauchen, denn mit nur einer VI kannst due ein 'riesiges' Projekt eh nicht bewältigen (siehe unten).
Welche Methode Du auch nutzt, Du solltest auf jeden Fall überlegen, ob Deine Daten, z.B. in Clustern, sinnvoll zusammengefasst werden können. Eine sinnvoll konzipierte Datenstruktur ist oft schon mehr als die Hälfte der Problemlösung!
Des weiteren: es hört sich so an, als würdest Du die verschiedenen Prüflinge in Deinem Programm alle dadurch bedienen, dass Du jeweils die entsprechende Schleife in einem Diagramm kopierst (da Du ja von lokalen Vars sprichst). Sinnvoll wäre aber hier eine subVI, die Du dann halt für jeden Prüfling (eventuell dynamisch) aufrufst. Dann wärst Du aber mit locals eh am Ende. Queues gehen dann aber immer noch.
Wenn Du noch relativ neu in LabVIEW bist, wird Dir einiges von dem Gesagten spanisch vorkommen.
Das ist normal, frag einfach weiter hier im Forum nach, ein Spanisch-Übersetzer findet sich immer.
-Franz
</div>
<div align="left">
Hallo Franz,
ja ich bin neu in LabVIEW (angefangen vor 4 Monaten) und kann auch kein spanisch .
Ein Programmierer wäre sinnvoll, aber dies ist mein Diplomthema. Vielleicht überschätze ich auch die Dimensionen meines Programms und ein Programmierer lacht nur darüber.
Aber für mich ist es schon ein riesiges Programm. Denn in meinem Studiengang hatte ich bisher ein Grundkurs in C-Programmierung. Schulische Kenntnisse habe ich in Pascal erworben, persönliche in Excel-VBA. Das wars dann auch schon, und das in Zeiten, in der ohne Computer schon fast gar nichts mehr geht.
Man wurschtel sich halt sich so durch. Sicherlich habe ich nicht gleich losprogrammiert, aber mir fehlt eben die Erfahrung, wie man solche Projekte angeht. So habe ich eben doch mehr nach dem Verfahren Versuch und Irrtum gearbeitet, weil meine Vorüberlegungen nicht zum Erfolg führten.
Ein Problem für mich ist auch jetzt noch, sämtliche Funtkionen in LabVIEW zu kennen. Immer wieder lernt man neue kennen. Ich bin mittlerweile an dem Punkt, alles von vorne zu beginnen, aber dazu fehlt mir einfach die Zeit -leider-, denn der Abgabetermin für die Arbeit rückt immer näher.
Ein weiteres Problem ist, daß ich zwar schon viel versucht habe zu optimieren, und Subvis zu basteln, aber wenn an einem Subvi 20 oder mehr Anschlüsse sind, dann kann das auch nicht der Weisheit letzter Schluß sein, zumal mein Betreuer mir von CLustern abgeraten hat, bzw. die gar nicht gerne sieht.
Beim dem Arbeiten mit lokalen Varibalen, bin ich davon ausgegangen, daß die weniger Ressorcen benötigen als globale, weil ein Netzwerk nicht notwendig ist.
Um mal mein Problem zu verdeutlichen hänge ich ein Beispiel-Vi ran, wie mein Programm aussieht.
Vielleicht wird dann dan Problem klarer.
Beim schnellen drüberschauen ist mir aufgefallen: Du benutzt polling (ständiges Abfragen der Inputs) um auf Nutzereingaben zu reagieren. Das sollte (eigentlich: muss) man mit Eventstrukturen machen.
Wenn man das Haupt-VI laufen lässt, merkt man wie träge die Reaktion auf Mausbewegungen ist. Grund: Beide Pollingschleifen laufen ungebremst, d.h. sie fressen CPU leistung so viel sie können. Kopier mal die wait Fuktion aus der Verarbeitungsschleife in die beiden input Schleifen, das wirkt schon Wunder.
Aber wie gesagt, mit den Eventstrukturen wird es noch besser gehen.
Ich schau mal tiefer rein, wenn ich mehr Zeit hab.
' schrieb:Na, damit kann man doch schon mal was anfangen.
Also erstmal: Das Programm ist nicht riesig.
Beim schnellen drüberschauen ist mir aufgefallen: Du benutzt polling (ständiges Abfragen der Inputs) um auf Nutzereingaben zu reagieren. Das sollte (eigentlich: muss) man mit Eventstrukturen machen.
Wenn man das Haupt-VI laufen lässt, merkt man wie träge die Reaktion auf Mausbewegungen ist. Grund: Beide Pollingschleifen laufen ungebremst, d.h. sie fressen CPU leistung so viel sie können. Kopier mal die wait Fuktion aus der Verarbeitungsschleife in die beiden input Schleifen, das wirkt schon Wunder.
Aber wie gesagt, mit den Eventstrukturen wird es noch besser gehen.
Ich schau mal tiefer rein, wenn ich mehr Zeit hab.
-Franz
<div align="left">
Guten Morgen Franz,
dies sind nur Beispieldateien. Mein richtiges Programm (als Anhalt, das VI ist ca. 2 MB groß.), darf ich nicht rausgeben. Das Beipsiel sollte nur den groben Aufbau widerspiegeln, den ich benutzt habe. Von den Prüfschleifen (inputschleifen) habe ich mehr als nur 2 Stück, sie sind, sowie die Hauptschleife, viel größer.
In meinen Programm habe ich jeder While-Schleife eine Wartezeit von einer Millisekunde eingebaut, um die Probleme mit der Prozessorlast zu vermeiden.
Die Prüfschleifen (inputschleifen) dienen auch zur Messung.
An dem Aufbau kann wie gesagt nichts mehr geändert werden, da:
1) ich keine Zeit mehr dafür habe,
2) mein Betreuer das so abgesegnet hat -Eventstrukturen wollte er gar nicht haben-.
Ich bräuchte eigentlich nur noch eine Tipp, wie ich von einer While-Schleife in die andere ohne Varibalen Werte übergeben kann. Eine Möglichkeit wurde schon genannt: Eigenschaftsknoten (Proberty Nodes).
Aber ich weiß überhaupt nicht, ob die Ressorcenschonender sind, und welche Möglichkeiten sich noch anbieten.
Wenn denn alles so sein muss wie beschrieben, sind lokale Variablen wohl der einfachste und schnellste Weg, Daten von Schleife zu Schleife innerhalb enes VI zu transferieren.
Bleibt also Dein ursprüngliches Problem, aus den vielen die richtigen auszuwählen. Da weiß ich leider auch keinen einfachen Weg. Da musst Du dann wohl durch...
(NB: falls Dein Betreuer Gründe für die meiner Meinung nach unsinnigen Einschränkungen genannt hat, würden die mich interessieren, evtl. per private message)