Discussions au sujet des autres produits NI

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

Quelle structure pour mon programme

Résolu !
Accéder à la solution

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?

0 Compliments
Message 1 sur 21
4 929 Visites

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.

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
0 Compliments
Message 2 sur 21
4 923 Visites

Salut Simon,

 

Merci pour cette réponse interressante. Je me voyais déjà utiliser une architecture producteur / consommateur avec des evennements et des queues... Smiley heureux

Je vais essayer de voir ce que j'arrive à faire avec ta méthode qui parait plus simple et je te redis.

 

0 Compliments
Message 3 sur 21
4 921 Visites
Solution
Accepté par Cholitzu

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.

Rodéric L
Certified LabVIEW Architect
Message 4 sur 21
4 919 Visites

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...?

0 Compliments
Message 5 sur 21
4 917 Visites

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

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
0 Compliments
Message 6 sur 21
4 914 Visites

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.

 

0 Compliments
Message 7 sur 21
4 911 Visites

J'ai modifié en même temps que tu répondais Smiley clignant de l'œil

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
0 Compliments
Message 8 sur 21
4 909 Visites

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?

0 Compliments
Message 9 sur 21
4 902 Visites

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.

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
Message 10 sur 21
4 896 Visites