L'utilisation de machines d'état finies (FSMs) séparées permet de gérer plus facilement les différents scénarios et cas d'usage d'un système complexe. En effet, en séquençant les différentes FSMs en modules distincts, chaque état peut être finement ajusté pour s'adapter aux spécificités d'une situation donnée. Par exemple, dans un système de contrôle de pont, des états séparés peuvent être définis pour gérer les lumières, les barrières et les spans de manière indépendante, mais interconnectée. Cela simplifie la conception, tout en offrant une flexibilité dans l'ajout de nouveaux cas d'usage.

L'un des avantages majeurs de cette approche réside dans la capacité de personnaliser le comportement des différentes sous-parties du système en fonction des événements spécifiques. Par exemple, les lumières de circulation peuvent être programmées pour réagir à l'approche d'un véhicule d'urgence lorsque aucun bateau n'est présent, tout en maintenant les barrières ouvertes pour permettre à ce véhicule de passer. En revanche, lorsqu'un bateau est détecté, les comportements associés aux lumières et aux barrières doivent changer pour permettre une gestion fluide du trafic fluvial et routier. Cette gestion par états séparés réduit la complexité inhérente à un système monolithique où tous ces événements seraient traités simultanément au sein d'une même machine d'état finie.

Ainsi, le processus de gestion des FSMs pour des cas d'usage multiples devient bien plus simple lorsque chaque module est conçu séparément. Par exemple, dans le modèle de spécification et de description du langage (SDL), chaque sous-module de contrôle des lumières, des barrières ou des spans sera intégré dans un processus global. Ce processus unique, même s'il regroupe plusieurs FSMs, permet de maintenir une vue d'ensemble sur le comportement du système tout en offrant une granularité dans le contrôle de chaque sous-état.

Dans la Figure 3.11, le système de contrôle du pont pendant son opération normale est illustré. Ce modèle simple met en évidence un super-état AND, où plusieurs FSMs interagissent pour contrôler les différents modules du système de manière synchronisée. Chaque sous-état gère une partie du système, qu'il s'agisse des barrières, des lumières, ou des capteurs de bateau, et il est crucial que chaque FSM se comporte de manière indépendante tout en étant reliée aux autres par des variables globales.

Prenons l'exemple de la gestion de la lumière : lorsque le système détecte l'arrivée d'un bateau, les lumières passent au jaune pendant une durée définie avant de passer au rouge. Simultanément, les barrières se ferment pour interdire le passage aux véhicules pendant que le bateau traverse. Les capteurs de bateau, qui surveillent l'arrivée d'un bateau en amont et en aval, jouent également un rôle essentiel dans la coordination des actions. Le passage d'un bateau est détecté par le capteur en amont (USSEN), ce qui déclenche la mise à jour des variables et initie l'enchaînement des états dans les autres FSMs (comme la transition des lumières au rouge).

Cela dit, il est important de comprendre que l’utilisation de FSMs séparées ne se limite pas à la simplification de la gestion des états concurrents. Elle permet également d'intégrer des cas d'usage complexes sans surcharger un seul état global. Chaque FSM peut être développée, testée et améliorée indépendamment, tout en étant reliée aux autres par des variables partagées. Cela facilite la maintenance du système et l'ajout de nouvelles fonctionnalités sans perturber l'ensemble du fonctionnement du système.

En outre, il est essentiel de bien gérer les variables internes partagées, comme celles décrites dans la Table 3.2, pour s'assurer que chaque module est informé de l'état des autres modules. Par exemple, la position des barrières (indiquée par la variable I_bdown) est cruciale pour déterminer les actions à entreprendre dans d'autres sous-états, comme les transitions dans le contrôle des lumières ou des spans.

Il est également important de souligner que l’utilisation d’événements externes, tels que la détection d’un bateau par le capteur USSEN ou le mouvement des spans, est un élément central de cette coordination. Ces événements sont essentiels pour synchroniser les transitions entre les états des différentes FSMs, garantissant ainsi un comportement fluide et efficace du système.

Enfin, au-delà de la simple gestion des événements et des transitions, l'approche par FSMs séparées permet de mieux modéliser la réalité d'un système complexe où plusieurs actions doivent être entreprises simultanément mais de manière indépendante. Chaque sous-état peut ainsi réagir de manière autonome tout en contribuant à un résultat global cohérent. Dans des scénarios réels, cela devient indispensable, car chaque événement (comme le passage d'un bateau ou d'un véhicule) peut avoir des répercussions sur plusieurs aspects du système.

La principale leçon à retenir est que bien que la séparation des FSMs augmente la complexité de la conception initiale, elle simplifie énormément la gestion des états et leur interconnexion, rendant l’ajout de nouveaux cas d’usage ou la modification des comportements plus simples et plus flexibles.

Comment gérer la concurrence et les ressources partagées dans les systèmes FSM ?

