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!
ich, User, habe die Aufgabe ein Messgerät zu programmieren. Die Messwerte sollen in eine Tabelle reingeschrieben werden und bei neuer Messung dazugefügt werden.
Ich habe das Problem, das entweder die Datei ersetzt wird oder der Header mehrfach eingespeichert wird.
Ist mein Konstrukt grundlegend falsch bzw. ist diese Kombination nicht möglich? Habe ich was vergessen?
Siehe Anhang!
Das Problem sind die sich überschneidende Drähte und dass du von Rechts nach Links programmierst. Da muss LabVIEW durcheinander kommen.
Scherz beiseite, hast du die Hilfe zu "Write to Text File" gelesen?
Zitat:file: can be a refnum or absolute file path. If you wire a path to the file input, the function opens or creates the file before writing to it and replaces any previous file contents. If you wire a file refnum to the file input, writing begins at the current file position. To append to an existing file, set the file position to the end of the file by using the Set File Position function. The default is to display a file dialog box and prompt you to select a file.
If you specify an empty or relative path, this function returns an error. If you specify a path to a hidden file, this function returns an error.
Da du mit einem Pfad ins SubVI reingehst, wird also bei jedem Aufruf entweder ein neuer File angelegt oder, falls der File-Name schon exisitiert, dieser überschrieben.
Wenn du das anders haben willst, verwende "Open File" und "Set File Position" aus der Advanced File Palette.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Zitat:Ich habe das Problem, das entweder die Datei ersetzt wird oder der Header mehrfach eingespeichert wird.
Das Ersetzen der Datei hat Jens schon erklärt.
Zum Header: den schreibst du doch selbst jedesmal erneut in die Datei! Warum machst du das, wenn du es eigentlich gar nicht willst?
Lösung:
1. Vor einer Schleife eine (neue) Datei öffnen, dann den Header hineinschreiben
2. Die FileRef in eine Schleife hineinverdrahten und in der Schleife die Messdaten in die Datei schreiben.
3. Nach der Schleife dann den Footer in die Datei schreiben und die Datei schließen.
"Vor/in/nach" ergibt sich aus THINK DATAFLOW!
Zitat:Habe ich was vergessen? Siehe Anhang!
Ja: Deine VIs anzuhängen…
Bilder kann man so schlecht debuggen!
Außerdem hast du vergessen, mal AutoCleanup auszuführen (hatte Jens auch schon "kritisiert").
Solange AutoCleanup ein Blockdiagramm noch verbessern kann, musst du deinen Programmierstil ebenfalls noch verbessern…
Vielen Dank für die Antworten. Diese haben mir auf jeden Fall weitergeholfen.
Ich habe aber leider immer noch Probleme mit dem Header, aber diesmal ein anderes, dieses wird gar nicht reingeschrieben.
Aber dafür werden jetzt meine Messdaten schön eingespeist in die Datei.
Weiß einer was sich da beißt?
Danke im Voraus
PS: auch danke für die konstruktive Kritik ^^
05.12.2017, 13:39 (Dieser Beitrag wurde zuletzt bearbeitet: 05.12.2017 13:41 von GerdW.)
Zitat:Ich habe aber leider immer noch Probleme mit dem Header, aber diesmal ein anderes, dieses wird gar nicht reingeschrieben.
Wo genau schreibst du deine Headerdaten?
Du erzeugst zwar einen String, aber der wird nirgends in die Datei geschrieben!
Tipp: Einfach mal die LabVIEW-Hilfe zu den verwendeten Funktionen lesen…
Zitat:Aber dafür werden jetzt meine Messdaten schön eingespeist in die Datei.
Warum schreibst du die Messdaten vor dem Header in die Datei?
Warum setzt du die FilePosition in einer Schleife auf "Ende"? Warum eine Schleife, die nur genau einmal iterieren soll? Wozu die Wartezeit in der Schleife?
Warum setzt du die FilePosition, wenn du die Datei gleich danach wieder schließt?
P.S.: Ich bin kein Fan von großen ConcatString-Funktionen: die lassen sich so gut wie immer einfacher durch FormatIntoString ersetzen…
P.P.S.: Kannst du mal deine LabVIEW-Version im Profil angeben? "student" ist jedenfalls keine offizielle Version…
erstens: ich bin Student und programmiere mit und Studentversion , da ich aber grad für eine Instution arbeite und für die was schreibe, darf ich diese Studentenlizenz nicht hernehmen.
Dadurch macht das für mich kein Sinn, wenn ich anschließend wieder mit der 14ner programmiere.
Gab ja bei meiner Threaderöffnung als Userversion an.
So hab jetzt ne Case Struktur mit enum von create and open. Gedanke ist: Wenn ich eine neue Datei erstelle, soll mein Header am Anfang stehen. Bei der nächsten Messung und die Messdaten sollen darunter geschrieben werden, setzte ich das Enum auf Open.
Problem: still Header, der nicht geschrieben wird. Wie kann ich den, laut meinem Anhängen, einfügen. Ich weiß das du Gerd meintest, ich schreib den auch nicht, aber ich sehe grad nicht was ich hinzufügen soll, dass es funktioniert.
Vielen Dank!!!
05.12.2017, 16:16 (Dieser Beitrag wurde zuletzt bearbeitet: 05.12.2017 16:18 von GerdW.)
Zitat:Gedanke ist: Wenn ich eine neue Datei erstelle, soll mein Header am Anfang stehen. Bei der nächsten Messung und die Messdaten sollen darunter geschrieben werden, setzte ich das Enum auf Open.
Also eine kleine Statemachine - prima!
Zitat:Problem: still Header, der nicht geschrieben wird.
Weil du den nirgends in die Datei schreibst…
Im "Create"-State erstellst du einen Header und schreibst ihn in eine Datei. Dann hängst du mittels WriteSpreadsheetFile die Daten ran. (Vorschlag: ersetze WriteToSpreadsheetFile durch die zwei Funktionen ArrayToSpreadsheetString und WriteText.) Dann öffnest du die Datei erneut, setzt die FilePosition und schließt die Datei wieder - dieser Teil ist Unsinn, weil du die Datei mit dem Modus "Create" öffnest! Was wird da wohl passieren?
Im "Open"-State hängst du wieder Daten an, um erneut das Spiel Öffnen/FilePos/Schließen unsinnigerweise zu spielen…
Wenn du dein VI mal hier anhängen würdest, hättest du wahrscheinlich schon die Korrektur vor Augen! Bilder lassen sich mit LabVIEW so schlecht debuggen…
Zum
Schreib dich einfach LV2009 und LV2014 rein - besser jedenfalls als ein unbestimmtes "student"…
Zu meinem neue Problem: 3 mal wird der Header reingeschrieben, kommt das von dem Arraysize? Kann ich das manipulieren? Und die aller erste Messung wird nicht reingeschrieben. Sobald ich auf Create Enum klicke, speist es wie gesagt schön ein, so wie ich es will.
Ich hab euch jetzt mal das ganze VI hochgeladen.
Bin offen für konstruktive Kritik mit Hilfe!
Du bist immer noch nicht mit FileIO warm geworden!
Die Reihenfolge beim Anhängen an ein bestehendes File ist:
- File öffnen
- File Pointer auf File Ende setzen
- Jetzt erst Schreiben (Write File).
- File bei Bedarf schließen.
In deinem "Open" Case kannst du dir das zusätzliche FileIO nach dem Write Spreadsheet File sparen, dort erledigst du das Anhängen durch die Optionen am Eingang dieses VI. Schau dir einfach mal den Sourcecode dieses VI an (aber NICHT abändern!!!!!).
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Zitat:Bin offen für konstruktive Kritik mit Hilfe!
Siehe Anhang…
- Willst du eigentlich immer erst händisch den Modus von "create" nach "open" umschalten? Warum machst du nicht eine Abfrage, ob die Datei schon existiert oder noch nicht? Wenn Datei noch nicht existiert: Header schreiben. Wenn Datei schon da: Messdaten anhängen…
- Warum hat dein VI keine "über alles"-Schleife? Wie sollen da mehrfach (programmatisch) Daten erfasst werden?