Vous êtes sur la page 1sur 26

TER Atelier flexible

S.U. Ngueveu - S. Caux


EEEA 3A - ACISE
2023/2024

L’atelier
Vidéo de présentation / montrer maquette

L’objectif du TER est de développer/implémenter la capacité de produire automatiquement et de


façon parallèle au sein d’un atelier flexible. Il a lieu à la MFJA afin de bénéficier du développement
2
de la maquette et de la simulation qui est commun à plusieurs établissements du site Toulousain.
4 Robots
Présentation du système 8 postes de travail P1...

12 aiguillages A1...

24 actionneurs/capteurs
“ stops” (PS1, ...)
1 2 3
10 capteurs de position
CP (CP1, ...)

5 4 8 capteurs de position
‘intérieur’ CPI (CPI1, …)
0 6 positions d’apparition
des navettes dans
l’ordre 3

Présentation du système
SR3 18 sections de rails
SR1

1 seul sens de
S2 S1 S12
circulation
S3 S11
SR1,...,SR4
S4 S13 S14 S10(acces robot/tache)

S1,…,S14
S5 S9
(déplacement)
S6 S8
S7

SR2 SR4

4
Environnement / outils

5
Macro fonctions implémentées

Principes de Production de Produits


● Numéro/Type devant être choisi entre 1 et 6 (produit A=1, produit B=2, …)
● Arrivée: un produit peut ‘apparaître’ sur n’importe quel poste au choix de
l’élève dans votre commande au début et en cours de simulation
● Les produits doivent suivre les étapes de leur construction (suite de
Tache/Poste) telle que définie dans le fichier dataXX.prodconfig.h considéré
● Evacuation: seul le poste 3 permet d’évacuer un produit. Il faut alors que le
produit ait été mis sur le poste 3 avant de lancer la commande d’évacuation
● En simulation COPPELIASim, produits et tâches sont matérialisés par des
empilements de cubes colorés
○ Un code couleur a été attribué à chaque produit (ex rouge pour le produit 1).
Chaque produit a donc sa couleur associée, qui permet de le reconnaître pendant
la simulation. Cette couleur concerne le cube en contact avec la navette.
○ Les couleurs des autres cubes de l’empilement reflètent les postes de travail par
lesquels est passé le produit. 6
Simulation COPPELIA: produits
● Arrivée / Évacuation des produits
○ Les produits peuvent arriver/apparaître sur n’importe quel poste
■ Arrivée/Apparition d’un produit B (= type 2) sur le poste 4: robot.AjouterProduit(POSTE_4, 2)
○ Le poste 3 est le seul permettant d’évacuer un produit
■ Evacuation du produit qui se trouve sur le poste 3: robot.Evacuer()

● Codes couleurs des produits : sur navette ou sur poste de travail


○ Transparence lorsqu’un produit est en cours de fabrication (cube haut)
○ Couleur pleine pour chaque étape de fabrication terminée
○ Type de produit et étapes respectant le fichier de données (dataXX.prodconfig.h)
○ Une tâche 1 se fait sur le poste 1 … etc
○ Le 1er cube (du bas) indique la couleur du produit (ex B=2x=bleu sur la figure ci-dessus)

Ex: 2: 3 4: 6 8: 5 //un produit de type 2 (donc B) doit faire Tache3 puis Tache4,
respectivement durant 6s et 8s; le ‘:5’ à la fin indique 5 produits de ce type à produire

● Numéros des postes et codes couleurs associés (voir slide suivant)


7

Simulation COPPELIA: produits et couleurs


Du bas vers le haut:

● couleur du 1er cube => type du produit Type de produit Couleur


● couleurs du 2ème cube au dernier cube
=> tâches déjà effectuées sur le produit A ou 1 rouge
(couleurs des postes associés). B ou 2 bleu

C ou 3 vert
Produit de type 2 (B)
transporté sur une D ou 4 orange
navette, après avoir été
E ou 5 rose
usiné par les postes de
travail POSTE_3, F ou 6 jaune
POSTE_6, POSTE_4 puis
POSTE_1

