Utilisation de Date et Heure dans Codesys [CodeSys]
Suite a plusieurs demande, je vais vous faire quelques petits Tuto sur la gestion de la date et de l’heure dans votre programme codesys
D’ailleurs n’hésiter pas a m’indiquer les sujets qui vous intéressent
Afin de récupérer les infos, l’automate se synchronise à un serveur NTP
Vous aurez effectué cette configuration en vous rendant sur les pages de paramétrage de votre automate
Pour info si vous avez une FreeBox V6 sur votre réseau, celle-ci assure la fonction de serveur NTP, sinon grâce a google vous trouverez plusieurs adresses
Dans les bibliothèques, il faudra ajouter la SYSTIME.LIB qui ajoute les fonctions qui permettent d’extraire le temps de l’automate
Cette Bibliothèque inclus deux fonctions et deux structures
Fonctions :
CurTime – Va vous permettre d’extraire les données de temps système, le résultat sera écrit sur la structure » SysTime64 » composé des données » ulLow » et » ulHigh »
Cette fonction ne nous sera pas utile car les données retourné sont difficilement exploitable
CurTimeEx – Dans celle-ci on retrouve le résultat de CurTime avec en plus des données beaucoup plus commode pour nous, c’est a dire l’heure la date et le jour de la semaine
chaque donnée sera retourné sur un intégral on aura 10 données, année, mois, jour, heure…
C’est celle-ci que l’on va utiliser
Dans ce pdf retrouver les infos de cette bibliothèque : syslibtime.pdf
Le programme est relativement simple
Données a déclarer en global
VAR_GLOBAL
(* Déclaration des données pour le temps *)
CurDate : DINT; (*Déclaration de la double int pour la date *)
CurTime : DINT; (* Déclaration de la double int pour le temps *)
DTNow: SystemTimeDate;
STNow: SysTime64;
END_VAR
Puis le programme
Déclaration
PROGRAM PRG_ST_ExtracHour
VAR
GetExtractCurrentTime:CurTimeEx; (* Declaration de la fonction d’extraction du temps *)
END_VAR
Le programme en lui même
(* Gestion de la date et de l’heure dans les différents module*)
DTNow.Year := 0; (* Recupere l’année *)
DTNow.Month := 0; (* Recupere le mois *)
DTNow.Day := 0; (* Recupere le jour *)
DTNow.Hour := 0; (* Recupere l’heure *)
DTNow.Minute := 0; (* Recupere les minutes *)
DTNow.Second := 0; (* Recupere les secondes *)
DTNow.DayOfWeek := 0; (* Recupere la valeur pour le jour de la semaine 1=Lundi, 2=Mardi….. *)
STNow.ulHigh := 0; (* Temps systeme *)
STNow.ulLow := 0; (* Temps systeme *)
GetExtractCurrentTime(SystemTime:=STNow , TimeDate:=DTNow ); (* Extraction du temps courant pour charger les variables précédente *)
CurTime:=DTNow.Hour*10000+DTNow.Minute*100+DTnow.Second; (* On concatene les données du temps pour n’en faire q’une seule variable qui sera utilisable plus facilement *)
CurDate:=DTNow.Day*1000000+DTNow.Month*10000+DTNow.Year; (* Pareil pour la date *)
Comme vous avez pu le voir je concatène la date et l’heure pour ne former que une seule variable (CurTime & CurDate), cela aura l’avantage de vous faciliter les opérations de comparaison avec un événement a gérer
Par exemple si vous voulez que la ventilation fonctionne entre 8H du matin et 17H le programme sera du style suivant
IF CurTime>80000 and CurTime<170000 then
b_Ventilation:=TRUE;
ELSE
b_Ventilation:=FALSE;
END_IF
Dans l’archive suivante vous retrouverez les quelques morceaux de programme, ainsi que les bibliothèques utilisé


Bonjour,
Avez-vous une solution que que l’automate gère l’heure d’été/hiver?
Merci
Il existe une bibliothèque daylight saving qui te permet de le faire, ou plus simplement tu peut récupérer l’archive au lien suivant et l’intégrer a ton programme , sa le fera automatiquement
http://www.wagocatalog.com/okv3/Download_files/ApplicationNote_DaylightSaving.zip
Merci Cyril de ta réponse.
Mais lorsque je lance le programme de test, que je simule le dernier dimanche de mars, j’ai bien la variable Summer qui change d’état mais pas l’horloge.
Une erreur de ma part?
Merci
Tu a inséré le programme dans un programme existant ou le teste tu tel que dans l’archive telechargé ?
J’ai testé celui qui est dans l’archive (Example_DaylightSaving.pro).
Ensuite je l’ai transféré dans un 750-881, démarrer, dans PLC_VISU je modifie l’heure et la date ( DT#2012-03-25-01:59:45 ), je clique sur « Set Clock ». Et à 2:00, je passe de « Winter » à « Summer » mais l’horloge ne change pas d’heure.
Je l’ai mis en place dans mon programme hier soir, mais j’ai pas testé le changement d’heure, je fait l’essai dé que j’ai du temps
Il semble que ce programme était destiné aux 841, il y a peut être une différence au niveau de la gestion de l’heure entre les appareil d’ancienne génération et les nouveaux
J’ai contacté WAGO pour le problème de passage à l’heure d’été.
Pour que le bloc fonctionnel fonctionne sur un 750-881, il faut que le firmware soit le 01.02.05 (03).
J’étais en 01.02.02 (03).
Tu a quel CPU?
J’ai un 880
Il ton envoyer le firmware?
Oui.
Par contre je ne sais pas si il est compatible avec le 880.
Meme problème avec le 880 l’heure ne change pas lors du passage a summer
Le Firmware ne doit pas être compatible puisque le 880 a les fcts de la carte SD en plus
A tu eu le temps d’essayer avec le nouveau firmware ?
Oui, et maintenant ça fonctionne.
Contact le support de Wago ou peut être que le firmware est sur leur site.
Impecable, merci de l’info
Demain je ferai un petit mail Mr Wago pour le firmware