Discussion:
Incrémenter et décrémenter une valeur
(too old to reply)
breneliere-r
2006-05-03 13:40:11 UTC
Permalink
Bonjour,
Je cherche à incrémenter et décrémenter une valeur entre 0 et 5 sur un temps paramétrable à l'aide d'un bouton variant de 100ms à 1s , j'essaye avec les registres sur une boucle for et des séquences pour l'incrémentation et la décrémentation de la variable, mais je sèche un peu sur la procédure à suivre. Si quelqu'un a une idée pour faire ce programme, merci d'avance.cordialement, Roland.
JB
2006-05-04 13:10:13 UTC
Permalink
Bonjour,
 
Cette opération peut être réalisée de différentes manières. Voici une solution assez élégante faisant appel à une division entière. N'hésitez pas à en faire la demande si vous deviez être intéressé par une solution faisant appel aux registres à décalage.
 
Avec mes meilleures salutations.


Avec division entière.vi:
http://forums.ni.com/attachments/ni/70/4862/1/Avec division entière.vi
breneliere-r
2006-05-05 07:40:11 UTC
Permalink
Re bonjour,
En fait voici en pièce jointe (fichier jpg) ce que je désire faire, incrémenter une valeur de 0 à 5 (séquence 0) puis décrémenter de 5 à 0 (séquence 1) pour piloter la sortie analogique d'un module USB-6800. J'ai 2 soucis avec ce VI, je n'arrive pas à faire varier la vitesse d'incrémentation ou de décrémentation en temps réel avec le même bouton rotatif et avoir la même sortie pour l'instant sur un même graphe en temps réel. En plaçant le bouton et le graphe dans la boucle, je dois les doubler ce que je veux éviter. L'autre souci est que lors de la décrémentation, la dernière valeur (0,1-0,1) ne donne pas 0 mais une valeur 1,026968 et je ne vois pas où se trouve le problème. Si quelque'un a une idée ? Merci d'avance.
(J'utilise la version 7.1 de LAbView.) 


IncDecVal.jpg:
Loading Image...
JB
2006-05-05 13:40:13 UTC
Permalink
Voici donc l'exemple en LV7.1.
 
Avec mes meilleures salutations


Avec division entière.vi:
http://forums.ni.com/attachments/ni/70/4867/1/Avec division entière.vi
JB
2006-05-17 13:10:09 UTC
Permalink
En réponse à votre question, coici donc un exemple un peu plus complet vous permettant de définir l'incrément et la valeur maximale  --> signal triangulaire entre 0 et la valeur maximale avec l'incrément défini.
Comme vous pouvez le voir, le diagramme est à peine plus compliqué.
Avec mes meilleures salutations.


Exemple plus complet.vi:
http://forums.ni.com/attachments/ni/70/4920/1/Exemple plus complet.vi
JB
2006-05-18 12:40:13 UTC
Permalink
La fonctionnalité désirée est en effet atteinte, félicitations !
 
Je vois deux avantages à la version que je vous propose :
1) Le VI s'arrête immédiatement à la pression du bouton stop au contraire de la vôtre qui ne s'arrête qu'à la fin d'un triangle. Selon les cas, cela est plutôt un désavantage puisque la valeur est alors quelconque alors que dans votre cas, elle sera toujours nulle.
2) La modification des paramètres du triangle (amplitude et incrément) est un peu plus aisée et compréhensible. Cela faciliterait la réalisation d'un sous-vi générique avec ces deux paramètres en entrée.
 
En vous souhaitant une excellente journée
breneliere-r
2006-06-01 12:10:09 UTC
Permalink
Bonjour,
Après pas mal de tests, voici le VI que je désirais obtenir pour commander la vitesse de rotation d'un moteur ainsi que récupérer les impulsions d'un codeur pour afficher cette vitesse sur un graphique le tout avec un boitier USB-6008, cela fonctionne mais j'ai encore un dernier soucis. Dans ce VI je génère un signal triangulaire pour commander la vitesse en même temps que je gère l'acquisition des impulsions de mon codeur pour l'affichage des tr/mn. Je veux pouvoir changer la période du signal triangulaire avec un bouton rotatif qui génère un délai d'attente dans la boucle, cela fonctionne bien quand je ne fais que commander la vitesse, mais si j'ajoute la gestion des impulsions et l'affichage en tr/mn, le bouton de période n'a plus aucune incidence sur celle-ci. Je ne vois pas comment gérer ça, peut être en utilisant une carte temps réel ?
Merci d'avance pour vos suggestions, cordialement RB
Le vi est en pièce jointe.


