LabVIEWForum.de - Grundlegendes Verständnis von LV

LabVIEWForum.de

Normale Version: Grundlegendes Verständnis von LV
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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)
' 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:
[attachment=7023]
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
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
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
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)
' 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
' 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
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:
[attachment=7032]
[attachment=7033]

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
' 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:
[attachment=7034]
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.
' 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
Seiten: 1 2
Referenz-URLs