# Variablen als String in csv- oder txt-Datei schreiben/speichern CoDeSys V3.5



## Malcolm (25 März 2014)

Hallo,

wie kann man Variablen als String in ein logfile speichern? Ich habe schon mehrere Versuche mit der SysFile.lib unternommen, jedoch ohne Erfolg.


Grüße
Malcolm


----------



## J Schohaus (25 März 2014)

Hallo Malcolm

Dann Beschreibmal dein Problem mit SysFile.lib. Was hast du bisher versucht ?
Um Eine Datei zu erzeugen ist das auf jeden fall der richtige Weg.
Es kann sein das es auch einen Herstellerbezogenen Lib. für das Filhändling gibt.
Welche Steuerung hast Du ?

MfG Jochen


----------



## Malcolm (25 März 2014)

Hallo Jochen,

bisher habe ich verschiedene Beispiele aus anderen Foren versucht. Jedoch habe ich das Problem, dass diese sich scheinbar auf ältere CoDeSys-Versionen beziehen. 

Hier z.B.: 

writeFile:= SysFileWrite(FileHandle, ADR(CurrentString), LEN(CurrentString), bla );

weiß ich nicht, was ich für "bla" einsetzten soll. Für meine Steuerung gibt es leider keine Lib für das Filehandling.

Grüße
Malcolm


----------



## J Schohaus (25 März 2014)

Der letzte Parameter ist pResult ein Pointer auf eine Variable wo das Ergebnis dieser Funktion geschrieben wird.
Die Variable ist vom Type "SysTypes.RTS_IEC_RESULT" .
Bevor du etwas in die Datei Schreiben kannst muss die Dateien natürlich auch noch geöffnet werden "SysFileOpen" 

Für ein etwas einfacheres Handling von Dateien schau dir die "CAA File" Lib an.
FILE.Open
FILE.Write
FILE.Close


----------



## Malcolm (25 März 2014)

Ja natürlich öffne ich zuerst die Datei, was meiner Meinung nach auch funktioniert. Nur schreibt er nichts in die Datei..


----------



## lothar (25 März 2014)

Hallo,
hFileOpen := SysFile.SysFileOpen(..... gibt ja ein Filehandle zurück. Dieses soll später, nach dem Close, auch wieder geschlossen werden: hFileOpen := 0;
Würde man z.B. fälschlicherweise zyklisch ein SysFile.SysFileOpen(... machen, gehen womöglich die Ressourcen aus und es geht erst mal nicht mehr.
Um welches System handelt es sich denn?

Gruss
Lothar


----------



## Malcolm (25 März 2014)

ok, hab gerade herausgefunden dass man für die älteren Beispiele die SysFile23.lib benötigt. 

@Lothar: Wie würde denn ein ganzes Bsp zum Schreiben einer Variable aussehen? Mein Programm schreibt einfach nichts..

Grüße
Malcolm


----------



## Malcolm (25 März 2014)

Hab das Problem gefunden mit den Beispielen für die ältere Versionen, man muss die SysFile23.lib verwenden..

@Lothar: Wie würde den ein ganzes Bsp für das Schreiben einer Variablen aussehen?

Grüße
Malcolm


----------



## lothar (25 März 2014)

Hallo,

anbei das Demo. 
Einfach den Deklarationsteil und dann den ganzen Codeteil reinkopieren. 
Tricky ist immer die Angabe von Pfad/Dateiname: das ist seeeehr systemspezifisch: da musst Du schauen, wie bei Deinem System die richtige Syntax ist! 
Das Beispiel
strFileName : STRING:= '/mnt/jogi.csv'; (*Pfadangabe ggf. anpassen*)
gilt für eine Boschrexroth-MTX und benennt die Datei jogi.csv im Verzeichnis mnt. Du siehst schon an der Unix-mässigen Syntax die Systemeigenheiten. 
Interessant auch bei CF-Cards: da ist die Syntax für die Pfade meist auch sehr spezifisch!

Gruss
Lothar




Demo gelöscht


----------



## Malcolm (26 März 2014)

Ok, jetzt funktioniert alles. Danke!


Wie kann ich es umsetzen, anstatt z.B. "66 8,182097 TRUE" etwa "DT#2014-3-26-14:48:56.174 Info TRUE" auszugeben; Also DATE_AND_TIME anstatt Byte ?


Gruß
Malcolm


----------



## lothar (26 März 2014)

... probier doch so irgendetwas wie

str:=DT_TO_STRING(DT#1998-02-13-14:20); 
(* Ergebnis ist 'DT#1998-02-13-14:20' *)


----------



## Malcolm (26 März 2014)

Perfekt, danke. Wie kann ich, wenn ich die Variablen in einer Schleife in die csv schreibe, einen Zeilenumbruch einfügen, so dass alle Variablen untereinander geschrieben werden?


----------



## lothar (26 März 2014)

... in dem Demo sollte das ja die Passage

// jetzt noch das CarriageReturn / LineFeed schreiben:
dwWriteSize_wNewLine := SysFile.SysFileWrite(hFile:=hFileOpen, pbyBuffer:=ADR(wNewLine), ulSize:=SIZEOF(wNewLine), pResult:= ADR(ResultFromFileWrite)); (* dwFileWrite ist Handle aus SysFileOpen *)

leisten.  

In Deiner Applikation ggf. anpassen.

Gruss
Lothar


----------

