#ifndef SDP_SCHEDULER_UTILS_H #define SDP_SCHEDULER_UTILS_H // Все зоны линии enum Zones { ZONE_LOAD_1 = 0, // загрузка 0, используется как точка появления барабанов ZONE_LOAD_2, // загрузка 1, используется как конечная точка барабанов ZONE_DEGREASING, // обезжиривание ZONE_WASHING_1A, // промывка 1А ZONE_WASHING_1B, // промывка 1Б ZONE_ETCHING_1, // травление 1 ZONE_ETCHING_2, // травление 2 ZONE_WASHING_2A, // промывка 2А ZONE_WASHING_2B, // промывка 2Б ZONE_GALVANIZING_1, // цинкование 1 ZONE_GALVANIZING_2, // цинкование 2 ZONE_GALVANIZING_3, // цинкование 3 ZONE_GALVANIZING_4, // цинкование 4 ZONE_GALVANIZING_5, // цинкование 5 ZONE_GALVANIZING_6, // цинкование 6 ZONE_GALVANIZING_7, // цинкование 7 ZONE_GALVANIZING_8, // цинкование 8 ZONE_WASHING_3A, // промывка 3А ZONE_WASHING_3B, // промывка 3Б ZONE_PASSIVATION, // пассивация ZONE_WASHING_4A, // промывка 4A ZONE_WASHING_4B, // промывка 4Б ZONE_UNLOAD, // зона выгрузки }; #define BARRELS_COUNT 10 union barrel_flags { short raw_word; struct { char is_exist: 1; char is_up: 1; // для панели char robot: 2; // обслуживающий робот char is_night: 1; // ночной барабан, имеет такой статус если он в промывке в ночном режиме или в промывке, // но пока не дождался очереди на выход из ночного режима char is_empty: 1; // пустой барабан, нужен для работы операции возврата }; }; struct barrel { union barrel_flags flags; short zone; // программный таймер, тикает сразу у всех барабанов, short software_timer; // время процессов short time_degreasing; // Время обезжиривания short time_washing_1a; // Время промывки 1А short time_washing_1b; // Время промывки 1Б short time_etching; // Время травления short time_washing_2a; // Время промывки 2А short time_washing_2b; // Время промывки 2Б short time_galvanizing; // Время цинкования short time_washing_3a; // Время промывки 3А short time_washing_3b; // Время промывки 3Б short time_passivation; // Время пассивации short time_washing_4a; // Время промывки 4А short time_washing_4b; // Время промывки 4Б }; union robot_regs_mx { short raw_word; struct { char correct_status: 1; char last_cmd_executed: 1; char correct_sensor: 1; char move_to_zone: 1; char move_to_offset: 1; char move_to_precise: 1; char do_correct: 1; char do_parking: 1; char hla_left: 1; char hla_right: 1; char auto_mode: 1; char error: 1; }; }; union robot_regs_dx { short raw_data[6]; struct { short current_zone; short target_zone; short left_max; short right_max; short output_current; short output_freq; }; }; union robot_regs_mz { short raw_word; struct { char correct_status: 1; char last_cmd_executed: 1; char is_up: 1; char move_up: 1; char move_down: 1; char do_correct: 1; char hla_up: 1; char hla_down: 1; char auto_mode: 1; char error: 1; }; }; union robot_regs_dz { short raw_data[3]; struct { short current_zone; short output_current; short output_freq; }; }; struct robot_regs { union robot_regs_mx mx; union robot_regs_dx dx; union robot_regs_mz mz; union robot_regs_dz dz; }; #ifdef __cplusplus extern "C" { #endif extern struct barrel barrels[BARRELS_COUNT]; // почему-то компилер говорит что размер структуру сраный //extern struct robot robot1; //extern struct robot robot2; #define ROBOT_CMD_MASK 0xF000 #define ROBOT_CMD_END 0x0000 #define ROBOT_CMD_MOVE_TO_ZONE 0x1000 #define ROBOT_CMD_MOVE_OFF 0x2000 #define ROBOT_CMD_UP 0x3000 #define ROBOT_CMD_DOWN 0x4000 #define ROBOT_CMD_DOWN_2 0x5000 #define ROBOT_CMD_WAIT 0x6000 #define ROBOT_CMD_TMR_SET 0x7000 #define ROBOT_CMD_SET_LOCK_ZONE 0x8000 #define ROBOT_CMD_CORRECT_AXIS 0x9000 #define ROBOT_CMD_INC_ZONE 0xA000 // перемещение с барабаном #define ROBOT_WITH_BARREL 0x0800 // алиасы перемещений с барабаном #define ROBOT_CMD_MOVE_TO_ZONE_WITH_BARREL (ROBOT_CMD_MOVE_TO_ZONE | ROBOT_WITH_BARREL) #define ROBOT_CMD_UP_WITH_BARREL (ROBOT_CMD_UP | ROBOT_WITH_BARREL) #define ROBOT_CMD_DOWN_WITH_BARREL (ROBOT_CMD_DOWN | ROBOT_WITH_BARREL) #define ROBOT_CMD_DOWN_2_WITH_BARREL (ROBOT_CMD_DOWN_2 | ROBOT_WITH_BARREL) #define ROBOT_AXIS_X 1 #define ROBOT_CMD_CORRECT_AXIS_X (ROBOT_CMD_CORRECT_AXIS | ROBOT_AXIS_X) #define ROBOT_AXIS_Z 2 #define ROBOT_CMD_CORRECT_AXIS_Z (ROBOT_CMD_CORRECT_AXIS | ROBOT_AXIS_Z) #define ROBOT_ZONE_ETCH 1 #define ROBOT_CMD_INC_ZONE_ETCH (ROBOT_CMD_INC_ZONE | ROBOT_ZONE_ETCH) #define ROBOT_ZONE_GAL 2 #define ROBOT_CMD_INC_ZONE_GAL (ROBOT_CMD_INC_ZONE | ROBOT_ZONE_GAL) // NOTE первой командой на любую транзакцию должна стоять команда опустить траверсу (в 22 зоне по идее никогда не закончим) struct robot_code { short barrel_id; // нужен ID барабана, если short PC; // когда -1, код не выполняется /* * система команд, которая нужна: (квадратные скобки - аргумент это младший байт, фигурные - отдельное слово) * 0: конец * 1 (опция с барабаном) [зона]: съебаться в зону * 2: встать на смещенную позицию * 3 (опция с барабаном): поднять траверсу (перед выполнением ожидать если таймер барабана не истек) * 4 (опция с барабаном): опустить траверсу * 5 (опция с барабаном): опустить траверсу не до конца * 6 [сек]: пауза на нужное количество секунд * 7 {время}: установить таймер барабану * 8 [зона]: установить зону блокировки * 9 [X(1) | Y(2)]: скорректировать ось * 10 [ETCH(1) |GAL (2)]: сделать инкремент зоны гальваники или обезжиривания * * формат команды: (команда, старший байт) [младший байт, аргумент команды (если есть)] [слово, аргумент если команда требует] */ short code[16]; // формат кода: [команды] <команда 0> }; #ifdef __cplusplus } #endif #endif //SDP_SCHEDULER_UTILS_H