Concevoir une logique d’interface homme-machine à l’aide de diagrammes Stateflow
Cet exemple montre comment modéliser la logique d’une interface utilisateur graphique dans un diagramme Stateflow® autonome. Les diagrammes autonomes implémentent une sémantique de diagramme classique avec MATLAB® comme langage d’action. Vous pouvez programmer le diagramme à l’aide de toutes les fonctionnalités de MATLAB, y compris les fonctions qui sont restreintes pour la génération de code dans Simulink®. Pour plus d’informations, veuillez consulter Create Stateflow Charts for Execution as MATLAB Objects.
Vous pouvez exécuter un diagramme Stateflow autonome en invoquant ses événements d’entrée et en utilisant des opérateurs temporels. Le workflow d’exécution piloté par des événements et par des timers est adapté pour la conception de la logique sous-jacente des interfaces homme-machine (IHM) et des interfaces utilisateur graphiques (UI).
Quand vous utilisez l’App Designer MATLAB, les fonctions de rappel depuis les widgets de l’interface invoquent des événements dans le diagramme.
Dans le diagramme Stateflow, les opérateurs temporels et les données locales contrôlent les propriétés de l’interface utilisateur.
Pour plus d’informations sur l’utilisation de MATLAB pour créer des interfaces utilisateur graphiques, consultez Développer des applications avec App Designer.
Contrôler une interface utilisateur App Designer
Cette interface utilisateur contient un interrupteur marche/arrêt qui contrôle une lampe. Quand l’interrupteur est sur la position marche, la lampe s’allume de deux façons différentes, soit fixe soit clignotante, en fonction de la position du bouton d’option Mode. Vous contrôlez la vitesse du clignotement en bougeant le curseur Blink Rate. Pour exécuter l’application, dans la barre d’outils de l’application Designer, cliquez sur Run.

Le fichier sf_lamp_logic.sfx définit un diagramme Stateflow autonome qui implémente la logique pour l’interface utilisateur. Le diagramme possède des événements en entrée (ON, OFF, BLINKING, et SOLID) et des données locales (delay et app). Les actions dans le diagramme contrôlent quels widgets sont accessibles depuis chaque état. Par exemple, les actions dans l’état Off grisent le widget Lampe, les boutons d’option Mode et le curseur Blink Rate de l’interface utilisateur.

Dans l’état On, les sous-états Solid et Blinking représentent les deux modes de fonctionnement. Pour implémenter une lampe clignotante, le diagramme dépend de l’opérateur de logique temporelle after. Quand le diagramme entre dans l’état Blinking.Off, l’expression after(delay,sec) sur la transition sortante crée un objet timer MATLAB qui exécute le diagramme après un certain nombre de secondes. Le diagramme effectue ensuite une transition à l’état Blinking.On et crée un autre objet timer pour redéclencher la transition vers Blinking.Off. Pendant que le diagramme effectue des transitions en continu entre les deux états, vous pouvez ajuster la vitesse de clignotement en changeant la valeur du délai des données locales ou effectuer une transition hors du mode clignotement en invoquant les événements en entrée SOLID ou OFF.
La jonction d’historisation dans l’état On préserve les informations sur le sous-état le plus récemment actif afin que l’interface utilisateur revienne au mode de fonctionnement précédent quand vous allumez la lampe.
Exécuter des diagrammes autonomes à l’aide d’événements
Vous pouvez exécuter le diagramme autonome en appelant ses fonctions d’événements en entrée dans la fenêtre de commande MATLAB. L’éditeur Stateflow montre les effets de chacune de ces commandes en mettant en évidence les états actifs et les transitions avec une animation du diagramme.
1. Créez l’objet de diagramme L et initialisez la valeur de delay à 0,5. Cette valeur correspond à une vitesse de clignotement d’un flash par seconde (allumé pendant 0,5 seconde et éteint pendant 0,5 seconde).
L = sf_lamp_logic(delay=0.5);
2. Allumez la lampe.
ON(L)
3. Passez en mode clignotement.
BLINKING(L)
4. Définissez la valeur de delay sur 0,25. Cette valeur correspond à une vitesse de clignotement de deux flashs par seconde (allumé pendant 0,25 seconde et éteint pendant 0,25 seconde).
L.delay = 0.25;
5. Passez en mode fixe.
SOLID(L)
6. Éteignez la lampe.
OFF(L)
7. Supprimez l’objet chart L de l’espace de travail MATLAB.
delete(L)
Connecter un diagramme autonome à une interface utilisateur
Pour établir une connexion bidirectionnelle entre l’interface utilisateur et le diagramme Stateflow autonome, ouvrez la fenêtre de l’App Designer et sélectionnez Code View (Visualisation du code).
1. Dans la fenêtre de l’App Designer, créez une propriété privée lampLogic pour stocker le handle vers l’objet de diagramme Stateflow.
properties (Access = private)
lampLogic
end
2. Créez une fonction de rappel StartupFcn qui crée l’objet de diagramme et définissez son app de données locales sur le handle de l’interface utilisateur. Attribuez le handle de l’objet de diagramme à la propriété privée lampLogic.
function StartupFcn(app) app.lampLogic = sf_lamp_logic(delay=0.5,app=app); end
3. Créez une fonction de rappel CloseRequestFcn qui supprime l’objet de diagramme quand vous fermez l’interface utilisateur.
function UIFigureCloseRequest(app, event) delete(app.lampLogic); delete(app); end
4. Pour chacun des widgets de l’interface utilisateur, ajoutez une fonction de rappel qui invoque l’événement approprié dans le diagramme autonome.
Fonction de rappel
ValueChangedFcnpour le widget Switch (interrupteur) :
function SwitchValueChanged(app, event) value = app.Switch.Value; switch lower(value) case "off" OFF(app.lampLogic); case "on" ON(app.lampLogic); end end
Fonction de rappel
SelectionChangedFcnpour le widget Mode Button :
function ModeButtonGroupSelectionChanged(app, event) selectedButton = app.ModeButtonGroup.SelectedObject; if selectedButton == app.SolidButton SOLID(app.lampLogic); else BLINKING(app.lampLogic); end end
Fonction de rappel
ValueChangedFcnpour le widget Blink Rate Slider (curseur de vitesse de clignotement) :
function BlinkRateSliderValueChanged(app, event) app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2); end
Quand vous utilisez l’interface utilisateur, vous pouvez observer les effets produits lorsque vous ajustez les widgets de contrôle sur la trame du graphique et sur le widget lampe.