Discussions au sujet des autres produits NI

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

sous vi avec horloge

Résolu !
Accéder à la solution

Bonjour, je suis débutant labview et ma question va peut être vous paraitre stupide.

J'ai réalise le vi testincrement1 (pièce jointe) qui sort une rampe croissante d'un pas de 1 toutes les 100ms.

Je compte utiliser cette rampe de temps pour déclencher des cycles de commandes sur un banc.

 

Je pensais donc utiliser ce vi comme sous vi mais il ne fonctionne pas. la valeur ne s'incrément pas.

Peut on vraiment faire de ce vi un sous vi?

 

D'avnce merci

0 Compliments
Message 1 sur 6
3 915 Visites

Vous rencontrez ici une notion essentielle qu'il est indispensable de bien comprendre et d'assimiler.

 

Le VI fonctionne comme attendu lorsqu'il n'est pas utilisé comme sous-VI. En d'autres termes, la valeur s'incrémente et le VI peut être arrêté par le bouton stop.

 

Pour faciliter le texte qui suit, appelons votre VI B et le VI qui va l'appeler A. B devient donc un sous-VI de A. 

 

Vous avez relié le bouton stop comme entrée de B et x+y comme sortie par le biais du connecteur.

 

Contrairement à vos attentes, une pression du bouton d'arrêt de A (relié à l'entrée de B) ne stoppe pas B. De plus, l'indicateur de A (reliée à x+y de B) ne s'actualise pas. Ceci est le comportement attendu d'un sous-VI !

 

En effet, lorsque B est appelé, l'état du bouton stop de A est transmis à celui-ci de manière unique. L'état de ce bouton a beau être modifié par la suite sur A, celui-ci n'est plus transmis à B. A l'inverse, la valeur de x+y de B n'est transmise à A qu'à la fin de l'exécution de B.

 

Dans la plupart des cas, ce comportement est entièrement suffisant. Prenons par exemple un VI simple qui se limiterait à additionnerait deux nombres. Il aurait donc les deux nombres comme entrée et le résultat de l'addition comme sortie. Les deux nombres lui sont transmis lors de l'appel, il exécute le calcul et retourne le résultat.

 

Dans votre cas, les choses sont un peu différentes puisqu'une interaction doit exister entre le VI et le sous-VI pendant l'exécution de celui-ci. Pour réaliser cela, vous devez passer les références du bouton stop et de l'indicateur à B. A l'aide des noeuds de propriétés correspondants il devient alors possible de lire l'état du bouton d'arrêt de A et d'actualiser l'indicateur de A dans B.

 

Cela fait peut-être un peu beaucoup à digérer d'un coup et je vous recommande de consacrer un peu de temps à un tutorial qui vous permettra de vous familiariser avec ces notions.

 

Je termine par le lien d'un message précédent montrant la manière de faire pour transmettre la référence d'un bouton à un sous-VI.

 

Message 2 sur 6
3 901 Visites

Pour répondre à votre question sur l'appel de sous-VI, OUI il est possible (et de plusieurs manières) d'appeller ce type de VI comme sous-VI mais à mon avis vous êtes confronté à un problème amont d'architecture de votre application. 

 

Je ne connais pas le but premier de votre application mais devez-vous envoyer systématiquement toute la rampe comme cycle de commande ou seulement en point par point.

 

Dans votre VI, j'attire votre attention sur le fait que vous temporisiez à 100ms dans la structure de construction de la rampe n'aura aucun impact temporel sur l'utilisation future de la rampe... (pas d'attente de 100ms entre chaque point.

 

Dans les 2 cas, je m'avance peut être mais à mon avis, c'est le VI que vous proposez qui doit être utilisé en tant qu'appelant du code de génération de commande, non? => Un point généré toutes les 100ms à envoyer à un instrument quelconque.

 

Dans ce cas, votre code se résumerait simplement à:

 

RampeIncr.jpg 

 

 

0 Compliments
Message 3 sur 6
3 899 Visites

Merci pour vos réponses.

 

Effectivement, je vais avoir besoin d'un peu de temps pour digérer ça.

 

Pour éclaircir le sujet, je vais tenter de vous expliquer ce que je souhaite faire.

Je dois piloter un banc de test via une carte NI. je dois commander trois AO suivant des cycles indépendant.

Exemple :

de t=0 à 0.5 s toutes les AO=0V,

de t=0.5s à 20s AO1=5v

de t=0.5s à 10s AO2=3v

.....

et ainsi de suite, pour chaque t entre 0 et 180s, je définis les valeurs que AO1, AO2 et AO3 doivent prendre.

Ensuite après 180s, le cycle recommence.

 

La rampe que j'ai voulu créé a donc le role de pendule, une pendule qui compte de 0 à 180s avec un pas de 0.1s et qui se remet à zéro après 180s (cette remise à zéro n'est pas codée dans mon vi).

Pour définir les instants pour lesquels les AO doivent changer, je comptais faire un test de la grandeur (x+y) par rapport à des ti (temps indice i) donnés.

 

exemple:

soit t1 l'instant ou AO1 doit passer à 5V,

si (x+y)>= t1 alors AO1 passe à 5V

NB: t1 sera relié à une commande de telle sorte que je puisse faire avancer ou retarder le déclenchement depuis la face avant.

 

Je ne sais pas si c'est plus clair. Cette solution n'est peut être pas la plus simple.

 

Si toutefois vous voyez d'autres solutions plus simples, je suis preneur.

 

D'ici là, je vais tenter de comprendre nos réponses.Smiley très heureux

 

Encore merci.

0 Compliments
Message 4 sur 6
3 892 Visites

Pour la partie construction du cycle si je devais le faire rapidement, je ferais quelque chose dans ce genre là:

 

AOConsigne.jpg

 

 

Message 5 sur 6
3 883 Visites
Solution
Accepté par l'auteur du sujet denislamy

Euh... comment dire ?

 

ben, je n'aurais pas fait mieux !Smiley très heureux

 

J'espère qu'un jour je saurai trouver des solutions aussi rapidement que vous.

 

comment dit on déjà... C'est en forgeant qu'on devient forgeron!

 

Je retourne forger !!!!Smiley très heureux

 

JB, J.DECHET, merci beaucoup pour votre aide.

0 Compliments
Message 6 sur 6
3 876 Visites