FUNCTION "CalendarWeek" : Int
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_TEMP
"void" : Int; // don't need a return value
DINT_Date : DInt; // Aktuelles Datum als Zahlenwert
DINT_Diff : DInt; // Jahresanfang als ZahlenWert
Slide : DInt; // Wochentagsverschiebung
DT_ref : Date_And_Time; // referenzierter Zeitstempel
DT_ref_bytes AT DT_New : Struct // aufgesplitteter zeitstempel
YY : Byte; // Jahr
MO : Byte; // Monat
DD : Byte; // Tag
hh : Byte; // Stunde
mm : Byte; // Minute
ss : Byte; // Sekunde
dc : Byte; // Dezi- und Centisekunde
md : Byte; // Millisekunde und DayCode
END_STRUCT;
END_VAR
BEGIN
(* Funktionsweise
~~~~~~~~~~~~~~
Der Code dieses Bausteins ist von folgendem VBScript inspiriert:
Option Explicit
Dim Slide, KW
Slide = (Date - 2) Mod 7
KW = Fix((Date - DateSerial(Year(Date + 3 - Slide), 1, Slide - 9)) / 7)
Bei VBScript beginnt das Format "Date" am 30.12.1899 (CLng(CDate("30.12.1899")) = 0) und in Step7 am 01.01.1990 (DATE_TO_DINT(DATE#1990-01-01) = 0).
Aus diesem Grund entfaellt in Step7 das (Date - 2).
Ferner ueberspringt DateSerial den den 0.01. bei der Berechnung mit negativen Werten (Slide - 9 kann -2..-9 betragen), weshalb die Berechnung in
Step7 auf #Slide - 10 angepasst werden muss, um am Ende das gleiche Differenzergebnis #DInt_Dat - DInt_Diff zu erhalten.
*)
//Systemzeit einlesen
#void := RD_SYS_T(#DT_ref);
//Systemzeit als Zahlenwert
#DINT_Date := DATE_TO_DINT(DT_TO_DATE(#DT_ref));
//Wochentagsverschiebeung
#Slide := #DINT_Date MOD 7;
//Verschiebung auf Systemzeit aufrechnen
#DT_ref := CONCAT_DATE_TOD(IN1 := DINT_TO_DATE(#DINT_Date + 3 - #Slide), IN2 := TOD#00:00:00);
//Datum auf den 01.01. des resultierenden Jahres aufrechnen
#DT_ref_bytes.MO := 1;
#DT_ref_bytes.DD := 1;
//Resultierendes Datum als Zahlenwert mit Wochentagsverschiebung
#DINT_Diff := DATE_TO_DINT(DT_TO_DATE(#DT_ref)) + #Slide - 10;
//Ausgabe der Kalenderwoche
#CalendarWeek := DINT_TO_INT(#DINT_Date - #DINT_Diff) / 7;
END_FUNCTION