Aller au contenu principal

Algorithme du stockage

Comme vu précédemment, nous allons procéder au stockage statique simple d'une pièce. L'événement déclencheur sera la détection d'une pièce à l'entrée du convoyeur.

Modélisation

Voici le diagramme d'état que nous allons implémenter :

Diagramme d'état du 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 storage_status = 0;

void loop() {
do_storage();
}

/**
* fonction de stockage
*/
void do_storage() {

if(storage_status == 0) {
if(isThereIncomingBox()) {
storage_status = 1;
}
} else if(storage_status == 1) {
if(hasTouchedCantileverBack()) {

stopCantilever();
moveArmTowardRack();
delay(500);
storage_status = 2;

} else {
moveCantileverBackward();
}
} else if(storage_status == 2) {
if(hasTouchedSwitchHorizontal()) {
moveArmTowardRack();
delay(300);
stopM2Horizontal();
storage_status = 3;

} else {
moveArmTowardConveyor();
}
} else if(storage_status == 3) {
if(hasTouchedSwitchVertical()) {
moveArmDown();
delay(4500);
stopVertical();
storage_status = 4;

} else {
moveArmUp();
}
} else if(storage_status == 4) {
if(hasTouchedCantileverFront()) {
stopCantilever();
storage_status = 5;

} else {
moveCantileverForward();
}
} else if(storage_status == 5) {
if(boxHasReachedEndOfConveyor()) {
stopConveyor();
moveArmUp();
delay(4000);
stopVertical();
storage_status = 6;
} else {
moveConveyorForward();
}
} else if(storage_status == 6) {
if(hasTouchedCantileverBack()) {
stopCantilever();
moveArmTowardRack();
delay(4700); // pour arriver à la colonne n°3
stopM2Horizontal();

storage_status = 7;
} else {
moveCantileverBackward();
}
} else if(storage_status == 7) {
if(hasTouchedSwitchVertical()) {
moveArmDown();
delay(300); // pour arriver au niveau de la ligne supérieure.
stopVertical();
storage_status = 8;

} else {
moveArmUp();
}
} else if (storage_status == 8) {
if(hasTouchedCantileverFront()) {
stopCantilever();
moveArmDown();
delay(500);
stopVertical();
storage_status = 9;

} else {
moveCantileverForward();
}
} else if (storage_status == 9) {
if(hasTouchedCantileverBack()) {
stopVertical();
stopCantilever();
storage_status = 10;

} else {
moveCantileverBackward();
}
} else if (storage_status == 10) {
warehouse_status = 0;
}
}