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 

Grundlegendes Verständnis von LV



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!

08.06.2007, 06:58 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2007 14:32 von jg.)
Beitrag #1

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Grundlegendes Verständnis von LV
Hallo,

trotz 3 Jahre LV habe ich noch immer einige (mir bekannte :-) Verständnisprobleme:

1.) Fehler in Schleifen - ich finde beides auch in NI-Examples: Fehler einfach durchgeschliffen (Error-1) oder mit einemShiftRegister.(error-2) Meiner Ansicht schleife ich einen eventuellen Fehler mit dem Shift-Register wieder in die Schleife hinein, kann also damit auf Vorfehler reagieren. Beim einfachen Durchschleifen passiert das nicht. Stimmt das?

2.) dasselbe mit einer refnum - meines erachtens hat hier ein ShiftRegister keinen Sinn - Stimmt das?

3.) ganz was anderes: ich dachte immer ich könne Alles in einem Indicator enden lassen und mit einer lokalen Variablen darauf, den Wert an anderer Stelle im Blockdiagramm abfragen. Zu meiner Überraschung geht das mit einer Session Line nicht. Mache ich etwas falsch oder verstehe ich da etwas nicht.

Danke

Gottfried

(VI LV 8.2)


Angehängte Datei(en) Thumbnail(s)
       

Sonstige .vi  GrabTest.vi (Größe: 75,45 KB / Downloads: 145)

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
08.06.2007, 08:19
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Grundlegendes Verständnis von LV
' schrieb:1.) Fehler in Schleifen - ich finde beides auch in NI-Examples: Fehler einfach durchgeschliffen (Error-1) oder mit einemShiftRegister.(error-2) Meiner Ansicht schleife ich einen eventuellen Fehler mit dem Shift-Register wieder in die Schleife hinein, kann also damit auf Vorfehler reagieren. Beim einfachen Durchschleifen passiert das nicht. Stimmt das?
Genau richtig!

' schrieb:2.) dasselbe mit einer refnum - meines erachtens hat hier ein ShiftRegister keinen Sinn - Stimmt das?
In der Regel wohl egal.

' schrieb:3.) ganz was anderes: ich dachte immer ich könne Alles in einem Indicator enden lassen und mit einer lokalen Variablen darauf, den Wert an anderer Stelle im Blockdiagramm abfragen. Zu meiner Überraschung geht das mit einer Session Line nicht. Mache ich etwas falsch oder verstehe ich da etwas nicht.
Vorsicht mit solchen Konstrukten. Da besteht immer die Gefahr von Race Conditions. Man muss sehr genau dafür sorgen, dass LabVIEW auch das macht, was man will. Ich gehe mal davon aus, dass du auf diesen Abschnitt in deinem Bsp. ansprichst:
   
Hier kann man auf Grund des BD überhaupt nicht vorhersagen, wann in die Variable "IMAQ1394 Session Out" geschrieben wird und dann aus der entsprechenden lokalen Variablen gelesen wird. Gut möglich, dass der Eingang aus der lokalen Variablen schon am nächsten VI anliegt.

MfG, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.06.2007, 11:57
Beitrag #3

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Grundlegendes Verständnis von LV
Erstens Danke, zweitens "ich bin verblüfft" wenn 2 VIs über error serialisiert sind .... wieso race condition? Mit einem wait dazwischen sollte es gehen? Da schreibt niemand auf diese Variable..... Habe es probiert, geht auch mit 100ms wait nicht.


vielen Dank

Gottfried


Angehängte Datei(en) Thumbnail(s)
   

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.06.2007, 14:19
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Grundlegendes Verständnis von LV
Hallo, Gottfried,

ich halte deinen letzten Vorschlag immer noch für gefährlich. Du kannst immer noch nicht 100-prozentig vorhersagen, an welcher Stelle im Ablauf deines Programms die lokale Variable ausgelesen wird. Das passiert ja parallel, und könnte deshalb vom Compiler an einer anderen Stelle im Code eingesetzt werden. Du legst zwar durch den durchgeschleiften Error-Cluster die Reihenfolge von Stop- & Start-Aquistion fest, und klar wird in Variablen-Refnum "IMAQ1394 Session Out" erst nach Beendigung vom Stop-VI ein Wert übertragen, aber wann der Wert aus der lokalen Kopie ausgelesen wird, kannst du bei diesem Code nicht vorhersagen.

