Datum(tt.mm.jjjj) aus CSV mit Systemzeit vergleichen

Nilsflo

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Forum,

ich bin Anfänger und stehe vor der Aufgabe eine WAGO SPS mit CoDeSys zu programmieren und habe dazu eine Problem für das ich leider noch keine Lösung finden konnte und zudem ich euch gerne befragen würde:

Ich habe eine CSV Datei mit 4 Spalten die Datum(tt.mm.jjjj), Uhrzeit(ss:mm) und einen Wert der entweder 1 oder 0 ist beinhaltet. Diese möchte ich gerne in ein Array einlesen (mittels SysLibfile) und dann das Datum mit dem der Systemzeit (die hole ich mir mit der SysLibRTC) vergleichen, um die Werte am aktuellen Tag zu erhalten.

Mein Problem ist, dass ich nicht weiß wie ich das vorliegende Datum der Form tt.mm.jjjj mit der Systemzeit in DT oder DATE vergleichen kann. Hat da jemand einen Tipp für mich?

Vielen Dank und viele Grüße,

Nils
 
Hallo Nils,
die Spalten in der*.csv, die das Datum und Uhrzeit beinhalten wurden von dir als STRING definiert ?
wenn ja, baue es dir ein DT-String (sehe CONCAT) und wandle den DT Format auch in String, danach ist der Vergleich moeglich.

Irek

(Fall du mir eine Vorlage besorgst, kann ich fuer das Forum paar Zeilen Code schreiben.)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Irek,

vielen Dank, die Idee finde ich sehr gut. Mein Problem ist aber, dass ich das Datum nicht in das STRING Format bekomme, hast du eine Idee dazu?

Was meinst du mit Vorlage? Die CSV-Datei sieht zum Beispiel wie folgt aus: 01.01.1970; 00:00; 01:00; 0;
01.01.1970; 01:00; 02:00; 0;
01.01.1970; 02:00; 03:00; 1;
Vielen Dank und viele Grüße,

Nils
 
Hallo Irek,

vielen Dank, die Idee finde ich sehr gut. Mein Problem ist aber, dass ich das Datum nicht in das STRING Format bekomme, hast du eine Idee dazu?

Was meinst du mit Vorlage? Die CSV-Datei sieht zum Beispiel wie folgt aus: 01.01.1970; 00:00; 01:00; 0;
01.01.1970; 01:00; 02:00; 0;
01.01.1970; 02:00; 03:00; 1;
Vielen Dank und viele Grüße,

Nils

Hi,

fuer Beckhoff gilt das, wenn andere Controller am Werk sollte es auch funktionieren.
Wichtig ist nur wo ich es bekomme.
Wenn du den Prinzip mit CONCAT verstanden hast, kannst du dir alles nach wunsch "zusammenbauen"
Wenn mit dem Datum funktioniert, dann brauchen wir ein Array (denke an die Menge der Eintraege) wo alles reinkommt.
Wird ein Struct definiert mit Datum, Uhrzeit und dem Zustand, dann kann man das Blockweise speichern (1x Stunde) und geordnet wieder einlesen.
Schreib doch bitte in paar Zeilen wie das Programm funktionieren soll, also was zuert und was danach.
Du wirst dich wundern, wie schnell man dann vorankommt.

