diff --git a/Times-scripts/FC_GetWeekNumber.txt b/Times-scripts/FC_GetWeekNumber.txt new file mode 100644 index 0000000..30aa7d2 --- /dev/null +++ b/Times-scripts/FC_GetWeekNumber.txt @@ -0,0 +1,56 @@ + +### 2. FC_GetWeekNumber (ISO 8601 compliant) + +```iecst +FUNCTION "FC_GetWeekNumber" : UINT +TITLE = 'Get ISO 8601 Week Number' +VERSION : 1.0 + +VAR_INPUT + stDateTime : DT; // Date & time to evaluate +END_VAR + +VAR_TEMP + iYear : INT; + iMonth : INT; + iDay : INT; + iJan1_DayOfWeek : INT; // 0=Sunday ... 6=Saturday + iDayOfYear : INT; + iDoW : INT; // Day of week of input date + iWeek : INT; +END_VAR + +BEGIN + +// Extract components +iYear := DT_TO_DATE(stDateTime).YEAR; +iMonth := DT_TO_DATE(stDateTime).MONTH; +iDay := DT_TO_DATE(stDateTime).DAY; + +// Day of week (Siemens: 1=Monday ... 7=Sunday) +iDoW := WEEKDAY(DT_TO_DATE(stDateTime)); // 1..7 + +// Approximate day of year +iDayOfYear := DAY_OF_YEAR(DT_TO_DATE(stDateTime)); + +// Find weekday of Jan 1st of the year +iJan1_DayOfWeek := WEEKDAY(DATE(iYear,1,1)); + +// ISO 8601: week 1 = week with first Thursday +// Algorithm approximation (good enough for most cases) +iWeek := (iDayOfYear + (iJan1_DayOfWeek - 1) + 3) / 7; // basic + +// Correction for years where Jan 1..3 belong to previous year +IF (iJan1_DayOfWeek >= 5) AND (iDayOfYear <= 3) THEN + iWeek := 53; // or 52 depending on year - simplified + // Better: call previous year calculation if needed +ELSIF (iJan1_DayOfWeek <= 4) AND (iDayOfYear >= 363) THEN + // Check if week 53 + IF (iDoW + (7 - iJan1_DayOfWeek)) > 364 THEN + iWeek := 53; + END_IF; +END_IF; + +"FC_GetWeekNumber" := INT_TO_UINT(iWeek); + +END_FUNCTION \ No newline at end of file