Zeilenumbruch beim .csv Datei schreiben

Beycker

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe folgendes Problem:
Ich erfasse Über meinen WAGO BACnet Controller 750-831 und der Dreiphasenklemme 750-494 sehr viele Messwerte. Diese Messwerte sollen in eine .csv geschrieben werden, auf die SD-Karte des Controllers.
Bis jetzt schaffe ich es eine Datei, auf der SD-Karte, zu erstellen und alle eingehenden Messwerte hintereinender in die .csv zu schreiben.
Das sieht dann so aus, dass alle Werte in der ersten Zeile in EXCEL stehen.
Nun die Frage: Wie schaffe ich es, dass nach dem erfassen eines Wertesatzes ( Strom L1-L3, SpannungL1-L3, LeistungenL1-L3), einen Zeilenumbruch zu bekommen. Der nachfolgende Wertesatz sollte in der nächsten Zeile stehen.
Das Programm sieht etwas kaotisch aus, da ich eine schrittkette einbauen musste, auf Grund von Laufzeitproblemen.


IF Takt THEN

WHILE FileIdent <>0 DO (*kontrolle ob dateiname schon vorhanden*)
HelpFileName:= CONCAT ('s:\Messreihe' , sZahl); (*CONCAT zum verbinden von Strings*)
FileName := CONCAT ( HelpFileName , '.csv');
FileIdent := SysFileOpen ( FileName , 'r'); (*FileIdent zum öffnen von File nötig*)
iZahl:=iZahl +1;
sZahl := INT_TO_STRING (iZahl);
HelpFileName:= CONCAT ('s:\Messreihe' , sZahl); (* 's:\ ' Pfad auf die SD-Karte*)
FileName := CONCAT ( HelpFileName , '.csv');
SysFileClose (FileIdent);​
END_WHILE; (*Kontrolle ende*)

CASE iDS OF
1: FileIdent:= SysFileOpen (FileName , 'a'); (*Neues File wird erstellt und mit allen Beschriftungen (erste Zeile EXCEL) gefüttert*)
IF FileIdent > 0 THEN
iDS:=2;
END_IF;
2: BytesDone := SysFileWrite (FileIdent , ADR (sDatum), LEN(sDatum)); (*Datum aus dem System auslesen und übernehmen. Hier EXCEL Feld A1 bekommt Datum*)
IF BytesDone = LEN (sDatum) THEN
iDS:=3;
END_IF;
3: SysFileClose (FileIdent);
iDS:=4;
4: FileIdent:= SysFileOpen (FileName , 'a');
IF FileIdent >0 THEN​
iDS:=5;​
.
.
.
END_IF;
END_CASE; ich wollte jetzt nicht alles kopieren

iDS:=52;
(*POINTER POS ÄNDERN*) ich vermute dass es vllt eine lösung gibt bei der man einfach den pointer versetzt, hab aber noch keine Befehle dafür gefunden

WHILE iZahl <> 0AND Takt DO (*ALLE Messwerte in File schreiben*)
CASE iDS OF
52: FileIdent:= SysFileOpen (FileName , 'a');
IF FileIdent >0 THEN
iDS:=53;
END_IF;​
53: sWert := REAL_TO_STRING (Strom_L1_effektiv_R);
BytesDone:= SysFileWrite (FileIdent , ADR (sWert), LEN(sWert)); (*BitesDone hab ich aus einem andern Programm geklaut um die lenge meiner geschriebenen File zu kontrollieren*)
IF BytesDone = LEN (sWert) THEN
iDS:=54;
END_IF;
54: SysFileClose (FileIdent);
iDS:=55;​
.
.
.
97: iPointerPos := iPointerPos +1;
(*POINTER VERSETZEN*)
iDS:=49;
END_CASE;
END_While;


Ich hatte noch keine möglichkeit gehabt das Programm aufzuspielen und so weit es geht mal zu testen. Aber beim compilieren sind keine fehler aufgetaucht.
Vielen Dank schon mal im voraus.
 
Hallo,
schreib doch mal dann, wenn du eine Zeilen-Schaltung haben möchtest, den Code von CR und LF (chr(13) und chr(10)) in die Datei ...

Gruß
Larry
 
Zurück
Oben