|
@@ -12,6 +12,9 @@ Dispatch_process::Dispatch_process()
|
|
m_dispatch_process_type = DISPATCH_PROCESS_TYPE_UNKNOW;
|
|
m_dispatch_process_type = DISPATCH_PROCESS_TYPE_UNKNOW;
|
|
m_dispatch_source = 0;
|
|
m_dispatch_source = 0;
|
|
m_dispatch_destination = 0;
|
|
m_dispatch_destination = 0;
|
|
|
|
+
|
|
|
|
+ m_dispatch_process_catcher_motion = CATCHER_MOTION_UNKNOW;
|
|
|
|
+ m_dispatch_process_carrier_motion = CARRIER_MOTION_UNKNOW;
|
|
}
|
|
}
|
|
|
|
|
|
Dispatch_process::~Dispatch_process()
|
|
Dispatch_process::~Dispatch_process()
|
|
@@ -106,8 +109,8 @@ void Dispatch_process::Main()
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- //流程正常, 就进入工作状态,
|
|
|
|
- m_dispatch_process_status = DISPATCH_PROCESS_WORKING;
|
|
|
|
|
|
+ //流程正常, 就去连接设备
|
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_CONNECT_DEVICE;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -125,7 +128,27 @@ void Dispatch_process::Main()
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ case DISPATCH_PROCESS_CONNECT_DEVICE:
|
|
|
|
+ {
|
|
|
|
+ //连接调度设备
|
|
|
|
+ m_result = connect_dispatch_device();
|
|
|
|
+ if ( m_result !=Error_code::SUCCESS)
|
|
|
|
+ {
|
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ //流程正常, 就进入工作状态,
|
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_WORKING;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
case DISPATCH_PROCESS_WORKING:
|
|
case DISPATCH_PROCESS_WORKING:
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case DISPATCH_PROCESS_RESPONSE:
|
|
{
|
|
{
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -217,15 +240,309 @@ Error_manager Dispatch_process::wait_dispatch_control_request_msg()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+//连接调度设备
|
|
|
|
+Error_manager Dispatch_process::connect_dispatch_device()
|
|
|
|
+{
|
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
|
+ Error_manager t_error;
|
|
|
|
+
|
|
|
|
+ //机器手的配置 准备工作
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() >= message::Dispatch_device_type::ROBOT_1 &&
|
|
|
|
+ m_dispatch_control_request_msg.dispatch_device_type() <= message::Dispatch_device_type::ROBOT_2 )
|
|
|
|
+ {
|
|
|
|
+ //找到对应的设备
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() == message::Dispatch_device_type::ROBOT_1 )
|
|
|
|
+ {
|
|
|
|
+ mp_catcher = Dispatch_manager::get_instance_references().m_catcher_map[0];
|
|
|
|
+ }
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() == message::Dispatch_device_type::ROBOT_2 )
|
|
|
|
+ {
|
|
|
|
+ mp_catcher = Dispatch_manager::get_instance_references().m_catcher_map[1];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //检查设备状态
|
|
|
|
+ if ( mp_catcher->check_status() == Error_code::SUCCESS &&
|
|
|
|
+ mp_catcher->m_actual_device_status == Dispatch_device_base::DEVICE_READY &&
|
|
|
|
+ mp_catcher->m_actual_load_status == Dispatch_device_base::NO_CAR)
|
|
|
|
+ {
|
|
|
|
+ //创建任务单
|
|
|
|
+ mp_catcher_task = std::shared_ptr<Task_Base>(new Catcher_task);
|
|
|
|
+ mp_catcher_task->task_init(NULL,std::chrono::milliseconds(15000));
|
|
|
|
+ Catcher_task * tp_catcher_task = (Catcher_task *)mp_catcher_task.get();
|
|
|
|
+
|
|
|
|
+ //第一次发送 空的唯一码, 可以和设备建立联系
|
|
|
|
+ tp_catcher_task->m_request_key = "";
|
|
|
|
+ tp_catcher_task->m_request_x = mp_catcher->m_actual_x;
|
|
|
|
+ tp_catcher_task->m_request_y = mp_catcher->m_actual_y;
|
|
|
|
+ tp_catcher_task->m_request_b = mp_catcher->m_actual_b;
|
|
|
|
+ tp_catcher_task->m_request_z = mp_catcher->m_actual_z;
|
|
|
|
+ tp_catcher_task->m_request_d1 = mp_catcher->m_actual_d1;
|
|
|
|
+ tp_catcher_task->m_request_d2 = mp_catcher->m_actual_d2;
|
|
|
|
+ tp_catcher_task->m_request_wheelbase = 0;
|
|
|
|
+ tp_catcher_task->m_request_clamp_motion = (Catcher_task::Clamp_motion)mp_catcher->m_actual_clamp_motion1;
|
|
|
|
+
|
|
|
|
+ t_error = mp_catcher->execute_task(mp_catcher_task, Dispatch_device_base::E_ONE_LEVEL);
|
|
|
|
+ if ( t_error != Error_code::SUCCESS )
|
|
|
|
+ {
|
|
|
|
+ return t_error;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
|
|
|
|
+ " Dispatch_process::excute_robot_catch_car_from_inlet device_status error ");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置起点
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_source() == 0 )
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates.x = 0;
|
|
|
|
+ m_source_coordinates.y = 0;
|
|
|
|
+ m_source_coordinates.z = 0;
|
|
|
|
+ }
|
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_source() > 0 && m_dispatch_control_request_msg.dispatch_source() <= 165)
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates = Dispatch_coordinates::get_instance_references().m_packspace_coordinates[m_dispatch_control_request_msg.dispatch_source()];
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates = Dispatch_coordinates::get_instance_references().m_catcher_coordinates[m_dispatch_control_request_msg.dispatch_source()];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置终点
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_destination() == 0 )
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates.x = 0;
|
|
|
|
+ m_destination_coordinates.y = 0;
|
|
|
|
+ m_destination_coordinates.z = 0;
|
|
|
|
+ }
|
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_destination() > 0 && m_dispatch_control_request_msg.dispatch_destination() <= 165)
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_packspace_coordinates[m_dispatch_control_request_msg.dispatch_destination()];
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_catcher_coordinates[m_dispatch_control_request_msg.dispatch_destination()];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //搬运器的配置 准备工作
|
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_device_type() >= message::Dispatch_device_type::CARRIER_1 &&
|
|
|
|
+ m_dispatch_control_request_msg.dispatch_device_type() <= message::Dispatch_device_type::CARRIER_3 )
|
|
|
|
+ {
|
|
|
|
+ //找到对应的设备
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() == message::Dispatch_device_type::CARRIER_1 )
|
|
|
|
+ {
|
|
|
|
+ mp_carrier = Dispatch_manager::get_instance_references().m_carrier_map[0];
|
|
|
|
+ }
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() == message::Dispatch_device_type::CARRIER_2 )
|
|
|
|
+ {
|
|
|
|
+ mp_carrier = Dispatch_manager::get_instance_references().m_carrier_map[1];
|
|
|
|
+ }
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() == message::Dispatch_device_type::CARRIER_3 )
|
|
|
|
+ {
|
|
|
|
+ mp_carrier = Dispatch_manager::get_instance_references().m_carrier_map[1];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //检查设备状态
|
|
|
|
+ if ( mp_carrier->check_status() == Error_code::SUCCESS &&
|
|
|
|
+ mp_carrier->m_actual_device_status == Dispatch_device_base::DEVICE_READY &&
|
|
|
|
+ mp_carrier->m_actual_load_status == Dispatch_device_base::NO_CAR)
|
|
|
|
+ {
|
|
|
|
+ //创建任务单
|
|
|
|
+ mp_carrier_task = std::shared_ptr<Task_Base>(new Carrier_task);
|
|
|
|
+ mp_carrier_task->task_init(NULL,std::chrono::milliseconds(15000));
|
|
|
|
+ Carrier_task * tp_carrier_task = (Carrier_task *)mp_carrier_task.get();
|
|
|
|
+
|
|
|
|
+ //第一次发送 空的唯一码, 可以和设备建立联系
|
|
|
|
+ tp_carrier_task->m_request_key = "";
|
|
|
|
+ tp_carrier_task->m_request_x = mp_carrier->m_actual_x;
|
|
|
|
+ tp_carrier_task->m_request_y = mp_carrier->m_actual_y;
|
|
|
|
+ tp_carrier_task->m_request_z = mp_carrier->m_actual_z;
|
|
|
|
+ tp_carrier_task->m_request_y1 = mp_carrier->m_actual_y1;
|
|
|
|
+ tp_carrier_task->m_request_y2 = mp_carrier->m_actual_y2;
|
|
|
|
+ tp_carrier_task->m_request_clamp_motion = (Carrier_task::Clamp_motion)mp_carrier->m_actual_clamp_motion1;
|
|
|
|
+ tp_carrier_task->m_request_joint_motion_x = (Carrier_task::Joint_motion)mp_carrier->m_actual_joint_motion_x1;
|
|
|
|
+ tp_carrier_task->m_request_joint_motion_y = Carrier_task::Joint_motion::E_JOINT_NO_ACTION;
|
|
|
|
+ tp_carrier_task->m_request_space_id = 0;
|
|
|
|
+ tp_carrier_task->m_request_floor_id = 0;
|
|
|
|
+ tp_carrier_task->m_request_wheelbase = 0;
|
|
|
|
+
|
|
|
|
+ t_error = mp_carrier->execute_task(mp_catcher_task, Dispatch_device_base::E_ONE_LEVEL);
|
|
|
|
+ if ( t_error != Error_code::SUCCESS )
|
|
|
|
+ {
|
|
|
|
+ return t_error;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
|
|
|
|
+ " Dispatch_process::excute_robot_catch_car_from_inlet device_status error ");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置起点
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_source() == 0 )
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates.x = 0;
|
|
|
|
+ m_source_coordinates.y = 0;
|
|
|
|
+ m_source_coordinates.z = 0;
|
|
|
|
+ }
|
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_source() > 0 && m_dispatch_control_request_msg.dispatch_source() <= 165)
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates = Dispatch_coordinates::get_instance_references().m_packspace_coordinates[m_dispatch_control_request_msg.dispatch_source()];
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ m_source_coordinates = Dispatch_coordinates::get_instance_references().m_carrier_coordinates[m_dispatch_control_request_msg.dispatch_source()];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置终点
|
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_destination() == 0 )
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates.x = 0;
|
|
|
|
+ m_destination_coordinates.y = 0;
|
|
|
|
+ m_destination_coordinates.z = 0;
|
|
|
|
+ }
|
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_destination() > 0 && m_dispatch_control_request_msg.dispatch_destination() <= 165)
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_packspace_coordinates[m_dispatch_control_request_msg.dispatch_destination()];
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ m_destination_coordinates = Dispatch_coordinates::get_instance_references().m_carrier_coordinates[m_dispatch_control_request_msg.dispatch_destination()];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Error_code::SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//检查机器手任务单
|
|
|
|
+Error_manager Dispatch_process::check_catcher_task()
|
|
|
|
+{
|
|
|
|
+ if ( mp_catcher_task.get() == NULL )
|
|
|
|
+ {
|
|
|
|
+ return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
|
|
|
|
+ "Dispatch_process::check_catcher_task POINTER IS NULL ");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ Catcher_task * tp_catcher_task = (Catcher_task *)mp_catcher_task.get();
|
|
|
|
+
|
|
|
|
+ if ( tp_catcher_task->get_task_statu() == Task_Base::Task_statu::TASK_OVER )
|
|
|
|
+ {
|
|
|
|
+ return Error_code::SUCCESS;
|
|
|
|
+ }
|
|
|
|
+ else if ( tp_catcher_task->get_task_statu() == Task_Base::Task_statu::TASK_ERROR )
|
|
|
|
+ {
|
|
|
|
+ return tp_catcher_task->get_task_error_manager();
|
|
|
|
+ }
|
|
|
|
+ else if ( tp_catcher_task->get_task_statu() == Task_Base::Task_statu::TASK_WORKING &&
|
|
|
|
+ tp_catcher_task->get_task_statu() == Task_Base::Task_statu::TASK_SIGNED &&
|
|
|
|
+ tp_catcher_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED)
|
|
|
|
+ {
|
|
|
|
+ return Error_code::NODATA;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//检查搬运器任务单
|
|
|
|
+Error_manager Dispatch_process::check_carrier_task()
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+//检查通道口任务单
|
|
|
|
+Error_manager Dispatch_process::check_passageway_task()
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
//执行调度控制指令, 并根据完成情况给答复
|
|
//执行调度控制指令, 并根据完成情况给答复
|
|
Error_manager Dispatch_process::excute_dispatch_control()
|
|
Error_manager Dispatch_process::excute_dispatch_control()
|
|
{
|
|
{
|
|
- std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
|
|
|
|
|
return Error_code::SUCCESS;
|
|
return Error_code::SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//机器手去入口抓车(例如:机器手移动到2号入口上方,然后下降到一楼抓车,最后上升到最上方)
|
|
|
|
+Error_manager Dispatch_process::excute_robot_catch_car_from_inlet()
|
|
|
|
+{
|
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
|
+ Error_manager t_error;
|
|
|
|
|
|
|
|
+ //设备的动作也使用外部的Main()的线程来循环
|
|
|
|
+ static int s_step = 0;
|
|
|
|
+
|
|
|
|
+ //第一次进入动作时, 创建任务单
|
|
|
|
+ if ( mp_catcher_task.get() == NULL )
|
|
|
|
+ {
|
|
|
|
+ //检查设备状态
|
|
|
|
+ if ( mp_catcher->check_status() == Error_code::SUCCESS &&
|
|
|
|
+ mp_catcher->m_actual_device_status == Dispatch_device_base::DEVICE_READY &&
|
|
|
|
+ mp_catcher->m_actual_load_status == Dispatch_device_base::NO_CAR)
|
|
|
|
+ {
|
|
|
|
+ s_step = 0;
|
|
|
|
+ //创建任务单
|
|
|
|
+ mp_catcher_task = std::shared_ptr<Task_Base>(new Catcher_task);
|
|
|
|
+ mp_catcher_task->task_init(NULL,std::chrono::milliseconds(15000));
|
|
|
|
+ Catcher_task * tp_catcher_task = (Catcher_task *)mp_catcher_task.get();
|
|
|
|
+
|
|
|
|
+ tp_catcher_task->m_request_key = "";
|
|
|
|
+ tp_catcher_task->m_request_x = mp_catcher->m_actual_x;
|
|
|
|
+ tp_catcher_task->m_request_y = mp_catcher->m_actual_y;
|
|
|
|
+ tp_catcher_task->m_request_b = mp_catcher->m_actual_b;
|
|
|
|
+ tp_catcher_task->m_request_z = mp_catcher->m_actual_z;
|
|
|
|
+ tp_catcher_task->m_request_d1 = mp_catcher->m_actual_d1;
|
|
|
|
+ tp_catcher_task->m_request_d2 = mp_catcher->m_actual_d2;
|
|
|
|
+ tp_catcher_task->m_request_wheelbase = 0;
|
|
|
|
+ tp_catcher_task->m_request_clamp_motion = (Catcher_task::Clamp_motion)mp_catcher->m_actual_clamp_motion1;
|
|
|
|
+
|
|
|
|
+ //第一次发送 空的唯一码, 可以和设备建立联系
|
|
|
|
+ t_error = mp_catcher->execute_task(mp_catcher_task, Dispatch_device_base::E_ONE_LEVEL);
|
|
|
|
+ if ( t_error != Error_code::SUCCESS )
|
|
|
|
+ {
|
|
|
|
+ return t_error;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return Error_manager(Error_code::DISPATCH_PROCESS_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
|
|
|
|
+ " Dispatch_process::excute_robot_catch_car_from_inlet device_status error ");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Catcher_task * tp_catcher_task = (Catcher_task *)mp_catcher_task.get();
|
|
|
|
+
|
|
|
|
+ switch ( s_step )
|
|
|
|
+ {
|
|
|
|
+ case 0://
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case 1:
|
|
|
|
+ {
|
|
|
|
+ ;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//机器手把车放到中跑车上面(例如:机器手下降到中跑车上放车,最后上升到最上方)(通过目标点 指定放到哪一个中跑车上)
|
|
|
|
+Error_manager Dispatch_process::excute_robot_put_car_to_carrier()
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//执行通道口动作
|
|
|
|
+Error_manager Dispatch_process::excute_passageway_motion()
|
|
|
|
+{
|
|
|
|
+return Error_code::SUCCESS;
|
|
|
|
+}
|
|
|
|
|
|
//等待调度总计划答复
|
|
//等待调度总计划答复
|
|
Error_manager Dispatch_process::wait_dispatch_plan_response_msg()
|
|
Error_manager Dispatch_process::wait_dispatch_plan_response_msg()
|