Konvertierungsfunktionen
... anbei hab ich mal den Code angehängt. Wie gesagt das Problem liegt beim auslesen und umwandeln der Jahreszahl.
[/CODE]TITLE = 'Tageszahl'
VERSION : '1.0'
AUTHOR :
NAME : name
FAMILY : family
FUNCTION Tageszahl_SCL: VOID
// Variablendeklartion
VAR_OUTPUT
Tageszahl: INT; // Aktuelle Tageszahl
TageImJahr:INT; // 365 oder 366 Tage???
Jahreszahl:INT;
END_VAR
VAR_TEMP
Tag:INT;
Monat:INT;
Date_Time:INT;
IstEinSchaltjahr:BOOL;
Jahr:INT;
Zaehler:INT;
END_VAR
VAR
TageImMonat: ARRAY[1..12] OF INT;
SPS_Datum_Uhrzeit : DATE_AND_TIME ;
a_Datum_Uhrzeit AT SPS_Datum_Uhrzeit : ARRAY [0..7] OF BYTE;
END_VAR
BEGIN
// Auslesen der der SPS Zeit und der Datumsangaben
Date_Time := READ_CLK (CDT:= SPS_Datum_Uhrzeit);
// Datum mit vierstelliger Jahreszahl aus Systemdatum ermitteln
Jahr:= WORD_TO_INT(BYTE_TO_WORD(a_Datum_Uhrzeit[0]));//
// Beim auslesen von BYTE 0 ist vor der konvertierung die reichtige Jahreszahl angezeigt,
// bei Jahreszahlen ab 2010 wird nach der Konverterung eine größere Zahl angezeigtnach.
Monat:= WORD_TO_INT(BYTE_TO_WORD(a_Datum_Uhrzeit[1]));
Tag:= WORD_TO_INT(BYTE_TO_WORD(a_Datum_Uhrzeit[2]));
IF Date_Time >= 90
THEN Jahreszahl := Jahr + 1900;
ELSE Jahreszahl := Jahr + 2000;
END_IF;
// Ist ein Schaltjahr???
// Die Regel lautet: Alles, was durch 4 teilbar ist, ist ein Schaltjahr.
// Es sei denn, das Jahr ist durch 100 teilbar, dann ist es keins.
// Aber wenn es durch 400 teilbar ist, ist es doch wieder eins.
IF (Jahreszahl MOD 400 = 0) OR
(Jahreszahl MOD 4 = 0) AND
(Jahreszahl MOD 100 <> 0)
THEN IstEinSchaltjahr := true;
ELSE IstEinSchaltjahr := false;
END_IF;
// Bestimmung der Anzahl Tage im Jahr in Abhängigkeit vom Schaltjahr
IF IstEinSchaltjahr = true
THEN TageImJahr:=366;
ELSE TageImJahr:=365;
END_IF;
// Berchnung der Tageszahl
//
// Wertezuweisung Array TageImMonat
TageImMonat [1]:= 31; // Januar
TageImMonat [2]:= 28; // Februar
TageImMonat [3]:= 31; // März
TageImMonat [4]:= 30; // April
TageImMonat [5]:= 31; // Mai
TageImMonat [6]:= 30; // Juni
TageImMonat [7]:= 31; // Juli
TageImMonat [8]:= 31; // August
TageImMonat [9]:= 30; // September
TageImMonat [10]:= 31; // Oktober
TageImMonat [11]:= 30; // November
TageImMonat [12]:= 31; // Dezember
// Anfangswerte setzen
Tageszahl := 0; // Tageszahl auf Anfangswert 0
Zaehler:=1; // Zähler auf Anfangswert 1
IF Monat > 1 AND Monat <=18 THEN // IST Monat größer 1(Jan.) und kleiner-gleich 12 (Dez.) DANN
FOR Zaehler := 1 TO Monat-1 BY 1 DO // SOLL über FOR-Schleife von 1 bis Monat-1
Tageszahl := Tageszahl+TageImMonat[Zaehler]; // die Tageszahlen aufsummiert werden
Zaehler:= Zaehler +1; // Zähler wird pro Durchlauf um 1 erhöht
END_FOR;
Tageszahl:= Tageszahl+Tag;
ELSE Tageszahl := Tag;
END_IF;
END_FUNCTION