Bedenke, LabVIEW kann den Code in mehrere Threads zerlegen, die parallel ablaufen.

Einschub: Wieso machst du das überhaupt, verbinde doch einfach den Ausgang vom Stop-VI wieder mit dem Eingang vom nächsten Start-VI?

MfG, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.06.2007, 15:35 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2007 14:36 von jg.)
Beitrag #5

thomas.sandrisser Offline
LVF-SeniorMod


Beiträge: 1.298
Registriert seit: Sep 2005

xxxx
2005
EN

78759
United States
Grundlegendes Verständnis von LV
Das Schieberegister dient allgemein dazu, nicht nur beim Error Cluster, um den zuletzt gueltigen Wert nach außen zu uebergeben.
D.h., nachdem die Styleguides von NI besagen, dass man skalierbar und erweiterbar programmieren soll, ist es doch moeglich, eine While Schleife in eine For Schleife zu transferieren und die For-Schleife 0 mal durchlaufen zu lassen.

Eine While Schleife laeuft immer mindestens 1mal.

Probiers mal aus und leg einen Fehler and eine For-Schleife mit N=0 und ueberpruefe den Ausgang.
Danach fuege das ShiftRegister hinzu.

(VI LV 8.2)


Angehängte Datei(en)
Sonstige .vi  ShiftRegister.vi (Größe: 12,45 KB / Downloads: 140)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.06.2007, 09:51
Beitrag #6

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Grundlegendes Verständnis von LV
' schrieb:Das Schieberegister dient allgemein dazu, nicht nur beim Error Cluster, um den zuletzt gueltigen Wert nach außen zu uebergeben.
D.h., nachdem die Styleguides von NI besagen, dass man skalierbar und erweiterbar programmieren soll, ist es doch moeglich, eine While Schleife in eine For Schleife zu transferieren und die For-Schleife 0 mal durchlaufen zu lassen.

Eine While Schleife laeuft immer mindestens 1mal.

Probiers mal aus und leg einen Fehler and eine For-Schleife mit N=0 und ueberpruefe den Ausgang.
Danach fuege das ShiftRegister hinzu.
Das ist interessant & wichtig - Danke

Gottfried

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.06.2007, 09:53
Beitrag #7

gottfried Offline
LVF-Guru
*****


Beiträge: 1.735
Registriert seit: Mar 2007

2019
2004
EN

20**
Oesterreich
Grundlegendes Verständnis von LV
' schrieb:ich halte deinen letzten Vorschlag immer noch für gefährlich. Du kannst immer noch nicht 100-prozentig vorhersagen, an welcher Stelle im Ablauf deines Programms die lokale Variable ausgelesen wird. Das passiert ja parallel, und könnte deshalb vom Compiler an einer anderen Stelle im Code eingesetzt werden.

Hallo Jens,

schätze da ist ein Missverständnis - das Ding funktioniert auch mit dem Wait nicht. Ich weiss nicht wieso. (klar, das Beispiel ist blöd :-)

Danke

Gottfried

mein wöchentlicher (eigenwilliger) Beitrag zur Innovation
http://innovation1.wordpress.com/
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.06.2007, 10:38
Beitrag #8

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Grundlegendes Verständnis von LV
Hallo, Gottfried,

ich dachte, ich hätte mich inzwischen klar ausgedrückt. Mich wundert es nicht, dass du weiterhin Fehler hast.

Also nochmal: Klar wird zuerst dein Stop-VI ausgeführt und danach dein Start-VI. Das schreibst durch durch den weitergeführten Error-Cluster vor. Dies legt aber nicht fest, zu welchem Zeitpunkt aus deiner lokalen Variablen schon der Wert an den Eingang des Start-VI's gelegt wird. Es ist durchaus möglich und sogar wahrscheinlich, dass hier noch die Refnum angelegt wird, als die Kamera noch geöffnet wurde.

Hierzu vielleicht noch ein Bsp:
   

Sonstige .vi  Bsp_Local_LV8.2.vi (Größe: 9,53 KB / Downloads: 167)


Wenn ich dich (bisher) richtig verstehe, erwartest du bei obigem Code als Ergebnis in der Variable x+y eine 4, ich erhalte hier aber 2 als Ergebnis.

