top of page
Rechercher
  • David CHERAMY

CoDeSyS v3.5 : Créer une fonction pour récupérer les heures, minutes, secondes d'une variable TI


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

1 466 vues0 commentaire
bottom of page