LabVIEWForum.de
Werte nacheinander in Tabelle schreiben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: Werte nacheinander in Tabelle schreiben (/Thread-Werte-nacheinander-in-Tabelle-schreiben)



Werte nacheinander in Tabelle schreiben - jh1988 - 05.12.2012 10:00

Hallo,

ich bin im Moment gerade dabei ein Programm zu schreiben, dass eine Datei einliest, einen exponentiellen Fit über einen bestimmten Bereich macht und das Ergebnis des Fits in eine Tabelle schreibt. Danach soll mit der nächsten Datei genau das selbe gemacht werden und das Ergebnis in die nächste Zeile der Tabelle geschrieben werden.
Einlesen und Fitten klappt auch, das Ergebnis in eine Tabelle schreiben leider nicht. Das Programm schreibt immer nur den Wert aus dem letzten Fit in die (richtige) Zeile der Tabelle. Die Werte davor werden leider alle wieder gelöscht. Wie kann ich das Löschen verhindern?
Das VI befindet sich im Anhang.

Ich benutze lv11_img


RE: Werte nacheinander in Tabelle schreiben - GerdW - 05.12.2012 10:13

Hallo jh,

die Antwort auf deine Frage heißt "Schieberegister"!
[attachment=42518]
(InsertIntoArray ist überbewertet. BuildArray tut es auch...)

Außerdem:
- Brauchst du wirklich dermaßen viele Splitarray-Funktionen? Wirklich?
- Du hast mehrere RaceConditions eingebaut, indem du statt Drähten lokale Variablen verwendest.
- Es ist keine überhaupt gute Idee, den Namen eines Controls zu löschen. Man sieht dies an deiner Event-Struktur, die ein Event namens " "":Wertänderung "anzeigt...
- Wozu überhaupt eine Eventstruktur? Der Dateidialog wartet doch so schon auf eine User-Bestätigung...
- Noch mehr RubeGoldberg: Wozu suchst du erst nach Maximalwerten, um dann eben diesen Maximalwert im Array zu suchen? Verwende doch gleich die Index-Ausgabe der Array-Min/Max-Funktion:
[attachment=42519](RaceCondition und Rube-Goldberg!)


RE: Werte nacheinander in Tabelle schreiben - jh1988 - 05.12.2012 10:38

Vielen Dank für deine Hilfe! Auf die Idee mit dem Schieberegister bin ich nicht gekommen, aber es funktioniert genau so wie ich das möchte!

zu deinen Anmerkungen:

- Die Splitarray-Funktionen benötige weil ich nur einen ganz bestimmten Bereich fitten möchte (nach dem 2. Maxima).
- Die lokalen Variablen habe ich alle gelöscht. Das mit den Drähten ist die eindeutig bessere Variante.
- Die Eventstruktur habe ich eingebaut damit ich einen Button habe, der mir ein Dateidialogfeld öffnet. Wenn ich diese Event-Struktur nicht habe, kann ich immer nur eine Datei einlesen und muss dann das ganze Programm stoppen und wieder starten. Da ich noch Anfänger bin, ist mir keine bessere Lösung eingefallen.


RE: Werte nacheinander in Tabelle schreiben - GerdW - 05.12.2012 10:41

Hallo jh,

Zitat:- Die Splitarray-Funktionen benötige weil ich nur einen ganz bestimmten Bereich fitten möchte (nach dem 2. Maxima).
Dann benutze doch die Funktion "Teil-Array". Einfach Index und Anzahl der gewünschten Werte angeben. Sieht definitiv besser aus als 2mal "Array umkehren" und 3mal "Array teilen"...

Zitat:damit ich einen Button habe, der mir ein Dateidialogfeld öffnet. Wenn ich diese Event-Struktur nicht habe, kann ich immer nur eine Datei einlesen
Die Dateidialog-Funktion wird doch mit oder ohne Eventstruktur aufgerufen. Du kannst also immer eine Datei auswählen...