8
Simulation COPPELIA: tâches et couleurs
Postes / Tâches Couleur

POSTE_1 rouge

POSTE_2 bleu

POSTE_3 vert

POSTE_4 orange

Produit de type 2 (couleur associée = bleue) en cours POSTE_5 rose


d’usinage sur le poste 4=orange (d’où l’effet de
transparence orange du cube haut), après avoir été usiné POSTE_6 jaune
sur les POSTE_3 et POSTE_6.
POSTE_7 Blanc
Lorsque l’usinage sur le POSTE_4 sera terminée, l’effet
POSTE_8 Noir
de transparence disparaîtra
9

Simulation et maquette: navettes


● Comment et où stopper une navette et la faire redémarrer
○ les navettes avancent toujours sauf quand elles détectent un capteur-stop PS qui
a été activé. “cmd.Stop_PS(2);” stoppe en cette position une navette sur
PositionStop2
○ 2 navettes peuvent se rattraper mais une détection de proximité évite le choc.
○ Lorsque le stop est désactivé la navette repart (cmd.Ouvrir_PS(2); ).

● Il faut mémoriser/gérer soi-même les positions de la navette


○ pas possible de connaître l’identité d’une navette ou demander à une navette où
elle se trouve sur le rail, il faudra traquer soi-même cette information, à l’aide d’un
réseau de Petri
○ détecter la présence d’une navette sur CapteurPosition1 : capteur.get_CP(1);
capteur.get_PS(2); ...
10
Simulation et maquette: aiguillages et robots
● Les aiguillages
○ aiguillage.Droite(2); //oriente l’aiguillage2 vers la droite (idem aiguillage.Gauche(1);)
○ Fin de mouvement des aiguillages/direction: capteur.get_DG(3); (idem : capteur.get_DD(4););
○ Remarque 1 : Il faut commander assez tôt les aiguillages avant le passage de la navette
○ Remarque 2 : Toujours vérifier si les aiguillages déplacés sont bien verrouillés en place

● Déplacement et Tâche Robots:


○ Evacuation uniquement sur le POSTE_3 (vert): robot.Evacuer();
○ robot.DeplacerPiece(ROBOT_2,1,2); // le robot 2 prend la pièce sur le Poste3 (sa position
n°1) et pose sur la navette en entrée (sa position n°2). Voir slide suivant. Retourne un
booléen accessible par la fonction robot.FinDeplacerPiece(Robot_2);
○ robot.FaireTache(Poste_4,5); // la tache4(celle du poste4) se fait durant 5s. Renvoie un
booléen accessible par la fonction: robot.TacheFinie(Poste_4);

11

Simulation et maquette: robots


void robot.DeplacerPiece(ref_robot, num_position_A, num_position_B);
- ACTION : Réalise successivement les actions suivantes: déplacer le bras du robot en position A, descendre bras,
fermer pince, lever bras, déplacer bras en position B, descendre bras, ouvrir pince, remonter bras
- ref_robot peut prendre les valeurs ROBOT_1, … ROBOT_4
- num_position_A peut prendre les valeurs 1, …, 4
- num_position_B peut prendre les valeurs 1, …, 4

int robot.FinDeplacerPiece(ref_robot);
- INFO : Retourne 0 si le robot ref_robot est en train de déplacer une pièce et > 0 sinon
- ref_robot peut prendre les valeurs ROBOT_1, … ROBOT_4

❖ 4 positions prédéfinies pour


chaque robot
❖ numérotées de 1 à 4

12
CAHIERS DES CHARGES

13

TER focalisé sur la cellule rouge


1 seule navette circulant
SR1
au sein de la cellule rouge

S2 S1 Partie 1:
S3
La production ne concerne
que les postes de travail
S4 S13 P3 et P4

S5 Partie 2:

S6 La production concerne les


