INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Allgemeine Fragen zum besseren Verständnis



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!

30.08.2007, 09:10
Beitrag #1

xyzabc Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Aug 2007

8.2.1
2007
kA


Deutschland
Allgemeine Fragen zum besseren Verständnis
Hallo,

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.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
30.08.2007, 10:00 (Dieser Beitrag wurde zuletzt bearbeitet: 30.08.2007 10:19 von Lucki.)
Beitrag #2

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Allgemeine Fragen zum besseren Verständnis
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.08.2007, 10:48
Beitrag #3

xyzabc Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Aug 2007

8.2.1
2007
kA


Deutschland
Allgemeine Fragen zum besseren Verständnis
Ok, danke Lucki!

Denke das hilft mir beim Optimieren meines VIs schon mal weiter. Vielleicht kann ja jemand noch ein paar kurze Sätze zu Frage 3 + 4 schreiben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.09.2007, 10:39 (Dieser Beitrag wurde zuletzt bearbeitet: 03.09.2007 10:41 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.304
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Allgemeine Fragen zum besseren Verständnis
' 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 RegelNo

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.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.09.2007, 09:33
Beitrag #5

xyzabc Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Aug 2007

8.2.1
2007
kA


Deutschland
Allgemeine Fragen zum besseren Verständnis
Danke Rolf.

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.
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..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.09.2007, 10:01
Beitrag #6

Benjamin Fuchs Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 86
Registriert seit: Aug 2007

8.20
2007
kA

90427
Deutschland
Allgemeine Fragen zum besseren Verständnis
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
04.09.2007, 12:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.09.2007 12:38 von Lucki.)
Beitrag #7

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Allgemeine Fragen zum besseren Verständnis
' 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]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.09.2007, 06:31
Beitrag #8

Achim Offline
*****
*****


Beiträge: 4.222
Registriert seit: Nov 2005

20xx
2000
EN

978xx
Deutschland
Allgemeine Fragen zum besseren Verständnis
' 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)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.09.2007, 09:21 (Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2007 21:03 von jg.)
Beitrag #9

xyzabc Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Aug 2007

8.2.1
2007
kA


Deutschland
Allgemeine Fragen zum besseren Verständnis
Danke Lucki, hab deine Tipps gleich umgesetzt.

@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..

Danke.

Gruß

(VI LV 8.2)


Angehängte Datei(en)
Sonstige .vi  Beispiel_Registerkarten_wechseln.vi (Größe: 16,62 KB / Downloads: 169)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.09.2007, 10:35
Beitrag #10

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Allgemeine Fragen zum besseren Verständnis
' 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..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Dataflow Verständnis Beispiel 911tom 9 5.441 28.11.2017 07:54
Letzter Beitrag: GerdW
  Brauche Hilfe zum Verständnis von XControls Hasenfuss 0 2.398 19.02.2013 11:24
Letzter Beitrag: Hasenfuss
  Fragen zu PID Regler belu003 3 5.981 18.08.2010 17:50
Letzter Beitrag: Lucki
  Newbie-Fragen zur GUI Tito 3 4.794 18.06.2010 10:45
Letzter Beitrag: GerdW
  Allgemeine Frage zu Wavelets/Kreuzkorrelation padbergus 0 3.602 12.04.2010 10:52
Letzter Beitrag: padbergus
  Allgemeine Frage bzgl. Auswertung gerydieschnecke 11 10.131 14.10.2009 08:16
Letzter Beitrag: IchSelbst

Gehe zu: