Discussions au sujet de NI LabVIEW

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

Peut-on mettre à jour un .ctl pendant l’exécution d'un programme ?

Résolu !
Accéder à la solution

Bonjour à toutes et à tous,

 

Je voudrai savoir s'il est possible de mettre à jour un ring défini en tant que déf de type pendant l’exécution de mon programme, je m'explique :

 

Dans mon programme l'utilisateur doit sélectionner un nombre N de sondes, une fois sélectionnées j'enregistre les voies sur lesquelles on trouve les sondes puis je les mets dans un menu déroulant.

sondes sélectionnées.png

 

 

 

menu déroulant associé.png

 

 

 

 

 

 

Ce menu déroulant je veux le transmettre à un sous-VI, sous-VI qui permet de placer les sondes sur un schéma, en fonction du nombre de sondes sélectionnées j'affiche tel ou tel schéma ici par exemple 5 sondes.

 

placement sondes.png

 placement sondes diagramme.png

 

 

 

 

 

 

(Le sous VI au centre ne sert qu'à vérifier que l'utilisateur n'ait pas sélectionné deux fois la même sonde sur le schéma).

Seulement dans le programme qui gère le placement des sondes j'ai placé plus d'une centaine de ring pour pouvoir parer à tous les cas possibles et j'aimerai qu'en fonction de ce que j'ai sélectionné comme sonde précédemment, les choix qui se trouvent dans mes ring soit modifiés d'où l'idée d'utiliser une déf de type puisque si j'arrive à la modifier pendant l’exécution de mon programme tous mes rings changeront en même temps et je n'aurai pas la lourdeur de transmettre le menu déroulant dans le sous VI de placement des sondes et surtout l'affectation de ce menu déroulant dans chaque menu déroulant en créant le nœud de propriété associé.

 

Voilà j'espère avoir était suffisamment clair et j'aimerai donc savoir si c'est possible de modifier un .ctl pendant l'exécution ou est ce que je dois faire la méthode "brut de décoffrage" ?

 

Cordialement 

 

Alex Delvart

 

0 Compliments
Message 1 sur 10
1 898 Visites

Bonjour Alex,

 

Tu ne peux pas modifier les TypeDef durant l'exécution de ton programme. Il Faut aller dans la fenêtre de la définition de type pour faire ça et ce n'est pas possible lorsque le vi roule.

 

S'agirait-il plutôt d'un listbox et non d'un ring?

 

Ben64

0 Compliments
Message 2 sur 10
1 867 Visites

Bonjour ben64,

 

Tout d'abord merci de votre réponse ! Dommage qu'on ne puisse pas modifier les .ctl pendant l’exécution du VI, ce n'est pas grave je peux utiliser la méthode un peu plus fastidieuse et moins flexible pour la suite. 

 

Ensuite j'utilise bien une listbox où l'utilisateur choisi les sondes qui sont câblées mais je pensais extraire les valeurs sélectionnés et les mettre dans un tableau pour le "transformer" en menu déroulant pour que ce ne soit pas intrusifs sur la face avant avec les schémas. Si j'affiche sur les schémas des listbox avec par exemple 5 ou 10 éléments j'ai peur d'avoir des gros "pavé" pour montrer à l'utilisateur l'ensemble de ses possibilités. Après je suppose que je peux redimensionner la listbox à un seul élément.

 

Malgré tout, je ne connais pas la différence entre le fait d'utiliser une listbox ou un ring et qui rendrait plus simple la transmission de données d'un VI dans un autre ? si vous avez des liens d'informations je suis preneur !

 

Cordialement 

 

Alex Delvart

0 Compliments
Message 3 sur 10
1 862 Visites

 

En fait les données que tu cherches à transmettre d'un VI n'est rien d'autre qu'un tableau de strings.

 

Ce tableau est la propriété "ItemNames" pour la listbox, et Strings[] pour le ring.

 

Je te conseille de travailler avec ce tableau de chaînes à travers tes VIs.

 

Walker34_0-1594881049028.png

 

0 Compliments
Message 4 sur 10
1 826 Visites

Bonjour Walker34,

 

Merci de votre réponse ! Je prends note de votre suggestion sauf que mon problème ne se situe pas là malheureusement...

 

Si je devais le résumer de façon plus générale ma problématique c'est :

Comment transmettre un tableau de string dynamique (sous entendu la sélection de l'utilisateur depuis la listbox) d'un VI dans un sous VI pour un grand nombre de commande, pendant que le VI tourne et sans en faire un diagramme illisible ?

Sur ma photo précédente il y a un exemple avec 5 menu déroulant mais j'en ai d'autre où il y en a 10, d'autre avec 15 etc, aussi si l'application évolue plus tard il faut que je (ou qqn d'autre) puisse faire des schémas de plus grande ampleur (30/40+ menu déroulant), si j'avais pu modifier un .ctl pendant l’exécution du VI j'aurai pu modifier toutes les nouvelles commandes en mettant en entrée le tableau de chaîne dans mon .ctl, là je dois faire ça :

methode sonde.png

"sondes selectionnees" représente le tableau de chaînes qui contient les sondes sélectionnées par l'utilisateur, je dois attribuer le tableau dans chacun de mes menu déroulant ça prends énormément de place dans le diagramme pour pas grand chose au final (c'est "juste" une attribution de valeur, aussi j'ai remarqué après avoir pris le screen que je n'avais pas câblé les entrées d'erreurs et que j'ai laissé mes menu déroulant en déf de type... je corrigerai ces problèmes plus tard) . 

Je cherche juste un moyen qui me permette de généraliser. Pour l'instant la solution ci-dessus suffit mais je ne sais pas si dans le futur (si on augmente considérablement le nombre de menu déroulant par exemple) cette méthode me permettra de relire facilement mon code.

0 Compliments
Message 5 sur 10
1 819 Visites
Solution
Accepté par l'auteur du sujet Alex_Delvart

À la base le problème est que ton programme n'est pas évolutif, ajouter des cas 30-40 sondes devrait avoir un impact mineur.

 

De ce que j'ai vu des images dans le cas 5 sondes on utilise les sondes 2,3,4,5,6. Pour 12 sondes on utilise 16 à 27. Ces informations devraient être dans un fichier de configuration (fichier .ini) par exemple:

5_sondes = Sonde 2,Sonde 3,Sonde 4,Sonde 5,Sonde 6

12_sondes = Sonde 16, ...

40_sondes = .....

 

Avec de telles lignes et la fonction Spreadsheet String To Array tu peux facilement recréer un tableau de chaines. Le but étant d'éliminer la structure case du nombre de sondes sélectionnées en rendant le code générique.

 

Je te suggère de créer un tableau de références de toutes les sondes, voici un exemple de comment faire ça dynamiquement:

Create References.png

Tu ajoutes autant de Ring  (dans l'exemple) que tu veux et si le label respecte le format Ring # alors la référence sera ajoutée au tableau.

 

Tu peux ensuite dynamiquement créer un sous-ensemble ces références qui correspond aux éléments sélectionnés. En utilisant une boucle FOR auto-indexée par ce tableau de référence sélectionnées tu peux ensuite mettre à jour et lire les propriétés Strings[] et Value.

 

Voici un exemple de ce que je veux dire.

Mise à jour Dynamique.png

 

Ben64

Message 6 sur 10
1 807 Visites

 

Le post de Ben explique bien la démarche propre.

 

En annexe un exemple qui récupère automatiquement tous les Ring de la face avant et leur attribue les liste lignes du ListBox sélectionnées.

 

 

0 Compliments
Message 7 sur 10
1 798 Visites

Merci à vous deux ! Désolé pour la réponse tardive, c'est ce que je cherchais !

Je n'avais pas pensé à utiliser les .ini pour ce genre de cas, merci pour ces idées !

 

Walker34, je suis désolé j'ai oublié de le préciser précédemment mais j'utilise labview 2016 est ce que tu pourrais me fournir ton exemple dans la version 2016 s'il te plait. 

 

Merci d'avance 

 

Alex 

0 Compliments
Message 8 sur 10
1 775 Visites
Solution
Accepté par l'auteur du sujet Alex_Delvart

Voilà en 2016.

Message 9 sur 10
1 766 Visites

Nickel ! Ça fonctionne parfaitement !

Merci à vous deux !

 

Cordialement,

 

Alex 

0 Compliments
Message 10 sur 10
1 761 Visites