08.05.2010, 11:14
Beitrag #1
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Formulardaten speichern und wiederherstellen
Hallo,
gibt es eine komfortable Möglichkeit, Benutzereingaben (z.B. numerische Eingabefelder) auf Knopfdruck in einer Datei zu speichern und später wiederherzustellen?
Ich dachte an ein SubVI zum Schreiben, dem ich ein Array mit den Feldnamen übergebe. Aber da weiß ich nicht, ob sich das umsetzen lässt.
Ich habe es mit Referenzen versucht, doch das war wohl der falsche Ansatz.
Natürlich könnte ich es manuell über eine Konfigurationsdatei machen, aber das ist sehr umständlich und ein Hinzufügen neuer Felder aufwändig.
Schön wäre es, wenn ich sagen kann, dass dem SubVI z.B. der Feldname und der Dateipfad übergeben wird und beides landet in der Datei. Beim Auslesen wird der Ausgang des Lesen-SubVIs mit dem Ausgabefeld verbunden o.ä.
Geht das irgendwie sauber?
Grüße
|
|
|
09.05.2010, 09:29
Beitrag #2
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Formulardaten speichern und wiederherstellen
' schrieb:gibt es eine komfortable Möglichkeit, Benutzereingaben (z.B. numerische Eingabefelder) auf Knopfdruck in einer Datei zu speichern und später wiederherzustellen?
Da ich ja immer nach meinem "Klassenkonzept" vorgehe, sieht das bei mir so aus:
Alle Eingabedaten (entspricht Bedienelement am FP) liegen in einem (strict typdef) Cluster. Die Daten selbst liegen in einem Schieberegister einer FGV. Über einen entsprechenden Enumerator-Wert speichert (oder liest) die FGV diesen CLuster nun in ein INI-File. Es gibt pro Variable im Cluster ein INI-Rd/Wr-Element. Dieses "einfache" Verfahren hat den Vorteil, dass auch komplexte Cluster-Strukturen (Cluster of (Cluster, Array, Value, Cluster of (..), ..) einfach handhabbar sind.
Es gibt aber auch folgende Möglichkeit:
Als Schlüssel kann man den Variablennamen verwerden. Den bekommt man über das entsprechend Property. Genau so wie die ClassID, die man braucht um das entsprechende INI-Rd/Wr-Element - String, Bool, Int, Dbl - zu selektieren. Hat man einen flachen Cluster (Cluster of Values), ist dieses Verfahren sehr einfach und passt sich neuen Elementen im Cluster von selbst an.
Es soll auch Möglichkeiten geben, den Cluster direkt in ein XML-File zu schreiben (hab ich hier im Forum mitgekriegt, musst du halt mal suchen). Dann gehen selbst komplexe Cluster. Ich selbst verwende aber lieber INI-File, die kann man mit Standardmitteln leicht manuell ändern.
Zitat:Ich dachte an ein SubVI zum Schreiben, dem ich ein Array mit den Feldnamen übergebe. Aber da weiß ich nicht, ob sich das umsetzen lässt.
Das lässt sich umsetzen - ist aber extrem aufwändig.
Zitat:Natürlich könnte ich es manuell über eine Konfigurationsdatei machen, aber das ist sehr umständlich und ein Hinzufügen neuer Felder aufwändig.
Ich halte das nicht für aufwändig.
Was hälst du denn von meinem Vorschlag mit dem Lesen/Speichern über eine FGV?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
09.05.2010, 09:52
Beitrag #3
|
|
|
09.05.2010, 10:25
Beitrag #4
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Formulardaten speichern und wiederherstellen
Hallo,
danke für die Antworten.
Es ist so, dass alles möglichst modular sein soll. D.h. ein Hinzufügen/Entfernen neuer Eingabefelder soll mit geringem Aufwand möglich sein. Und Cluster gefallen mit im Frontpanel optisch nicht. Da habe ich im Forum einige Lösungen gefunden. Die einfachste ist die mit einer Binärdatei.
Ich dachte nun an folgendes:
Ich schreibe ein SubVI, das ein "Array of Reference" übergeben bekommt. Daraus bekomme ich dann Wert etc. der Elemente. Nur wäre es schön, wenn ich die Reference/ClassID (oder was erforderlich ist) mit speichern könnte, so dass beim Auslesen automatisch eine Zuordnung zu den Elementen erfolgen kann. Geht sowas?
|
|
|
09.05.2010, 11:02
Beitrag #5
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Formulardaten speichern und wiederherstellen
' schrieb:Ich schreibe ein SubVI, das ein "Array of Reference" übergeben bekommt. Daraus bekomme ich dann Wert etc. der Elemente. Nur wäre es schön, wenn ich die Reference/ClassID (oder was erforderlich ist) mit speichern könnte, so dass beim Auslesen automatisch eine Zuordnung zu den Elementen erfolgen kann. Geht sowas?
Nein. Das geht auch in einer strukturierten Sprache nicht.
Eine Reference zu speichern ist sinnlos, weil die bei jedem Programmneustart einen anderen Wert bekommen kann. Referenzen sind ja meistens nur Pointer - und da zu spekulieren, dass die ewig gleich sind, ist gewagt.
Du brauchst die Referenz auch gar nicht. Verwende einfach den Variablennamen als Schlüssel. Beim Schreiben der Datendatei liest du über die Referenz den Variablennamen aus. Beim Lesen liest du alle Schlüssel eines Segments. Jetzt durchläufst du pro Schlüssel das Referenz-Array und suchst für jeden Schlüssel die entsprechende Referenz. Sollte auch für XML möglich sein.
Ich will noch auf folgendes hinweisen:
Bei der Auswahl des Speicherformates - INI, XML, Binär etc. - sollte darauf geachtet werden, dass bestehende Files auch dann noch gelesen werden können, wenn sich der Datensatzaufbau ändert. Änderungen können sein: Erweiterung um Datenwerte, Zwischenreinschieben von Datenwerten, Typänderung von Datenwerten.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
09.05.2010, 11:47
Beitrag #6
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Formulardaten speichern und wiederherstellen
Hallo,
stimmt, wenn Referencen Pointer sind, ist es natürlich Unsinn, diese zu speichern.
Was meinst du mit Variablenname? Ist jedem Eingabefeld ein eindeutiger Name zugeordnet, auf den ich zugreifen kann?
Denn das wäre das, was ich wissen müsste. Wie ich die Zuordnung über diesen Namen herstellen kann.
Notfsalls könnte ich auch den Label-Text nehmen, nur wie ich dann bsp. den Dateiinhalt "Frequenz=500" dem numerischen Eingabefeld "Frequenz" zuordnen kann, ist mir noch nicht klar.
|
|
|
09.05.2010, 13:33
(Dieser Beitrag wurde zuletzt bearbeitet: 09.05.2010 21:23 von Lucki.)
Beitrag #7
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Formulardaten speichern und wiederherstellen
Habe mir mal ein alternatives Konzept überlegt. Das Speichern/Lesen wird in einem SubVI erledigt.
Funktionsweise, vom Haupt-VI aus gesehen:
Es werden alle Typen von Elementen gespeichert, also angefangen vom boolschen Element bis hin zu einem mehrdimensionalen Array oder kompliziertem Cluster.
Das Einzige was man was an das SubVI eingeben muß, ist ein Textarray von allen zu speichernden/zu lesenden Variablennamen (Die dämliche Bezeichnung im deutschen LV dafür heißt „Beschriftungen“)
Und natürlich die boolsche Information, ob man schreiben oder lesen möchte.
Z.Zt. muß man auch den Pfad des aufrufenden Vis noch mit übergeben, aber da hoffen ich, dass es einen schlauen Experten gibt, der weiß, wie man vom SubVI aus feststellen kann, von wem es aufgerufen wurde.
Interne Funktion des SubVI:
Es werden alle Elemente in Variants konvertiert, und danach der Wert jedes Variants in serialisierten Text. Diese Texte werden gespeichert. Dazu habe ich als Format das ini-Dateiformat gewählt. Es müsste aber ganz einfach sein, auch ein anderes Format zu wählen, also z.B Binärformat oder HTML.
Die ini-Datei sieht so aus:
[Test.vi]
Element 1 = "��������"
Element 2 = "�"
Element 3 = "��������"
( Shit: Leider sind Zeichen mit vorangestelltem Backslash hier nicht darstellbar)
Also: Abschnittname = VIName, Schlüssel = Beschriftung, Schlüsselwert = serialisierter Text.
Test.vi (Größe: 13,31 KB / Downloads: 263)
Testsub.vi (Größe: 17,91 KB / Downloads: 270)
|
|
|
09.05.2010, 15:41
Beitrag #8
|
IchSelbst
LVF-Guru
Beiträge: 3.697
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Formulardaten speichern und wiederherstellen
' schrieb:Was meinst du mit Variablenname?
Variablen sind: Felder in Klassen, Globale Variablen, Instanzen, Anzeigeelemente, Bedienelemente - eben alles das, wo Daten drinnen stehen. In C: "INT NameVonVar;". NameVonVar ist also der Variablenname.
Zitat:Ist jedem Eingabefeld ein eindeutiger Name zugeordnet, auf den ich zugreifen kann?
Ja. Hier unterscheidet sich LabVIEW nicht von anderen Programmiersprachen.
Wenn du ein Element auf das FP platzierst, bekommt dieses Element automatisch einen Namen. Wenn du 10 Boolsche plazierst, werden automatisch 10 Namen "Boolean 1", "Boolean 2" etc. erzeugt. Diese "Beschriftungen" sind der Variablenname.
Ein Cluster in LabVIEW ist (prinzipiell) nicht anderes als ein struct in C/C++: eben eine Zusammenfassung von mehreren Variablen in einer Variablen. Und genau so wie in C - MyInt=MyStruct1.MyStruct2.MyArray[X].MyStruct3.EndlichIntValue - kann man auch in LabVIEW auf Variablen innerhalb eines Clusters zugreifen - nur nicht mehr ganz so einfach.
Beachte:
Das, was im (deutschen) Kontextmenü eines Elementes unter "Beschriftung" steht, ist der Variablenname. Variablennamen sind eineindeutig (auch in LabVIEW, da sieht man das nur nicht). Variablennamen können zur Laufzeit nicht geändert werden (wie auch/wozu auch - sie dienen nämlich als "Referenz"). Im Gegensatz zum "Untertitel", der kann zur Laufzeit geändert werden.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
09.05.2010, 18:40
Beitrag #9
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Formulardaten speichern und wiederherstellen
Schön, dass es einige Analogien zu richtigen Programmiersprachen gibt. Das erleichtert das Verständnis enorm.
@Lucki: Ich verstehe zwar noch überhaupt nicht, wie deine VIs funktionieren, aber es schaut vielversprechend aus. Ich werde versuchen, sie nachzuvollziehen. Vielen Dank.
|
|
|
| |