Wie kann ich einfach von der oberen zur unteren Struktur gelangen?
Der umständliche Weg wäre so:
füge an die obere linke Struktur 2 leere Frames an und kopiere den Inhalt der beiden rechten Frames hinein
dabei werden aber Drähte unterbrochen und man muß umständlich neu verdrahten
LV8.6
[
attachment=17627]
Geht meines Wissens nach nicht.
Wobei: bei entsprechender Programmierung und entsprechender Erstellung von SubVIs kann man quasi immer auf eine Sequenzstruktur verzichten, dafür ist der Datenfluss da. Und wenn du was von Neuziehen von Verbindungen sagst, dann ist dies doch schon deine Abfolge...
Gruß, Jens
Anders wirst Du es aber nicht hinkriegen.....
Was hast Du denn mit der Sequenz vor? Wäre da nicht eine State Machine die bessere Lösung?
Und wenn Du eh schon am rumverschieben, kopieren,... bist, dann könntest Du das doch gleich umstellen.
Gruß Markus
' schrieb:Wie kann ich einfach von der oberen zur unteren Struktur gelangen?
So berechtigt die Einwände sind - und ich schließe mich hier der allgemenen Kritik voll an -, so kann man sich auch auf den Standpunkt stellen: Des Menschen Wille ist sein Himmelreich, also soll es so geschehen.
Und dann wäre die einfache Antwort auf die einfach Frage:
Entweder:
In Sequenzstruktur 1/2 boolsche Konstatne erstellen, diese herausführen und an Sequenzstruktur 3/4 anschließen - ohne dort die Durchführung innen zu benutzen. (Oder statt eine boolsche Konstante zu erstellen einen beliebigen Draht anzapfen, der gerade da ist.)
Oder:
Neuen Rahmen mit 2 Sequenzen a und b erstellen. In Sequenzrahmen a die Sequenzstruktur 1/2 hineinkopieren und in Sequenzrahmen b die Sequenzstruktur 3/4 (Man hat also dann 2 Sequenzstrukturen innerhalb einer Sequenzstruktur)
In beiden Fällen hätte man die Reihenfolge 1/2/3/4 erzwungen, ohne ganz neu zu verdrahten.
Wie ihr im Bild erkennen könnt, berechne ich einige Variablen, auf die ich später über Referenzen zugreife. Die Variablen sind teilweise voneinander abhängig, d.h. bestimmte Variablen ergeben sich aus früheren Variablen. Nun will ich lange Verdrahtungen, die zu einer Seqenzierung führem wegen der Unübersichtlichkeit vermeiden. Die Reihenfolge wird stattdessen durch Flat sequenzen erzwungen. Das eigentliche Problem ist, das ich festgestellt habe, dass Variablen berechnet werden, selbst wenn die dafür benötigten Eingangsvariablen (hier: Rerenzen von anderen Variablen) noch nicht berechnet wurden. LV nimmt dann einfach den Variablenwert, der im vorherigen Programmstart ermittelt wurde. Das sollte ja eigentlich nicht sein.
[
attachment=17629]
So auf eine schnellen Blick kannst du auf alle lokalen Variablen in deinem Screenshot verzichten! Einfach Verdrahtung weiterführen, und du brauchst:
1. keine Sequenzstuktur.
2. keine lokalen Variablen (Performance!)
3. Hast keine Probleme mit den von dir angesprochenen Race Conditions.
Weitere Hinweise zu deinem Screenshot:
1. BD ist eindeutig zu groß, 5600 Pixel Breite, was soll das...
2. Ein Tip zur besseren Übersichtlichkeit: Mach doch mal aus deinen vielen Rechenschritten in den einzelnen Sequenzrahmen ein paar SubVIs. Auch dann brauchst du die Sequenzstruktur nicht und kannst durch entsprechende Datenflussverdrahtung die von dir festgestellten (und auch so programmierten) Race-Condition abstellen.
Gruß, JEns
' schrieb:Nun will ich lange Verdrahtungen, die zu einer Seqenzierung führem wegen der Unübersichtlichkeit vermeiden. Die Reihenfolge wird stattdessen durch Flat sequenzen erzwungen.
Ich würde trotz ersterem letzteres trotzdem nicht machen. In deinem Falle würde ich alle Variablen zu einem Cluster zusammenfassen und den als Sequenzierung nehmen.
Zitat:Das eigentliche Problem ist, das ich festgestellt habe, dass Variablen berechnet werden, selbst wenn die dafür benötigten Eingangsvariablen (hier: Rerenzen von anderen Variablen) noch nicht berechnet wurden.
Sollte ich dieses Verhalten aus dem geposteten Bild herauslesen können?
Hier der Kern meines Problems. Wenn ich bei a einen Wert eingebe und das Prg starte, dann wird bei Indikator b der Wert a ausgegeben und erst beim zweiten Programmstart auch bei Indikator c, d.h. c gibt den Wert von a aus dem vorletzten Programmstart aus. Ich hätte erwartet, dass erst die Abhängigkeiten abgearbeitet werden, bis c definiert ist. Stattdessen wird für Indikator c der Wert aus dem Speicher benutzt. Kann man denn nicht erzwingen, dass der Speicher abgeschaltet wird und erst dann eine Referenz benutzt wird, wenn sie klar definiert wurde?
[
attachment=17635]
' schrieb:Wenn ich bei a einen Wert eingebe und das Prg starte, dann wird bei Indikator b der Wert a ausgegeben und erst beim zweiten Programmstart auch bei Indikator c, d.h. c gibt den Wert von a aus dem vorletzten Programmstart aus.
Das ist genau das, was du als Bild gepostet hast.
Zitat:Ich hätte erwartet, dass erst die Abhängigkeiten abgearbeitet werden, bis c definiert ist. Stattdessen wird für Indikator c der Wert aus dem Speicher benutzt.
Deine Erwartungen mögen zwar deiner Applikation entsprechen - aber du hast hier mit LV ein datenflußgesteuertes Datenmodell. Alles was nicht per Datenfluß (also per Draht) verbunden (also sequenziert ist) ist, wird parallel abgearbeitet. Was da parallel abgearbeitet wird, ist dem Programm egal. Ob da deine Logik mit den Variablen durcheinander kommt, steht auf einem anderen Blatt.
Zitat:Kann man denn nicht erzwingen, dass der Speicher abgeschaltet wird und erst dann eine Referenz benutzt wird, wenn sie klar definiert wurde.
Nein. So wie du das sagt, geht das nicht. Die lokale Variable an sich ist keine Referenz. Die hat einen eigenen (Zwischen-)Speicher. Auch wäre sowas nicht im Sinne von LV resepktive dem Datenfluß.
Machs doch einfach so, wie es sich gehört: Nimm statt der lokalen Variablen einen Datenfluß (ob per Draht oder Sequenzstruktur sei vorerst nochmals zurückgestellt).
Warum willst du keinen Datenfluß machen?
Nachtrag:
Die Sache mit dem Datenfluß muss dir in Fleisch und Blut übergehen. Ohne geht zwar, mit wird aber besser.
Na und, das ist das ganz normale Verhalten in LV, wenn du nicht durch Datenfluss eine Abarbeitungsfolge erzwingst. Nur das Platzieren von links nach rechts sagt dir noch lange nicht, wie intern wirklich die Abfolge sein wird. Merke: LV ist keine textbasierte Programmiersprache, bei die Reihenfolge der Abarbeitung durch die Zeilennummer gegeben ist. Im Gegenteil, LV ist multithreading-fähig und versucht, Sourcecode der parallel laufen kann, auch parallel abzuarbeiten.
Die Lösung für dein Problem sieht übrigens extrem einfach aus: keine lokale Variablen und Datenfluss ausnutzen:
[
attachment=17636]
Gruß, Jens