LabVIEWForum.de
Cluster "manuell" zur Laufzeit erstellen? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Cluster "manuell" zur Laufzeit erstellen? (/Thread-Cluster-manuell-zur-Laufzeit-erstellen)



Cluster "manuell" zur Laufzeit erstellen? - Kiesch - 10.01.2012 10:10

Hallo liebe LFV Nutzer,

gibt es eine Möglichkeit beliebige Cluster zur Laufzeit zu erzeugen?

Das Problem ist: Ich brauche in der Regel bei Datei IO Dateien die die Daten als (für Menschen lesbare ;-) ) Tabellen von Zahlen und Strings enthalten. Entsprechend bin ich bisher noch auf keinen grünen Zweig dabei gekommen mir eine Standardfunktion für Datei IO zu definieren. Zwar könnte man das ganze über ein Objekt machen, dass die Strings und Zahlen intern richtig ablegt und dann jeweils über Indizes (für Zeilen und Spalten) wie ein Array angesprochen wird. Die Zeilendefinition kann dann einfach über einen Formatstring geschehen. Allerdings würde ich als Aus- bzw. Eingabe einen Cluster bevorzugen (der über unbundle / bundle by name weiter angesprochen werden kann), da ansprache der einzelnen Elemente über Indizes doch ein wenig kompliziert erscheint und man manuell richtig auswählen muss ob man die Methode für String oder Zahl ausgeben braucht.

Deswegen habe ich mich gefragt ob man auch einfach den Cluster zur Laufzeit erzeugen kann. Direkt durch hinzufügen von Elementen scheint das nicht zu gehen (?) - aber selbst wenn müsste man den Cluster ja vermutlich als Variant aus der Einleseroutine herausführen und vor der Weiterverarbeitung wieder auf den Cluster casten. Deswegen habe ich überlegt ob man vielleicht einfach manuell die Binärdaten für einen Cluster erzeugen kann (die man mit flatten to String erhalten würde), so dass ich das Ausgangsfile dann entsprechend dem Formatstring parsen würde und dann aus den Daten einen Cluster als Datenstream erzeuge, der dann Ausgegeben wird. Den muss ich dann nur noch im eigentlichen Programm (das die Leseprozedur nutzt) wieder in einen Cluster umwandeln.

Geht das?
Oder hat jemand eine andere Möglichkeit mit sowas umzugehen?

Als Alternative fällt mir auf Anhieb nur ein zwei Dateien zu speichern. Einmal in der Form als Datenstream und eine zugehörige Datei die das ganze in menschenlesbarer Form enthält.

Gruß Kiesch


RE: Cluster "manuell" zur Laufzeit erstellen? - GerdW - 10.01.2012 10:20

Hallo Kiesch,

Zitat:gibt es eine Möglichkeit beliebige Cluster zur Laufzeit zu erzeugen?
Nein. Strikte Datentypisierung...

Zitat:so dass ich das Ausgangsfile dann entsprechend dem Formatstring parsen würde und dann aus den Daten einen Cluster als Datenstream erzeuge, der dann Ausgegeben wird.
Das würde noch gehen. Wobei NI immer die Möglichkeit hat, die interne Repräsentation zu ändern, womit du dann inkompatibel wirst...

Zitat:Den muss ich dann nur noch im eigentlichen Programm (das die Leseprozedur nutzt) wieder in einen Cluster umwandeln.
Siehe erster Punkt oben...

Du hast immer das Problem, dass du schon während des Kompilierens (= Edit Time) den Datentyp kennen musst. Du kannst also später nicht einfach andere Datentypen unterschieben. Es sei denn, du programmierst alles mit Variants (oder Strings) und jeweiligem Parser für alle geplanten Datentypen - das kann schnell sehr aufwendig werden...


RE: Cluster "manuell" zur Laufzeit erstellen? - Kiesch - 11.01.2012 15:36

Würde eine Änderung der Clusterdefinition durch NI nicht auch mit Flatten to String umgewandelte Cluster betreffen? Von daher sollte sich an der (Struktur-)definition doch nichts ändern (?). Einfach weil man das ja sonst nicht vernünftig nutzen könnte (um Daten wieder einzulesen die mit einer Vorgängerversion gespeichert wurden). Und im Prinzip weis ich ja zur Programmierzeit was ich für nen Cluster verwende. Allerdings weis ich das eben nur in nem Teil des Programms (der dann mit dem eingelesenen weiterarbeitet bzw. auszuschreibende Daten liefert).


