Exécuter des états en parallèle
Vous pouvez configurer un diagramme Stateflow® pour activer chaque état d’un niveau hiérarchique dans le même pas de temps grâce à la décomposition parallèle. Vous pouvez utiliser des événements pour qu’un état puisse déclencher un certain comportement dans un autre état.
Lorsqu’un diagramme ou un état utilisant la décomposition parallèle devient actif, chacun de ses enfants directs devient actif lui aussi. Ces enfants sont appelés états parallèles et comportent une bordure en pointillés sur le canevas.
Dans l’exemple de diagramme suivant, les états ParentA et ParentB utilisent la décomposition parallèle. Lorsque chaque état parent devient actif, ses deux états enfant deviennent également actifs.

À chaque pas de temps, le diagramme exécute les actions et évalue les transitions de chaque état parallèle d’un niveau hiérarchique dans l’ordre séquentiel indiqué par un numéro dans le coin supérieur droit de chaque état. Par exemple, quand ParentB devient actif, le diagramme entre à la fois dans ChildC et dans ChildD. Comme l’ordre d’exécution de ChildC est 1, il définit y à 3. Puis, dans le même pas de temps, ChildD redéfinit y à 4.
Vous pouvez modifier l’ordre d’exécution en faisant un clic droit sur un état, en cliquant sur Execution Order et en sélectionnant un autre ordre.
Dans cet exemple, vous allez utiliser des états parallèles pour terminer le modèle inachevé d’un système de batterie. Vous allez ensuite utiliser des événements pour créer des interactions entre les états. Le système de batterie contient deux composants indépendants :
Une batterie principale rechargeable
Une batterie de secours non rechargeable qui maintient les fonctions essentielles si la batterie principale est vide
Ouvrir le modèle
Le modèle sfGetStartedParallel représente la logique de contrôle d’un système de batterie rechargeable. Pour créer le modèle, suivez les instructions des étapes précédentes du tutoriel.

Double-cliquez sur le bloc Chart pour accéder au diagramme de la batterie.

Le diagramme contient deux états non parallèles qui représentent la batterie principale et la batterie de secours. Chaque batterie contient des états enfant imbriqués qui représentent les modes de fonctionnement pour la charge, la décharge ou la veille. Par ailleurs, les batteries utilisent des données d’entrée, de sortie et locales :
isCharging: donnée d’entrée qui indique si le système de batterie est connecté à une source d’énergie. Cette donnée détermine l’état actif de la batterie principale.deviceDemand: donnée d’entrée qui représente la puissance demandée par l’équipement connecté.maxWatts: donnée locale qui représente la puissance en sortie maximale de la batterie principale.sentPower: donnée locale qui représente la puissance en sortie de la batterie principale. SideviceDemandest inférieur àmaxWatts, cette donnée est égale àdeviceDemand. Sinon, elle est égale àmaxWatts.mainChargeetemergencyCharge: données locales qui représentent le pourcentage de charge de chaque batterie.
Pour plus d’informations sur le fonctionnement de la batterie principale, consultez les étapes précédentes du tutoriel.
Activer la décomposition parallèle
Vous pouvez activer l’exécution parallèle pour les états enfant en faisant un clic droit sur le composant parent et en sélectionnant Decomposition > Parallel.
Comme les états MainBattery et EmergencyBattery n’ont pas d’état parent, le diagramme est considéré comme leur parent. Activez la décomposition parallèle pour le diagramme en faisant un clic droit sur une section vide du canevas et en sélectionnant Decomposition > Parallel. Les bords des deux états sont mis en pointillés pour indiquer qu’ils sont parallèles.

Diffuser et recevoir des événements
Vous pouvez faire en sorte qu’un composant du diagramme déclenche un certain comportement dans d’autres composants du diagramme ou du modèle en diffusant des événements. Par exemple, dans un diagramme contenant deux états parallèles, vous pouvez diffuser un événement dans un état pour déclencher une transition dans l’autre.
Pour diffuser un événement à partir d’un état ou d’une transition, utilisez l’opérateur send avec le format suivant :
send(event_name,receiving_state)
Pour recevoir l’événement diffusé dans une transition, saisissez le nom de l’événement dans le libellé de celle-ci. Il n’est pas nécessaire de placer l’événement entre crochets ou accolades. La transition doit être un enfant direct ou indirect de l’état récepteur.

Les exigences du projet de système de batterie stipulent que la batterie de secours doit se décharger quand la batterie principale est vide et se mettre en veille quand la batterie principale commence à se recharger. Faites basculer le mode de fonctionnement de la batterie de secours en diffusant des événements à partir de la batterie principale.
1. Dans l’état MainBattery, dans l’action d’entrée de l’état enfant Empty, diffusez un événement nommé toggleOn à l’état EmergencyBattery :
entry: sentPower=0; send(toggleOn,EmergencyBattery);
2. Dans l’état MainBattery, dans l’action d’entrée de l’état enfant Charge, diffusez un événement nommé toggleOff à l’état EmergencyBattery :
entry: sentPower=3.5; send(toggleOff,EmergencyBattery);
3. Dans l’état EmergencyBattery, double-cliquez sur la transition de Standby vers Discharge et saisissez le libellé toggleOn.
4. Double-cliquez sur la transition de Discharge vers Standby et saisissez le libellé toggleOff.
5. Dans le volet Symbols, cliquez sur le bouton Resolve undefined symbols pour définir toggleOn et toggleOff comme des événements locaux. Dans les actions d’entrée et les transitions, toggleOn et toggleOff deviennent orange pour indiquer un événement.

Simuler le modèle
Le modèle enregistre deux valeurs dans le Simulation Data Inspector :
L’activité de l’état
EmptydansMainBattery, où1correspond à actif et0à inactif.Le nom de l’état enfant actif de
EmergencyBattery.
Simulez le modèle et observez ces valeurs.
Revenez dans le modèle Simulink de plus haut niveau. Le bloc Manual Switch modifie le mode de fonctionnement de la batterie principale. Quand la valeur est
1, la batterie se recharge. Quand la valeur est0, la batterie se décharge.Pour simuler le modèle, accédez à l’onglet Simulation et cliquez sur Run. Le bloc Chart présente l’exécution du diagramme.
Double-cliquez sur le bloc Manual Switch pour décharger la batterie. Au bout de quelques secondes, quand la batterie principale transitionne vers
Empty, double-cliquez sur le bloc Manual Switch pour la recharger. Répétez ce processus plusieurs fois.Pour arrêter la simulation, accédez à l’onglet Simulation et cliquez sur Stop.
Pour ouvrir Simulation Data Inspector, accédez à l’onglet Simulation et cliquez sur Data Inspector.
Pour afficher l’activité de l’état
Empty, accédez à l’onglet Inspect et cliquez surMainBattery.Discharge.Empty:IsActive.Pour afficher l’état enfant actif de l’état
EmergencyBattery, accédez à l’onglet Inspect et cliquez surEmergencyBattery:ActiveChild.
Quand la batterie principale est vide, la batterie de secours se décharge. Quand la batterie principale quitte l’état Empty et commence à se recharger, la batterie de secours se met en veille.
