This repository has been archived on 2024-09-18. You can view files and clone it, but cannot push or open issues or pull requests.
sdp-scheduler/utils.h

208 lines
7.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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