Funzione che calcola il numero della settimana dell’anno secondo il sistema ISO (https://en.wikipedia.org/wiki/ISO_week_date). Quindi tale funzione calcola il numero della settimana usando il seguente algoritmo:
Esempio: Friday 26 September 2008
Ordinal day: 244 + 26 = 270
Weekday: Friday = 5
270 − 5 + 10 = 275
275 / 7 = 39.28…
Risultato: Week 39
La funzione che andiamo a creare userà la funzione “numero_giorno_anno” precedentemente creata in un altro articolo (link).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | FUNCTION "numero_settimana" : Void { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT data_input : Date_And_Time; END_VAR VAR_OUTPUT num_sett : Int; END_VAR VAR_TEMP data_in_tmp : Date_And_Time; data_array AT data_in_tmp : Array[0..7] of Byte; num_giorno_anno : Int; giorno_settimana : Int; tmp_real : Real; END_VAR BEGIN // calcolare il numero della settimana in corso #data_in_tmp := #data_input; //uso la funzione numero_giorno_anno per trovare //il numero del giorno dell'anno "numero_giorno_anno"(data_in := #data_input, num_giorno => #num_giorno_anno); // trasforma in un intero i 4 LSB di data_array[7] #giorno_settimana := BCD16_TO_INT(16#0f AND #data_array[7]); //modifico giorno_settimana in modo da avere //giorno_settimana=1 per lunedi invece che per domenica //... giorno_settimana=7 per domenica invece che per sabato. #giorno_settimana := #giorno_settimana - 1; IF #giorno_settimana = 0 THEN #giorno_settimana := 7; END_IF; #tmp_real:= (#num_giorno_anno - #giorno_settimana + 10) / 7; #num_sett := TRUNC(#tmp_real); END_FUNCTION |
Potete scaricare i sorgenti da questo link –>> Donwload