Les variables globales et locales sont des concepts avancés de LabVIEW. Elles ne font pas partie de manière inhérente du modèle d'exécution en flux de données LabVIEW. Les diagrammes peuvent devenir difficiles à lire lorsque vous utilisez des variables globales et locales, c'est pourquoi vous devez les utiliser avec précaution. Une mauvaise utilisation des variables globales et locales, pour remplacer un connecteur ou accéder à des valeurs dans chaque étape d'une structure Séquence, par exemple, peut entraîner un comportement inattendu des VIs. Une utilisation excessive des variables globales et locales, pour remplacer de longs fils de liaison ou le flux de données, par exemple, ralentit l'exécution.

Initialisation des variables globales et locales

Pour initialiser une variable locale ou globale, écrivez des valeurs connues dans la variable avant d'exécuter le VI. Sinon, les variables risquent de contenir des données qui provoquent un comportement incorrect du VI. Si la variable base la valeur initiale sur le résultat d'un calcul, assurez-vous que LabVIEW écrit la valeur à la variable avant d'essayer d'accéder à la variable pour une autre action. Si l'action d'écriture est câblée en parallèle au reste du VI, une situation de compétition risque de survenir.

Pour être sûr que les variables soient initialisées avant que le reste du VI s'exécute, vous pouvez isoler le code qui écrit la valeur initiale de la variable en le mettant dans la première étape d'une structure Séquence ou dans un sous-VI et câblez le sous-VI pour qu'il s'exécute en premier dans le flux de données du diagramme.

Si vous n'initialisez pas la variable avant qu'elle ne soit lue pour la première fois par le VI, elle contient la valeur par défaut de l'objet de la face-avant associé.

Lorsque la valeur d'une variable globale ou locale est câblée à un autre élément du diagramme, la valeur sur le fil de liaison ne change pas lorsque la variable change. Pour mettre à jour la valeur du fil de liaison, vous devez lire la valeur de la variable après la modification.

Situation de compétition

Une situation de compétition risque de se produire lorsque plusieurs sections de code s'exécutent en parallèle en ayant accès à une même partie de la mémoire. Si chaque section de code est indépendante, il n'est pas possible de déterminer dans quel ordre LabVIEW accède à la ressource partagée.

Les situations de compétition peuvent produire des résultats inattendus. Par exemple, si deux sections de codes indépendantes accèdent à une file d'attente et que vous ne pouvez pas contrôler dans quel ordre LabVIEW accède à cette file, vous risquez de créer une situation de compétition.

Les situations de compétition peuvent être dangereuses car elles peuvent apparaître et disparaître lorsque le cadencement d'un programme change. Elles sont susceptibles de se manifester lorsque vous changez de système d'exploitation, de version LabVIEW ou d'autre logiciel s'exécutant sur le système.

Si vous provoquez un changement de cadencement dans un VI (si vous mettez à jour le système d'exploitation ou la version de LabVIEW, par exemple), recherchez si du code qui s'exécute en parallèle accède aux mêmes données et utilisez une condition de cadencement pour contrôler quelles actions s'exécutent en premier.

Situations de compétition lors de l'utilisation de variables locales et globales

Bien que les situations de compétition peuvent survenir à chaque fois que plusieurs actions mettent à jour la valeur des mêmes données stockées, elles se produisent souvent lors de l'utilisation de variables locales et globales ou d'un fichier externe. Le diagramme suivant montre un exemple de situation de compétition avec une variable locale.

La sortie de ce VI, la valeur de la variable locale x, dépend de l'opération qui s'exécute en premier. Comme chaque opération attribue une valeur différente à x, il n'y a aucun moyen de déterminer si le résultat sera 7 ou 3. Dans certains langages de programmation, un paradigme de flux de données vertical (de haut en bas) assure l'ordre d'exécution. Dans LabVIEW, vous pouvez utiliser le câblage pour effectuer plusieurs opérations sur une variable tout en évitant les situations de compétition. Le diagramme suivant effectue des additions en utilisant un fil de liaison plutôt qu'une variable locale.

Astuce Si vous devez effectuer plusieurs actions sur une variable locale ou globale, pensez à déterminer l'ordre d'exécution.

Les situations de compétition se produisent aussi lorsque deux opérations essaient de mettre à jour une variable globale en parallèle. Pour mettre à jour la variable globale, une opération lit la valeur, la modifie puis l'écrit de nouveau à son emplacement. Si la première opération effectue l'action lire-modifier-écrire et que la seconde suit, le résultat est correct et prévisible. Si la première opération lit puis que la seconde en fait de même, les deux opérations modifient et écrivent une valeur. Ceci engendre une situation de compétition du processus lire-modifier-écrire qui se traduit par des valeurs manquantes ou non valides.

Pour éviter les situations de compétition associées aux variables globales, vous pouvez utiliser des variables globales fonctionnelles afin de protéger des sections de code critiques qui effectuent une action sur une variable. En utilisant une variable globale fonctionnelle au lieu de multiples variables locales ou globales, il n'est pas possible d'exécuter plusieurs opérations à la fois ; vous ne risquez donc pas d'effectuer des opérations en conflit ni d'attribuer des valeurs contradictoires aux données stockées.

Comportement des variables dans les boucles

Lorsqu'une variable contrôle plusieurs boucles parallèles, celles-ci doivent s'exécuter après l'écriture de la variable et vous devez lire la variable à chaque itération de chaque boucle.

Lorsque le système redémarre, la variable doit être placée dans une condition de démarrage correcte avant que les boucles qui lisent la variable ne s'exécutent, sinon les boucles s'arrêteront prématurément.

Prise en considération de la mémoire lors de l'utilisation de variables locales

Les variables locales effectuent des copies de tampons de données. Lorsque vous lisez une variable locale, vous créez un nouveau buffer pour les données depuis la commande associée.

Si vous utilisez des variables locales pour transférer de grandes quantités de données d'un endroit du diagramme à un autre, vous utilisez généralement plus de mémoire, et de ce fait, la vitesse d'exécution est plus lente que si vous transfériez des données avec un fil de liaison. Si vous avez besoin de stocker des données pendant l'exécution, utilisez plutôt un registre à décalage.

Considérations au sujet de la mémoire lors de l'utilisation de variables globales

Lorsque vous lisez depuis une variable globale, LabVIEW crée une copie des données stockées dans cette variable globale.

Lorsque vous manipulez de grands tableaux et chaînes, le temps et la mémoire nécessaires pour manipuler les variables globales peuvent être considérables. Manipuler des variables globales est particulièrement inefficace lorsque vous utilisez des tableaux, parce que si vous ne modifiez qu'un seul élément de tableau, LabVIEW enregistre et modifie le tableau entier. Si vous lisez la variable globale à plusieurs endroits dans l'application, vous créez plusieurs zones de mémoire tampon, ce qui est inefficace et ralentit les performances.

Reportez-vous au livre Gestion des performances et de la mémoire pour obtenir des informations complémentaires sur les considérations concernant la gestion des performances et de la mémoire dans LabVIEW.