Example Code

Gestion de distributeur de boissons utilisant une machine d’état

Code and Documents

Attachment

Vue D'ensemble


Cet exemple met en œuvre une architecture très souvent utilisée par tous les programmeurs en LabVIEW : la machine d’état. Vous découvrirez peut-être également quelques astuces de programmation comme les fonctions de condition et scrutation de touches de commande.

Fonctionnement :

La machine d’état permet de changer facilement l’ordre d’exécution des états et de prendre des décisions à chaque nouvel état pour se connecter vers un autre état.

Chaque état peut être écrit de manière séparée et il est possible d’en ajouter à volonté.

Une machine d’état LabVIEW est constituée d’une boucle While qui permet de basculer d’un état à un autre, d’un registre à décalage qui permet de stocker la transition vers l’état suivant, d’une valeur qui peut être un numérique, une chaîne de caractère ou comme ici une définition de type strict qui contient la liste des états possibles. En effet, l’avantage de cette définition par liste est que lorsque l’on ajoute une valeur d’état à la liste, toutes les commandes de définition de type strict seront réactualisées simultanément de manière automatique.

Dans cet exemple, la première valeur est l’initialisation qui, en entrant dans la boucle, va basculer dans le cas ‘’initialisation’’. En sortie de ce cas, la valeur de la transition passe à ‘‘ attendre’’, ce qui, au prochain tour de boucle, grâce au registre à décalage, va faire basculer dans le cas ‘‘attendre’’.

Le cas ‘‘attendre’’ permet de détecter si une commande de la face-avant a été enfoncée. Le sous-VI permet de scruter quelle valeur booléenne du bouton est à vrai par une boucle For. Si un bouton est enfoncé, alors la condition renvoie la valeur de la liste suivant sa position. Par défaut, la valeur ‘‘attendre’’ en sortie du sous-VI permet à la machine d’état de continuer à tourner en boucle.

Pour éviter d’utiliser 100 % du CPU, un VI ‘‘attendre un multiple de ms’’ met en sommeil le CPU et cadence la boucle tous les 800 ms. Cette valeur est volontairement exagérée afin de pouvoir visualiser les transitions dans la face-avant.

Lorsqu’une commande de la face-avant, dont certaines sont personnalisées et remplacées par des images de pièces de monnaie, est actionnée alors il y a basculement vers le cas concerné. Prenons l’exemple de la pièce de 5 centimes. Un autre registre à décalage qui contient la somme versée en cours sera augmenté de la valeur de la pièce, ensuite une comparaison est faite avec la valeur de l’article qui permet de savoir si la somme est atteinte et que la vente peut être faite.

Les autres cas sont identiques sauf qu’ils utilisent une manière différente de comparer en utilisant l’une des propriétés de la structure de cas. Seul le cas correspondant à la somme à atteindre et au delà déclenche le basculement vers l’état ‘’vendu’’. Il suffit de placer dans la condition la valeur à atteindre et le symbole de gamme ‘‘..’’ sans spécifier de valeur de limite supérieure.

L’état ‘‘vendu’’ permet d’afficher la boisson. Physiquement, c’est dans cet état que l’on déclenchera un relais afin de libérer la boisson. Puis on bascule dans l’état de rendre la monnaie.

Pour rendre la monnaie, deux cas se présentent : soit sur la face-avant du distributeur vous avez appuyé sur le bouton ‘‘rendre la monnaie’’ sans avoir atteint la somme qui déclenche la vente, soit vous avez dépassé la somme qui déclenche la vente.

Pour basculer dans les deux cas, on compare la somme actuelle avec la valeur de l’article puis, suivant le cas, on soustrait la somme introduite avec la valeur de l’article. Le reste sera rendu. Dans les deux cas on convertit la somme à rendre en chaîne de caractères et on l’affiche avec une concaténation avec la chaîne ‘’Centimes’’.

Le cas ‘’sortie’’ affiche un message à l’utilisateur et arrête le programme car, à chaque tour de boucle, on compare la valeur de la transition avec la condition d’arrêt de la boucle.

La structure de machine d’état est générique et peut être utilisée pour gérer n’importe quelle transition comme par exemple les actions de déplacement d’un robot en fonction de l’état des capteurs de position. Ici la machine d’état est utilisée pour gérer une interface utilisateur du programme. L’inconvénient de cette utilisation est qu’elle ne bufférise pas les actions sur la face-avant. Si le programme n’est pas dans l’état ‘’attendre’’ au bon moment, le basculement ne s’effectuera pas. De plus, le CPU sera réquisitionné pour réaliser les scrutations « pooling ».

D’autres exemples de code peuvent être utilisés pour montrer que dans ce cas particulier d’interface homme machine, la structure de détection d’événements est plus adaptée. Cependant l’utilisation des machines d’état est universelle et est le cœur de très nombreux programmes LabVIEW.

Example code from the Example Code Exchange in the NI Community is licensed with the MIT license.

Contributors