Noch mehr RubeGoldberg:
Um einen Dateinamen zu bestimmen, kann man wie du den Pfad in ein Array of Strings umwandeln, den letzten Eintrag des Arrays per SplitArray abfragen (warum nicht per IndexArray?), und das Ergebnis per ArrayToSpreadsheetString in einen String umwandeln (warum nicht IndexArray?) (das ist ja schon ein RubeGoldberg in einem RubeGoldberg, also RubeGoldberg²!).
Man könnte aber auch einfach die Funktion StripPath ("Pfad zerlegen") verwenden...
Wall


RE: Werte nacheinander in Tabelle schreiben - jh1988 - 05.12.2012 12:04

Zitat: Die Dateidialog-Funktion wird doch mit oder ohne Eventstruktur aufgerufen. Du kannst also immer eine Datei auswählen...
Wenn ich aber keine Datei mehr einlesen möchte, kommt immer Fehler 43. Der macht zwar nichts, ist aber nervig und mit dem Button umgehe ich diesen Fehler.

Zitat:Man könnte aber auch einfach die Funktion StripPath ("Pfad zerlegen") verwenden...
Die Funktion StripPath kannte ich leider nicht, vereinfacht die Suche nach dem Dateinamen aber gewaltig. Danke für die Info!


RE: Werte nacheinander in Tabelle schreiben - GerdW - 05.12.2012 15:31

Hallo jh,

Zitat:Wenn ich aber keine Datei mehr einlesen möchte, kommt immer Fehler 43.
Genau: Fehler 43 = UserCancel.

Zitat:Der macht zwar nichts, ist aber nervig
Genau. Deswegen macht man eine Fehlerauswertung und nutzt eine Casestruktur...

Gegenfrage:
Warum nutzt du dann eine FOR-Loop, die 1000× durchlaufen soll? Wenn man die Anzahl der Schleifendurchläufe nicht kennt, nimmt man eine While-Loop mit Endebedingung...


RE: Werte nacheinander in Tabelle schreiben - jh1988 - 06.12.2012 15:19

Zitat: Genau. Deswegen macht man eine Fehlerauswertung und nutzt eine Casestruktur...
Die Fehlerbehandlung mit dem Express VI Dateidialog funktioniert auch, leider kommt aber dann immer noch der Fehler bei Read From Spreadsheet File. Um diesen Fehler zu umgehen, habe ich die Event-Struktur mit dem Button eingefügt. Wenn du eine Idee hast, wie ich die Fehlerbehandlung der Read From Spreadsheet File hinbekomme kannst du es mir gerne sagen. Ich habe es mal mit einer Case-Struktur versucht bei der der Dateidialog nicht geöffnet wird, wenn ein leerer String anliegt. Hat aber nicht so geklappt....

Zitat: Warum nutzt du dann eine FOR-Loop, die 1000× durchlaufen soll? Wenn man die Anzahl der Schleifendurchläufe nicht kennt, nimmt man eine While-Loop mit Endebedingung...
Die For-Schleife habe ich nur gewählt um mir keine Endbedingung zu überlegen ;-)


RE: Werte nacheinander in Tabelle schreiben - GerdW - 06.12.2012 15:31

Hallo fh,

Zitat:leider kommt aber dann immer noch der Fehler bei Read From Spreadsheet File
Eben deswegen nutze ich diese Funktion nicht (mehr)...
Das schöne an diesem VI ist aber, dass du dir anschauen kannst, wie es funktioniert! Es ist ziemlich simpel gestrickt: Textdatei lesen, Umwandeln mit SpreadsheetStringToArray. Kann man wunderbar selbst programmieren - und dann mit vernünftigem Fehlerhandling Smile
Oder: Lege dir eine Kopie dieses VIs (und seiner subVIs) an. Diese Kopie bearbeitest du dann so, dass auch ein Fehlerhandling enthalten ist (bzw. kein Dialog mehr gezeigt wird) und verwendest sie dann immer, wo du sie gebrauchen kannst. Aber daran denken: Kopie anlegen, da es sich hier um ein VI aus der vi.lib handelt!

Zitat:Die For-Schleife habe ich nur gewählt um mir keine Endbedingung zu überlegen
Wall Big Grin
Endebedingung = Fehler (z.B. 43 = UserCancel). Wenn doch alles so einfach wäre...