-> Hier kostenlos registrieren
Hallo,
ich hänge momentan ein wenig in der Luft. Vllt könnt ihr mir nen denkanstoß verpassen.
Ich versuche gerade Krampfhaft die Systemzeit meiner CPU einzustellen. Über den SFC0 mit direkter vorgabe des Datums und der Uhrzeit KEIN Problem.
Jetzt will ich aber Tag, Monat, Jahr, Stunde und Minute separat über das Panel eingeben können. Meinen "ersten" entwurf mit den Grundfunktionen seht
ihr am Ende der Nachricht.
Mein Problem schein so wie ich es meine folgendes zu sein:
ArZeitSchreiben AT ZeitSchreiben : ARRAY[0..7] OF BYTE;
.
.
ArZeitSchreiben[0] := INT_TO_BCD(Jahr);
ArZeitSchreiben[1] := INT_TO_BCD(Monat);
.
.
.
Diese beiden Variablentypen (BCD und BYTE) Vertragen sich nicht (Ungültiger Datentyp). Mit der INT Zahl die ich im Panel eingebe kann ich über INT_TO_BYTE nur die Zahlen von 1 bis 8 bzw. dann 16 für 10 verwenden ,
da ja das BCD Format erwartet wird, und sich ab da iwann unterscheidet.
Jetzt hab ich schon ein wenig gegoogelt und finde leider keine Möglichkeit wie ich den sch... so zu konvertieren, dass ich ihn rüberschreiben kann.
Ich hoffe ihr könnt mir da weiter helfen!
ich hänge momentan ein wenig in der Luft. Vllt könnt ihr mir nen denkanstoß verpassen.
Ich versuche gerade Krampfhaft die Systemzeit meiner CPU einzustellen. Über den SFC0 mit direkter vorgabe des Datums und der Uhrzeit KEIN Problem.
Jetzt will ich aber Tag, Monat, Jahr, Stunde und Minute separat über das Panel eingeben können. Meinen "ersten" entwurf mit den Grundfunktionen seht
ihr am Ende der Nachricht.
Mein Problem schein so wie ich es meine folgendes zu sein:
ArZeitSchreiben AT ZeitSchreiben : ARRAY[0..7] OF BYTE;
.
.
ArZeitSchreiben[0] := INT_TO_BCD(Jahr);
ArZeitSchreiben[1] := INT_TO_BCD(Monat);
.
.
.
Diese beiden Variablentypen (BCD und BYTE) Vertragen sich nicht (Ungültiger Datentyp). Mit der INT Zahl die ich im Panel eingebe kann ich über INT_TO_BYTE nur die Zahlen von 1 bis 8 bzw. dann 16 für 10 verwenden ,
da ja das BCD Format erwartet wird, und sich ab da iwann unterscheidet.
Jetzt hab ich schon ein wenig gegoogelt und finde leider keine Möglichkeit wie ich den sch... so zu konvertieren, dass ich ihn rüberschreiben kann.
Ich hoffe ihr könnt mir da weiter helfen!
Code:
FUNCTION_BLOCK FB350
VAR
ZeitGelesen : DATE_AND_TIME;
ZeitSchreiben : DATE_AND_TIME;
ArZeitSchreiben AT ZeitSchreiben : ARRAY[0..7] OF BYTE;
FreigabeLesen : BOOL;
FreigabeLesenAlt : BOOL;
FreigabeSchreiben : BOOL;
FreigabeSchreibenAlt : BOOL;
Tag : INT;
Monat : INT;
Jahr : INT;
Stunde : INT;
Minute : INT;
Sekunde : INT;
FehlerLesen : INT;
FehlerSchreiben : INT;
END_VAR
IF(FreigabeLesen AND NOT FreigabeLesenAlt) THEN
FehlerLesen := READ_CLK(CDT := ZeitGelesen);
END_IF;
IF(FreigabeSchreiben AND NOT FreigabeSchreibenAlt) THEN
IF Monat < 1 THEN
Monat := 1;
END_IF;
IF Monat > 12 THEN
Monat := 12;
END_IF;
//IF Jahr < 2012 THEN
// Jahr := 2012;
//END_IF;
CASE Monat OF
01, 03, 05, 07, 08, 10, 12: //JANUAR, März, Mai, ...
IF(Tag > 31) THEN
Tag := 31;
END_IF;
IF(Tag < 1) THEN
Tag := 1;
END_IF;
02: //Februar
IF( NOT (((Jahr MOD 4) = 0) AND ((Jahr MOD 100) <> 0) AND ((Jahr MOD 400) = 0))) THEN
IF(Monat = 2 AND Tag > 28) THEN
Tag := 28;
END_IF;
ELSIF(Tag > 28) THEN
Tag := 28;
END_IF;
IF(Tag < 1) THEN
Tag := 1;
END_IF;
04, 06, 09, 11: //April, Rest
IF(Tag > 30) THEN
Tag := 30;
END_IF;
IF(Tag < 1) THEN
Tag := 1;
END_IF;
END_CASE;
ArZeitSchreiben[0] := INT_TO_BCD(Jahr);
ArZeitSchreiben[1] := INT_TO_BCD(Monat);
ArZeitSchreiben[2] := INT_TO_BCD(Tag);
ArZeitSchreiben[3] := INT_TO_BCD(Stunde);
ArZeitSchreiben[4] := INT_TO_BCD(Minute);
ArZeitSchreiben[5] := INT_TO_BCD(Sekunde);
FehlerSchreiben := SET_CLK( PDT := ZeitSchreiben);
END_IF;
FreigabeSchreibenAlt := FreigabeSchreiben;
FreigabeLesenAlt := FreigabeLesen;
;
END_FUNCTION_BLOCK