Académique Documents
Professionnel Documents
Culture Documents
L’atelier
Vidéo de présentation / montrer maquette
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
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
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
11
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
12
CAHIERS DES CHARGES
13
S2 S1 Partie 1:
S3
La production ne concerne
que les postes de travail
S4 S13 P3 et P4
S5 Partie 2:
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 !
(1)
WIP = work in progress (nombre de produits en cours de fabrication en parallèle) 15
● 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
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
devel
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
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
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:
(le reste du fichier ne doit pas être modifié par vous, uniquement par
l’enseignant/e si besoin)
Cases réservées:
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)
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 !!!!
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
1 2 3 4
*Niveau validé
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
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).
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);
void aiguillage.Droite(num_aiguillage);
void aiguillage.Gauche(num_aiguillage);
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
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);
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
43
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)
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
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
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.
51
Merci à toutes et à tous pour vos contributions !