Durée : 2h. Cours, corrections de TP et autres documents autorisés.
On désire utiliser un ordinateur pour commander un système automatisé, plutôt qu'un automate programmable, car on envisage à terme piloter divers asservissements à l'aide de calculs complexes et dépendant de nombreuses variables, provenant en temps réel de divers capteurs mais aussi d'informations d'origine très variable, y compris d'Internet. Mais pour commencer nous allons nous limiter à des traitements séquentiels de systèmes tout ou rien. Nous supposons disposer d'une carte 16 entrées, 16 sorties, accessible en C à l'aide de quelques fonctions utilisables après avoir inclus le fichier "ent-sort.h", dont voici les entêtes :
Les numéros d'entrée ou de sortie sont des entiers entre 1 et 16. La fonction etat_entree retourne 1 si l'entrée est alimentée, 0 sinon.
Question 1 : Ecrivez un programme en C qui répond à ce cahier des charges :
Au départ du programme, éteignez toutes les sorties. Puis attendez que l'entrée 1 soit activée pour allumer la sortie 2. Vous l'éteindrez quand les entrées 2 et 3 sont toutes les deux allumées (mais pas s'il n'y en a qu'une) et allumerez en même temps la sortie 1, et ce jusqu'à ce que les entrées 2 et 3 soient éteintes toutes les deux. Puis le programme s'arrête.
On désire désormais écrire un programme permettant d'effectuer une séquence linéaire : L'utilisateur indique pour commencer le nombre d'étapes de sa séquence (dans la première partie il y en avait trois). Puis il indique, pour chaque étape la sortie qu'elle doit allumer (une seule sortie par étape, ou aucune) et l'entrée dont l'activation ou la désactivation permet de passer à l'étape suivante (une et une seule entrée, contrairement à la partie précedente). Puis votre programme exécute la séquence en affectant les sorties en fonction des entrées et des données introduites. Il n'y aura jamais plus de 100 étapes.
On utilisera deux tableaux. Le premier (appellé "action") contiendra, pour chaque étape, la sortie qu'elle doit allumer (et éteindre en passant à l'étape suivante, sauf si l'étape suivante doit allumer la même sortie). On codera par -1 les étapes où il ne doit pas y avoir d'action (pas de sortie allumée). Le second tableau (appellé "transition") contiendra le numéro d'entrée permettant de passer à l'étape suivante. S'il est positif, cette entrée devra être à 1 pour passer à la suite, par contre s'il est négatif c'est que l'on attend son état 0.
Question 2 : Ecrivez ce programme en C. Votre programme sera décomposé en au moins deux fonctions (en plus de main), l'une pour la saisie de la séquence, l'autre pour son exécution.
On désire passer à des cas plus complexes. L'enchaînement des étapes n'est plus linéaire, mais plusieurs étapes peuvent se dérouler en même temps. Une étape représentée par une structure contenant : le numéro de la sortie associée (une au maximum, -1 s'il n'y en a aucune), et son état (0 ou 1 suivant qu'elle est active ou non). Il y aura toujours moins de 100 étapes.
Question 3.1 : donnez une déclaration possible de ces 100 étapes.
Une transition (condition de passage d'une étape à une autre) sera représentée par une autre structure. Elle contiendra le numéro de l'entrée associée (obligatoirement une et une seule), positif ou négatif. Mais elle pourra être reliée à jusqu'à 10 étapes (dans les cas précédents il y en avait deux, une avant et une après), certaines avant (représentées par leur numéro, mais négatif), et d'autres après (numéro positif). La structure contiendra donc aussi un tableau de 10 numéros d'étapes, ainsi qu'un entier indiquant le nombre d'étapes qui y sont reliées. Il y a au plus 100 transitions.
Question 3.2 : Donnez une déclaration de ces transitions. Donnez également la ou les instructions permettant d'afficher le numéro de la dernière étape reliée à la première transition (on suppose bien évidement que les données ont été saisies entre la déclaration et l'affichage).
Question 3.3 : Avec les déclarations de la question 3.2, en supposant que les données ont été saisies, écrivez une fonction qui reçoive en argument (en plus de ceux permettant de connaître les transitions) un numéro d'étape (entier), et affiche toutes les transitions qui ont ce numéro d'étape soit en entrée soit en sortie. Il ne doit pas y avoir de variable globale.
Remarques : pour attendre qu'une entrée soit dans un état donné, on regarde sans arrêt son état, jusqu'à ce qu'il soit tel qu'on le désire. Pour ceux qui n'ont pas l'habitude de ce vocabulaire, activer, allumer et mettre à 1 sont "à peu près" synonymes, de même que éteindre, désactiver et mettre à 0.
pour retourner au sommaire des sujets d'examen, cliquez ici
Si vous le désirez, vous pouvez regarder ici une proposition de réponses.
Patrick TRAU, ULP - IPST fev 03