Подготовка к переписыванию планировщика: добавлены переменные на ПЛК, добавлена система команд для роботов
This commit is contained in:
96
scheduler.c
96
scheduler.c
@@ -22,8 +22,9 @@ static short get_robot_barrel(char robot_id) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// TODO обновить метод
|
||||
// вернет можно ли ехать и главное куда ехать, если можно (нельзя если вернулось значение < 0)
|
||||
// -1 вренет что перемещать нельзя
|
||||
// -1 вернет что перемещать нельзя
|
||||
// -2 вернет если требуется атомарная операция пассивации
|
||||
short can_move(struct barrel* bar) {
|
||||
// сразу отсекаем варианты, при которых невозможно переместить барабан
|
||||
@@ -90,7 +91,6 @@ short can_move(struct barrel* bar) {
|
||||
|
||||
case PROCESS_WASHING_2B:
|
||||
// промывка 2Б, нужно цинкование (зоны 9-16)
|
||||
// TODO сделать приоритет на барабан, который больше всего ждет
|
||||
if (!zone_is_busy(9 + galvanizing_zone)) {
|
||||
return 9 + galvanizing_zone;
|
||||
}
|
||||
@@ -164,34 +164,48 @@ short can_move(struct barrel* bar) {
|
||||
}
|
||||
|
||||
|
||||
struct scheduler_task {
|
||||
short start_zone; // стартовая зона
|
||||
short dest_zone; // конечная зона
|
||||
short priority; // приоритет, чем больше тем выше, по умолчанию 0
|
||||
};
|
||||
|
||||
// выставляет приоритет операции
|
||||
short get_operation_priority(short barrel_id) {
|
||||
// сделать приоритет на барабан, который больше всего ждет
|
||||
|
||||
// task->priority = 0;
|
||||
// switch (barrel_process) {
|
||||
// case PROCESS_RETURN_2:
|
||||
// break;
|
||||
// }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct barrel makeBarrel(short flags, short zone, short timer, short process) {
|
||||
struct barrel b;
|
||||
b.flags.raw_word = flags;
|
||||
b.zone = zone;
|
||||
b.software_timer = timer;
|
||||
b.curr_process = process;
|
||||
b.time_defatting = 6;
|
||||
b.time_washing_1a = 2;
|
||||
b.time_washing_1b = 3;
|
||||
b.time_etching = 8;
|
||||
b.time_washing_2a = 3;
|
||||
b.time_washing_2b = 4;
|
||||
b.time_galvanizing = 15;
|
||||
b.time_washing_3a = 4;
|
||||
b.time_washing_3b = 5;
|
||||
b.time_defatting = 12;
|
||||
b.time_washing_1a = 4;
|
||||
b.time_washing_1b = 6;
|
||||
b.time_etching = 16;
|
||||
b.time_washing_2a = 6;
|
||||
b.time_washing_2b = 8;
|
||||
b.time_galvanizing = 30;
|
||||
b.time_washing_3a = 8;
|
||||
b.time_washing_3b = 10;
|
||||
b.time_passivation = 3;
|
||||
b.time_washing_4a = 6;
|
||||
b.time_washing_4b = 7;
|
||||
b.time_washing_4a = 12;
|
||||
b.time_washing_4b = 14;
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
struct scheduler_task {
|
||||
short start_zone; // стартовая зона
|
||||
short dest_zone; // конечная зона
|
||||
};
|
||||
|
||||
|
||||
static short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) {
|
||||
// ищем первый барабан слева, и ближайший справа
|
||||
short left = -1, right = -1;
|
||||
@@ -264,7 +278,7 @@ void schedule_robot_1() {
|
||||
|
||||
// найти подходящую задачу
|
||||
if (schedulerOneRobotMode) {
|
||||
short target_task = scheduler_find_task(tasks, robot1.curr_zone);
|
||||
short target_task = scheduler_find_task(tasks, robot1.dx.current_zone);
|
||||
|
||||
if (target_task >= 0) {
|
||||
// создаем транзакцию
|
||||
@@ -390,6 +404,48 @@ char create_barrel_in_load(short zone) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
=== ЦИКЛОГРАММА ПЕРЕТАСКИВАНИЯ БАРАБАНА ===
|
||||
// NOTE первой командой на любую транзакцию должна стоять команда опустить траверсу (в 22 зоне мы никогда не закончим, за нее не беспокоится)
|
||||
* опустить траверсу
|
||||
если зона изъятия != промывка 3б
|
||||
если текущая зона != зона иъятия
|
||||
если зона изъятия == 22
|
||||
* встать на смещенную
|
||||
* поднять траверсу
|
||||
* съебать в 21 зону
|
||||
* встать на смещенную
|
||||
* опустить траверсу не до конца
|
||||
* съебать в 22 зону
|
||||
иначе
|
||||
* съебать в зону изъятия
|
||||
* поднять траверсу
|
||||
если зона изъятия != 22 и зона изъятия != 0:
|
||||
* ждать скапывания (зависит от зоны)
|
||||
* ехать в зону назначения
|
||||
если зона назначения == 22
|
||||
* опустить траверсу не до конца
|
||||
* съебать в 21 зону
|
||||
если ЭНКОДЕРЫ СТАРЫЕ (по умолчанию)
|
||||
* поднять траверсу
|
||||
* опустить траверсу
|
||||
иначе
|
||||
* опустить траверсу
|
||||
если зона назначения != 1
|
||||
* установить время ожидания барабана (зависит от зоны)
|
||||
иначе
|
||||
если текущая зона != промывка 3б
|
||||
* съебать в промывку 3б
|
||||
* поднять траверсу
|
||||
* съебать в пассивацию
|
||||
* опустить траверсу
|
||||
* поставить время ожидания барабана в <время пассивации>
|
||||
* поднять траверсу
|
||||
* съебать в зону промывка 4а
|
||||
* опустить траверсу
|
||||
* установить время ожидания барабана (для промывки 4а)
|
||||
*/
|
||||
|
||||
void scheduler_main() {
|
||||
// тут должно быть удаление барабана из зоны 1, если он там есть
|
||||
// if (schedulerLoadButton1) {
|
||||
|
||||
Reference in New Issue
Block a user