Discussions au sujet de NI LabVIEW

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

synchronisation mesures avec une boucle

Résolu !
Accéder à la solution

Bonjour,

 

Je viens sur la communauté car une question me taraude: comment synchroniser 2 acquisitions réalisées par deux instruments différents ?

La question peut sembler un peu stupide, mais j'ai essayé de procéder avec une boucle for, or j'ai l'impression que mes deux acquisitions ne vont pas à la même vitesse.

Je pensais que grâce au registre à décalage la mesure qui se ermine en première devait attendre que l'autre se réalise pour lancer un second tour de boucle (ce qui assurerait donc une synchronisation des deux différentes mesures à  chaque itération).

or, j'ai un tableau plus rapide qu'un autre : les 6 mesures sont réalisées alors que dans l'autre tableau seulement une seule mesure a été affichée.

 

je voulais savoir quelle est la méthode à utiliser dans ce cas la. La boucle cadencée?

Voici mon VI.

Dans l'attente de vos retours je continue de chercher d'oùu viens le problème et une éventuelle solution.

 

Merci encore une fois !

0 Compliments
Message 1 sur 14
4 141 Visites

Bonjour Lablasc,

 

Malheureusement il ne sera pas possible d'assurer une synchronisation correcte de ces instruments s'ils n'ont pas une électronique le permettant. Pour bien synchroniser plusieurs instruments, rien de mieux que le format PXI ou PXIe où tous les instruments partagent un fond de panier avec des lignes de trig et de synchronisation.

Pour revenir sur le code joint dans ton message, je pense qu'il faudrait partir sur plus simple (un exemple LabVIEW peut-être) et implémenter au fur et à mesure les modifications.

Pour la boucle For elle n'a ici aucun intérêt et il faudra voir à privilégier la boucle While.

Ci-joint le lien vers un forum sur lequel un utilisateur a tenté une pseudo synchronisation logicielle, en espérant que cela pourra t'aider!

https://forums.ni.com/t5/Instrument-Control-GPIB-Serial/visa-synchronized-while-loops/td-p/620041

 

Bonne journée,

M-Junior

Message 2 sur 14
4 102 Visites

Une itération de boucle FOR se termine lorsque tout ce qui est à l'intérieur de la boucle a été effectué. Un register à décalage ne sert qu'a transférer une valeur d'une itération à l'autre. Si tu n'as qu'une seule valeur dans un cas alors cet instrument n'a probablement répondu qu'une seule fois et est en erreur.

 

Comme Jun l'a dit tu n'auras qu'une synchronization très approximative entre tes instruments (boucle FOR ou While). Une boucle cadencée agira comme une boucle while avec un Wait, il n'y a pas vraiment d'avantage dans ce cas.

 

Ben64

Message 3 sur 14
4 088 Visites

Salut,

quel tableau se remplit plus rapidement que l'autre?
Comme dit Ben64, il y a peut-être un instument en erreur, as-tu, à la fin de l'exécution, une erreur sur les port VISA?

Message 4 sur 14
4 079 Visites

Bonjour Jun',

 

Tout d'abord merci de ton retour.

Concernant le format PXI ou PXIe j'y jetterai un oeil plus tard, cela à l'air d'être assez compliqué. 

 

Ensuite concernant mon code, effectivement c'est très moche et peu lisible. Je n'ai pas encore le niveau pour faire du joli code. J'ai essayé de procéder par étape, mais ce sont surtout les conversions de tableaux qui prennent de la place.

Après ce bout de code, j'ai une autre partie de code sensée faire des comparaisons de valeurs (de tableaux) et je trouvais ça plus facile de travailler avec des dbl. Cependant j'ai gardé ces mêmes tableaux en string car je veux ensuite les enregistrer dans un tableur et je trouve ça plus facile en string :).

De plus, cette multitudes d'indicateurs me permets de voir l'évolution de la collecte de valeurs et je trouve ça plus facile pour le debug.

 

Si tu as des conseils, n'hésite surtout pas ;).

 

Enfin la boucle for ne peux pas être remplacée par une boucle while, car la première partie de mon "main VI" doit ouvrir un fichier txt avec des valeurs qui vont devenir commandes du générateur.

 

J'ai modifié le code afin que celui-ci puisse faire pour chaque valeur:

- envoi de la commande au générateur

- mesure étalon + mesure boitier + horodatage

- comparaison EMT + étalon

 

Alors je suis désolé de vous fournir un VI si moche mais je n'ai pas eu le temps de m'occuper de l'esthétique de la face avant, je m'y attarderai quand mon code marchera :). 

Ce VI est le programme principal, le problème c'est que quand je le lance, le Write m'indique l'erreur 1073807265, un problème de communication alors que tout à l'air d'être bon.

 

