Codesys KOP Daten aufzeichnen

Nein, aber, wie gesagt, such Dir mal eine Doku zum Thema Schreiben in Dateien, hier im Forum ist das Thema auch schon öfters aufgetaucht, denn da machst Du einen großen Fehler. Die einzelnen Bausteine benötigen nämlich mehr als einen Zyklus.
 
Beispiel um etwas in eine Datei zu speichern:
Code:
(************************************************************************************************)
(*    Einstellungen abspeichern                                                                *)
(************************************************************************************************)

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
PROGRAM PLC_PRG
VAR
xAF_Temp: REAL;
xAF: INT;
xAF_TempR: REAL;
iStat: INT;
FileName: STRING:= 'D:';
Mode: STRING;
SysFileOpenNum: DWORD;
DwWritten: DWORD;

END_VAR



CASE iStat OF
100:
xAF_Temp := xAF;
xAF_TempR := xAF_Temp / 10.0 ;
iStat:= 101;
101:
FileName:='Temperatur.csv';
Mode:='w';
iStat:=102;
102:
SysFileOpenNum:=SysFileOpen(FileName, Mode);
iStat:=102;

103:
DwWritten:= SysFileWrite(RGWW, ADR(str_Temperatur), SIZEOF(str_Temperatur));


END_CASE



Vielen Dank für eure Hilfe!
Mir wird "SysFileOpen" und "SysFileWrite" nicht als Befehl deklariert. Zudem benötigt SysFileOpen noch einen 3en Eingang?
Kann es sein das mir ein Paket aus der Bibliothek fehlt?
 
Vielen Dank, du hast mir sehr geholfen!
Mein Programm ist soweit fertig. Ich habe dennoch ein kleines Problem und finde keine Lösung.
Ich möchte in die csv Datei, eine Spalte mit Datum und Uhrzeit und eine Spalte mit der Temperatur. Funktioniert so weit auch alles, aber
ich bekomme immer 3 Spalten ausgegeben. Die erst Spalte ist ein abgeschnittenes Datum, die zweite Spalte, das ganze Datum und die dritte Spalte die Temperatur. Im ersten Durchgang des Programms passt alles. Im zweiten-00 habe ich immer 3 Spalten. Ich komme nicht drauf, woran es liegen könnte.
Vielleicht habt Ihr eine Idee?
Code und csv Datei hänge ich an.
Screenshot 2021-12-07 07.53.53.pngScreenshot 2021-12-07 07.55.05.pngUnbenannt1.PNG
 
Moin Winsterde,

ganz spontan habe ich auch keine Idee, allerdings mehrere Dinge, die mir auffallen:
  • Programmierstil:
    • Bitte nutze beim Programmieren Tabulatoren zum Einrücken... In #25 siehst Du, wie schön übersichtlich ein CASE aufgebaut sein kann.
    • Ich würde nicht jeden kleinen Teil einzeln in die Datei schreiben, Schreibvorgänge kosten viel Zeit. Erst eine komplette Zeile zusammenbauen und dann in einem Rutsch wegschreiben. Zumal SysFileWrite eine blockierende Funktion ist: Das SPS-Programm hält an, so lange die Daten geschrieben werden. Dein Prozeß hält also an!
    • Was machst Du, falls mal nicht alle Bytes geschrieben wurden (Datenträger voll?), dann bleibst Du in der Schleife hängen und kannst nur die SPS neu starten.
  • Ausgabe:
    • Warum hast Du so viel Abstand in den Spalten? Eigentlich müßte die Temperatur direkt hinter dem Semikolon stehen.
    • In der ersten Spalte stehen Zeitstempel von vor 10 bzw. 3 Sekunden!?
Wichtig wäre nochmal zu sehen, Deine Variablendeklarationen und der FileMode, den Du nutzt.

Du kannst Dir die Strings beim Debuggen ja mal online ansehen. Zumal, wenn Du eine komplette Zeile zusammenbaust.

Gruß
Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Tipps. Ich habe Ablauf 3 u. 4 zusammengefasst. Geändert hat sich leider nichts. Warum Zeiten teils 10 Sekunden zurückliegen, frage ich mich auch. Vielleicht der Zeitpunkt, indem ich mich in die SPS einlogge bzw. das Programm drauf schreibe.
Ich wollte erst mal den Grundbaustein legen. Und Probleme die, während dem Betrieb auftreten könnten, angehen, sodass die SPS nicht mitten im Programm stehen bleibt.
Anbei noch die Variabeln.
Screenshot 2021-12-07 08.53.50.png
 
Bei CS2.3 wurde ein String ohne Längenangabe mit einer definierten Zeichenanzahl erzeugt( ich glaub es waren 80, weiß es aber nicht mehr genau)
 
Ich habe das Problem gefunden.. Aber keine Lösung dafür. Sobald WriteDate := DT_TO_STRING(ActTimeRTC) wird automatisch in die CSV datei geschrieben, aber total sinnfreie Zeiten. Wie kann ich das Lösen?
 
Ich hätte noch eine kurze Frage.
Ich möchte noch einen CTD Counter programmieren. Dieser sollte pro Ablaufzyklus herunterzählen. Wie gehe ich da am besten vor?
Wie kann ich das programmieren. Eingangssignale habe ich ja keine.
Hoffe Ihr könnt mir helfen!
 
Der Zähler zählt ja bei einer steigenden Flanke um eins herunter. Du musst jetzt also dafür sorgen, dass der Zähler FB in jedem Ablaufzyklus eine steigende Flanke sieht, z.B. in dem Du ihn zweimal nacheinander aufrufst. Einmal mit CD = TRUE und einmal mit CD = FALSE, oder umgekehrt, geht auch und dann hat er in dem Durchlauf sicher eine steigende Flanke.
 
Zurück
Oben