Algorithme du déstockage
Comme vu précédemment, nous allons procéder au déstockage statique simple d'une pièce pré-définie.
Modélisation
Voici le diagramme d'état que nous allons implémenter :
Programmation de l'automate
Pour la partie programmation, nous allons ajouter une variable qui sert à mémoriser l'état en cours :
// A placer avant notre fonction "setup".
int clearance_status = 0;
void loop() {
do_clearance();
}
/**
* fonction de stockage
*/
void do_clearance() {
// status=0 => retire le pont du transstockeur
if(clearance_status == 0) {
stopAllEngines();
if(hasTouchedCantileverBack()) {
stopCantilever();
moveArmTowardRack();
delay(500);
clearance_status = 1;
} else {
moveCantileverBackward();
}
// status=1 => déplace le transstockeur horizontalement jusqu'à la fin de course.
// Quand il arrive en fin de course, il repart dans l'autre sens jusqu'à la colonne à destocker.
} else if(clearance_status == 1) {
if(hasTouchedSwitchHorizontal()) {
moveArmTowardRack();
delay(12500); // Jusqu'à la colonne à déstocker (12500 = COLONNE A)
stopM2Horizontal();
clearance_status = 2;
} else {
moveArmTowardConveyor();
}
} else if(clearance_status == 2) {
if(hasTouchedSwitchVertical()) {
moveArmDown();
delay(5000);
stopVertical();
clearance_status = 3;
} else {
moveArmUp();
}
} else if(clearance_status == 3) {
if(hasTouchedCantileverFront()) {
stopCantilever();
moveArmUp(); // Lève le pont du transstockeur pour prendre la pièce à déstocker
delay(700);
stopVertical();
clearance_status = 4;
} else {
moveCantileverForward();
}
} else if(clearance_status == 4) {
if(hasTouchedCantileverBack()) {
stopCantilever();
clearance_status = 5;
} else {
moveCantileverBackward();
}
} else if(clearance_status == 5) {
if(hasTouchedSwitchHorizontal()) {
moveArmTowardRack();
delay(300); // Pour se mettre en face du convoyeur
stopM2Horizontal();
delay(300);
moveArmUp(); // relève un peu le pont avant de l'avancer pour déposer la pièce sur le convoyeur de sortie.
delay(500);
stopVertical();
clearance_status = 6;
} else {
moveArmTowardConveyor();
}
} else if(clearance_status == 6) {
if(hasTouchedCantileverFront()) {
stopCantilever();
moveArmDown();
delay(500);
stopVertical();
clearance_status = 7;
} else {
moveCantileverForward();
}
} else if(clearance_status == 7) {
if(hasTouchedCantileverBack()) {
stopCantilever();
clearance_status = 8;
} else {
moveCantileverBackward();
}
} else if(clearance_status == 8) {
if(boxHasGoneOut()) {
stopConveyor(); // On a fini
clearance_status = 9;
} else {
moveConveyorBackward();
}
} else if(clearance_status == 9) {
warehouse_status = 0;
}
}