Encore une fois désolé pour la "mocheté" de mon code. (J'ai enlevé quelques commandes qui sont confidentielles, mais dans mon programmes, elles y sont et ce sont les bonnes :D)

 

Merci de votre aide 🙂 

 

 

 

0 Compliments
Message 5 sur 14
4 067 Visites

Salut Ben,

 

l'erreur affichée est 1073807265.

mais mardi cette erreur survenait au bout de la 3eme etape juste avant les mesures, là dorénavant elle apparait dès la première étape dans le read de l'étalon.

 

De plus depuis ce matin j'ai nremarqué quelques chose de très bizarre: en allant sur nimax et en faisant un scan for instruments, NIMAX me disait qu'il n'avait trouvé aucun instrument. Le branchement consiste à relier le générateur et l'étalon en gpib, et ensuite je relis l'étalon à l'ordinateur (avant ca marchait très bien, pourtant j'ai rien changé).

J'ai débranché rebranché : idem; j'ai changé de cable gpib : idem; j'ai connecté directement le cable gpib usb au générateur et là ça a marché.

J'ai du éteindre et rallumer l'étalon pour que cela fonctionne avec le même type de branchement, je pensais avoir résolu le problème mais cela n'a pas marché quand j'ai lancé le programme. En y faisant plus attention, lorsque je selectionne la commande de l'étalon, je ne remarque pas l'icone à gauche qui indique qu'il y a une connexion. Mais encore une fois je ne comprends pas cela marchait très bien avant.

0 Compliments
Message 6 sur 14
4 059 Visites

Après avoir rallumé une nouvelle fois le multimètre, le programme s'exécute jusqu'à la troisième étape. Comme lorsque j'ai crée la discussion.

Encore ces fichus timeout ! Individuellement, le bout de code servant à la mesure de l'étalon fonctionne. Idem pour le boitier.

Les choses se gâtent lorsque je veux faire mes mesures en parallèle. Soit l'un soit l'autre se met en timeout.

Lorsque j'exécute le gros programme, c'est l'étalon qui se met en timeout. Lorsque j'ai essayé de faire un p'tit programme pour voir si la mesure des deux en simultanée fonctionnait, c'était le boitier qui mettait en timeout.

 

Pourtant j'ai essayé de respecter ce que me disait le site NI pour éviter ce problème (temporisation).

 

Merci de votre aide ! 😉

PS: je sais que la séquence ne sert à rien mais je voulais respecter au mieux ce que j'avais dans mon programme principal

illustration pb timeout.png

0 Compliments
Message 7 sur 14
4 051 Visites
Solution
Accepté par l'auteur du sujet Lablasc

On ne peux pas effectuer d'opérations en parallèle sur un même bus GPIB (sinon ça te prendrais deux contrôleurs USB/GPIB). Tu dois effectuer la mesure sur un appareil puis sur l'autre. Pour chaque appareil tu dois ouvrir une session VISA (VISA Open) et surtout la fermer par la suite à l'aide de la fonction VISA Close. C'est probablement à cause que tu n'as pas fermé la session GPIB d'un appareil que l'autre tombe en erreur.

 

Ben64

Message 8 sur 14
4 035 Visites
Solution
Accepté par l'auteur du sujet Lablasc

je pense en effet que Ben a raison, les ressources VISA nécessitent une certaine rigueur si on veut un programme qui tient la route.

Ouvrir, écrire ou lire, fermer la ressource est un minimum pour que tout ce passe bien; ensuite, il est parfois utile (voir nécessaire) de vider les buffers d'entrée/sortie de temps en temps!

Message 9 sur 14
4 026 Visites

Bonjour Ben,

 

merci de ton retour. 

En fait je voudrai faire une mesure avec l'étalon (visa ressource 1) et une autre (quasiment en même temps) avec le boitier (visa ressource 2).

Je ne sais pas si j'ai bien suivi ce que tu m'as dit mais j'ai mis un visa open en début de chaque opération et un visa close lorsqu'elle se termine mais cela ne marchait toujours pas.

Je ne voudrai pas dire de bêtises mais il me semble que lors d'un de mes TPs de labview de cette année, on avait réussi à réaliser des mesures simultanées de cette manière.

Finalement, j'ai utilisé une méthode que j'ai pu voir sur un forum ni. Le read du boitier qui me posait problème s'arrête lorsqu'il lit le caractère de terminaison. Pour l'instant, après quelques essais, plus de timeout, seulement une mise en garde qui me dit qu'effectivement le caractère de terminaison a été lu.

 

je vais voir ce que ça donne dans mon gros programme.

Je reviendrai sur le forum pour faire un retour 😉

 

version qui a l'air de marcher

 

 

0 Compliments
Message 10 sur 14
4 015 Visites