Discussions au sujet des autres produits NI

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

partage voie d'entrée

Résolu !
Accéder à la solution

Bonjour,

 

je dois, pour satisfaire les désirs d'un client, mettre deux bancs de mesure dans le même programme (alors que deux programmes séparés faisaient aussi bien l'affaire et plus simples à coder).

 

 

Bref. Côté face avant, j'ai placé chaque programme dans un onglet.  L'un utilise une entrée numérique compteur et l'autre utilise une entrée numérique en fréquence. Physiquement les deux tâches associées à ces programmes pointent sur la même broche du périphérique à laquelle est reliée une unique cellule optoélectronique.

 

Actuellement j'ai codé comme ci-après sur la capture d'écran : lv.png

L'autre onglet qui n'apparait pas sur cette capture s'appelle "couple de démarrage" et les fils programmer / libérer sont inversés. Je n'obtiens aucun message d'erreur. Lorsque que je suis sur l'onglet "fréquence", tout va bien. Lorsque que je bascule sur l'onglet qui utilise l'entrée compteur, le comptage est très lent, il laisse passer beaucoup de fronts. 

 

Comment corriger ça ? Sachant que dans Max, les deux tâches fonctionnent parfaitement.

 

Je vous remercie par avance.

0 Compliments
Message 1 sur 13
4 177 Visites

Bonjour,

 

Il existe differente solution à votre problème. Celui-ci est dut à l'allocation en simultané de la voie, LabVIEW ne peut pas reserver et libérer en même temps, il faut un peu de temps pour effecteur ces tâches.

 

Pour trouver la meilleur solution, il me faudrait plus d'information à propos de votre projet:

  • Avez vous réellement besoin de la structure cadencée?
  • Quel est la fréquence maximale que vous devez atteindre?

 

Vous pouvez utiliser le VI en pièce jointe pour une utilisation avec une frequence basse. Si vous souhaitez avoir une frequence plus elevé il faudra vous orientez vers un registre à décalage sur votre onglet afin de detecter le passage de l'un à l'autre et changer à ce moment là.

 

Cordialement,

Message Edité par ajangot le 07-29-2009 08:01 AM
0 Compliments
Message 2 sur 13
4 151 Visites

Je vais décrire un peu plus le banc de mesure, du moins la partie concernée par cette boucle.

 

Il s'agit de piloter en vitesse un moteur solidaire d'une courronne dentée qui passe devant une cellule optique.  Comme il a 60 dents, une simple mesure de fréquence sur l'entrée numérique reliée à cette cellule me donne directement la vitesse en tour / minute. Ce mesure sert à asservir le contrôleur du moteur pour des paliers en vitesse par le biais d'un PID. Je dois être capable de monter jusqu'à 15000 tours/minute mais plus courrament vers 5000 tours/minute. 

 

L'autre application utilise l'entrée compteur. Il s'agit de détecter le démarrage du moteur (considéré comme tel après 3 dents) et de stopper l'alimentation du moteur après 1/4 de tour. Ce comptage se passe à très basse vitesse.

 

Dans les deux cas je ne sais pas si j'ai besoin d'une boucle cadencée. Ce que je ne veux pas c'est sauter une dent.

 

Un autre point qui me dérange au sujet des boucles, c'est qu'à basse vitesse, la boucle est en attente d'une dent pour "boucler". C'est particulièrement embêtant lorsque je clique sur le bouton rouge. L'éxécution ne s'arrête pas. Je suis obligé de tourner le moteur à la main pour qu'une dent passe devant la cellule et permette à la boucle en cours de s'achever.

 

Y'a-t-il moyen de corriger ce problème ?

 

 

0 Compliments
Message 3 sur 13
4 131 Visites

Si vous n'êtes pas sur un OS temps réel (windows N'EST PAS temps réel), la structure cadencée ne sert pas à grand chose.

 

Pour votre problème d'arret de votre VI, cela est normal. Vous avez cablez un timeout de -1, le VI lecture ne s'arrete jamais sauf si un front est detecté. Vous devez mettre un timeout de suffisement long pour lire vos dents mais pas trop court pour eviter qu'il en saute. Si aucune donnée n'arrive alors le VI envoie une erreur et alors vous pouvez la traiter comme une fausse erreur et continuer votre acquisition.

 