4 postes de travail P1, P2,
P3 et P4
SR2
14
Sujet du TER
● Prise en main (1/4 séance): fabriquer un produit sur le poste P4 et l’évacuer (avec puis
sans passage par la navette)
● Implémenter la production automatique et parallèle (WIP(1) > 1) sur la demi-cellule P3-P4
● Étendre votre production automatique et parallèle (WIP(1) > 1) sur la cellule rouge

Pour réaliser ce cahier des charges, il vous faudra donc lancer les différentes tâches liées à la
production et au transfert des produits d’un poste à l’autre, mais aussi gérer le déplacement de
la navette au sein de la cellule rouge !

Pour ce faire, vous devrez modifier/compléter le fichier “XXX_XXX.main_commande.cpp”,


après avoir remplacé les XXX par les quatre premières lettres de vos noms de famille.

(1)
WIP = work in progress (nombre de produits en cours de fabrication en parallèle) 15

Cahier des charges (CDC)


● Interdiction de circuler sur les voies près des postes (SR1, …, SR4) si ce n’est
pour y amener/récupérer un produit ou pour des permutations via navette
● Interdiction pour la navette de stationner sur les voies près des postes (SR1, …,
SR4) si un (dé-)chargement ou une permutation via navette n’est pas en cours
● Interdiction de circuler sur la voie S7
● Gérer la production de plusieurs unités d’un même produit en plus de la
production de plusieurs types de produits différents
● Le code / réseau de Petri doit fonctionner même si les durées de fabrication ou
les postes de fabrication sont modifiés de manière arbitraire
● WIP > 1
● Critères d’évaluation: Respect du CDC, puis niveau de parallélisation (WIP), puis
durée totale d’exécution
❖ LIMITES : (1) pas plus de 5 tâches par produits, (2) pas de répétition d’opération 16
au sein d’une gamme (une opération = une paire “poste/durée”)
Prise en main de la production automatique
Demi-cellule P3-P4, 1 navette, 1 produit, 1 unité par produit

● Lorsque la navette n’est pas sollicitée elle circule ou est en arrêt sur les rails
S2, S3, S4, S5, S6, S13
● Gammes pour la prise en main de chaque binôme (demandez votre numéro à
l’enseignant/e)
○ dataP34_1_1_n1 → B : 4 3 3 4 3 : 10 8 13 7 4 : 1
○ dataP34_1_1_n2 → C : 3 3 3 4 : 3 7 8 15 : 1
○ dataP34_1_1_n3 → D : 4 4 4 3 : 11 1 3 7 : 1
○ dataP34_1_1_n4 → E : 4 3 4 3 4 : 2 4 8 14 9 : 1
○ dataP34_1_1_n5 → F : 3 3 4 4 3 : 9 5 15 6 6 : 1

17

Exemples de gammes de fabrication


dataP123_1_4_n0 : cellule rouge, 1 produit, plusieurs unités par produit, pas de conflit potentiel
- B : 2 1 3 : 5 10 2 : 4

dataP13_2_1_n0 : cellule rouge, plusieurs produits, 1 unité par produit (conflit potentiel entre D et E)
- D:13:23:1
- E:31:25:1

Gammes de fabrication Plusieurs produits Plusieurs unités par produit Conflits potentiels

dataP13_2_1_n0 ✅ ❌ ✅

dataP123_1_4_n0 ❌ ✅ ❌

dataP1234_1_3_n0 ❌ ✅ ✅

dataP123_3_1_n0 ✅ ❌ ✅

dataP123_4_4_n0 ✅ ✅ ✅
18
Architecture / Environnement logiciel

19

Structure du dossier TER


src

CoppeliaSim Doc ros_ws build


celluleflexible sim

devel

etu dataprodconfig exemples output

20
Linux/TER: Accès
● Les instructions terminal-linux utiles: ls, cd, ./toexecute
○ Monter/Descendre répertoire: cd Monrep cd ..
○ Renommer fichier: mv nom_fichier_init nom_fichier_final
○ Copier : cp nom_fichier_original nom_fichier_duplicata
○ Liste du contenu : ls
○ Exécution avec deux arguments en entrée : ./script_a_executer argument_1 argument_2

