Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Méthodes Thorlabs dans LabVIEW

Résolu !
Accéder à la solution

Bonjour,


Cela fait plusieurs semaines que je ne parviens pas à résoudre un problème pourtant assez simple.

 

Comme je l'avais évoqué dans d'autres sujets, je développe actuellement une application LabVIEW permettant de commander des actionneurs Z825 à l'aide de servo-moteurs TDC001 de la marque Thorlabs. Je suis parevenu à réaliser de nombreuses fonctions (avancer/reculer d'un pas, avancer/reculer jusqu'à consigne de position, aller en butée, etc) dont une fonction d'initialisation. A ce propos, j'avais également éprouvé des difficultés à réaliser cette fonction mais j'ai finalement fini par trouver une solution en ajoutant des temporisations.

 

Bref, il me reste une dernière fonction à développer et elle est essentielle pour mon application. Il s'agit en fait d'une fonction permettant d'avancer et de réculer l'actionneur par appui sur les boutons "avancer" et "reculer". Pour cela, il existe les méthodes ActiveX qui vont bien :

 

  • MoveVelocity : initie un déplacement (en avant ou en arrière selon la valeur de IDirection) à vitesse constante sans point d'arrivée.
  • StopImmediate : arrête le déplacement du moteur immédiatement.

Comme on peut le constater, pour réaliser un mouvement, il faut invoquer la première méthode puis la seconde pour l'arrêter.

 

Dans mon cas, je souhaiterais le comportement suivant :

 

  1. L'utilisateur veut entreprendre un mouvement. Il appuie et maintient la pression sur le bouton tant qu'il veut que l'actionneur avance (ou recule).
  2. Une fois que l'actionneur est arrivé à la bonne position, l'utilisateur relâche la pression sur le bouton.

La méthode MoveVelocity est appelée à l'étape 1. La méthode StopImmediate est appelée à l'étape 2.

 

Ca n'a pas l'air très compliqué présenté comme ça, néanmoins, cela fait des semaines que je sèche car je ne parviens pas à trouver la solution. J'arrive exécuter la méthode MoveVelocity, mais pas la seconde ce qui envoie mon actionneur "dans les choux".

 

Comment pourrais-je m'y prendre ?


Merci pour votre aide.

Cordialement,

Che57

0 Compliments
Message 1 sur 10
4 024 Visites

Bonjour,

 

Quel type d'architecture utilisez vous pour réaliser cela?


Si on résume vous souhaitez :

- qu'à l'appui sur un bouton le programme exécute l'action n°1 (MoveVelocity)

- qu'au relâchement du même bouton vous souhaitez exécuter l'action n °2 (StopImmediate)

 

En utilisant une structure événement avec les événements souris appuyé, puis souris relâché, en insérant dans chacune des deux conditions les actions correspondante, cela devrait réaliser ce que vous souhaitez.

 

Cdlt,

0 Compliments
Message 2 sur 10
4 020 Visites

Bonjour fab1 et merci tout d'abord pour votre réponse.

J'ai essayé d'implémenter cette fonction en utilisant une structure événement.

Cette solution fonctionne mais j'ai alors un autre problème qui apparait : mes autres fonctions, utilisant des boucles IF avec comme conditions un bouton ne fonctionnent plus.

0 Compliments
Message 3 sur 10
4 017 Visites

Re-

 

Je ne comprends pas où sont situées vos autres fonctions? Dans la structure événement?

 

Dans la structure événement, tout pendant que l'on est dans une condition, les autres ne seront pas réalisées. Il faut dans ce cas passer par une structure producteur/consommateur basé événement.(fichier-> nouveau->vi->à partir d'un modèle->modèle de conception).

 

Il y a une autre chose que j'ai du mal comprendre; votre action 'MoveVelocity' fonctionne continuellement?

Si c'est le cas, et si vous souhaitez lancer d'autres actions en parallèle, il faudrait insérer une seconde boucle consommateur (ou utiliser un vi server)

 

Cdlt,

0 Compliments
Message 4 sur 10
4 014 Visites

fab1 a écrit :

Re-

 

Je ne comprends pas où sont situées vos autres fonctions? Dans la structure événement?

 

Mes autres fonctions sont situées dans mon programme principal (boucle while).

 

Dans la structure événement, tout pendant que l'on est dans une condition, les autres ne seront pas réalisées. Il faut dans ce cas passer par une structure producteur/consommateur basé événement.(fichier-> nouveau->vi->à partir d'un modèle->modèle de conception).

 

Dans ma structure événement il n'y a aucune structure condition.

 

Il y a une autre chose que j'ai du mal comprendre; votre action 'MoveVelocity' fonctionne continuellement?

Si c'est le cas, et si vous souhaitez lancer d'autres actions en parallèle, il faudrait insérer une seconde boucle consommateur (ou utiliser un vi server)

 

J'ignore si la méthode MoveVelocity fonctionne en permanence...

 

Cdlt,


Je vous ai joint le VI pour y voir plus clair.

0 Compliments
Message 5 sur 10
4 008 Visites

Bonjour,

 

Je viens de regarder votre vi.

 

Différentes remarques :

 

