CSV Datei zyklisch erweitern auf SD Karte speichern und per FTP senden

carki

Level-1
Beiträge
71
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ich steh vor einem Problem was mir unlösbar erscheint^^ aber sicherlich nur mir weil ich neuling bin bei dieser Programmiersprache.

Ich habe eine Wago750-880 mit SD Card. Möchte nun Analogewerte die vom Datentyp REAL sind speichern. Und zwar zyklisch über ein neuen Task (das hab ich hinbekommen^^). Quasi soll immer der aktuelle Wert alle 60sec an die csv datei angehängt werden und auf die sd card speichern und jeden tag einmal per FTP versendet werden. Hat jmd eine Ahnung wie das funktioniert???


Grüße
 
Hi, das abspeichern mit anhängen ist kein Problem. Beim Öffnen der Datei zwecks speichern geschieht mit dem Befehl SysFileOpen(Dateiname,Modus), wobei "Dateiname" ein String ist mit dem Namen der Datei und "Modus" in dem Fall 'a' für "append" was bedeutet, dass Informationen immer am Ende angehangen werden. Außerdem ist in dem Modus egal ob die Datei existiert, denn wenn sie es nicht tut, wird sie erstellt.

Zum senden per FTP kann ich leider nichts sagen.

Tante Edit meint: Im Dateinamen enhalten ist auch der Pfad. Entweder relativ (z.B. wenn man ihn ganz weg lässt) oder absolut soweit ich weiß.

mfg altelulex
 
Jo da das Programm seinen Stammordner sicher nicht auf der SD-Card hat musst du einen pfad angeben. Die Endung .csv gehört bei Windows fest zum Dateinamen, muss also immer mit verwendet werden. Hier mal ein Beispiel:

VAR
FileNumber: DWORD; (*number of file (internal)*)
WriteBuffer: STRING(250); (*buffer for writing to export*)
END_VAR

FileNumber := SysFileOpen(beispieldatei.csv, 'a'); (*open file for appending*)
WriteBuffer := 'teststring';
SysFileWrite(FileNumber, ADR(WriteBuffer), LEN(WriteBuffer)); (*writing to file*)
SysFileClose(FileNumber); (*closing file*)

Egal was du schreibst, du musst es vorher in einen string umwandeln. Das schreiben mit der Funktion "ADR()" ist nötig, da das Ende der Datei dynamisch im Speicher liegt.
Am Ende das Schließen nicht vergessen und außerdem ist wichtig, dass das Öffnen, Schreiben und Schließen innerhalb eines Zykluses geschehen muss, da sonst Fehler entstehen.

mfg altelulex
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

nur noch einmal zur Ergänzung: Will man auf die SD-Karte schreibend oder lesend zugreifen, ist dem Dateinamen der Laufwerksbuchstabe "s:\" voranzustellen. Wird dieser nicht angegeben, wird auf das interne Filesystem zugegriffen.

Das Senden der Datei ist zudem in dem folgenden Anwendungshinweis gut beschrieben: http://www.wago.de/catalogue/downloadSearch.do?docOid=a114100de&act=showAppnote

Bei weiteren Fragen kannst Du uns auch gerne unter den unten genannten Adressdaten direkt kontaktieren.
 
Hallo Leute,

Das gleiche möchte ich eigentlich auch Erreichen aber nur bis zur SD karte, aus Testgründen möchte ich nur mal schauen ob er die CSV datei erstellt. Leider geht es da nicht weiter, Er schreibt zwar den Wert in den Zwischenspeicher aber erstellt die Datei nicht.
Könnt Ihr vieleicht helfen?

Programmcode:

VAR
zaehler:INT;
POSFLANK:BOOL;
FLANKE:BOOL;
POSFLANKE:BOOL;
TONInst:TON;
Timer_start:BOOL;
Timer_signal:BOOL;
FileName:STRING:='C:\Code.csv';
FileMode:STRING:='w';
SysFileOpenNum:DWORD;
WriteBuffer:STRING;
DWWritten:DWORD;
handle:DWORD;
MODE:STRING;
SIGNAL: BOOL;
END_VAR



IF SIGNAL= TRUE AND FLANKE = FALSE
THEN POSFLANKE:= TRUE;
FLANKE:=TRUE;
ELSE
POSFLANKE:=FALSE;
END_IF

IF SIGNAL = FALSE THEN FLANKE:=FALSE;
END_IF

IF POSFLANKE THEN zaehler:=zaehler+1;
END_IF



TONInst(IN:= NOT TONInst.Q,PT:=T#15s);
Timer_signal:=TONInst.Q;

IF Timer_signal
THEN
SysFileOpenNum:=SysFileOpen(Filename,FileMode);
WriteBuffer:=INT_TO_STRING(zaehler);
WriteBuffer:=CONCAT(WriteBuffer, ';');
DWWritten:=SysFileWrite(SysFileOpenNum,ADR(WriteBuffer),LEN(WriteBuffer));
SysFileClose(SysFileOpenNum);
zaehler:=0;
END_IF

MFG

newbie
 
die File Befehle brauchen teilweise sehr lange bis sie ausgeführt sind (vor allem das Schreiben), da kann sehr viel Zeit vergehen, eine Auswertung des Status ist unverzichtbar. Sinnvoll ist hier eine Schrittkette. Hier ein Auszug:

Code:
CASE stat OF

100:
        Filename:='Setting.txt';
        Mode:='w';
        stat:=101;
101:
        RGWW:=SysFileOpen(FileName, Mode);
        IF RGWW>0 THEN
            stat:=102;
        END_IF
102:
        BytesDone:=    SysFileWrite(RGWW, ADR(G_HMI), SIZEOF(G_HMI));
        IF BytesDone = SIZEOF(G_HMI) THEN
                stat:=103;
        END_IF
103:
        SysFileClose(RGWW);
        Stat:=    104;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo :)

Ich kann Dir da die Oscat Network lib empfehlen. Dort sind fertige Datenloggerbausteine enthalten. Du musst nur die network.lib etwas modifizieren, damit Du die Tcip von Beckhoff nicht benötigst. Die kostet nämlich etwas. Einfach so viel rausschmeißen, bis beim kompilieren keine Fehler mehr auftauchen. :) ist erst ne stunde arbeit. Läuft bei mir aber stabil. Ich lasse eine csv auf einen usbstick schreiben. Hardware Beckhoff cx9020 (ja, gerade frisch in der Auslieferung ;) ... Alle 30 sek bei sieben tage Aufzeichnung Dateigröße ca 3mb... Auswertung mit Libreoffice als diagramm. Ausgewertet werden Strom, Spannung, Leistung, Arbeit.

Gruß
Frank
 
Zurück
Oben