Re: Soustraction format DATE
Posté : 18 nov. 2016, 18:34
Sinon, le format DATE, c'est du BCD, tu peux aussi récupérer les années / mois / jours indépendamment dans différents INT pour faire tes soustractions ensuite.
Forum d'automatisme, entraide et partage des automates industriels.
https://forum-automatisme.net/
Avec l'autorisation de geronimogeronimo a écrit :merci beaucoup
Je suis sur une idée, je la poste dès que sa marche
Code : Tout sélectionner
(*
==========================================================================================
Fonction identique à DATE_TO_DINT sur siemens Step7 (SCL)
Renvoi le numéro du jour depuis le 01/01/1990 en commençant par 0
==========================================================================================
Cyril93
==========================================================================================
*)
(* Séparation de la date en 3 INT *)
DateArray := DATE_TO_ARINT (IN := IN_DATE);
year:= BCD_TO_INT(DateArray[1]);
month:=BCD_TO_INT(SHR(DateArray[0],8));
day:=BCD_TO_INT(DateArray[0] AND 16#00FF);
(* Initialise le résultat à chaque tour de cycle *)
RESULT:=0;
(* Ajoute les jours par année depuis 1990 jusqu'à l'année n-1 *)
For i:=1990 To year-1 DO
IF SHL(i,14)=0 THEN (* Année bissextile *)
RESULT:=RESULT+366;
ELSE
RESULT:=RESULT+365;
END_IF;
END_FOR;
(* Ajoute les jours par mois jusqu'au mois n-1 *)
For i:=1 To month-1 DO
CASE i OF
1,3,5,7,8,10,12 : RESULT:=RESULT+31;
4,6,9,11: RESULT:=RESULT+30;
2: IF SHL(year,14)=0 THEN
RESULT:=RESULT+29;
ELSE
RESULT:=RESULT+28;
END_IF;
END_CASE;
END_FOR;
(* Ajoute le nombre de jour du mois courant *)
RESULT:=RESULT+INT_TO_DINT(day);
RESULT:=RESULT-1; (* Résultat -1 pour être identique à DATE_TO_DINT Siemens Step7 *)
Code : Tout sélectionner
(*
==========================================================================================
Fonction inverse à DATE_TO_DINT
Renvoi la DATE depuis le numéro du jour
==========================================================================================
Cyril93
==========================================================================================
*)
(* Initialise les variables *)
temp:=IN_DAY;
year:=1990;
month:=01;
day:=01;
(* calcul de l'année *)
WHILE temp >= 365 DO
IF SHL(year,14)=0 THEN (* Année bissextile *)
temp:=temp-366;
ELSE
temp:=temp-365;
END_IF;
IF temp< 0 THEN
EXIT;
END_IF;
year:=year+1;
END_WHILE;
(* calcul du mois *)
IF SHL(year,14)=0 THEN
monthArray[2]:=29;
ELSE
monthArray[2]:=28;
END_IF;
REPEAT
IF temp >= INT_TO_DINT(monthArray[month]) THEN
CASE month OF
1,3,5,7,8,10,12 : temp:=temp-31;
4,6,9,11: temp:=temp-30;
2: IF SHL(year,14)=0 THEN
temp:=temp-29;
ELSE
temp:=temp-28;
END_IF;
END_CASE;
month:=month+1;
END_IF;
UNTIL temp < INT_TO_DINT(monthArray[month])
END_REPEAT;
(* Reste le jour *)
IF temp = -1 THEN
day:=monthArray[12];
month:=12;
ELSE
day:=DINT_TO_INT(temp+1);
END_IF;
(* converti au format DATE *)
DateArray[1]:=INT_TO_BCD(IN:=year);
DateArray[0]:=SHL(INT_TO_BCD(month),8) OR INT_TO_BCD(day AND 16#00FF);
RESULT_DATE:=ARINT_TO_DATE(IN:=DateArray);