le 04-12-2019 05:52 AM
Bonjour à tous,
Je travaille sur une interface où l'utilisateur pourra choisir plusieurs étalons. De ce choix en découle des fonctions accessibles (ou non), ce qui implique des unités disponibles ou non.
Ce programme est donc basé sur le raisonnement suivant :
Choix étalon -> Choix fonction -> Choix unité
Mon programme marche bien dans le sens, où il empêche à l'utilisateur de sélectionner une unité "incohérente". Je voudrai cependant rajouter une caractéristique : je voudrai une initialisation cohérente de la valeur fonction et unité lorsque l'utilisateur choisit un étalon.
Je m'explique, si l'utilisateur choisit l'étalon 8508, il aura accès à toutes les fonctions. Maintenant s'il choisit la fonction résistance et l'unité ohm, ces 2 choix resteront toujours en mémoire même s'il choisit un étalon qui n'a pas accès à cette fonction et à cette unité. J'ai voulu initialiser chaque étalon avec une fonctionet une unité disponible avec le noeud de propriété value mais forcément au sein de la boucle while, ma valeur devient donc figée et cela ne me va pas.
J'espère avoir été clair. N'hésitez pas à utiliser le vi pour visualiser le problème.
Merci de vos futurs conseils, et as usual, si des choses sont à améliorer (surement d'ailleurs) n'hésitez pas !
Résolu ! Accéder à la solution.
le 04-12-2019 08:34 AM
C'est exactement le cas qui est résolu par une structure "State Machine" (http://www.ni.com/tutorial/7595/en/).
le 04-12-2019 09:15 AM
Merci de ton conseil, maintenant que tu me l'as dit, je me sens bête de ne pas y avoir pensé !
Je code ça et je mettrai la résultat sur le forum.
As-tu constaté autrement des erreurs de codage ou des choses à optimiser ?
Merci de ton retour rapide et de ton lien, un rafraichissement de mémoire ne fait jamais de mal !
le 04-12-2019 09:23 AM
Mon seul conseil serait de toujours démarrer la programmation d'un VI avec un template de State Machine, à moins que le VI soit vraiment très simple.
le 04-16-2019 08:14 AM
Bonjour Marc, merci de ton retour.
J'ai essayé de reprendre mon petit VI d'initialisation mais je n'ai pas réussi à adapter une state machine pour que le programme ait le comportement voulu. Le comportement du programme était trop rigide comparé au programme que je t'ai montré. En "pilotant" la state machine avec un control je n'ai pas vu d'autres solution que de créer 2 boucles while imbriquées : - boucle de la state machine
- boucle englobant la state machine pour mettre a jour le control, ici "choix étalon"
Je me bloquais donc dans la state machine sans avoir accès au control "choix étalon"
Une solution rapide et simple (mais peut-être pas la meilleure) était tout simplement de sortir de la boucle, l'énum qui pilote les unités. Ainsi au premier tour de boucle, la donnée est transmise tout en en laissant la possibilité à l'utilisateur de changer ce paramètre. Le problème de cette technique est sa lourdeur, autant de constante d'énum que d'unités différentes.
Je continue à travailler sur la state machine, afin de voir si je ne peux pas faire quelque chose de plus propre.
le 04-16-2019 11:35 AM
Voici la state machine comme je le comprends. J'espère que ça aide.
le 04-17-2019 04:18 AM
Bonjour Marc,
Je viens de voir ta machine à état et elle répond parfaitement à mon objectif. Désolé de t'avoir "donné du boulot" mais je t'en remercie sincèrement car c'est très instructif ! Je pense maintenant pouvoir l'arranger et l'utiliser dans d'autres cas. Je ne la maîtrisais pas vraiment finalement donc merci pour ce cours illustré 😉
Cependant, il y avait un toute petite chose à rectifier pour que la "state machine" fonctionne à merveille, c'était de corriger un enum dans la structure évènement :
-> structure condition -> waits for events -> structure évènement -> fonction à générer -> enum : fonction à générer
(en étant sur waits for events, les contraintes de choix sur l'unité ne s'appliquaient pas)
Mais je suis sûr que tu l'as laissé volontairement pour me faire "briller" ! 😄
Plus sérieusement merci beaucoup pour ton aide ! Je vais accepter ta réponse comme solution et je pense poster un nouveau message avec cette même state machine qui contiendra plus de fonctions. Ce sera un bon exercice pour m'entrainer sur les state machine.
PS: il y a un léger bug avec la fonction fréquence (enum fonction à générer) car elle n'était pas totalement terminée lorsque j'ai transféré mon VI, je suis donc le seul fautif 😄
08-08-2019 05:13 AM - modifié 08-08-2019 05:35 AM
Bonjour Marc,
Je pensais avoir mis sur ce sujet la state machine que j'avais complété en continuant sur le (très bon) modèle que tu m'avais envoyé.
J'en profite pour te remercier à nouveau, car cela m'a vraiment aidé à mieux comprendre et à modifier cette "bestiole".
Je me dis qu'elle peut aider d'autre personnes et si je peux avoir d'éventuels retours sur des améliorations possibles ce serait super. Elle fonctionne bien : elle répond à mon objectif d'initialisation de la face avant, mais il est possible que beaucoup de choses soient à modifier pour améliorer l'efficacité du codage (si Luc passe par là, ne lui dîtes pas que c'est moi qui ait codé cela :D)
Plus sérieusement, j'ai reçu énormément d'aide de la part du forum et j'essaie de rendre un dixième de pourcentage de tout cela 😄
Comme d'habitude, toute remarque est la bienvenue 😄
Bon code à tous !