le 05-04-2011 01:46 AM
Rebonjour à tous,
J'écris ce nouveau message pour obtenir de l'aide pour la modification de mon programme qui ne tourne pas comme j'aimerais.
J'utilise LV2010 et un moteur dont l'axe est relié à un compteur angulaire.
Fonctionnement du programme:
L'utilisateur rentre le n° de série de l'instrument à tester ainsi que le nombre de cycle de mesure à réaliser
Il clique ensuite sur le bouton START pour lancer le test
Le programme suit une certaine suite de séquence (initialisation des ports COM, déplacement du moteur, enregistrement des données) - j'utilise donc une machine à état
Je me suis concentré sur le développement de cette machine à état dont la 1ère séquence est lancé via un événement sur le bouton START.
Le problème est qu'avec la structure actuelle, je ne peux rien faire (arrêter le déplacement du moteur par ex.) tant que la suite de séquence citée ci-dessus n'est pas terminée (et elle dure environ 2 minutes...).
J'ai pu voir sur un message du forum (mais trop tard) qu'il ne fallait pas mettre de boucle while à l'intérieur d'événement.
Mais alors comment intégrer ma structure machine à état ? Que dois-je modifier?
Ci-joint, mon programme.
Quelqu'un aurait-il des solutions?
Résolu ! Accéder à la solution.
le 05-04-2011 02:42 AM
Bonjour,
Une méthode pour gérer une machine à état avec des évenements, est de la placer dans le timeout. Les différents évenements permettent de changer l'état qui sera actif dès le retour dans le timeout.
le 05-04-2011 03:01 AM
Salut Simon,
Merci pour cette réponse interressante. Je me voyais déjà utiliser une architecture producteur / consommateur avec des evennements et des queues... ![]()
Je vais essayer de voir ce que j'arrive à faire avec ta méthode qui parait plus simple et je te redis.
le 05-04-2011 03:10 AM
Cholitzu, l'architecture en producteur/consommateur, peut être combinée avec la structure évenements,il faut mettre la structure évenement dnas le producteur, l'évenement empile un ordre dnas une FIFO, et le consommateur dépile la FIFO et est une machine d'état. Sa devrait résoudre tous tes problèmes.
le 05-04-2011 03:21 AM
Salut Rodéric,
Merci pour ta réponse. Effectivement, je pensais devoir utiliser une telle architecture au début. Mais suite au message de Simon, j'étais dans le doute quant à la solution à choisir.
Si je résume:
un événement un clic sur un bouton démarre une suite de séquence qui dure 2 bonnes minutes.
Si je désire stopper cette séquence en plein milieu...
L'architecture producteur / consommateur serait donc meilleure que la machine à état dans l'événement timeout alors...?
05-04-2011 03:58 AM - modifié 05-04-2011 04:03 AM
Dans tous les cas la première question à se poser est comment peut tu arrèter ta boucle en plein milieu? Si ta séquence dure 2min comment intervenir avant la fin?
Il faut peut-etre repenser tes états: Par exemple un état acquisition, au lieu de durer 2 min va etre de 10ms et à chaque tour de ta boucle il va vérifier si les 2min se sont écoulées ou si il y a eu un stop, et gérer l'état suivant en fonction
le 05-04-2011 04:01 AM
Vu que je commande un moteur, je pensais avoir la possibilité d'arrêter la séquence via un bouton "stop d'urgence". Mais je pense qu'il serait préférable que je la stoppe également si une erreur quelconque erreur se produit.
le 05-04-2011 04:05 AM
J'ai modifié en même temps que tu répondais ![]()
le 05-04-2011 04:43 AM
J'ai modifié mon programme initial en architecture producteur / consommateur avec des événement et des queues...
Il fonctionne correctement au niveau du déplacement du moteur cependant je n'arrive toujours pas à stopper la séquence quand j'appuie sur le bouton stop.
Concernant les acquisitions, je n'en fais qu'une fois la position cible atteinte - je dois l' atteindre avec précision, c'est pourquoi j'utilise 2 types de mouvement:
Je démarre en lui donnant une grande valeur et une grande vitesse pour une avance rapide. Ce déplacement se fait en une seule fois et la sortie du vi n'est libérée que quand la position est atteinte. J'ai comme l'impression que je ne pourrais pas avoir la main pendant ce déplacement. D'ailleurs l'icône du programme devient un carré blanc comme s'il ne répondait pas si j'essaye d'appuyer sur stop.
En revanche, pour atteindre la position cible précisément, la suite des déplacement se font en avançant par petits pas successifs et je devrais normalement avoir la main entre les déplacements... Mais je n'y arrive pas...
PS:
Le moteur utilisé est un maxon motor EC-max30 équipé d'une Epos24/2
Je vous joins mon nouveau vi. Y a-t-il une erreur?
Qu'en pensez-vous?
le 05-04-2011 05:04 AM
C'est ce que j'essayais d'expliquer dans mon autre post. Sans tenir compte de l'architecture que tu vas utiliser, il faut peut-etre revoir les états. Si le mouvement rapide met un certain temps; alors il ne faut pas qu'il garde la main.
Tu peux par exemple mettre un état avance rapide dans le quel la position à atteindre est lue. Si elle est atteinte ou si il y a un stop tu changes d'état, sinon tu reviens dans le même état. De la même façon pour l'avance lente. Tout cela sans garder la main.