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!
Eventuell ist dies eine etwas lächerliche Frage, ich stelle sie trotzdem. Und benötige ich eine simple Zählvariable. Hierbei kann ich nicht auf den Index einer Schleife zurückgreifen sondern es bedarf eines Objektes in welches ich einen Inkremntalwert hineingebe, dieser soll auf den aktuellen Zählerstand aufsummiert werden und dieser Zählerstand soll nach Aufsummierung ausgeben werden.
Gibt es evtl. in LV schon ein Objekt dafür oder weiss jemand wie man dieses verwirklicht ?
Das kannst du mit ner globalen variablen machen, die man aber eigentlich besser nicht benutzen sollte. Also mach dir doch n subvi mit dem increment als eingang und dem zaehlerstand als ausgang.
Das Thema Variablen hatten wir heut morgen schon einmal.
i2dx hat recht. Man sollte versuchen, so weit wie möglich auf Variablen zu verzichten.
Ruffryder, wie sieht dein Programm denn ungefähr aus. Vielelicht gibt es auch eine andere Lösung, als mit Variablen zu arbeiten.
Also das Problem sieht im Detail folgendermaßen aus.
Ich lese Messwerte von einem Gerät ein (Read VI). Dabei verfügt das Gerät selbst über einen Speicher für eine gewisse Anzahl Werte. Beim Aufruf der besagten VI liefert mir das Gerät nicht nur den aktuellen Messwert sondern auch die Anzahl der bis diesem Zeitpunkt eingelesenen Werte. Da die PC Datenverarbeitung schneller läuft als die Messwerterfassung am Gerät muss ich erst warten bis ein Wert vorliegt. Ist dies der Fall so läuft eine Case-Struktur an, die die Werte ausgibt. Würde ich hier nicht so vorgehen würde ich ständig Lücken in meinem Messwertdiagramm erhalten. Allerdings soll noch die Anzahl der (auf dem PC) erfassten Werte gezählt werden. Hierzu wollte ich den von der Read VI ausgegebenen Wert (sollte meist nur 1 sein) aufsummieren. Die abgebildete Variante mit der While Schleife innerhalb der Case-Struktur funktioniert zwar, allerdings ist ja die Benutzung von Variablen nicht so gern gesehen. Daher würden mich andere, vor allem simplere Lösungen interessieren.
Richte in der Schleife ein Schieberegister ein. Außerhalb der Schleife setzt du das Register mit einer Konstante auf 0. Innerhalb der Schleife gehst Du von dem linken Anschluss des Registers auf einen Adierer und von dort auf die rechte Seite des Registers. Der zweite Anschluss des Addierers geht an den den Zählausgang deines SubVI's. An den Ausgang des Addierers schließt du ein Anzeigeelement. Fertig.
Sobald das Unterprogramm Werte an das Hauptprogramm übergibt wird deine Anzeige hochgezählt.
Ein Bild sagt mehr als tausend Worte, daher der Anhang.
RuffRyder schrieb:[...] allerdings ist ja die Benutzung von Variablen nicht so gern gesehen. Daher würden mich andere, vor allem simplere Lösungen interessieren.
nicht gern gesehen ist irgendwie falsch ausgedrückt, finde ich. Ich z.B. "wettere" immer gegen die Verwendung von lokalen Variablen, weil Sie eine Menge Probleme verursachen können wenn man sie falsch einsetzt (Stichwort: Race Condition,). Zudem bricht man mit lokalen Variablen das (LabVIEW zugrundeliegende) Prinzip der datenfluss-orientierten Programmierung, und daher sollte man sie nur einsetzen, wenn man 1. weiss was man tut, 2. sichergestellt hat, dass man keine race condition programmiert hat und 3. es deutlich einfacher ist eine lokale Variable zu verwenden als etwas nach dem Datenfluß-Prinzip zu programmieren.
Vielen Dank erstmal für die Tips. Allerdings bin ich beim rumprobieren auf die "Feedback Node" gestoßen. Die habe ich jetzt mal eingesetzt und die Sache funktioniert auch wunderbar. Allerdings gibt es jetzt das nächste Problem. Die Feedback node (wie auch das Schieberegister) merken sich den Wert vom vorherigen Programmdurchlauf. Dies kann ich überhaupt nicht gebrauchen. Auch das Initializer Terminal hilft da nicht weiter, da der Initialialisierungswert permanent an diesem Terminal anliegt, egal wo man die dazugehörige Konstante platziert. Ich suche also eine möglichkeit die Feedback node zu nullen und dabei nicht über "operate>initialize all to default" zu gehen. Eine programminterne Lösung wäre traumhaft.
hmm ... das, auf das du da gestoßen bist, ist mit DAS BESTE was man in LabVIEW ÜBERHAUPT programmieren kann ;-)
mit Shift-Registern, die IN DER SCHLEIFE initialisiert werden, erstellt man s.g. "Old-Style-Globals" die man im weiteren Sinne als Objekte betrachten kann. Feedback-Nodes und Shift-Register sind ja dazu da, dass in einer Schleife der Wert vom vorhergehenden Durchlauf "auf der linken Seite" wieder zur Verfügung steht. Wenn sich der Wert nicht ändern soll, dann schiebst du halt in der Schleife den Wert, der rauskam wieder rein. Man kann das über eine Case-Struktur realisieren, im False-Case z.B. wird der Wert einfach "durchgeschliffen", im True-Case kann sich was ändern, je nach Bedarf (siehe Beispiel "shiftreg.png").
Wenn der Wert des Shift-Registers bei jeden Aufruf des VIs neu "genullt" werden soll, dann initialisiert man ihn von aussen. (Siehe Bsp. 3)
Programmiere das Bsp 1+2 mal nach und setz es irgendwo als SubVI ein, du wirst sehen, das VI "merkt" sich seinen Zustand und zählt den Wert hoch, bis es neu initialisiert wird.
Ich verwende dieses Konstrukt immer um z.B. eine "Hardware-API" zu erstellen. In dem SoundCard Demo, das hier irgendwo im Forum rumfliegt (oder hier runtergeladen werden kann) wir dieses Prinzip (hoffentlich) deutlich: Das VI "merkt" sich alles, was mit der HW zu tun hat, und man spart sich jede menge "Verkabelung". Noch besser: die ganze Geschichte ist gleich gekapselt, dadurch wiederverwendbar, kann "StandAlone" getestet werden und man strukturiert seine Software :-)
Nach einigem probieren bin ich auch auf die variante mit der Case-Struktur gekommen. Als Bedingung verwende ich den Index des großen While-Loops. Steht dieser auf 0 (Anfang) wird die die Rückführung in einer Case-Struktur ausgekoppelt und eine 0 eingekoppelt.
Trotzdem nochmal vielen Dank für die Tips und die guten Diagramme.