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!
nachdem meine erste Anwendung soweit gut funktioniert, hab ich noch ein paar allgemeine Fragen:
1. Könnte es problematisch werden (CPU-, Speicherauslastung usw.), wenn man sehr viele lokale Variablen und Eigenschaftsknoten in einem VI benutzt?
2. Sollte man (wenn sinnvoll) SubVIs erstellen? Kann es Probleme geben, wenn ein SubVI mehrmals gleichzeitig ausgeführt wird?
3. Ist es sinnvoll While-Schleifen durch eine 'Addition mit Case' zu ersetzen? (siehe *.jpg)
4. Kann es zu Fehlern kommen, wenn Daten sekündlich mit 'Write to spreadsheet' gespeichert werden und das VI abgebrochen wird? Könnte beispielsweise die Datei fehlerhaft werden.
Hatte noch mehr Fragen, aber die sind mir grad entfallen..
Danke schonmal.
Anzeige
30.08.2007, 10:00 (Dieser Beitrag wurde zuletzt bearbeitet: 30.08.2007 10:19 von Lucki.)
Wenigstens Antwort auf 2 Fragen:
zu 1.)
Problematisch bei lokalen Variablen ist vor allem, daß es zu unerwarteten Resultaten kommen kann, da das Auslesen/Beschreiben manchmal nicht zu dem Zeitpunkt erfolgt, in dem der Programmierer das erwartet hatte. Deshalb die einschlägigen Beispiele für solches Verhalten studieren und verinnerlichen!
Eigenschaftsknoten sind noch langsamer als lokale Variable. Deshalb die Eigenschaft "Wert" statt lokaler Variablen nur verwenden, wenn der Eigenschaftsknoten ohnehin wegen anderer Eigenschaften aufgerufen wurde.
Was man möglichst vermeiden soll:
a) Von einer komplexen Variablen, beispielweise einem Array mit 100000den von Bytes oder einem ebensolchem Cluster, bedenkenlos ein oder mehrere lokale Variable erstellen.
c) noch schlechter ist es, wenn eine solche lokale Variable in der zeitkritischen Hauptausführungsschlefe verwendet wird. Man sollte also z.B. die einmalige Initialisierung über eine lokale Variable vornehmen und das Element selber in der Hauptausführungsschleife verwenden und nicht umgekehrt.
Man vermeide auch die bedenkenlose Verwendung von Eigenschaftsknoten in der Hauptausführungschleife. Es ist schlecht, z.B die Eigenschaft "sichtbar:true" immer wieder auszuführen, wo doch ein einziger Ausruf vor dem Schleifendurchlauf genügt hätte.
Es gibt Techniken - Benutzung von shift-Registern in Verbindung mit State machines - um lokale Variable ganz zu vermeiden. Es gibt Puristen, die mit so einem Apparat loszuschlagen, nur um ein oder einige lokale Variable in einer nicht zeitkritischen Anwendung zu umgehen. Dazu kann man nur sagen, daß in den Beispielen von NI solche Aufstände nicht gemacht werden, und das es von NI oder in mir bekannten Tutorials auch keine Empfehlung zur generellen Vermeidung von lokalen Veriablen gibt.
zu 2)
Das ist immer dann der Fall, wenn das Sub-VI nicht initialisierte Schleifenregister zu Daten-Zwischenspeicherung enthält. Beispiel: in einem Point-to-Point Filter VI bleibt der momentane Status des Filters gespeichert. Wenn das Filter-VI für unterschiedliche Kanäle aufgerufen wird, geht es in die Hose. In diesen Fall muß das Sub-VI auf "reentrant" gesetzt werden.
Ansonsten bestehen die Bedenken nicht. Nach meinen Erfahrungen ist irgendwie dafür gesorgt, daß zwei verschiedene Instanzen desselben SUB-VI nie gleichzeitig abgearbeitet werden.
' schrieb:3. Ist es sinnvoll While-Schleifen durch eine 'Addition mit Case' zu ersetzen? (siehe *.jpg)
4. Kann es zu Fehlern kommen, wenn Daten sekündlich mit 'Write to spreadsheet' gespeichert werden und das VI abgebrochen wird? Könnte beispielsweise die Datei fehlerhaft werden.
1) ist gut beantwortet. Meine Regel ist dabei sehr strikt. Lokale Variablen (und globale noch viel mehr) nicht benützen ausser in ganz bestimmten Ausnahmefällen. Globale Variablen sind absolut Tabu ausser in schnellen Quick&Dirty Tests oder als einfacher Status etwa um global bestimmte Funktionen auszuschalten (etwa Hardware um in Simulationsmodus arbeiten zu können. Im Prinzip werden globale Variablen bei mir einmal beschrieben, vor dem Ausführen des Programms oder beim Starten und danach nie mehr.
Lokale Variablen sind da sinnvoll wo Du innerhalb einer Statemachine mehrmals Zugang zum Wert haben musst. Auch hier gilt aber normalerweise: einmal beschreiben zur Initialisation des Benützerinterfaces und danach eigentlich nur noch lesen.
Verwendung von globalen und lokalen Variablen um Drähte zu "sparen" ist für mich ABSOLUT tabu und Mitarbeiter hier halten sich besser ebenfalls and diese Regel
2) LabVIEW stellt sicher, dass ein VI nicht zweimal gleichzeitig aufgerufen werden kann und blockiert den Ablauf des zweiten Aufrufers bis der erste Aufruf beendet ist. Das ist nur bei reentranten VIs anders aber die behandelt LabVIEW wieder speziell indem lokale Daten (etwa Schieberegister) per Instanz im Speicher stehen und daher bei mehreren verschiedenen Aufrufern voneinander geschützt sind.
3) Begreife ich nicht, sind ja sicher nicht equivalent.
4) Wenn Du mit abbrechen den Stopbutton in der Toolbar meinst dann kann es tatächlich zu korrupten Files führen. Die korrekte Weise um ein Program zu beenden ist ein Benützerkontrol zur Terminierung des Programms in die Statemaschine aufzunehmen und dann die Applikation ordnungsgemäss verlassen.
Die Toolbar ist bei meinen LabVIEW Programmen eh nie sichtbar.
zu 3) Ich möchte in diesem Beispiel die Registerkarten alle 5 Sek. automatisch wechseln lassen. Das muss sein, da ich per Webserver ein Screenshot im Netzwerk verfügbar mache. Dort wird dann bei jedem aktualisieren die nächste Registerkarte angezeigt.
Kann ich dies vielleicht 'eleganter' lösen, als in meinem Beispiel 1? Beispiel 2 funktioniert nach dem gleichen Prinzip, nur mit dem großen Nachteil, dass ich das Programm nicht sofort stoppen kann (sondern erst nachdem die Schleife fertig durchgelaufen ist).
zu 4) Ich habe in einem Programm 2 parallele While-Schleifen. Die eine läuft mit einer Verzögerung von 1 Sek (zum Messen und Aufzeichnen von Daten) und die andere mit einer Verzögerung von 1 Std. (zum Erstellen einer neuen Datei, in die gespeichert wird). Wie kann ich denn dieses Programm sofort ordnungsgemäß beenden? Wenn ich die Schleifen per boolscher Bedingung beende, läuft doch die eine Schleife noch zu Ende, was mit max. einer Stunde zu lange dauert.
Hier hab ich mir überlegt die eine Schleife (1 Sek) über eine Bedingung zu beenden und die andere dann einfach abzubrechen (mit dem STOP-Button in der Funktionspalette). Könnte es hier zu Problemen kommen oder wie kann man das 'besser' lösen? Die 'wichtige' Schleife ist ja dann ordungsgemäß beendet worden..
Noch so ein Hinweis, die kleinen roten Punkte sind Wandlungspunkte von Datentypen. Jeder kleine rote Punkt sollte wenn möglich vermieden werden (jeweils den gleichen Datentyp verwenden)
Ich würde mich ja gerne mit Dir geistig duellieren, aber ich sehe Du bist unbewaffnet.
--------------------
Der Vorteil von Klugheit ist, dass man sich dumm stellen kann. Das Gegenteil ist schwieriger.
--------------------
Damit immer mehr immer weniger tun können, müssen immer weniger immer mehr tun.
Anzeige
04.09.2007, 12:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.09.2007 12:38 von Lucki.)
' schrieb:zu 3) Ich möchte in diesem Beispiel die Registerkarten alle 5 Sek. automatisch wechseln lassen. Das muss sein, da ich per Webserver ein Screenshot im Netzwerk verfügbar mache. Dort wird dann bei jedem aktualisieren die nächste Registerkarte angezeigt.
Kann ich dies vielleicht 'eleganter' lösen, als in meinem Beispiel 1? Beispiel 2 funktioniert nach dem gleichen Prinzip, nur mit dem großen Nachteil, dass ich das Programm nicht sofort stoppen kann (sondern erst nachdem die Schleife fertig durchgelaufen ist).
Habe mich nicht weiter darin vertieft, aber bei einem kurzen flüchtigen Blick auf Dein Bild fallen mir sofort 2 Punkte auf, die man verbessern könnte: [list]
[*]Statt der Eigenschaftknoten "Wert" besser lokale Variablen (und/oder Shiftregister) verwenden.<>
[*]Inkrementierung (nächster Tab) nicht mit Addition um 1, sondern mit der Funktion "+1", welches 2 Vorteile hat: (i) Vermeidung der Konvertierungspunkte; (ii) nach dem Letzen Tab und fängt es automatisch wieder beim ersten Tab an<>
[st]
' schrieb:Nochmal 2 Rückfragen, bzw. Erläuterungen:
zu 3) Ich möchte in diesem Beispiel die Registerkarten alle 5 Sek. automatisch wechseln lassen. Das muss sein, da ich per Webserver ein Screenshot im Netzwerk verfügbar mache. Dort wird dann bei jedem aktualisieren die nächste Registerkarte angezeigt.
Hi,
kleiner Tipp bzw. zusätzliche Information: Du kannst dein Frontpanel auch übers Web bedienen/bedienbar machen, d.h. ein Betrachter kann die Registerkarten auch selber umschalten...das wäre für diesen evtl. bequemer, weil er sich auch mal eine Ansicht länger betrachten kann weil nicht ständig automatisch weitergeschaltet wird. Damit könntest du dir im Programm auch das automatische umschalten sparen...
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)
05.09.2007, 09:21 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2007 21:03 von jg.)
@Achim: Hatte das Frontpanel auch schon über das Web gesteuert, aber dabei folgenden Fehler entdeckt/verursacht: Wenn der Client bereits die Steuerung übernommen hat und danach nochmals (aus Versehen, oder nicht) auf den Aktualisieren-Button des Browsers drückt, zeigt das VI auf dem Server eine Fehlermeldung an und 'hängt sich auf'. Per Client kann ich dann auch nicht mehr zugreifen.
Kennt dieses Problem noch jemand?
Da ich dies umgehen wollte und trotzdem alle Daten per Screenshot sichtbar machen wollte, hab ich mir diese wechselnden Registerkarten überlegt.
Im Anhang hab ich es auch nochmal als VI, denke das ist so in Ordnung oder?
Vielleicht kann mir auch nochmal jemand dies beantworten:
Zitat:zu 4) Ich habe in einem Programm 2 parallele While-Schleifen. Die eine läuft mit einer Verzögerung von 1 Sek (zum Messen und Aufzeichnen von Daten) und die andere mit einer Verzögerung von 1 Std. (zum Erstellen einer neuen Datei, in die gespeichert wird). Wie kann ich denn dieses Programm sofort ordnungsgemäß beenden? Wenn ich die Schleifen per boolscher Bedingung beende, läuft doch die eine Schleife noch zu Ende, was mit max. einer Stunde zu lange dauert.
Hier hab ich mir überlegt die eine Schleife (1 Sek) über eine Bedingung zu beenden und die andere dann einfach abzubrechen (mit dem STOP-Button in der Funktionspalette). Könnte es hier zu Problemen kommen oder wie kann man das 'besser' lösen? Die 'wichtige' Schleife ist ja dann ordungsgemäß beendet worden..
' schrieb:Vielleicht kann mir auch nochmal jemand dies beantworten:
Ganz einfach: Die Verzögerung für das Erstellung einer neue Datei sollte nicht 1 Std betragen, sondern 3600* 1sec. Ist zwar rechnerisch dasselbe, aber vielleicht kannst Du Dir denken wie es gemeint ist. Wenn nicht, schade, aber Du kannst ja noch mal fragen..