28.02.2010, 19:58
Beitrag #1
|
taylor
LVF-Neueinsteiger
Beiträge: 5
Registriert seit: Jan 2010
8.6.1
-
de
57627
Deutschland
|
Array von bestimmter Stelle an lesen
Hi Leute,
ich bin immer noch Neuling, sowohl hier im Forum als auch in Bezug auf LabVIEW. Im Moment arbeite ich an einem Programm für eine Prüfung. Dabei geht es darum, vier Messwerte zu erfassen und grafisch darzustellen. Soweit auch mittlerweile kein großes Problem mehr. Allerdings hat das Programm noch zwei "Schönheitsfehler":
- Die aufgenommenen Messwerte werden in eine TDMS-Datei geschrieben. Mit einem zweiten, anderen VI kann diese später ausgelesen und die Daten wieder grafisch aufbereitet werden. Im Prinzip nehme ich Messwerte von vier Sensoren auf und füge diesem Array vor dem Datei Schreiben eine weitere, fünfte Spalte mit einer Relativzeit hinzu (beginnt beim Start der Messung ab 00:00 = HH:MM zu laufen). Ich möchte jetzt die Möglichkeit schaffen, beim Auslesen der Messdaten durch eine Tastatureingabe "Zeit" an die entsprechende Stelle der fünften Spalte des Arrays zu springen und dann alle darauf folgenden Messwerte (aus den vier anderen Spalten) auszulesen, damit der Benutzer nicht nach einer langen Aufzeichnung "ewig" vor seinem PC sitzen muss. Welche Möglichkeit(en) gibt es da?
- Da ich den DAQmx-Task, der die Daten von vier AI der USB-6008 einliest, mit 1/4Hz Samplerate betreibe (es geht um die Aufnahme von wenig dynamischen Temperaturen über eine Zeit von bis zu 48h), wird auch die While-Schleife, in der sich dieser Task befindet, nur alle 4s durchlaufen. An sich nicht besonders tragisch, aber es ist sehr unschön wenn man im Frontpanel auf einen Button klickt und erst einige Sekunden später eine Reaktion sieht. Gibt es die Möglichkeit, zwei Schleifen zu synchronisieren und Daten (in dem Fall ja ein 2D-Array mit fünf Spalten) von der einen in die andere zu übertragen? Habe die Synchronisations-Palette bereits "durchforstet", aber es mit keiner der dort gebotenen Möglichkeiten hinbekommen. Das liegt aber vermutlich an meiner eigenen Unwissenheit...
Sowohl das Suchen im Forum als auch in der LV-Hilfe haben mich nicht weitergebracht...
Im Anhang findet Ihr Screenshots der jeweiligen Blockdiagramme (Schreiben / Lesen). Wenn Bedarf besteht, lade ich gerne die VIs hoch. Ich danke Euch für schnelle Antworten!
MfG
taylor
|
|
|
01.03.2010, 10:59
Beitrag #2
|
M Nussbaumer
Zarathustra
Beiträge: 654
Registriert seit: Sep 2009
2009 SP1
2009
EN
6300
Schweiz
|
Array von bestimmter Stelle an lesen
' schrieb:- Die aufgenommenen Messwerte werden in eine TDMS-Datei geschrieben. Mit einem zweiten, anderen VI kann diese später ausgelesen und die Daten wieder grafisch aufbereitet werden. Im Prinzip nehme ich Messwerte von vier Sensoren auf und füge diesem Array vor dem Datei Schreiben eine weitere, fünfte Spalte mit einer Relativzeit hinzu (beginnt beim Start der Messung ab 00:00 = HH:MM zu laufen). Ich möchte jetzt die Möglichkeit schaffen, beim Auslesen der Messdaten durch eine Tastatureingabe "Zeit" an die entsprechende Stelle der fünften Spalte des Arrays zu springen und dann alle darauf folgenden Messwerte (aus den vier anderen Spalten) auszulesen, damit der Benutzer nicht nach einer langen Aufzeichnung "ewig" vor seinem PC sitzen muss. Welche Möglichkeit(en) gibt es da?
Sehe ich das richtig, du willst in dem Array quasi zur Stelle scrollen an der dein eingegebener Zeitwert steht?
Wenn ja, dann vergleich doch deine 5.Spalte mit deinem Eingabewert, den Index den du findest kannst dann mit einer Porperty-Node des Arrays zum scrollen bringen.
Hier das Beispiel, wie ich es machen würde:
LabVIEW 8.5
ArrayScrollen.vi (Größe: 12,13 KB / Downloads: 309)
' schrieb:- Da ich den DAQmx-Task, der die Daten von vier AI der USB-6008 einliest, mit 1/4Hz Samplerate betreibe (es geht um die Aufnahme von wenig dynamischen Temperaturen über eine Zeit von bis zu 48h), wird auch die While-Schleife, in der sich dieser Task befindet, nur alle 4s durchlaufen. An sich nicht besonders tragisch, aber es ist sehr unschön wenn man im Frontpanel auf einen Button klickt und erst einige Sekunden später eine Reaktion sieht. Gibt es die Möglichkeit, zwei Schleifen zu synchronisieren und Daten (in dem Fall ja ein 2D-Array mit fünf Spalten) von der einen in die andere zu übertragen? Habe die Synchronisations-Palette bereits "durchforstet", aber es mit keiner der dort gebotenen Möglichkeiten hinbekommen. Das liegt aber vermutlich an meiner eigenen Unwissenheit...
Hier würde ich dir das Producer-Consumer-Pattern von LabVIEW empfehlen, sprich Queues auf der Synchronisations-Palette.
Solltest du noch Fragen haben, so kannst du sie gerne stellen
|
|
|
02.03.2010, 20:22
Beitrag #3
|
taylor
LVF-Neueinsteiger
Beiträge: 5
Registriert seit: Jan 2010
8.6.1
-
de
57627
Deutschland
|
Array von bestimmter Stelle an lesen
Hallo,
erstmal vielen Dank für die schnelle Antwort!
Ich wünschte ich könnte jetzt sagen, dass es mir weitergeholfen hat. Vermutlich stehe ich auch nur auf dem Schlauch. Wenn ich versuche, die Funktion so wie in obigem Beispiel gezeigt zu realisieren, erhalte ich durch die Funktion "Array initialisieren" einen Fehler an der For-Schleife ("N ist nicht verbunden und es existieren keine indizierten Eingänge"). Mir ist aufgefallen, dass sich "Array initialisieren" nicht, wie im Beispiel, in Spalten und Zeilen unterteilen lässt indem ich einfach den ersten Indexeingang offen lasse und am zweiten die Spaltennummer eintrage, sondern dass statt dessen an beiden Eingängen das schwarz ausgefüllte Rechteck abgebildet ist, was meines Wissens heißt, dass der Anschluss aktiviert ist und somit hier dann wohl Spalte 0 ausgelesen würde.
Ich kann mir nicht erklären, warum das so ist und deshalb stellt sich mir folgende Frage: Lag ich überhaupt richtig, als ich schrieb, dass es sich um ein 2D-Array mit fünf Spalten handelt?! Das hängt ja sicher davon ab, wie die Express-VIs "Messwerte in Datei schreiben" bzw. "Messwerte aus Datei lesen" die TDMS-Datei anlegen, oder? Und davon, wie das Array aussieht, welches vom DAQmx-Task kommt.
Des weiteren frage ich mich, wie ich einen Eigenschaftsknoten für das Array erzeugen kann, denn es erscheint ja nicht als Anzeige- oder Bedienelement in meinem Frontpanel, sondern wird lediglich von o.g. Express-VIs erzeugt. Fragen über Fragen... deshalb finden sich im Anhang beide VIs (Messwerte schreiben und Messwerte lesen) und eine der betreffenden TDMS-Dateien. Das alles wurde mit LV 8.6.1 erzeugt.
Ich hoffe, jemand kann damit diese Fragen klären, denn ich weiß wirklich nicht weiter.
Vielen Dank!
taylor
Lesen.vi (Größe: 5,18 MB / Downloads: 384)
Livemessung.vi (Größe: 5,23 MB / Downloads: 319)
Test_TG_4.rar (Größe: 3,58 KB / Downloads: 224)
|
|
|
02.03.2010, 21:21
Beitrag #4
|
GerdW
______________
Beiträge: 17.467
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
Array von bestimmter Stelle an lesen
Hallo Taylor,
dein VI ist ein klassisches Beispiel dafür, warum man von ExpressVIs eher Abstand nehmen sollte...
Du hängst hier 2 VIs von jeweils >5MB Größe an. Wenn ich eines davon on LV2009 lade und wieder abspeichere, werden sogar >13MB draus. Und das alles für eine Funktionalität, die man glatt mit ca. 100kB VI-Größe erzeugen könnte.
ArrayInit liest keine Werte aus, sondern erzeugt ein Array. Deshalb musst du (natürlich) für jede Dimension eine Größe angeben, auch wenn diese Null sein kann...
|
|
|
04.03.2010, 08:45
Beitrag #5
|
M Nussbaumer
Zarathustra
Beiträge: 654
Registriert seit: Sep 2009
2009 SP1
2009
EN
6300
Schweiz
|
Array von bestimmter Stelle an lesen
' schrieb:Ich wünschte ich könnte jetzt sagen, dass es mir weitergeholfen hat. Vermutlich stehe ich auch nur auf dem Schlauch. Wenn ich versuche, die Funktion so wie in obigem Beispiel gezeigt zu realisieren, erhalte ich durch die Funktion "Array initialisieren" einen Fehler an der For-Schleife ("N ist nicht verbunden und es existieren keine indizierten Eingänge"). Mir ist aufgefallen, dass sich "Array initialisieren" nicht, wie im Beispiel, in Spalten und Zeilen unterteilen lässt indem ich einfach den ersten Indexeingang offen lasse und am zweiten die Spaltennummer eintrage, sondern dass statt dessen an beiden Eingängen das schwarz ausgefüllte Rechteck abgebildet ist, was meines Wissens heißt, dass der Anschluss aktiviert ist und somit hier dann wohl Spalte 0 ausgelesen würde.
Im Beispiel wurde auch nicht die Funktion "Array initialisieren" sondern "Index Array" (Sorry verwende LabVIEW auf Englisch) verwendet. Dies damit die 5. Spalte ausgelesen werden kann
' schrieb:Des weiteren frage ich mich, wie ich einen Eigenschaftsknoten für das Array erzeugen kann, denn es erscheint ja nicht als Anzeige- oder Bedienelement in meinem Frontpanel, sondern wird lediglich von o.g. Express-VIs erzeugt. Fragen über Fragen... deshalb finden sich im Anhang beide VIs (Messwerte schreiben und Messwerte lesen) und eine der betreffenden TDMS-Dateien.
Wie gibst du denn dein Array aus? Per Express-VI geht das mit den Eigenschaftsknoten nicht, du musst also zumindest dieses Express-VI durch ein Frontpanel-Array ersetzen.
' schrieb:Ich kann mir nicht erklären, warum das so ist und deshalb stellt sich mir folgende Frage: Lag ich überhaupt richtig, als ich schrieb, dass es sich um ein 2D-Array mit fünf Spalten handelt?! Das hängt ja sicher davon ab, wie die Express-VIs "Messwerte in Datei schreiben" bzw. "Messwerte aus Datei lesen" die TDMS-Datei anlegen, oder? Und davon, wie das Array aussieht, welches vom DAQmx-Task kommt.
Sehe mir gerne dein Problem an, wenn du es für mich auf LabVIEW 8.5 runterspeichern könntest.
Allgemein:
Ich verwende kaum Express VIs da man, wie du gerade selber merkst, diese nicht gut erweitern kann.
Zudem verschlechtert sich die Lesbarkeit des Codes meiner Meinung nach, da man nie auf den ersten Blick die Konfiguration des Express VIs sehen kann.
Und natürlich auch noch aus den selben Gründe wie GerdW
|
|
|
| |