Commande auto Moteur cc.vi:
http://forums.ni.com/attachments/ni/70/4983/1/Commande auto Moteur cc.vi
JB
2006-06-02 13:10:13 UTC
Permalink
Bonjour Monsieur Brenelière,
C'est une fois de plus moi qui vous répond. Connaissant déjà un peu votre application, il ne m'est donc pas trop difficile de la comprendre.
Le comportement que vous décrivez est tout-à-fait attendu. Vous avez en effet placé un Wait Until Next ms Multiple avec une attente définie à 1000ms dans la partie droite de la séquence servant à déterminer la vitesse de rotation. La boucle while ne peut donc en aucun cas s'exécuter plus rapidement qu'une fois par seconde. La fonction Wait (ms) s'exécute en parallèle au code se trouvant dans la boucle et ne génère donc jamais d'attente, du moins avec une plage de 0 à 1000ms pour Période [ms].
Il vous suffit donc de supprimer l'attente de 1000ms si vous désirez lire la vitesse de rotation à la même période que la génération du signal triangulaire. La vitesse d'exécution de la boucle sera alors définie par Période [ms]; la période minimale étant donnée par le temps nécessaire pour exécuter le code à l'intérieur de la boucle.
Vous devez par contre modifier quelque peu votre code si vous désirez conserver une période d'une seconde pour la lecture de la vitesse de rotation tout en ayant la possibilité de modifier la période de la génération du signal de commande triangulaire. Deux méthodes me viennent à l'esprit :
1) Mettre les parties "signal de commande" et "lecture vitesse" dans deux boucles while séparées. La période de la boucle générant le signal triangulaire est alors définie par Période [ms] et celle de la boucle de lecture par la constante du Wait Until Next ms Multiple. Il faut alors utiliser une variable locale du bouton d'arrêt pour arrêter la deuxième boucle. Cette méthode offre la meilleure flexibilité pour les périodes des deux boucles puisqu'elles s'exécutent en parallèle à leurs périodes propres.
2) Conserver une seule boucle mais mettre la partie "lecture vitesse" dans un case True/False afin de pouvoir l'exécuter conditionnelement. Vous pourrez donc soit l'exécuter toutes les X itérations de la boucle (X = Période lecture/Période génération) ou lorsque le temps écoulé depuis la dernière exécution à atteint la période de lecture voulue. L'une et l'autre variante sont très faciles à mettre en oeuvre mais la période de lecture sera moins précise qu'avec deux boucles while parallèle puisqu'elle sera dépendante et forcément plus grande ou égale à la période de la génération du signal triangulaire.
N'hésitez pas à répondre si vous deviez avoir besoin d'aide pour mettre l'une ou l'autre solution en oeuvre.
Avec mes meilleures salutations
JB
2006-06-02 14:10:14 UTC
Permalink
Sur ma lancée, je viens de prendre un peu de temps pour coder la variante avec deux boucles en parallèle. J'en ai profité pour supprimer du code inutile dans la partie de lecture. A moins de ne me tromper, la boucle For ne sert à rien puisque vous n'entrez qu'avec une seule valeur. Elle peut donc être supprimée à condition de déplacer le registre à décalage sur la boucle while.
Veuillez noter que le comportement mécanique du bouton d'arrêt ne peut plus être du type Latch... puisqu'une variable locale doit être créée. De ce fait, il faut mettre le bouton à False avant d'exécuter les boucles. Pour simuler le comportement Latch... on le remet également à False après l'exécution des boucles.
 
Avec mes meilleures salutations
 
PS :
1) L'utilisation d'une constante pour calculer la vitesse de rotation (nombre de fronts du codeur par unité de temps) me paraît un peu dangereuse. Les vitesses seraient en effet fausses si la période de 1000ms devait être modifiée. Par conséquent je vous suggère de remplacer la constante 25 par une formule tenant compte de la période ou mieux encore de mesurer le temps réel écoulé entre deux itérations et de l'utiliser pour le calcul. Je vous ai déjà préparé le travail.
2) Je vous suggère également de ne pas afficher la première vitesse dans les graphiques puisqu'elle est systématiquement fausse.
3) Et finalement, comme le suggèrent certains : "N'hésitez pas à évaluer une réponse qui vous a été utile".
 


Commande auto Moteur cc 2 boucles parallèles.vi:
http://forums.ni.com/attachments/ni/70/4991/1/Commande auto Moteur cc 2 boucles parallèles.vi
breneliere-r
2006-06-06 14:40:11 UTC
Permalink
Bonjour,
Juste pour vous remercier pour votre aide, je ne pense pas que seul j'aurais abouti à votre VI, je suis même impressionné de la rapidité de votre réponse. Je vais supprimer, comme vous le conseillez, la constante (60) servant à calculer le Nb Tr/mn en y incorporant le temps passé pour une itération et tester l'ensemble.
Encore merci pour votre précieuse aide, bien cordialement RB
 

Loading...