Il y a deux séquence événement dans la même boucle while, pourquoi ne pas tout regrouper dans la même?

 

Ensuite dans la même boucle while il y a la structure événement, et tout un tas d'autre choses, donc votre structure condition IF.

Comment fonctionne la boucle while? La boucle réalise l'ensemble des actions a l'intérieur, puis recommence.

Dans votre cas, si vous n'appuyez sur aucun bouton, aucune condition de la structure événement ne se déclenche, on attend indéfiniment (pour vous en rendre compte insérer un indicateur sur le 'i' de la boucle while).

C'est de la que viennent vos problèmes de réactivité sur les boutons.

 

Pour y remédier, mettez un timeout sur la structure événement (câblez sur le sablier en haut a gauche).

 

Le mieux serait tout de même d'extraire toutes vos actions dans une boucle consommateur et laisser dans la boucle while actuel une seul structure événement.

 

Cdlt,

Message 6 sur 10
3 999 Visites

Je vous remercie d'avoir jeté un oeil sur mon VI.

 

Pour ce qui est de la boucle While, son but est de lire l'état de tous les boutons de commande (init, valPosX, etc) durant l'exécution de mon VI, mais également d'exécuter une méthode ActiveX permettant de connaitre la position courante de mes 3 actionneurs. Si j'arrête sur bouton "Arrêter le VI", je sors de cette boucle While et le programme prend fin. Il a le même comportement qu'une boucle infinie en C dans un PIC...

 

Vous avez raison, j'aurais pu utiliser une seule structure événement, il s'agit d'une erreur de ma part.

 

J'ai mis un indicateur sur le "i" de la boucle While, et en effet, durant l'exécution du VI, elle s'incrémente indéfiniement. Ce comportement n'est-il pas normal ?

 

Et donc, j'ai ajouté un timeout de 100 à ces structures, en supposant qu'il s'agisse de milliseconde et là, tout fonctionne, aussi bien les structures événement que toutes les structures IF conditionnées par mes boutons !

 

Si je comprend bien, en omettant ce timeout, la structure événement est sans arrêt scrutée ?

 

 

Merci infiniement fab1 !

 

0 Compliments
Message 7 sur 10
3 996 Visites

J'aurais une autre question.

 

J'ai fait en sorte que le bouton permettant d'avancer soit désactivé et grisé si jamais mon actionneur dépasse une valeur limite. J'ai pour cela utilisé la propriété "désactivé" de ce bouton.

 

Lorsque la valeur limite est dépassée, le bouton est bien grisé et désactivé, mais par contre, un appui sur celui-ci provoque tout de même l'exécution du code, en l'occurence avancer l'actionneur.

 

On dirait que la structure événement exécute le code rattaché au bouton pour l'événement "souris appuyé" même s'il est désactivé et grisé.

 

Est-il possible de désactiver momentanément un événement ?

 

Je vous remercie.

Bonne journée.

Cordialement,

Che57

0 Compliments
Message 8 sur 10
3 982 Visites

J'ai finalement trouvé : j'ai ajouté dans ma structure événement une structure condition. En gros, si ma valeur est atteinte ou dépassée, je ne fais rien, sinon j'exécute la méthode permettant d'avancer l'actionneur.

 

J'aurais dû réfléchir avant..

0 Compliments
Message 9 sur 10
3 978 Visites
Solution
Accepté par l'auteur du sujet Che57

Bonjour,

 

 

Si je comprend bien, en omettant ce timeout, la structure événement est sans arrêt scrutée ?

 


SI vous ne mettez pas de timeout, la structure événement est en attente d'un événement, elle ne s'exécute donc pas. Il y a comme une pause dans le programme.

 

J'ai mis un indicateur sur le "i" de la boucle While, et en effet, durant l'exécution du VI, elle s'incrémente indéfiniment. Ce comportement n'est-il pas normal ?

 

 

Oui c'est le comportement normal apres avoir mis un timeout dans la structure événement. Avant , ce compteur ne devait pas incrément, ce qui posait problème pour vos structure IF.

 

Et donc, j'ai ajouté un timeout de 100 à ces structures, en supposant qu'il s'agisse de milliseconde et là, tout fonctionne, aussi bien les structures événement que toutes les structures IF conditionnées par mes boutons !

 

Le temps est bien en millisecondes. Vos structures conditions sont( rafraîchies (re exécuter ) toutes les 100 millisecondes, dès que la structure evenement passe en timeout (on relance une exécution de la boule while)

 

On dirait que la structure événement exécute le code rattaché au bouton pour l'événement "souris appuyé" même s'il est désactivé et grisé.

 

Et oui votre action est 'souris appuyé'. Même si le bouton est désactivé, la souris est bien appuyé dessus !

 

 

Est-il possible de désactiver momentanément un événement ?

 

 

Il y a une possibilité en utilisant les événements filtré.

Actuellement vous utilisez les événements notifié : un appui sur le bouton donne un événement.

Avec les événement filtré, on va pouvoir , ou non , autoriser l'action. Ce sont les événements avec la petite flèche rouge, et le point d'interrogation.

 

 

Cdlt

Message 10 sur 10
3 966 Visites