● Accès à la simulation/maquette via une machine virtuelle de la MFJA:


○ Login pass (domaine IUT)
○ Bureau->VirtualBox -> ‘machine ajouter’: c:\virtal_b\ROS Ubuntu20
○ Démarrer Machine Virtuelle
○ Menu -’gestionnaire de fichier’ -> Documents/TERN7
○ README -> instructions config Ros+Coppelia+Atelierflexible
○ clickDroit -> ‘ouvrir dans un terminal’
○ (souris: copier/coller les instructions... cf slide suivant)
○ Revenir dans le répertoire de travail ‘etu’
○ Si nécessaire faire le test avec ‘TutoBasique’ cd ..
21

ROS/Coppelia/TER
● Pour (ré-)initialiser l’environnement:
Depuis le terminal, une fois dans le dossier du TERcelluleflexible, lancer les commandes suivantes:
➢ cd celluleflexible/ros_ws
➢ source /opt/ros/noetic/setup.bash
➢ catkin_make
➢ source devel/setup.bash
➢ cd ../../etu
A présent vous êtes dans le dossier etu et prêt(e)s à commencer (à partir de ce moment n'utiliser que les scripts 0 à 4)
Cette manip est aussi à refaire si vous fermez le terminal, ou arrêtez la simulation de manière incorrecte

● Pour le TER: à partir du dossier etu


➢ mv XXX_XXX.main_commande.cpp VOS_INITIALES.main_commande.cpp
➢ ./script0_Compile.sh VOS_INITIALES NOM_FICHIER_DATA
➢ ./script1_Run.sh
➢ ./script2_GetSimuOutput.sh VOS_INITIALES NOM_FICHIER_DATA
➢ ./script3_Validation.sh VOS_INITIALES NOM_FICHIER_DATA
➢ ./script4_Documentation.sh VOS_INITIALES

● Des fenêtres XTerminal permettent de visualiser Etat 4Robots et Simulation


Dans fenêtre ‘run’: choix du nombre de navettes et visualisation des jetons marqués: M[x]=1
22
Dans fenêtre IHM-‘launch’ menu >> ‘3’ lancer la simu et ‘4’ stop simu
2 demos disponibles
❖ Demo1: Tuto_Basique (fonctionne avec 1 ou 2 navettes)
➢ cp exemple/Tuto_Basique.main_commande.cpp .
➢ ./script0_Compile.sh Tuto_Basique dataP2_1_1_n0
➢ ./script1_Run.sh
➢ ./script2_GetSimuOutput.sh Tuto_Basique dataP2_1_1_n0
➢ ./script3_Validation.sh Tuto_Basique dataP2_1_1_n0
➢ ./script4_Documentation.sh Tuto_Basique

❖ Demo2: TeamSALLAG (fonctionne avec 1 navette)


➢ cp exemple/TeamSALLAG.main_commande.cpp .
➢ ./script0_Compile.sh TeamSALLAG archive/data4_3_2_n0
➢ ./script1_Run.sh
➢ ./script2_GetSimuOutput.sh TeamSALLAG archive/data4_3_2_n0
➢ ./script3_Validation.sh TeamSALLAG archive/data4_3_2_n0
➢ ./script4_Documentation.sh TeamSALLAG
23

Le fichier “XXX_XXX.main_commande.cpp”
Toutes les implémentations pour le TER se dérouleront au sein d’un seul fichier
“XXX_XXX.main_commande.cpp” à modifier à volonté à quatre endroits:

● Au niveau de l’en-tête file/brief/author/version


● entre les mots-clés “| DEBUT DECLARE ETU |” et “| FIN DECLARE ETU |”
● entre les mots-clés “| DEBUT INIT ETU |” et “| FIN INIT ETU |”
● entre les mots-clés “| DEBUT PETRI ETU |” et “| Place de fin de Petri |”

(le reste du fichier ne doit pas être modifié par vous, uniquement par
l’enseignant/e si besoin)

Un vecteur M vous est fourni pour vous permettre de représenter votre


réseau de Petri (voir slide suivante) 24
Le vecteur M - Marquage du réseau de Petri
Vecteur représentant les marquages possibles de votre réseau de Petri

Taille maximale 1000+1 (déjà déclaré max: M[PlaceFin])

Cases réservées:

- M[0]: place initiale, valant 1 au début du réseau de Petri


- M[1000]: place finale=PlaceFin. Son marquage déclenche la fin de la simulation
du Réseau de Petri. Elle vaut donc 0 au début du RdP. A vous d’y mettre un 1 au
moment opportun

Manipulations: M[x]++ pour marquer; M[x]-- pour démarquer.

Recommandation: utiliser une structure/codage qui sera lisible ou facilement


interprétable pour vous. 25

Dans le fichier XXX_XXX.main_commande.cpp, comment


accéder aux informations sur la production à réaliser
const vector<int> Prod_type{ 2,
6};

const vector<int> Prod_qte{ 2,


1};

const vector<vector<int>> Prod_seqdeposte{ { POSTE_1, POSTE_4 },


{ POSTE_7, POSTE_6, POSTE_5 }};

const vector<vector<int>> Prod_dureeparposte{ { 4, 5 },


{ 3, 6, 3 }};

26
Implémentation du réseau de Petri
Syntaxe à respecter absolument !!!!
if( CONDITIONS SUR LES MARQUAGES ET/OU CAPTEURS )
{
/*!
* \b Nom de la transition
* \arg Description
* \arg \b Precondition:
* \arg \b Postcondition:
*/ Respecter la structure des commentaires (en vert)
pour permettre l’édition automatique de la
DEMARQUAGE DES PLACES AMONT documentation associée à votre code avec l’outil
LANCEMENT D’ACTIONS
DOXYGEN (voir slide suivante)

MARQUAGE DES PLACES AVAL


display();
}

ROS n’étant pas vraiment ‘temps réel’ dans les procédures cpp, le lancement de l’action souhaitée
se fait dans une procédure (e.g. déclenchement du déplacement d’un robot), mais la détection de
la fin de l’action (e.g. fin de déplacement d’un robot) doit être faite par une autre procédure.
27
NE PAS RESTER BLOQUÉ ou EN ATTENTE AU SEIN D’UNE PROCÉDURE !!!!

Implémentation du réseau de Petri: exemple


2 places amont, 2 places aval, une condition de début
if(M[85] && M[188] && robot.TacheFinie(POSTE_3))
{
/*! M[85] M[188]
* \b T3: charger navette avec produit du poste 3
* \arg Déplacer piece avec ROBOT_2 de position 1 à 2
* \arg \b Precondition: M[85] && M[188] && robot.TacheFinie(POSTE_3)
* \arg \b Postcondition: M[292]++; M[390]++
*/ T3: charger navette
M[85]--; avec produit du poste 3
M[188]--;

robot.DeplacerPiece(ROBOT_2, 1, 2);
M[292] M[390]
M[292]++;
M[390]++;
display();
}
ROS n’étant pas vraiment ‘temps réel’ dans les procédures cpp, on lance les actions (arcs).
La fin de l’action ‘fin de l’arc’ sera un événement dans ‘Condition_debut’ pour l’évolution dans 28
la/les procédures suivantes
Evaluation
Et
Auto-évaluation des solutions

29

Checklist indicative pour évaluation des codes


Scénarios Niveau validé*

1 2 3 4

1 seul produit - 1 unité par produit ✓ ✓

1 seul produit - plusieurs unités par produit ✓

Plusieurs produits - 1 unité par produit

Plusieurs produits - plusieurs unités par produit

*Niveau validé

1. Fonctionne pour un cas particulier


2. Fonctionne quelles que soient les modifications apportées aux durées des tâches
3. Fonctionne même si les gammes de fabrication ou le nombre d’unités sont modifiés de manière arbitraire
4. Fonctionne et est optimisé
30
Le CDC est considéré respecté à partir du niveau 3
Evaluation du code de XXX
Gammes Niveau validé WIP Duree Gammes Niveau validé WIP Duree

1 2 3 4 1 2 3 4

P34_1_1_n0 P13_2_1_n0

P34_1_1_n1 P123_3_1_n0

P34_1_1_n2 P123_4_4_n0

P34_1_1_n3 P124_3_1_n0

P34_1_1_n4 P1234_1_3_n0

P34_1_1_n5 P1234_6_2_n0

Barème indicatif
✦ CDC respecté sur demi-cellule P3-P4: 8-12/20 ✦ CDC respecté sur cellule rouge: 12-15/20
✦ CDC respecté et WIP > 2 sur cellule rouge: 14-18/20
31
✦ CDC respecté et WIP > 3 sur cellule rouge: 18-20/20

Exemple: Tuto_Basique

32
Tuto_Basique : réseau de Pétri implémenté

33

Tuto_Basique : évaluation
Fonctionne pour la gamme dataP2_1_1_n0

Solution validant à peine le niveau 1 de la checklist 1 car les aiguillages sont modifiés sans
prendre en compte la position de la navette (pas d’activation de stop de navette pendant
qu’ils pivotent), ni vérification du positionnement effectif des aiguillages via
capteur.get_DG(?) ou capteur.get_DG(?), etc.. Une des conséquences peut être constatée
avec dataP2_1_1_n1.
Gammes Niveau validé par WIP Duree
Tuto_Basique
WIP > 1 n’est pas non plus respecté.

Donc: 1 2 3 4

P2_1_1_n0 ✓ ⨯ 1 33.65

P2_1_1_n1 ⨯ ⨯ 34
ANNEXE
Validation, documentation et code

35

Outil de validation
But: vérifier le fichier VOS_INITIALES_NOM_FICHIER_DATA.log.txt pour savoir si
les produits demandés ont été correctement produits pendant la simulation, en
comparant ces informations avec celles de “NOM_FICHIER_DATA.prodconfig.h”

- Le fichier “.log.txt” est généré par ROS après exécution des scripts 0, 1 et 2
- Le fichier “.prodconfig.h” manuellement créé par l’étudiant/e ou l’enseignant/e
doit se trouver dans le dossier “dataprodconfig”.
- Dans ce fichier, les informations des lignes débutant par “// “et “const” doivent être
identiques !

36

Comment l’utiliser: ./script3_Validation.sh VOS_INITIALES NOM_FICHIER_DATA


Outil de validation: Erreurs détectables
16 erreurs
possibles

4 issues du fichier de configuration 12 issues du fichier log

Numéro de produit ∉ [1,6] Durée de tâche incorrecte


Numéro de tâche ∉ [1,8] Séquences de tache incorrecte
Nombre de tâches > maximum (5) Tâche lancée sur un poste vide
Nombre de produits créés ≠ Nombre de produits finis Tâche lancée sur un produit plein
Produit détruit
Mauvais type de produit
Une tâche n’est pas terminée
Évacuation d’un poste vide
Création du mauvais produit
Produit pas créé le bon nombre de fois
Produit pas évacué le bon nombre de fois

37

Générateur de documentation
Génère la documentation associée à votre code XXX_XXX_main_commande.cpp
à l’aide du logiciel doxygen (si vous avez bien respecté la syntaxe de chaque
transition du réseau de Petri).

Le résultat est accessible dans le dossier etu/output/doc

3 formats sont utilisés: html, rtf et pdf

Comment l’utiliser: ./script4_Documentation.sh VOS_INITIALES

C’est le seul script qui ne prend qu’un seul paramètre en entrée (au lieu de 2 ou
aucun comme les autres)
38
Déplacements de navettes et aiguillages
void cmd.Stop_PS(num_capteur_PS);

- ACTION : Permet d’arrêter une navette au niveau d’un actionneur PS du circuit. A activer AVANT le passage de la
navette sur le capteur en question
- num_capteur_PS peut prendre les valeurs 1, …, 24

void cmd.Ouvrir_PS(num_capteur_PS);

- ACTION : Débloque le passage au niveau de l’actionneur PS


- num_capteur_PS peut prendre les valeurs 1, …, 24

void aiguillage.Droite(num_aiguillage);

- ACTION : Positionne l’aiguillage num_aiguillage à droite dans le sens de la marche


- Num_aiguillage peut prendre les valeurs 1 à 12

void aiguillage.Gauche(num_aiguillage);

- ACTION : Positionne l’aiguillage num_aiguillage à gauche dans le sens de la marche


- Num_aiguillage peut prendre les valeurs 1 à 12

39

Robots
void robot.DeplacerPiece(ref_robot, num_position_A, num_position_B);

- ACTION : Réalise successivement les actions suivantes: déplacer le bras du robot en position A, descendre bras,
fermer pince, lever bras, déplacer bras en position B, descendre bras, ouvrir pince, remonter bras
- ref_robot peut prendre les valeurs ROBOT_1, … ROBOT_4
- num_position_A peut prendre les valeurs 1, …, 4
- num_position_B peut prendre les valeurs 1, …, 4

int robot.FinDeplacerPiece(ref_robot);

- INFO : Retourne 0 si le robot ref_robot est en train de déplacer une pièce et > 0 sinon
- ref_robot peut prendre les valeurs ROBOT_1, … ROBOT_4

❖ 4 positions prédéfinies pour


chaque robot
❖ numérotées de 1 à 4

40
Postes / Tâches
void robot.FaireTache(ref_poste, duree);

- ACTION : Rajoute un cube sur le produit au poste num_poste en un certain temps durée
- ref_poste peut prendre les valeurs POSTE_1, …, POSTE_8
- durée est de type int

int robot.TacheFinie(ref_poste);

- INFO : Renvoie 1 si la tâche sur le poste ref_poste s’est terminée


- ref_poste peut prendre les valeurs POSTE_1, …, POSTE_8

void robot.AjouterProduit(ref_poste, num_produit);

- ACTION : Fait apparaitre un produit de type num_produit sur le poste num_poste


- ref_poste peut prendre les valeurs POSTE_1, …, POSTE_8
- num_produits peut prendre les valeurs 1, …, 6 (1=produit A, 2=produit B, …)

void robot.Evacuer();

- ACTION : Fait disparaître le produit qui se trouve sur le POSTE_3. C’est la seule manière de faire sortir une pièce
usinée de la simulation
41

Capteurs stops/positions/aiguillages
bool capteur.get_PS(int num_PS);
- INFO : Retourne vrai si une navette est présente sur le capteur points de stop num_PS
- num_PS peut prendre les valeurs 1, …, 24

bool capteur.get_CP(int num_CP);


- INFO : Retourne vrai si une navette est présente sur le capteur de position num_CP
- num_CP peut prendre les valeurs 1, …, 10

bool capteur.get_CPI(int num_CPI);


- INFO : Retourne vrai si une navette est présente sur le capteur de position num_CPI
- num_CPI peut prendre les valeurs 1, …, 8

bool capteur.get_DG(int num_DG);


- INFO : Retourne vrai si l’aiguillage num_DG est en position gauche.
- num_DG peut prendre les valeurs 1, …, 12

bool capteur.get_DD(int num_DD);


- INFO : Retourne vrai si l’aiguillage num_DD est en position droite.
- num_DD peut prendre les valeurs 1, …, 12
42
Votre fichier “.main_commande.cpp” 1/2

43

Votre fichier “.main_commande.cpp” 2/2

44
CONSEILS

45

STRUCTURER “M”
Utilisez la matrice M comme bon vous semble, pas besoin d’utiliser des cases
consécutives (par exemple, on peut très bien utiliser les cases 3 et 4 puis les
cases 30 et 31)

Pour vous y retrouver, nous vous conseillons fortement de structurer la matrice M


de manière claire, lisible et interprétable de manière à comprendre la signification
de chaque case sans nécessairement devoir se référer à vos notes.

Par exemple, on pourrait dédier les cases M[5XY] aux apparitions des produits Y
sur les postes X, dédier les cases M[8XX] au suivi des déplacements des
navettes, etc.

46
ATTENTION PSEUDO-TEMPS REEL
Surtout pas de boucle “for”, pas de boucle “while”, pas de temporisation à
l’intérieur d’une procédure/transition !!

Par exemple, après chaque demande de déplacement d’un robot, ne pas attendre
la fin de l’action dans la même procédure/transition ! Sortir de la procédure puis
tester la fin de déplacement du robot en en-tête d’une autre procédure

Faire des procédures de durée courte pour ne pas monopoliser la ressource


processeur et permettre l’aspect temps réel

47

BUG / DEBUG
Après chaque compilation, bien vérifier dans le terminal qu’il n’y a eu aucun message d’erreur avant de
lancer un run

Tenir à jour le réseau de Petri correspondant à votre fichier XXX_XXX_main_commande.cpp. C’est celui
qui servira de base de discussion/correction avec l’enseignant/e.

En cas d’erreur ou bug, bien identifier et isoler le coeur du problème pour être en mesure de poser des
questions précises si besoin.

Les fonctions cpp suivantes peuvent aider au débogage mais attention, leur utilisation peut monopoliser
la ressource processeur et fausser l’aspect pseudo-temps réel

- Std::cout : peut permettre d’afficher un message dans la fenêtre “run”, par exemple la valeur d’une
variable.
- Std::cin : peut permettre de suspendre l’exécution du réseau de Petri dans l’attente d’une saisie
clavier. Attention, cela n’arrête pas la simulation COPPELIA. 48
Problèmes de produits disparus après saisie/dépôt
● Cause 1: Non respect de la syntaxe (démarquages -> actions -> marquages)
● Cause 2: Décalage entre l’émulation CoppeliaSim et le suivi bas-niveau des
navettes (problème de synchronisation physique/signaux vs informatique)
○ Cela est souvent déclenché par des changements de position d’aiguillage très (trop?)
rapidement suivis de la traversée de la navette sans avoir vérifié si l’aiguillage est verrouillé
■ Pour éviter cela, commander les aiguillages bien avant l’approche de la navette et
vérifier la fin du positionnement d’aiguillage avant autorisation de traversée de la
navette
● (rappel: interdiction d’utiliser une boucle ‘for’ ou ‘while’ pour cette tempo !!! Si
besoin, incrémenter un compteur dans une transition dédiée)
○ Dans quelques rares cas ralentir coppeliasim (cf lapin/tortue de son interface) peut donner
l’impression de régler le problème, car cela augmente la probabilité de réception des signaux
à temps … mais faire cela ne règle pas le problème de fond (franchissement d’un aiguillage
non verrouillé) … en conséquence le bug réapparait plus tard à des moments peu opportuns 49

CDC étendu
Uniquement après autorisation de l’encadrant/e

4 postes, 2 navettes, WIP=4

50
Mentions
Le montage de ce TER, mis en application pour la 1ère fois en Novembre 2020,
est le résultat de différents projets longs et stages encadrés par Cyril Briand et
Sandra Ulrich Ngueveu à partir de Février 2016.

Il est aussi le résultat de collaborations multiples coordonnées au sein de l’AIP


PRIMECA (désormais intégrée à la MFJA).

(Initiales car pas d’autorisation demandée pour diffusion éventuelle de noms)

● Projets longs N7:


○ 2016 (EA, TB, SD, CLB), 2017 (JBBR, CD, EM, MM, AQ, CT), 2018 (GL, SF, MW, NMT),
2019 (JV, BB, VP, CF), 2020 (SC, AF, LV, LR, AM, GAA), 2022 (YO, MD, TR, RC)
● UPS :
○ 2016(BD, AE, ES)

51
Merci à toutes et à tous pour vos contributions !

Vous aimerez peut-être aussi