CoDeSyS v3.5 : Créer une fonction pour récupérer les heures, minutes, secondes d'une variable TI
- David CHERAMY
- 22 juin 2019
- 2 min de lecture
Bonjour,
Aujourd'hui, un petit tuto simple pour récupérer le nombre d'heures, de minutes et de secondes depuis une variable de type TIME.

Dans un premier temps, regardons de plus près la variable TIME...
L'aide de CODESYS explique bien les différents types de variables concernant le temps, la date... vous trouverez cette aide en ligne sur ce lien :
Concentrons-nous sur le TIME qui est une variable 32 bits, donc elle ne peut avoir que
2^32 = 4 294 967 296 valeurs différentes (de 0 à 4 294 967 295 en décimal), ce qui peut paraître énorme mais ça correspond à 49 jours 17 heures 2 minutes 47 secondes et 295 millisecondes. Pour un compteur totalisateur de temps de production d'une machine ça peut être bloquant par exemple.
Déclaration d'une variable type TIME :
Quand vous venez d'arriver sur CODESYS et que vous connaissez bien PL7-PRO, CX-Programmer ou autres... C'est l'une des premières question que vous vous poserez, car vous utiliserez très souvent la variable TIME pour des temporisations, donc comment les déclarer ?
la variable TIME a une notion d'unité
d (jour)
h (heure)
m (minute)
s (seconde)
ms (milliseconde)
Donc il faut écrire, t# ou T# devant la valeur
(de la même façon que vous écririez 16# en hexa ou LREAL# pour une valeur en réel) :
350 millisecondes => t#350ms
20 secondes => t#20s
15 minutes => t#15m
100 secondes => t#1m40s
3 jours 2 heures 8 minutes 27 secondes 875 millisecondes => t#3d2h8m27s875ms
Comment récupérer les heures,minutes, secondes... ?
Prenons l'exemple de t#23h47m31s176ms
Comme je l'ai expliqué plus haut, la valeur maxi n'atteint pas les 50 jours, imaginons que vous souhaitez mémoriser le nombre d'heures de production de votre machine.
Vous me direz c'est simple ! Il suffit de convertir la variable TIME en variable DINT (aussi en 32bits), pour avoir la valeur en millisecondes qu'on divise par 1000 pour avoir la valeur en secondes, puis par 60 pour avoir le valeur en minutes puis par 60 pour avoir la valeur en heures... Ou diviser directement par 3600000 !
Je suis d'accord, MAIS ! la valeur sera arrondie ! Donc il faut utiliser la fonction TRUNC qui garde uniquement la valeur entière du calcul :
Déclaration :
TempsProduction : TIME;
HeuresProduction : DINT;
Programme (en ST) :
HeuresProduction := TRUNC(TIME_TO_DINT(TempsProduction) / 3600000);
Création d'une fonction que j'ai appelé TIME_TO_HOUR
Déclaration :
FUNCTION TIME_TO_HOUR : DINT VAR_INPUT In_Time : TIME; END_VAR
Programme (en ST) :
TIME_TO_HOUR := TRUNC(TIME_TO_DINT(In_Time) / 3600000 );
Ensuite dans un programme qui appelle la fonction vous écrivez :
HeuresProduction := TIME_TO_HOUR(TempsProduction);
Vous pouvez ensuite faire la même chose pour chaque unité TIME_TO_MINUTE, TIME_TO_SECOND...
A vous de jouer !!
David
ADPerformances
Comentarios