Модернизация алгоритма планирования

This commit is contained in:
VladislavOstapov 2023-02-05 16:32:32 +03:00
parent b83b860e1f
commit 885e64062e
3 changed files with 115 additions and 82 deletions

View File

@ -20,7 +20,7 @@ struct robot_regs robot1;
struct robot_regs robot2; struct robot_regs robot2;
char _scheduler_software_timer = 0; char _scheduler_software_timer = 0;
short scheduler_correction_stage = 0; short scheduler_stage = 0;
// кнопка загрузки в зоне 0, означает что барабан надо изъять из этой загрузки (а перед этим создать) // кнопка загрузки в зоне 0, означает что барабан надо изъять из этой загрузки (а перед этим создать)
char button_load = 0; char button_load = 0;

View File

@ -128,7 +128,7 @@ void scheduler_main()
for (short i = 0; i < BARRELS_COUNT; i++) { for (short i = 0; i < BARRELS_COUNT; i++) {
// после рестарта планировщика надо всем барабаном убрать робота, // после рестарта планировщика надо всем барабаном убрать робота,
// всех кто сверху удалить, // всех кто сверху удалить
barrels[i].flags.robot = 0; barrels[i].flags.robot = 0;
if (barrels[i].flags.is_up) { if (barrels[i].flags.is_up) {
barrels[i].flags.is_up = 0; barrels[i].flags.is_up = 0;
@ -136,11 +136,22 @@ void scheduler_main()
} }
} }
scheduler_start_signal = 0; scheduler_start_signal = 0;
scheduler_stage = 0;
}
// программный таймер, применяется ко всем существующим барабанам во всех режимах
if (_scheduler_software_timer) {
_scheduler_software_timer = 0;
for (int i = 0; i < 10; i++) {
if (barrels[i].flags.is_exist && barrels[i].software_timer > -9999) {
barrels[i].software_timer--;
}
}
} }
if (hla_correct_command) { if (hla_correct_command) {
if (one_robot_mode) { if (one_robot_mode) {
switch (scheduler_correction_stage) { switch (scheduler_stage) {
case 0: case 0:
if (hla_robot2_en) { if (hla_robot2_en) {
if (robot2_code.PC < 0) { if (robot2_code.PC < 0) {
@ -150,7 +161,7 @@ void scheduler_main()
robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.code[2] = ROBOT_CMD_END();
robot2_code.PC = 0; robot2_code.PC = 0;
scheduler_correction_stage++; scheduler_stage++;
} }
} else { } else {
if (robot1_code.PC < 0) { if (robot1_code.PC < 0) {
@ -161,23 +172,23 @@ void scheduler_main()
robot1_code.code[3] = ROBOT_CMD_END(); robot1_code.code[3] = ROBOT_CMD_END();
robot1_code.PC = 0; robot1_code.PC = 0;
scheduler_correction_stage++; scheduler_stage++;
} }
} }
break; break;
case 1: case 1:
if (robot2_code.PC < 0 && robot1_code.PC < 0) { if (robot2_code.PC < 0 && robot1_code.PC < 0) {
scheduler_correction_stage++; scheduler_stage++;
} }
break; break;
default: default:
scheduler_correction_stage = 0; scheduler_stage = 0;
hla_correct_command = 0; hla_correct_command = 0;
} }
} else { } else {
switch (scheduler_correction_stage) { switch (scheduler_stage) {
case 0: case 0:
// сначала робота 2 отправляем на коррекцию // сначала робота 2 отправляем на коррекцию
if (robot2_code.PC < 0) { if (robot2_code.PC < 0) {
@ -187,13 +198,13 @@ void scheduler_main()
robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.code[2] = ROBOT_CMD_END();
robot2_code.PC = 0; robot2_code.PC = 0;
scheduler_correction_stage++; scheduler_stage++;
} }
break; break;
case 1: case 1:
if (robot2_code.PC < 0) { if (robot2_code.PC < 0) {
scheduler_correction_stage++; scheduler_stage++;
} }
break; break;
@ -207,33 +218,23 @@ void scheduler_main()
robot1_code.code[3] = ROBOT_CMD_END(); robot1_code.code[3] = ROBOT_CMD_END();
robot1_code.PC = 0; robot1_code.PC = 0;
scheduler_correction_stage++; scheduler_stage++;
} }
break; break;
case 3: case 3:
if (robot1_code.PC < 0) { if (robot1_code.PC < 0) {
scheduler_correction_stage++; scheduler_stage++;
} }
break; break;
default: default:
scheduler_correction_stage = 0; scheduler_stage = 0;
hla_correct_command = 0; hla_correct_command = 0;
} }
} }
} else if (scheduler_en) { } else if (scheduler_en) {
// программный таймер, применяется ко всем существующим барабанам
if (_scheduler_software_timer) {
_scheduler_software_timer = 0;
for (int i = 0; i < 10; i++) {
if (barrels[i].flags.is_exist && barrels[i].software_timer > -9999) {
barrels[i].software_timer--;
}
}
}
// автоматический инкремент зон травления и цинкования // автоматический инкремент зон травления и цинкования
if (!is_accessible_zone(ROBOT_ZONE_ETCH)) { if (!is_accessible_zone(ROBOT_ZONE_ETCH)) {
increment_zone(ROBOT_ZONE_ETCH); increment_zone(ROBOT_ZONE_ETCH);
@ -247,88 +248,120 @@ void scheduler_main()
if (one_robot_mode) { if (one_robot_mode) {
// режим одного робота // режим одного робота
char robot_id = ROBOT_NONE; char robot_id = ROBOT_NONE;
if (hla_robot1_en && robot1_code.PC < 0) { if (hla_robot1_en) {
robot_id = ROBOT_1; robot_id = ROBOT_1;
} else if (hla_robot2_en && robot2_code.PC < 0) { } else {
robot_id = ROBOT_2; robot_id = ROBOT_2;
} }
if (robot_id != ROBOT_NONE) { switch (scheduler_stage) {
case 0:
if ((robot_id == ROBOT_1 && robot1.dx.current_zone < ZONE_WASHING_1A) || if ((robot_id == ROBOT_1 && robot1.dx.current_zone < ZONE_WASHING_1A) ||
(robot_id == ROBOT_2 && robot2.dx.current_zone < ZONE_WASHING_1A)) { (robot_id == ROBOT_2 && robot2.dx.current_zone < ZONE_WASHING_1A)) {
if (robot_id == 1) { if (robot_id == ROBOT_1 && robot1_code.PC < 0) {
robot1_code.barrel_id = -1; robot1_code.barrel_id = -1;
robot1_code.code[0] = ROBOT_CMD_DOWN(); robot1_code.code[0] = ROBOT_CMD_DOWN();
robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A);
robot1_code.code[2] = ROBOT_CMD_END(); robot1_code.code[2] = ROBOT_CMD_END();
robot1_code.PC = 0; robot1_code.PC = 0;
} else { scheduler_stage++;
} else if (robot2_code.PC < 0) {
robot2_code.barrel_id = -1; robot2_code.barrel_id = -1;
robot2_code.code[0] = ROBOT_CMD_DOWN(); robot2_code.code[0] = ROBOT_CMD_DOWN();
robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A);
robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.code[2] = ROBOT_CMD_END();
robot2_code.PC = 0; robot2_code.PC = 0;
scheduler_stage++;
} }
} else { } else {
schedule_one_robot(robot_id); scheduler_stage += 2;
} }
break;
case 1:
if ((robot_id == ROBOT_1 && robot1_code.PC < 0) || (robot_id == ROBOT_2 && robot2_code.PC < 0)) {
scheduler_stage++;
}
break;
case 2:
schedule_one_robot(robot_id);
break;
default:
scheduler_stage = 0;
} }
} else { } else {
// а вот для режима двух роботов все интересно // а вот для режима двух роботов все интересно
// для каждого робота нужно получить свой список задач // для каждого робота нужно получить свой список задач
// и надо еще сделать так, чтобы роботы не столкнулись // и надо еще сделать так, чтобы роботы не столкнулись
// суть этого предела в том, чтобы робот всегда был свободен ЗА зоной gal8, switch (scheduler_stage) {
// но при этом если зоной обмена выбрана промывка 3а, то за ней тоже, получается max(ZONE_G8, exchange_zone) case 0:
const short robot1_border = ZONE_GALVANIZING_8 > hla_exchange_zone ? ZONE_GALVANIZING_8 : hla_exchange_zone; // посылаем робота 1 в жопу линии, если он не в жопе
if (robot1.dx.current_zone < ZONE_PASSIVATION) {
// суть этого предела в том, чтобы робот всегда держал свободной зону gal1,
// но при этом если зоной обмена выбрана промывка 2б, то за ней тоже, получается min(ZONE_G1, exchange_zone)
const short robot2_border = ZONE_GALVANIZING_1 < hla_exchange_zone ? ZONE_GALVANIZING_1 : hla_exchange_zone;
// логика для того, чтобы роботы не столкнулись в начале
if (robot1.dx.current_zone < robot1_border) {
if (robot1_code.PC < 0) { if (robot1_code.PC < 0) {
robot2_lock_zone = -1; robot2_lock_zone = -1;
robot1_lock_zone = robot1_border; robot1_lock_zone = ZONE_PASSIVATION;
robot1_code.barrel_id = -1; robot1_code.barrel_id = -1;
robot1_code.code[0] = ROBOT_CMD_DOWN(); robot1_code.code[0] = ROBOT_CMD_DOWN();
robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(robot1_border + 2); robot1_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_PASSIVATION);
robot1_code.code[2] = ROBOT_CMD_END(); robot1_code.code[2] = ROBOT_CMD_END();
robot1_code.PC = 0; robot1_code.PC = 0;
} scheduler_stage++;
} else if (robot2.dx.current_zone > robot2_border) {
// это уже граница робота 2
if (robot2_code.PC < 0) {
robot2_lock_zone = robot2_border - 2;
robot2_code.barrel_id = -1;
robot2_code.code[0] = ROBOT_CMD_DOWN();
robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(robot2_border - 2);
robot2_code.code[2] = ROBOT_CMD_END();
robot2_code.PC = 0;
} }
} else { } else {
// отдельно просчитаем все для первого робота scheduler_stage++;
if (robot1_code.PC < 0) {
schedule_one_robot(ROBOT_1);
} }
break;
// и отдельно для второго (только если не в ночном режиме) case 1:
if (robot2_code.PC < 0) { // ждем пока робот съебет в зону дальше, чем зона 8
if (robot1.dx.current_zone > ZONE_WASHING_2A + 1 && robot1_lock_zone > ZONE_WASHING_2A + 1) {
robot2_lock_zone = ZONE_ETCHING_2;
scheduler_stage++;
}
break;
case 2:
// отправляем второго робота в зону 3, если он левее
if (robot2.dx.current_zone < ZONE_WASHING_1A) { if (robot2.dx.current_zone < ZONE_WASHING_1A) {
// начальная позиция робота 2 - промывка 1a
robot2_lock_zone = ZONE_WASHING_1A;
if (robot2_code.PC < 0) { if (robot2_code.PC < 0) {
robot2_lock_zone = ZONE_ETCHING_2;
robot2_code.barrel_id = -1; robot2_code.barrel_id = -1;
robot2_code.code[0] = ROBOT_CMD_DOWN(); robot2_code.code[0] = ROBOT_CMD_DOWN();
robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A); robot2_code.code[1] = ROBOT_CMD_MOVE_TO_ZONE(ZONE_WASHING_1A);
robot2_code.code[2] = ROBOT_CMD_END(); robot2_code.code[2] = ROBOT_CMD_END();
robot2_code.PC = 0; robot2_code.PC = 0;
scheduler_stage++;
} }
} else {
scheduler_stage++;
}
break;
case 3:
// ну а теперь конечная стадия - собсна раздача команд
// отдельно просчитаем все для первого робота
if (robot1_code.PC < 0) {
schedule_one_robot(ROBOT_1);
}
// и отдельно для второго
if (robot2_code.PC < 0) {
if (robot2.dx.current_zone < ZONE_WASHING_1A) {
// вернемся к стадии 2, ну его нафиг, код переписывать
} else { } else {
schedule_one_robot(ROBOT_2); schedule_one_robot(ROBOT_2);
} }
} }
break;
default:
scheduler_stage = 0;
} }
} }
} }

View File

@ -204,7 +204,7 @@ extern char scheduler_en;
// сигнал инициализации планировщика, должен быть установлен по фронту разрешения на работу // сигнал инициализации планировщика, должен быть установлен по фронту разрешения на работу
extern char scheduler_start_signal; extern char scheduler_start_signal;
extern short scheduler_correction_stage; extern short scheduler_stage;
#else #else
#define barrels ((struct barrel*)barrels_array) #define barrels ((struct barrel*)barrels_array)
@ -243,7 +243,7 @@ extern short scheduler_correction_stage;
#define hla_night_mode _c_hla_night_mode #define hla_night_mode _c_hla_night_mode
#define hla_correct_command _c_hla_correct_command #define hla_correct_command _c_hla_correct_command
#define scheduler_correction_stage _c_scheduler_correction_stage #define scheduler_stage _c_scheduler_stage
#endif #endif