Dans les systèmes de contrôle basés sur des machines à états finis (FSM), plusieurs processus parallèles interagissent souvent avec des ressources partagées. Cela peut entraîner des problèmes de contention et de non-déterminisme, particulièrement dans des sous-états qui attendent simultanément les mêmes signaux. Lorsque ces signaux arrivent en même temps, des transitions multiples peuvent se produire, modifiant les mêmes variables ou actionnant des dispositifs communs, ce qui peut causer des conflits. Ce type de situation est couramment rencontré dans des systèmes complexes où plusieurs modules physiques interagissent avec des capteurs et des actionneurs. Un exemple classique est celui des systèmes de contrôle de barrières et de ponts, où des capteurs détectent l’absence de trafic et déclenchent le mouvement des éléments physiques tels que les barrières et les travées du pont.

Prenons l’exemple du pont et des barrières. Lorsque les barrières sont abaissées, elles sont probablement accompagnées d’un mécanisme de moteur qui effectue l’action physique de descente. Une fois que les barrières ont atteint leur position finale, un capteur détecte cet état, et la transition dans la machine à états s’effectue. Ce processus interagit avec le monde physique et doit être modelé de manière à refléter la réalité, notamment en prenant en compte le temps nécessaire à ces actions. Le mouvement des éléments, comme la descente des barrières, prend un certain temps. Si cette durée est trop courte pour qu’un événement imprévu se produise (comme une situation d’urgence), on peut considérer cette action comme instantanée, comme c’est souvent le cas pour l’éclairage des feux de signalisation. Cependant, pour des actions comme le mouvement des ponts, le processus est plus complexe et il faut prendre en compte le fait que des événements imprévus, comme l’apparition d’un véhicule d’urgence, peuvent intervenir pendant l’exécution de l’action.

Un autre aspect crucial est la gestion du temps et des états intermédiaires dans le système. Par exemple, pendant que les travées du pont se lèvent, une situation d’urgence peut survenir, nécessitant l’arrêt immédiat du processus. Si ce processus de levée était simplifié et qu’il n’incluait pas un état intermédiaire pour refléter l’élévation partielle, il serait impossible de modéliser cette situation de manière adéquate. En effet, il serait essentiel de pouvoir détecter si le pont est dans un état de levée incomplet et, dans ce cas, arrêter l’opération avant que l’incident ne se produise.

Dans ce système, l’objectif est de bien gérer la synchronisation entre différentes actions physiques. Un autre aspect important à modéliser est la gestion de l’ordre des transitions et la synchronisation des différents sous-systèmes qui dépendent des mêmes ressources. Par exemple, la transition de l’état des barrières à l’état de levée du pont ne peut avoir lieu que si les barrières sont complètement abaissées et que le trafic a été dégagé. Si la machine à états de contrôle des barrières omet l’état de descente, la transition directe vers la position abaissée pourrait ne pas être représentée correctement, empêchant ainsi de simuler des dysfonctionnements, comme une barrière qui reste partiellement levée, ce qui empêcherait la poursuite de l’opération du pont.

Dans ces systèmes, l’utilisation de variables globales est essentielle pour la communication entre les sous-états, mais elle peut aussi entraîner des conflits si plusieurs transitions tentent d’écrire ou de modifier les mêmes variables en même temps. Un exemple courant est la tentative de mise à jour de la même variable par différentes transitions simultanées. Ce genre de conflit peut perturber la synchronisation des sous-systèmes et nuire à la stabilité de l’ensemble du processus.

L’une des solutions proposées pour résoudre ce problème de concurrence est l’utilisation de la sémantique StateMate, qui permet d’insérer une étape intermédiaire lors de l’exécution des actions. Cette étape évalue les expressions sur toutes les actions, mais attribue les résultats à des variables temporaires. Après l’évaluation, ces variables temporaires sont ensuite copiées dans les variables réelles de la machine à états. Cette approche permet de gérer les conflits en s’assurant que les actions simultanées qui modifient les mêmes variables sont effectuées de manière déterministe et prévisible. Ce processus garantit que même si plusieurs transitions sont effectuées en même temps, l’état final du système est cohérent et conforme à l’intention du modèle.

Cependant, cette solution ne résout pas tous les problèmes de concurrence. Lorsque plusieurs actions tentent d’accéder à une même ressource physique de manière conflictuelle, la situation devient non déterministe. Par exemple, si deux transitions tentent simultanément d’allumer un moteur, l’ordre d’exécution des transitions peut affecter l’état du moteur de manière imprévisible, ce qui pourrait entraîner des dysfonctionnements.

Dans des systèmes complexes tels que celui du contrôle des ponts et des barrières, il est important de comprendre que la gestion des ressources partagées ne se limite pas à la simple modification d’un état ou à la gestion du temps. Elle implique aussi la gestion de l’asynchronisme, de la concurrence et des potentiels conflits d’accès aux ressources, ce qui nécessite une stratégie de conception rigoureuse. Il est donc essentiel d’intégrer dans le modèle de machine à états des mécanismes permettant de simuler ces conditions de concurrence, afin de garantir la robustesse et la fiabilité du système dans des situations réelles.

Comment l'analyse des graphes de disponibilité aide à éviter les comportements indésirables dans les systèmes complexes

