ich möchte mehrere Werte in einer csv-Datei abspeichern. Dies funktioniert soweit auch. Die Werte stehen in einer struct. Einzig hab ich Probleme mit der Ausrichtung. Nach jedem schreiben in die Datei wird eine neue Zeile begonnen. Nun kann es vorkommen, dass innerhalb einer Zeile plötzlich die Daten in die falsche Zelle (eine weiter) geschrieben werden. Woran kann dies denn liegen (evtl. Taskprobleme?)?
Desweiteren möchte ich natürlich die Strings so klein wie möglich halten. Deshalb lese ich zuerst die Länge des String heraus. Kann ich nun die Länge des Strings in den struct übergeben um dadurch die Länge entsprechend anpassen zu können?
Anstatt SIZEOF solltest du vielleicht mal LEN() probieren. Das gibt die tatsächliche Länge des Strings und nicht die maximal mögliche.
Die Deklaration "(mein Wunsch: nDrehzahl: STRING(n);)" geht nicht. Dynamische Deklarationen sind in V2.3 nicht möglich. Nur über eine Konstante, was dir in diesem Fall ja aber auch nichts bringt.
Gruss
Erik
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo zusammen,
ich möchte mehrere Werte in einer csv-Datei abspeichern. Dies funktioniert soweit auch. Die Werte stehen in einer struct. Einzig hab ich Probleme mit der Ausrichtung. Nach jedem schreiben in die Datei wird eine neue Zeile begonnen. Nun kann es vorkommen, dass innerhalb einer Zeile plötzlich die Daten in die falsche Zelle (eine weiter) geschrieben werden. Woran kann dies denn liegen (evtl. Taskprobleme?)?
Desweiteren möchte ich natürlich die Strings so klein wie möglich halten. Deshalb lese ich zuerst die Länge des String heraus. Kann ich nun die Länge des Strings in den struct übergeben um dadurch die Länge entsprechend anpassen zu können?
TYPE tActiveSLTData :
STRUCT
nDrehzahl: STRING(15); (mein Wunsch: nDrehzahl: STRING(n); )
END_STRUCT
END_TYPE
dwFileHandle := SysFileOpen(FileName:=strFileNew, Mode:='w');
(Open/Create File and write datas)
IF (dwFileHandle <> 0) THEN
...
Ich hoffe dass mir jemand helfen kann.
Hi
Nimm doch mal den "append"-Modus.
Frage die Länge des Strings ab.
Bei "SysFileWrite" --> Parameter "Size" gibst du diese Länge an.
Mahlzeit
Append mode ist eine spitzen Idee...
Anstatt SIZEOF solltest du vielleicht mal LEN() probieren. Das gibt die tatsächliche Länge des Strings und nicht die maximal mögliche.
Die Deklaration "(mein Wunsch: nDrehzahl: STRING(n);)" geht nicht. Dynamische Deklarationen sind in V2.3 nicht möglich. Nur über eine Konstante, was dir in diesem Fall ja aber auch nichts bringt.
Gruss
Erik
Hallo
und erst mal Danke für die Tips. Das Umstellen des Mode von 'w' auf 'a' bringt leider nichts.
Wenn ich die Länge des Datenpakets mit LEN ermitteln möchte kommt immer eine Fehlermeldung
"Unzulässiger Typ für Eingang 'STR' von 'LEN': Kann tActiveSLTData' nicht in 'STRING(255)' konvertieren"
Das tActiveSLTData ist mein Struct, in der aller Variabeln stehen, die ich in die Datei schreiben möchte.
Hier ein Auszu aus der Datei:
Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0
Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0
Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0
Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0
Es sollte eigentlich immer nur pro Zelle der Name Spalte1 ; Spalte 2; ... stehen. Die Werte dazwischen kommen von...???
Mit dem Befehl
SLTDataToFile [iArrayLine].nDieselRpm:=CONCAT('Spalte 1',';');
füge ich den String und den Separator zusammen.
dwFileHandle := SysFileOpen(FileName:=strFileNew, Mode:='a');
(Open/Create File and write datas)
IF (dwFileHandle <> 0) THEN
Gruß,
Daniel
Moin
Also dass da 'Blödsinn' zwischendrin steht ist klar, wenn du SIZEOF benutzt. Dann stimmt ja die Länge des Strings nicht.
Lies mal die Beschreibung von SIZEOF...
Du musst aber natürlich LEN(SLTDataToFile[nActSLTDataRdIdx].nDrehzahl) schreiben.
Gruss Erik