MfG, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.06.2007, 11:01 (Dieser Beitrag wurde zuletzt bearbeitet: 09.06.2007 11:16 von Lucki.)
Beitrag #9

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

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Grundlegendes Verständnis von LV
' schrieb:schätze da ist ein Missverständnis - das Ding funktioniert auch mit dem Wait nicht. Ich weiss nicht wieso. (klar, das Beispiel ist blöd :-)
Jens hat es schon gesagt, aber vielleicht ist es hilfreich dasselbe noch mal mit anderen Worten zu tun.
Hier noch mal dein Bild:
   
Die lokale Variable befindet sich in einer (nicht vollständig sichtbaren) While-Schliefe. Die lokale Variable wird, wie jedes andere Objekt in der Schleife auch, pro Schleifendurchlauf nur einmal ausgeführt (gelesen) . Die Lokale Variable ist nicht abhängig von anderen Daten. Man kann sogar davon ausgehen, daß sie gleich am Anfang, wenn das Programm in die Schleife eintritt, gelesen wird (wenn also im übrigen Funktionen ausgeführt werden, die in diesem Teilbild gar nicht sichtbar sind). Wenn dann viele später der Wert aktualisiert wird, wirkt sich das nicht mehr auf den bereits gelesenen Wert der lokalen Variablen aus.

Ich habe früher ähnliche Irrtümer durchgemacht, indem ich geglaubt habe, die lokale Variable sei irgendwie in der Weise datenabhängig, daß sie erst gelesen werden kann, wenn das zugehörige Hauptelement mit einem sinnvollen Wert beschrieben worden ist. Das ist aber gar nicht der Fall, der l.V. kann immer gelesen werden, ganz egal ob da ein undefinierter Zufallswert drinsteht oder nicht.

Änderung z.B.: Die lokale Variable in eine Sequenz einschießen, und hier den Fehlerstrang vor dem betreffenden VI, welches die lokale Variable benutzt, hindurchgehen lassen. Oder dieses VI zusammen mit der lokalen Variablen in eine Sequenz einschließen.

Ergänzung:
Reihenfolge der Ausführung: Theoretisch richtig ist zwar, daß man bei Datenunabhängikeit einzelner Tasks nicht wissen kann, was als erstes ausgeführt wird. Es gibt aber Erfahrungen, und die besagen: Die einfachen Dinge, wie Lesen von (lokalen) Variablen, werden (soweit datenunabhängig) immer zuerst ausgeführt, erst dann kommen die Sub-Vis oder Funktionen dran. Nach diesen Erfahrungen ist es sogar totsicher, daß Dein VI nicht wie gewünscht funktionieren kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.06.2007, 13:07
Beitrag #10

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Grundlegendes Verständnis von LV
' schrieb:[...] Die lokale Variable wird, wie jedes andere Objekt in der Schleife auch, pro Schleifendurchlauf nur einmal ausgeführt (gelesen) . Die Lokale Variable ist nicht abhängig von anderen Daten. Man kann sogar davon ausgehen, daß sie gleich am Anfang, wenn das Programm in die Schleife eintritt, gelesen wird (wenn also im übrigen Funktionen ausgeführt werden, die in diesem Teilbild gar nicht sichtbar sind). Wenn dann viele später der Wert aktualisiert wird, wirkt sich das nicht mehr auf den bereits gelesenen Wert der lokalen Variablen aus.

das ist so absolut richtig! genau das sollte/wird passieren!

nochmal zur Erinnerung: eine lokale Variable ist keine Variable sondern eine Funktion, die folgendes ausführt
READ: lies den aktuellen Wert des Controls XYZ und gib mir den Wert zurück
WRITE: schreibe den von mir bereitgestellten Wert in das Control XYZ und aktualisiere das Frontpanel!

man sollte lokale Variablen nur dann verwenden, wenn man Controls auslesen / aktualisieren möchte, z.B. ein Control auf einen bestimmten Wert initialisieren, oder einen Indicator (schnell und schnutzig) auf einen bestimmten Wert einstellen, wenn der Datenfluss "zu viel Arbeit" machen würde ... etc

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Dataflow Verständnis Beispiel 911tom 9 5.287 28.11.2017 07:54
Letzter Beitrag: GerdW
  Brauche Hilfe zum Verständnis von XControls Hasenfuss 0 2.368 19.02.2013 11:24
Letzter Beitrag: Hasenfuss
  Allgemeine Fragen zum besseren Verständnis xyzabc 14 10.334 13.09.2007 15:14
Letzter Beitrag: oenk

Gehe zu: