Discussions au sujet de NI LabVIEW

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

Contrôle d'un banc d'essai

Bonjour,


J'ai voulu regarder un peu ton code pour chercher uen solution à ton problème, et avant tout de chose, il faudrait déjà que tu confirmes les aberrations contenues dans celui-ci.


Pourquoi connecter un terminal et une variable locale associée en écriture au même endroit ? J'avoue ne pas comprendre l'intérêt si ce n'est d'alourdir le programme avec un non sens.


Tu souhaites faire de l'acquisition de données et du traitement, mais tu n'as aucune source de synchronisation de tes boucles, donc cela va forcément te provoquer des instabilités.


Ton programme n'étant pas encore très avancé, je te conseillerais vivement de redémarrer en partant du modèles de conception "Producteur/Consommateur  (données)". Ainsi tu auras déjà la structure adéquate pour te prémunir de conflit d'accès à tes variables.

http://zone.ni.com/reference/fr-XX/help/371361H-0114/lvhowto/creating_vis_from_templates/

http://www.ni.com/newsletter/51735/fr/


Sans cette refonte, je ne m'aventurerais pas à trouver une solution, car cela serait juste une rustine, ce qui  ne serait pas te rendre service, ni aider les personnes qui auront à maintenir ton programme par la suite.

 

Cdt,

Michael

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 11 sur 22
1 260 Visites

Bonjour,

Pour ce qui est du terminal et de la variable locale, je suppose au ton de ta question que seul le terminal suffit pour envoyer les données dans la variable ? Si oui, j'ai fait ça parce que je ne le savais pas, tout simplement, je vais donc retirer la variable à cet endroit.

Comment faire alors pour synchroniser des boucles ? Je pensais que la boucle de traitement serait forcément synchronisée avec la première grâce à la variable locale...

Du coup, je vais regarder le modèle et essayer de construire quelque à partir de ça.

Merci

David

0 Compliments
Message 12 sur 22
1 251 Visites

Bonjour,

 

Désolé si le ton de la question était un peu trop sarcastique, mais oui tu as eu la bonne conclusion.

Au passage, il est plutôt effrayant de se lancer dans un programme sans savoir celà, car il s'agit de la notion la plus simple de labview. Je t'invite rapidement à te renseigner sur les bases de labview afin que ton expérience de la programmation dans ce langage se passe dans de bonne condition.

La formation CORE 1 de NI est une très bonne solution pour démarrer

http://sine.ni.com/tacs/app/overview/p/ap/of/lang/fr/pg/1/sn/n24:12725/id/1582/

 

En ce qui concerne la synchronisation de deux boucles, il existe plusieurs méthodes :

1- Utilisation d'une FIFO (une boucle productrice / une boucle Consomatrice)

2- Utilisation de sémaphore (une boucle se lance que sur el feu vert de la première)

3 - Utilisation de rendez vous (les boucles s'attendent à une certaine étape).

 

Mais en aucun cas une simple variable ne permettra de faire de la synchronisation. L'utilisation de variable locale et globale est très attrayant pour une personne débutante en labview car cela permet de faire abstraction du principe de flux de données, et c'est justement là qu'est le piège. Sans gestion de flux de données, tu engendres des instabilités dans ton programme (Compétition d'accès en lecture/ecriture sur les variables, Absence de contrôle de la mise à jour des valeurs vs lecture des valeurs,....)

 

Tu verras le modèle Producteur/Consommateur (donnée) est très abordable, et cela va te simplifier la vie 😉

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 13 sur 22
1 239 Visites

Pas de problèmes.

Je vais regarder pour les cours, mais mon niveau d'anglais est pas au top... Et je suis pas sûr que que mon université veuille bien me les payer.

 

Sinon j'ai commencé à transférer mon programme sur le modèle que tu m'as proposé (le FIFO). Je suis donc rendu avec trois boucles, la première lit les données des capteurs, la deuxième envoit les données au banc d'essai, et la troisième fait tout les calculs. Je n'ai pas encore connecté la deuxième boucle à la file d'attente, ce qui correspond donc au stade ou j'en était avant (entrées et sorties gérées indépendemment). Cependant, il n'y a aucune donnée qui passe par la file d'attente pour aller dans la boucle de calculs, et je n'arrive pas à comprendre ce que j'ai mal fait... Il n'y a pourtant aucune erreur qui vient des fonctions qui gèrent la file.

David

0 Compliments
Message 14 sur 22
1 223 Visites

Personne n'a une idée pour m'aider à résoudre mon problème ?

 

David

0 Compliments
Message 15 sur 22
1 140 Visites

Là il ne reste que les outils de debug pour comprendre ce qui se passe.

Regardez bien avec des sondes si les données sont correctement empilées dans la file d'attente. Vous avez également un vi "Get Status  Queue" permettant de voir combien il y a d'elements dans la file d'attente.

Juste une remarque, lorsque vous arretez la boucle du haut, toute les données de la file d'attentes seront perdues.

Paolo_P
Certified TestStand Architect
Certified LabVIEW Architect
National Instruments France

0 Compliments
Message 16 sur 22
1 132 Visites

Vérifie la temporisation de ta boucle d'acquisition.

Dans un premier temps, fixe celle-ci de manière arbitraire, plutôt que de la calculer à partir de la fréquence de travail du DAQ.

 

Es tu sur que cette boucle s'exécute ? pour le vérifier câble un indicateur au terminal d'indice de la boucle "i".
Si celui-ci ne s'incrémente pas alors, ton problème vient de là.

 

Pour comprendre ton programme, une bonne méthode serait de l'exécuter en mode pas à pas, et de vérifier où se bloque l'information ( appuie sur l'ampoule sur le diagramme de ton vi)

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 17 sur 22
1 131 Visites

J'avais déjà commencé à regarder d'où pouvait venir l'erreur. Si je place un terminal juste après la fonction lire, il y a bien des données, donc la boucle s'éxécute, ce qui est confirmé par l'indicateur connecté au terminal d'indice de la boucle "i". En animant l'éxécution au ralenti, je ne vois aucun problème, l'information semble bien circuler...

Avec la fonction "Get Status  Queue" placé dans la boucle productrice, je peux voir qu'il y a des éléments qui s'ajoute dans la file à chaque incrémentation de la boucle. Jusque là, tout me semble normal. Cependant, si je place la fonction "Get Status  Queue" dans la boucle consommatrice, il n'y aucune donnée qui s'ajoute. N'y a-t-il donc pas un problème de connection entre les deux boucles dans la file d'attente ?

 

David

0 Compliments
Message 18 sur 22
1 122 Visites

As tu vérifer le fonctionnement de ta boucle consommatrice ?

N'y a t il pas une erreur à la première itération, qui arrête celle-ci sans que tu t'en rendes compte.

 

Sans pouvoir exécuter ton code, il est compliqué d'identifier l'erreur.

 

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 19 sur 22
1 103 Visites

Effectivement l'erreur venait bien de là ! Il n'y a juste aucune donnée qui passe à la première itération de la boucle, mais après tout est bon. J'ai donc supprimé le cable d'erreur. Par contre je ne comprend pas pourquoi il n'y a aucune donnée seulement à le première itération ?

 

David

0 Compliments
Message 20 sur 22
1 089 Visites