Au vu des spécifications que vous souhaitez avoir, le mieux est de passer par un registre à décalage. Vous pouvez trouvez des exemples dans LabVIEW.

 

Cordialement, 

0 Compliments
Message 4 sur 13
4 129 Visites

Pour le timeout, vu que le programme doit parfois rester en attente, manipulation de l'opérateur ou autre, je ne peux pas mettre un timeout autre que -1. Est-ce qu'il est possible de changer le timeout en cours de route ? (il passerait à 0 ou -1 lorsque je clique sur stop).

 

 

 

 

 

0 Compliments
Message 5 sur 13
4 126 Visites

Pour le timeout en fait c'est bon. J'ai mis le timeout à 1. En fait ce qu'il me manquait s'était de câbler un "désassembler par nom" "status" sur le cluster d'erreur. Sans ça le programme s'interrompt et on a un popup pour nous signale l'erreur.

 

En revanche je n'ai pas compris votre solution avec des registre à décalage. Je sais ce que sont ces registres mais je n'en vois pas la mise en application ici.

 

Ce qui est curieux c'est que la tâche d'acquisition "fréquence" fonctionne et pas celle du compteur. Et pourtant je me suis refait un petit programme à partir de zéro uniquement sur le partage de la voie entre ces deux tâches. Donc quelque chose de clair et léger.

 

Votre solution, dans le fichier joint,  ne me convient pas tout à fait : vu que l'on arrête la tâche compteur à chaque boucle et qu'on la relance cela réinitialise le compteur qui donc en gros reste à 0. Comment faire ? Je cherche de mon côté.

 

Je vous remercie pour votre aide.

0 Compliments
Message 6 sur 13
4 121 Visites
Solution
Accepté par l'auteur du sujet Binoyte

Bonjour,

L'idée du registre à décalage est en fait de détecter un changement d'onglet et donc de changer la tâche en cours d'exécution. 

Le principe est assez simple: si l'onglet a la même valeur qu'au tour de boucle précédent, alors on ne fait que lire la valeur. 

Par contre s’il y a un changement, il faut arrêter la tâche en cours et démarrer celle qui correspond à l'onglet.

Voici un petit exemple développé rapidement vous montrant la mise en oeuvre des registres à décalage, 

avec une gestion d'erreur afin de ne pas prendre en compte l'erreur de Timeout.

Cordialement

Yann C.

France

Message 7 sur 13
4 117 Visites

Merci pour cette réponse, je vais regarder votre exemple.

Nos message se croisent car j'allais poster ma solution. J'ai trouvé quelque chose qui marche. 

 

L'idée est de vraiment guider Labview par des séquences successives :

1) vérifier que l'ancienne tache est bien arrêtée

2) si non, envoyer la commande arrêter et attendre qu'elle soit effectivement arrêtée.

3) Ensuite dans une autre séquence lancer la nouvelle tâche.

 

Ca marche et il n'y a pas trop de latence entre le passage d'une tâche à l'autre. En revanche c'est sûrement mal codée et on doit pouvoir faire plus classe et plus sobre comme code. J'ai appris labview par moi même et ce depuis à peine deux ans et de façon non intensive.

 

N'hésitez pas à critiquer ça me fera progresser.

 

Je vous remercie.

0 Compliments
Message 8 sur 13
4 106 Visites

Bonjour,

 

Il n y a pas de gestion d'erreur dans vos boucle while.

Si vous avez une erreur matérielle, vous ne pourrez pas le savoir et allez rester dans votre boucle jusqu'à ce que vous appuyez sur stop.

Je vous conseil d'utiliser le status pour sortir de votre boucle en cas d'erreur.

 

Si comme dans votre cas vous avez une erreur que vous voulez inhiber,

ce n'est pas un problème, on peut avec un petit vi "inhiber" une erreur (voir mon vi "gestion erreur").

 

Cordialement

Yann C.

France

0 Compliments
Message 9 sur 13
4 100 Visites
oui c'est ce que je vais faire. inhiber l'erreur timeout en m'inspirant de votre exemple précédent. Sinon mon programme contient une boucle while dans une boucle while. Est-ce propre comme façon de faire? Cela nuit-il aux performancex du système : consommation de ressource plus que necessaire.
0 Compliments
Message 10 sur 13
4 097 Visites