le 02-16-2012 02:12 PM
Bonjour à tous,
J'ai lu dans un post, et également dans la doc LV, qu'il était risqué voir déconseillé
d'utiliser la fonction "Wait(ms)" pour mesurer une durée d'exécution.
S'il y a "dépassement", de (2^32)-1 à 0, la mesure est faussée.
Je ne suis certainement, ni le seul, ni le premier à avoir cherché une solution,
je propose la mienne ... si quelqu'un à trouvé autres choses, ou une autre approche,
cela m'intéresse.
Ceci dit, je pense que le compteur en question est remis à zero à chaque mise sous tension du PC,
il faut donc attendre un peu plus de 49 jours pour avoir un petit rique de dépassement.
voici ma solution:
Résolu ! Accéder à la solution.
le 02-16-2012 03:35 PM
not+(+1) représente le complément à 2 (instruction "neg" en assembleur X86)
La fonction n'est pas proposée dans LV, je l'ai ajoutée.
le 02-17-2012 02:10 AM
Cette précaution est inutile !
Pour vous en convaincre, un petit exemple qui simule le débordement pour le type U8. Vous verrez que même au passage de 255 à 0, la différence est de 1. Autrement dit, la soustraction des entiers U8 0 - 255 = 1.
02-17-2012 02:14 AM - modifié 02-17-2012 02:17 AM
C'est vrai que 49 jours dans la majorité des cas ça suffit largement.
Sinon, il y a un article dans la Base de Connaissance dans lequel NI conseille d'utiliser la fonction "Get Date/Time in Seconds" si la durée à mesurer est importante.
Cet autre article interessant explique la différence de résolution entre les deux fonctions
le 02-17-2012 02:31 AM
Bien vu JB, merci pour l'info.
le 02-17-2012 02:40 AM
02-17-2012 02:55 AM - modifié 02-17-2012 03:00 AM
JB ... rien avoir avec le passage de 255 à 0.
Mais bien de 4294967295 à 0.
Si vous prélevez le compteur à 4294967280, et que votre VI prend 17ms
votre mesure de temps sera fausse.
Quand aux 49 jours (2^32 ms), il suffit d'un équipement qui reste sous tension en permanence.
Et pour l'autre méthode (Helmut), perso je préfère une mesure directe en ms.
base de connaissance; "... restarting the computer can be used as a method to reset the tick count."
amusant comme méthode ... si un process important est en cours.
ma solution évite cela.
02-17-2012 03:08 AM - modifié 02-17-2012 03:11 AM
ouadji a écrit :
JB ... rien avoir avec le passage de 255 à 0.
Mais bien de 4294967295 à 0.
Si vous prélevez le compteur à 4294967280, et que votre VI prend 17ms
votre mesure de temps sera fausse.
J'ai fait un exemple avec un U8 pour éviter une boucle avec un grand nombre d'itérations (2^32) mais le principe est le même avec tous les types d'entiers (U16, U32, U64).
Ce que vous dites est faux !
En 17ms, le compteur de l'horloge aura passé de 4294967280 à 1. Faites donc la soustraction U32 1 - 4294967280 et vous serez probablement surpris par le résultat.
le 02-17-2012 03:20 AM
désolé pour le "255 à 0" ... je n'avais pas compris l'analogie.
Et pour le reste ... vous avez raison, au temps pour moi.
C'est évident en plus.
(Je suis sans café depuis 3 jours, ça doit être ça )