Aller au contenu principal

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 :

Diagramme d'état du déstockage

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;
}
}