Подготовка к переписыванию планировщика: добавлены переменные на ПЛК, добавлена система команд для роботов

This commit is contained in:
2022-12-02 22:29:36 +03:00
parent aa8d949323
commit 8f19d1b277
8 changed files with 461 additions and 120 deletions

View File

@@ -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) {