Lors de l'analyse d'un réseau de places/transitions modélisant un système en cours de conception, une des tâches de l'équipe d'analyse consiste à envisager différents ordres de tirage, y compris les tirages concurrents de transitions non conflictuelles. Cette approche vise à s'assurer que le non-déterminisme introduit par la sélection des ordres de tirage ne génère pas de comportements indésirables dans le système. Le graphe de disponibilité, introduit dans la section 5.3, est un outil important pour aider à l'étude de ce non-déterminisme.

La fonction de capacité KK doit refléter la capacité réelle du système. Prenons l'exemple d'une chaîne de montage automobile : la station où les portes sont assemblées sur les voitures dispose d'une capacité de stockage limitée et peut donc contenir un nombre fixe de portes. Autrement dit, elle a une capacité maximale. Dans les systèmes informatiques, où les processus communiquent par passage de messages, une place peut représenter un canal de communication et les jetons dans la place symbolisent les messages. Le processus récepteur dispose d'une file d'attente pour recevoir ces messages, cette file pouvant être déclarée avec une longueur fixe. Il est tentant, surtout pour les modélisateurs novices, de définir une capacité infinie (ω) pour toutes les places. Bien que la définition permette cela, il est important de s'efforcer de déterminer des valeurs réalistes pour les capacités. Par exemple, des simulations ou des walkthroughs peuvent aider les concepteurs à déterminer des exigences réalistes pour la performance des transitions (par exemple, quel est le temps maximal admissible pour qu'une transition soit effectuée), puis à en déduire la capacité réelle nécessaire pour les places.

Prenons encore l'exemple de la chaîne de montage : l'aire de stockage des portes (P2 dans la Figure 5.3) ferait partie du post-ensemble d'une autre transition, celle qui déplace les portes d'une grande zone de stockage (non montrée dans la figure) vers la chaîne de montage. Cette grande zone de stockage serait elle-même dans le post-ensemble d'une autre transition représentant la fabrication des portes, et ainsi de suite. D'autres parties de la chaîne de montage auraient des ensembles similaires de places et de transitions pour leurs composants respectifs. En étudiant l'ensemble du réseau et en estimant la vitesse à laquelle divers processus (c'est-à-dire les transitions), comme la fabrication des portes et leur transfert depuis le stockage principal vers la ligne de montage, peuvent être réalisés, les concepteurs peuvent estimer les capacités nécessaires pour les places, vérifier si des goulets d'étranglement peuvent survenir lorsque des affectations de capacités provisoires sont effectuées, examiner différents scénarios et ordres de tirage des transitions pour vérifier si l'un de ceux-ci dépasse les capacités provisoires et ajuster ces capacités afin de garantir le bon déroulement et la rapidité de la chaîne de montage.

Un autre concept clé est celui de la portée dans les réseaux de places/transitions. La portée fait référence à l'ensemble des marquages (ou états) accessibles à partir d'un marquage donné MM. Lorsque le réseau est dans l'état MM, cet état est évidemment déjà atteint. Tout état MM' qui peut être obtenu en appliquant une transition activée dans MM est également accessible depuis MM, et en fait, accessible en un seul coup. De même, un état MM'', obtenu en appliquant une transition activée dans MM', est accessible depuis MM en deux étapes. L'ensemble des marquages accessibles est défini comme la clôture transitive de ce processus.

La portée des marquages peut être explorée par simulation. On pourrait essayer de générer l'ensemble entier, bien qu'un point de coupure dans le processus de génération soit nécessaire pour interrompre la simulation si la portée devient infinie. En effet, la portée de tout réseau réel ne doit pas être infinie ; le nombre de jetons dans au moins une place devrait nécessairement augmenter continuellement au fur et à mesure de l'opération du système. Un réseau dans lequel le nombre de jetons dans chaque place est limité par une borne supérieure finie, quelle que soit la séquence de tirages suivie, est appelé un réseau borné.

La portée des marquages, qu'elle soit analysée manuellement ou à l'aide de graphiques de portée, permet également d'identifier des inefficacités potentielles dans l'opération du système. Par exemple, dans l'exemple de la robotisation, le robot R2 pourrait attendre que R1 remplisse toutes les trois parties avant de commencer à retirer les pièces. Cela est indiqué par la séquence de transitions T1, T2, T3, répétée plusieurs fois. R1 pourrait aussi attendre que R2 retire toutes les pièces avant de commencer à les remplir. Il est évident que cette stratégie n'est pas optimale, et l'équipe de conception devra aborder cette inefficacité dans la conception du système final.

En somme, l'analyse des graphes de portée et de la portée elle-même offre un aperçu précieux des différents ordres de tirage possibles et des relations de dépendance entre transitions. Ces analyses permettent de détecter les goulets d'étranglement et d'identifier des scénarios inefficaces, mais aussi de simuler l'ensemble des marquages accessibles pour mieux comprendre le comportement du système en différentes configurations. Cela aide à affiner la conception afin d'atteindre des performances optimales, notamment en maximisant l'efficacité des processus parallèles et en garantissant que les capacités allouées sont adéquates.