carrier_base.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. //
  2. // Created by huli on 2020/7/20.
  3. //
  4. #ifndef NNXX_TESTS_CARRIER_BASE_H
  5. #define NNXX_TESTS_CARRIER_BASE_H
  6. #include "../error_code/error_code.h"
  7. #include <glog/logging.h>
  8. #include <thread>
  9. #include <mutex>
  10. #include "../tool/thread_condition.h"
  11. #include "../dispatch/carrier_task.h"
  12. //搬运器的基类, 普爱项目就是 电梯和中跑车和小跑车 三合一
  13. class Carrier_base
  14. {
  15. public:
  16. //搬运器底层通信延时5000ms
  17. #define CARRIER_COMMUNICATION_OVER_TIME_MS 5000
  18. //搬运器状态,这个类的总状态,这里指工作任务流程
  19. enum Carrier_status
  20. {
  21. E_UNKNOW = 0, //未知
  22. E_READY = 1, //准备,待机
  23. E_BUSY = 2, //工作正忙
  24. E_ONE_LEVEL_WORK = 3, //一级工作状态, 就是普通的移动任务
  25. E_ONE_LEVEL_OVER = 4, //一级工作完成,
  26. E_TWO_LEVEL_WORK = 5, //二级工作状态, 就是紧急避让, 插队任务(会在执行一级任务的过程中, 插队并优先执行二级任务)
  27. E_TWO_LEVEL_OVER = 6, //一级工作完成,
  28. E_THREE_LEVEL_WORK = 7, //三级工作任务, 就是锁定硬件资源, 不让插队, (除非急停或者取消任务)
  29. E_THREE_LEVEL_OVER = 8, //一级工作完成,
  30. E_FAULT = 100, //故障
  31. E_DISCONNECT = 101, //通信故障
  32. };
  33. //小跑车的夹杆
  34. enum Clamp_motion
  35. {
  36. E_CLAMP_NO_ACTION = 0, //无动作.
  37. E_CLAMP_TIGHT = 1, //夹紧夹杆
  38. E_CLAMP_LOOSE = 2, //松开夹杆
  39. };
  40. //中跑车和平层轨道的对接
  41. enum Joint_motion
  42. {
  43. E_JOINT_NO_ACTION = 0, //无动作.
  44. E_JOINT_HOLD_OUT = 1, //伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  45. E_JOINT_TAKE_BACK = 2, //收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  46. };
  47. //小跑车的位置,是否在中跑车上面
  48. enum Small_sports_car_motion
  49. {
  50. E_SMALL_SPORTS_NO_ACTION = 0, //无动作.
  51. E_SMALL_SPORTS_CAR_GET_AWAY = 1, //小跑车离开中跑车
  52. E_SMALL_SPORTS_CAR_GET_BACK = 2, //小跑车返回中跑车
  53. };
  54. //指令完成状态, 搬运器答复指令, 返回任务完成的情况
  55. enum Respons_status
  56. {
  57. RESPONS_WORKING = 0, //任务进行中
  58. RESPONS_OVER = 1, //任务完成
  59. RESPONS_MINOR_ERROR = 100, //一般故障, 可恢复
  60. RESPONS_CRITICAL_ERROR = 101, //致命故障,不可恢复
  61. };
  62. //搬运器的硬件设备状态
  63. enum Device_status
  64. {
  65. DEVICE_UNKNOWN = 0, //设备未知
  66. DEVICE_READY = 1, //设备空闲(可以接受新的指令任务)
  67. DEVICE_WORKING = 2, //设备工作中
  68. DEVICE_EMERGENCY_STOP = 3, //设备急停
  69. DEVICE_UNSAFETY = 4, //设备不安全
  70. DEVICE_COLLISION = 5, //设备发生碰撞
  71. DEVICE_FAULT = 6, //设备故障
  72. };
  73. //搬运器的负载状态, 小跑车上面是否有车.
  74. enum Load_status
  75. {
  76. LOAD_UNKNOWN = 0, //负载未知
  77. HAVE_CAR = 1, //有车
  78. NO_CAR = 2, //没车
  79. };
  80. public:
  81. Carrier_base();
  82. Carrier_base(const Carrier_base& other)= default;
  83. Carrier_base& operator =(const Carrier_base& other)= default;
  84. ~Carrier_base();
  85. public://API functions
  86. //搬运器 初始化
  87. virtual Error_manager carrier_base_init();
  88. //搬运器 反初始化
  89. virtual Error_manager carrier_base_uninit();
  90. //处理一级任务, 普通任务
  91. virtual Error_manager execute_one_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  92. //处理二级任务, 插队任务
  93. virtual Error_manager execute_two_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  94. //处理三级任务, 核心任务
  95. virtual Error_manager execute_three_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  96. //检查状态,是否正常运行
  97. virtual Error_manager check_status();
  98. //注意了, 调度任务允许同时接受多个任务
  99. //判断能否执行一级任务
  100. virtual Error_manager check_one_level_task();
  101. //判断能否执行二级任务
  102. virtual Error_manager check_two_level_task();
  103. //判断能否执行三级任务
  104. virtual Error_manager check_three_level_task();
  105. //结束任务单,里面会根据任务的故障等级修正 任务单的状态
  106. virtual Error_manager end_task(std::shared_ptr<Carrier_task> carrier_task);
  107. //取消任务单,由发送方提前取消任务单
  108. virtual Error_manager cancel_task(std::shared_ptr<Carrier_task> carrier_task);
  109. //判断是否为待机,如果已经准备好,则可以执行任务。
  110. virtual bool is_ready();
  111. public://get or set member variable
  112. Carrier_status get_carrier_status();
  113. protected://member functions
  114. //执行外界任务的执行函数
  115. void execute_thread_fun();
  116. //执行线程工作函数, 正在执行任务单.
  117. virtual Error_manager execute_thread_working(std::shared_ptr<Carrier_task> p_carrier_task, Carrier_status & carrier_status);
  118. //执行线程工作函数, 已经完成任务单. 等待新的指令
  119. virtual Error_manager execute_thread_over(std::shared_ptr<Carrier_task> p_carrier_task, Carrier_status & carrier_status);
  120. //更新设备底层通信数据
  121. virtual Error_manager update_device_communication();
  122. //取消下发的指令
  123. virtual Error_manager cancel_command();
  124. protected://member variable
  125. std::atomic<Carrier_status> m_carrier_status; //搬运器总状态, 控制任务流程
  126. int m_carrier_id; //搬运器id, (楚天项目和单元号对应)
  127. //调度下发到plc
  128. std::string m_request_key; //请求唯一码, 用作识别
  129. //请求的目标坐标和动作
  130. float m_request_x; //搬运器坐标x轴, 中跑车控制横向移动
  131. float m_request_y; //搬运器坐标y轴, 小跑车控制纵向移动
  132. float m_request_z; //搬运器坐标z轴, 电梯控制上下移动
  133. int m_request_space_id; //搬运器空间位置的id.
  134. float m_request_y1; //搬运器坐标y1轴, 小跑车控制纵向移动(前轮抓杆)
  135. float m_request_y2; //搬运器坐标y2轴, 小跑车控制纵向移动(后轮抓杆)
  136. float m_request_wheelbase; //搬运器小跑车的抓车杆前后轮距.
  137. Clamp_motion m_request_clamp_motion; //小跑车夹车杆. 0=无动作,1=夹紧,2=松开
  138. Joint_motion m_request_joint_motion; //电梯与X轴的横向轨道对接,0=无动作,
  139. //1=进行对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  140. //2=松开对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  141. //plc反馈给调度
  142. std::string m_respons_key; //应答的唯一码, 用作识别
  143. Respons_status m_respons_status; //指令完成状态, 搬运器答复指令, 返回任务完成的情况
  144. //答复的实际坐标和动作
  145. float m_respons_x; //搬运器坐标x轴, 中跑车控制横向移动
  146. float m_respons_y; //搬运器坐标y轴, 小跑车控制纵向移动
  147. float m_respons_z; //搬运器坐标z轴, 电梯控制上下移动
  148. int m_respons_space_id; //搬运器空间位置的id.
  149. float m_respons_y1; //搬运器坐标y1轴, 小跑车控制纵向移动(前轮抓杆)
  150. float m_respons_y2; //搬运器坐标y2轴, 小跑车控制纵向移动(后轮抓杆)
  151. float m_respons_wheelbase; //搬运器小跑车的抓车杆前后轮距.
  152. Clamp_motion m_respons_clamp_motion; //小跑车夹车杆. 0=无动作,1=夹紧,2=松开
  153. Joint_motion m_respons_joint_motion; //电梯与X轴的横向轨道对接,0=无动作,
  154. //1=进行对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  155. //2=松开对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  156. //硬件状态, 目前只做显示判断
  157. std::chrono::system_clock::time_point m_status_updata_time; //状态更新时间点
  158. unsigned char m_last_heartbeat; //上一次的心跳
  159. //搬运器的设备状态数据,
  160. Device_status m_device_status; //搬运器的硬件设备状态
  161. Load_status m_load_status; //搬运器的负载状态, 小跑车上面是否有车.
  162. //搬运器的真实状态, 可能是路径中间的坐标
  163. float m_actual_x; //搬运器坐标x轴, 中跑车控制横向移动
  164. float m_actual_y; //搬运器坐标y轴, 小跑车控制纵向移动
  165. float m_actual_z; //搬运器坐标z轴, 电梯控制上下移动
  166. float m_actual_y1; //搬运器坐标y1轴, 小跑车控制纵向移动(前轮抓杆)
  167. float m_actual_y2; //搬运器坐标y2轴, 小跑车控制纵向移动(后轮抓杆)
  168. Clamp_motion m_actual_clamp_motion1; //小跑车夹车杆. 0=无动作,1=夹紧,2=松开
  169. Clamp_motion m_actual_clamp_motion2; //小跑车夹车杆. 0=无动作,1=夹紧,2=松开
  170. Joint_motion m_actual_joint_motion1; //电梯与X轴的横向轨道对接,0=无动作,
  171. Joint_motion m_actual_joint_motion2; //电梯与X轴的横向轨道对接,0=无动作,
  172. Small_sports_car_motion m_actual_small_sports_car_motion; //小跑车的位置,是否在中跑车上面
  173. //搬运器设备的错误码
  174. unsigned char m_carrier_error_code[50]; //搬运器设备的故障信息位
  175. unsigned char m_carrier_warning_code[50]; //搬运器设备的警告信息位
  176. std::string m_carrier_error_description;//搬运器设备的错误描述
  177. //任务执行线程
  178. std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
  179. Thread_condition m_execute_condition; //执行的条件变量
  180. std::shared_ptr<Carrier_task> mp_carrier_one_level_task; //搬运器的普通任务, (一般移动和等待指令, 允许被打断)
  181. std::shared_ptr<Carrier_task> mp_carrier_two_level_task; //搬运器的优先任务, (紧急避让和插队指令, 允许打断普通任务)
  182. std::shared_ptr<Carrier_task> mp_carrier_three_level_task; //搬运器的核心任务, (锁定位置进行抓车和放车, 最高任务, 不允许打断和被打断)
  183. private:
  184. };
  185. #endif //NNXX_TESTS_CARRIER_BASE_H