Wie macht ihr denn allgemein Datei IO mit ner vernünftigen Schnittstelle? (die schon Weiterverarbeitung wie parsen von Daten, Header beim parsen Ignorieren, Ignorieren entsprechend markierter Kommentarzeilen etc. implementiert) Hat da jemand zumindest nen Tipp in ne bestimmte Richtung?

Gruß Kiesch


RE: Cluster "manuell" zur Laufzeit erstellen? - GerdW - 11.01.2012 15:39

Hallo Kiesch,

Zitat:Würde eine Änderung der Clusterdefinition durch NI nicht auch mit Flatten to String umgewandelte Cluster betreffen?
Dann rate mal, warum die Datalog-Filefunktionen von NI nur noch so stiefmütterlich behandelt werden und man jetzt freundlich, aber bestimmt, in Richtung TDMS geleitet wird! Dort hatte man eben diese Probleme, ich glaube bei Einführung von LV6 oder LV7 - die Clusterdefinition änderte sich und man konnte plötzlich keine alten Datalogs mehr lesen...


RE: Cluster "manuell" zur Laufzeit erstellen? - Lucki - 11.01.2012 16:18

Würde es nicht mit einem work arround machbar sein?
1. Alle gewünschten Clustertypen im Voraus erstellen und dann zur Laufzeit nur den gerade gewünschten Clustertyp benutzen und im FP sichbar machen.
Oder
2. Einen sehr komplexen Cluster erstellen, der alles enthält, was je gebraucht werden könnte und zur Laufzeit nur die Elemente sichtbar machen, die tatsächlich benutzt werden. (Ich weiß nicht genau, aber wahrscheinlich kann man zur Laufzeit sogar die Abmessungen des Clusters anpassen)

Durch Verwendung von Arrays im Cluster wäre noch zusäzlich eine gewisse Flexibilität in Bezug auf die Anzahl von Daten gegeben.


RE: Cluster "manuell" zur Laufzeit erstellen? - Kiesch - 11.01.2012 16:48

hi Lucki,

ich mache das mit LVOOP. Bis auf die Ausgabe ist mir auch eigentlich schon alles klar. Jede Tabelle wird dabei als Objekt mit einem Array pro benötigtem Datentyp repräsentiert, das alle Daten dieses Datentyps als Container aufbewahren kann (davon werden dann in der Regel einige leer sein). Dazu einen Formatstring der spezifiziert wie die Zeilen aufgebaut sind (Reihenfolge der Datentypen). Entsprechend wäre es dann auch kein Problem intern den Cluster zusammenzubauen (auslesen Formatstring des Objekts; parsen; feststellen welches Array an welcher Stelle gelesen werden muss; entsprechende Ausleseprozedur auswählen; in Cluster schreiben). Das Objekt zu programmieren lohnt aber halt nur, wenn ich genau das intern in der Schnittstelle machen kann und nicht jedesmal im konkreten Programm dahinterhängen muss.
Ich werd das jetzt vermutlich so machen, dass einfach jeder praktisch gebrauchte Cluster als eigene Methode implementiert wird die den Cluster in der "Richtigen" Form ausgibt. Brauche das ja sowieso nur zur späteren Weiterverwendung.

Hatte auch noch überlegt ob es was bringt eine Referenz auf einen "Beispielcluster" an das Programm zu übergeben, ausdem man dann programmatisch über die Label der einzelnen Cluster Elemente den Cluster befüllt (die würden dann in der Datei einfach mit angegeben; entsprechend würde dann in die richtigen Felder geschrieben). Allerdings nehme ich auch da an, dass das nicht geht, da man dann ja wieder zur Compilezeit nicht weis was man später genau schreibt und das ja tatsächlich darauf hinauslaufen könnte das man versucht einen String in ein Double zu schreiben o.ä.



Nachtrag:

Eigentlich bin ich ja ein Trottel. Ich brauche ja nur ein Referenzobjekt zu bauen, dass wie beschrieben funktioniert und anschließend davon ein Kindobjekt erben, dass dann die konkrete Ausgabe für die Daten implementiert. Das könnte funktionieren.