Discussions au sujet de NI LabVIEW

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

boucle dans sous-VI ou sous-VI dans boucle ?

Question simple. J'ai un sous-VI dans mon programme qui exécute des calcules. Ces calculs doivent être faits en permanence en parallèle du reste de l'exécution d'un autre programme.

J'ai donc un while quelque part, mais j'hésite à le mettre dans mon sous-VI ou à l'extérieur, autour.

 

qu'en pensez vous ?

 

Si je ne me trompe pas, d'un point de vue programmation ça revient exactement au même. La question est donc purement esthétique de diagramme.

0 Compliments
Message 1 sur 10
4 807 Visites

Bonjour V.M,

 

Ce qui est important et qui peut être critique lorsque l'on fait tourner plusieurs processus en parallèle est la communication entre ces processus. Par exemple, la partie du code qui exécute des calculs en parallèle de ton code principal va devoir s'arrêter en même temps que celui-ci. Il convient de choisir la bonne structure de code.

 

Je te propose de lire la présentation suivante sur les design patterns.

 

Bon courage

Sabri JATLAOUI - Certified LabVIEW Architect - Certified LabVIEW Developer
0 Compliments
Message 2 sur 10
4 802 Visites

boucle interne vs boucle externe : " ... ça revient exactement au même. La question est donc purement esthétique ...."

 

purement esthétique ... je ne suis pas d'accord.

 

hormis les considérations de sabri.jatlaoui,

 

si ta boucle est à l'extérieur de ton sousVI, il y aura un appel (et un retour) à ce sousVI à chaque itération de la boucle (mis à part le cas où ce sousVI est "inline").

si ta boucle fait partie du sousVI, il n'y aura qu'un seul appel.

En terme de performances (vitesse) et pour un grand nombre d'itérations, pour moi la solution avec la boucle interne serait logiquement plus rapide.

Faire appel à une sous-routine, ça prend du code et du temps machine.

Mais (mis à par le "inline"), dans l'absolu et en termes de code ... non ... cela ne "revient pas exactement au même".

 

 

 

0 Compliments
Message 3 sur 10
4 794 Visites

Un autre aspect 😉

 

En boucle interne, si tu veux accéder à tes données pour x ou y raisons, il faudra passer par une variable globale.

En boucle externe, tu pourras te contenter d'une variable locale.

 

Après en terme de performance, je sais pas trop le gain, vue que ca va être impacté aussi par les remarques de Ouadji 😄

“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 4 sur 10
4 790 Visites

Bonjour Michael,

 

Si j'ai une boucle contenant un seul sousVI ... pour moi, il n'y a pas photo, dans 95% (99?) des cas, je placerai la boucle en interne.

Venant de l'assembleur (pour moi) c'est un non-sens de créer un appel à une sous-routine (et de gérer un retour), et ce à chaque itération de la boucle.

Maintenant, si je dois échanger de l'information (sorties et/ou entrées) avec une autre tâche (ou plusieurs) ... les méthodes sont multiples.

Une variable globale, une FGV (attention aux "race conditions") ... ou un Notifier, un user-event (pour moi, ce sera probablement un des deux derniers.

Quelque soit la méthode d'échange utilisée, je ne crois pas que cela impactera de façon significative la vitesse du sousVI.

Généré une Notification ou un user-event .. une fois lancé, cela devient également une tâche autonome totalement indépendante du code du sousVI.

Pour le reste ... on arrive assez vite dans le "feeling personnel" ... chaque développeur a ses préférences et son style.

(La bonne solution est rarement unique ... cela dépend de l'angle de vue)

0 Compliments
Message 5 sur 10
4 784 Visites

grosse remarque qui me vient à l'esprit :

 

cela dépend ... le sousVI peut parfaitement être utilisé ailleurs ... sans boucle.

Dans ce cas, la boucle "externe" peut se justifier d'emblée.

 

0 Compliments
Message 6 sur 10
4 781 Visites

Ok merci à tous pour vos remarques.

 

Personnellement je préfère passer mes variables par références plutôt que par la création de variables locales/globales. Il me semble avoir lu quelque part qu'il fallait mieux éviter la multiplication de variables locales et globales en labview. (Et puis ayant fait beaucoup de C pour moi la création de variables locales et proscrite ^^).

0 Compliments
Message 7 sur 10
4 767 Visites

En fait il faut minimiser au maximum leur utilisation car cela va à l'encontre du principe de "flux de données", les variables locales/ globales se posant comme cela dans le diagramme..

 


Après effectivement, dans la mesure du possible, il est vivement conseillé d'utiliser des références, ou les autres méthodes utilisés par Ouadji.
Toutefois quand tu n'as aucun lien "filaire" vers ton sous-vi, et que celui-ci est lancé ou non selon la convenance de l'opérateur, la variable globale va venir trouver un intérêt.
On se protégera par la suite des problèmes de conflit lecture/ecriture grâce aux méthodes d'accès exclusifs de type sémaphore ;).

 

Bonne journée à tous.

“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 8 sur 10
4 764 Visites

Bonjour V.M,

 

"Il me semble avoir lu quelque part qu'il fallait mieux éviter la multiplication de variables locales et globales en labview"

Pas exactement, le conseil est d'éviter plusieurs sources d'écriture avfin d'éviter les situations de compétitions. Tu peux avoir plusieur sources de lectures sans que cela ne pose problème.

 

Je suis d'accord avec Ouadji et Michael.C il n'y a plusieurs solution à ton problème. Pourrait-tu nous expliquer plus en détail ton programme? Traites-tu toutes les données de tes calculs? Cadencement?...

 

Personellement, je ne suis pas fan de l'utilisation de référence pour transmettre des données. Cela ralentis considérablement les temps d'éxécution d'un code.

 

J'ai repris un slide d eLuc Desruelle:

 

speed+execution.png

 

a+

Sabri JATLAOUI - Certified LabVIEW Architect - Certified LabVIEW Developer
0 Compliments
Message 9 sur 10
4 747 Visites

En effet slide trés interessant et significatif !

 

Je pensais que, comme en C, si on passe une variable à un sous VI, il y a une copie en mémoire de la valeure de la variable, qui est à la fois dans le sous VI et dans le VI de plus haut niveau !?

Sur le slide il n'y a pas d'appel à un sous VI mais sa reste pertinant.

 

Dans le cas de mon projet j'ai finalement laissé mes calculs dans mon VI principale par ce qu'il ne sont pas trop encombrants. Mais je posais aussi la question par curiosité, de manière générale.

0 Compliments
Message 10 sur 10
4 736 Visites