FUNCTION_BLOCK FB_PLC_Systemtime
VAR_INPUT
END_VAR
VAR_OUTPUT
DT_String:STRING(20);
XML_Datum:STRING;
XML_Time:STRING;
END_VAR
VAR
(* 1s Timer for internal logging based of Systemtime and sync with SNTP*)
fbTime :FB_LocalSystemTime:=( bEnable := 1, dwCycle := 1 );
logTimer : TON := ( IN :=1, PT := T#1000ms );(* 1s Clock for logging Timebase = 1x pro sec wird Zeit aktualisiert*)
Year:STRING(6);
Month:STRING(4);
Day:STRING(4);
Hour:STRING(4);
Minute:STRING(4);
Sec:STRING(4);
XML_Year:STRING(6);
XML_Month:STRING(4);
XML_Day:STRING(4);
XML_Hour:STRING(4);
XML_Minute:STRING(4);
XML_Sec:STRING(4);
END_VAR
(* PLC Time => GV PLC_Systemtime:STRING(20); !*)




MAIN
fbTime();(*Das ist der Baustein fuer interne Systemzeit b. Beckhoff*)
Year:=WORD_TO_STRING( fbTime.systemTime.wYear);(*Einfach das Jahr(Systemintern als WORD) in String umwandeln*)
Month:=WORD_TO_STRING( fbTime.systemTime.wMonth);(*Genauso*)
IF fbTime.systemTime.wMonth < 10 THEN(* 9 wird als 09 ausgegeben, will heissen immer konstante Breite*)
Month:=CONCAT(STR1:='0',STR2:=Month);
END_IF;
Day:=WORD_TO_STRING( fbTime.systemTime.wDay);(*wenn kleiner 10 dann mach daraus "09" *)
IF fbTime.systemTime.wDay < 10 THEN
Day:=CONCAT(STR1:='0',STR2:=Day);
END_IF;
Hour:=WORD_TO_STRING( fbTime.systemTime.wHour);
IF fbTime.systemTime.wHour < 10 THEN
Hour:=CONCAT(STR1:='0',STR2:=Hour);
END_IF;
Minute:=WORD_TO_STRING( fbTime.systemTime.wMinute);
IF fbTime.systemTime.wMinute < 10 THEN
Minute:=CONCAT(STR1:='0',STR2:=Minute);
END_IF;
Sec:=WORD_TO_STRING( fbTime.systemTime.wSecond);
IF fbTime.systemTime.wSecond < 10 THEN
Sec:=CONCAT(STR1:='0',STR2:=Sec);
END_IF;
(************************************************************************)

XML_Year:=CONCAT(STR1:='D_',STR2:=Year);(* Und "D_2013 *)
XML_Month:=CONCAT(STR1:='_',STR2:=Month);(* "D_2013_10" *)
XML_Day:=CONCAT(STR1:='_',STR2:=Day);(* "D_2013_10_20" = Datum als String*)
XML_Hour:=CONCAT(STR1:='T_',STR2:=Hour);(* "T_20" *)
XML_Minute:=CONCAT(STR1:='_',STR2:=Minute);(*"T_20_30" *)
XML_Sec:=CONCAT(STR1:='_',STR2:=Sec);(*"T_20_30_59" = Zeit *)

Year:=CONCAT(STR1:=Year,STR2:='-');(*Eine andere Variante*)
Month:=CONCAT(STR1:=Month,STR2:='/');
Day:=CONCAT(STR1:=Day,STR2:='/');
Hour:=CONCAT(STR1:=Hour,STR2:=':');
Minute:=CONCAT(STR1:=Minute,STR2:=':');

DT_String:=CONCAT(STR1:=Day,STR2:=Month);
DT_String:=CONCAT(STR1:=DT_String,STR2:=Year);
DT_String:=CONCAT(STR1:=DT_String,STR2:=Hour);
DT_String:=CONCAT(STR1:=DT_String,STR2:=Minute);
DT_String:=CONCAT(STR1:=DT_String,STR2:=Sec);




XML_Datum:=CONCAT(STR1:=XML_Year,STR2:=XML_Month);
XML_Datum:=CONCAT(STR1:=XML_Datum,STR2:=XML_Day);
XML_Time:=CONCAT(STR1:=XML_Hour,STR2:=XML_Minute);
XML_Time:=CONCAT(STR1:=XML_Time,STR2:=XML_Sec);



Irek
 
Zuletzt bearbeitet:
Hallo Irek,

vielen Dank für deine ausführliche Hilfe! Ich habe die Lösung mit den STRING jetzt einsetzen können.

Viele Grüße,

Nils
 
Zurück
Oben