dispatch_plc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. //
  2. // Dispatch_plc 调度plc模块, 主要是负责对接plc的通信数据缓存,以及调度主流程
  3. // 本地缓存DB块的的数据, 内部线程负责下发任务指令和验收任务指令.
  4. //
  5. #ifndef NNXX_TESTS_DISPATCH_PLC_H
  6. #define NNXX_TESTS_DISPATCH_PLC_H
  7. #include "../error_code/error_code.h"
  8. #include <glog/logging.h>
  9. #include <thread>
  10. #include <mutex>
  11. #include "../tool/thread_condition.h"
  12. #include "../tool/common_data.h"
  13. #include "../tool/time_tool.h"
  14. #include "../task/task_base.h"
  15. //#include "../message/dispatch_message.pb.h"
  16. #include "../message/message.pb.h"
  17. #include "../dispatch/dispatch_communication.h"
  18. #include "../tool/string_convert.h"
  19. //调度plc
  20. class Dispatch_plc
  21. {
  22. //设备底层通信延时5000ms
  23. #define COMMUNICATION_OVER_TIME_MS 5000
  24. //调度指令超时时间 3600000 ms = 60 min
  25. #define DISPATCH_PROCESS_TIMEOUT_MS 3600000
  26. //调度指令超时时间 衰减值 在原有的基础上减少10秒
  27. #define DISPATCH_PROCESS_ATTENUATION_TIMEOUT_MS 10000
  28. public:
  29. //调度plc状态
  30. enum Dispatch_plc_status
  31. {
  32. DISPATCH_PLC_UNKNOW = 0, //未知
  33. DISPATCH_PLC_READY = 1, //准备,待机
  34. DISPATCH_PLC_BUSY = 2, //工作正忙, 暂时不用
  35. DISPATCH_PLC_DISCONNECT = 3, //断连
  36. DISPATCH_PLC_REQUEST = 4, //给plc发送请求
  37. DISPATCH_PLC_WORKING = 5, //plc工作中
  38. DISPATCH_PLC_RESPONSE = 6, //给主控答复
  39. DISPATCH_PLC_FAULT = 100, //故障
  40. };
  41. //指令完成状态, 设备答复指令, 返回任务完成的情况
  42. enum Response_status
  43. {
  44. RESPONS_WORKING = 0, //任务进行中
  45. RESPONS_OVER = 1, //任务完成
  46. RESPONS_ERROR = 2, //错误
  47. RESPONS_REALLOCATE_MIN_CAR = 11, //重新分配小车
  48. RESPONS_REALLOCATE_MID_CAR = 12, //重新分配中车
  49. RESPONS_REALLOCATE_BIG_CAR = 13, //重新分配大车
  50. RESPONS_REALLOCATE_HUGE_CAR = 14, //重新分配fault
  51. RESPONS_REALLOCATE_FAULT_CAR = 15, //重新分配fault
  52. RESPONS_MINOR_ERROR = 100, //一般故障, 可恢复
  53. RESPONS_CRITICAL_ERROR = 101, //致命故障,不可恢复
  54. };
  55. public:
  56. Dispatch_plc();
  57. Dispatch_plc(const Dispatch_plc& other)= default;
  58. Dispatch_plc& operator =(const Dispatch_plc& other)= default;
  59. ~Dispatch_plc();
  60. public://API functions
  61. //调度plc 初始化
  62. Error_manager dispatch_plc_init(int plc_id);
  63. //调度plc 反初始化
  64. Error_manager dispatch_plc_uninit();
  65. //调度plc 执行请求
  66. // Error_manager execute_for_dispatch_request_msg(message::Dispatch_request_msg &dispatch_request_msg);
  67. //新版调度plc 执行请求 存车
  68. Error_manager execute_for_dispatch_request_msg(park_table &park_table_msg, Common_data::Dispatch_process_type dispatch_process_type, Common_data::Car_type car_type);
  69. //新版调度plc 执行请求 取车
  70. Error_manager execute_for_dispatch_request_msg(pick_table &pick_table_msg, Common_data::Dispatch_process_type dispatch_process_type, Common_data::Car_type car_type);
  71. public://get or set member variable
  72. Dispatch_plc::Dispatch_plc_status get_dispatch_plc_status();
  73. // message::Dispatch_request_msg get_dispatch_request_msg();
  74. Error_manager get_result();
  75. float get_response_working_total_time();
  76. float get_response_working_remaining_time();
  77. void clear_request_msg();
  78. protected://member functions
  79. //jiancha qingqiu xiaoxi
  80. // Error_manager check_dispatch_request_msg(message::Dispatch_request_msg & dispatch_request_msg);
  81. //执行外界任务的执行函数
  82. void execute_thread_fun();
  83. //数据储存线程函数
  84. void data_storage_thread_fun();
  85. //封装 给plc的调度请求
  86. Error_manager encapsulate_dispatch_request_to_plc();
  87. //封装 给plc的调度请求
  88. Error_manager encapsulate_dispatch_request_to_plc_new();
  89. //更新plc通信
  90. Error_manager update_dispatch_plc_communication();
  91. //检查plc答复反馈
  92. Error_manager check_response_from_plc();
  93. //检查plc答复反馈
  94. Error_manager check_response_from_plc_new();
  95. //发送调度答复信息给主控
  96. Error_manager send_dispatch_response_to_main_control();
  97. //发送调度答复信息给主控
  98. Error_manager send_dispatch_response_to_main_control_new();
  99. protected://member variable
  100. public:
  101. std::atomic<Dispatch_plc_status> m_dispatch_plc_status; //设备总状态, 控制任务流程(长流程)
  102. int m_plc_id; //设备id, 索引, 就是楚天车库的单元号.
  103. std::mutex m_lock; //锁
  104. //任务执行线程
  105. std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
  106. Thread_condition m_execute_condition; //执行的条件变量
  107. //数据存储线程
  108. std::thread* mp_data_storage_thread; //数据存储线程的指针,内存由本类管理
  109. Thread_condition m_data_storage_condition; //数据存储线程的条件变量
  110. //指令
  111. Common_data::Dispatch_process_type m_dispatch_process_type ; //调度流程类型
  112. // message::Dispatch_request_msg m_dispatch_request_msg; //1执行搬运请求(主控->调度管理)
  113. // message::Dispatch_response_msg m_dispatch_response_msg; //6搬运动作执行完成后反馈结果(调度管理->主控)
  114. park_table m_park_table_msg; //停车表单
  115. pick_table m_pick_table_msg; //取车表单
  116. // int m_terminal_id; //出入口id
  117. Common_data::Car_type m_car_type; //车的大小
  118. std::string m_command_key; //任务唯一码, 索引
  119. int m_timeout_ms; //超时时间,单位ms
  120. std::chrono::system_clock::time_point m_start_time; //流程开始时间
  121. Error_manager m_result; //中间的错误码
  122. //数据缓存
  123. //调度管理给plc发送调度指令
  124. std::string m_request_key; //请求唯一码, 用作识别
  125. unsigned int m_request_status = 0; //请求确认标志
  126. // 调度指令的起点,终点,方向
  127. Common_data::Dispatch_process_type m_request_dispatch_motion_direction ; //调度方向 0=未知,1=存车,2=取车
  128. unsigned int m_request_passageway_id = 0; //出入口id 6个入口和6个出口
  129. Common_data::Passageway_direction m_request_passageway_direction ; //出入口方向 0=未知,1=入口,2=出口
  130. unsigned int m_request_parkingspace_index_id = 0; //楼上车位索引id 1~180(3*6*13)
  131. unsigned int m_request_parkingspace_unit_id = 0; //楼上车位单元号 1~3
  132. unsigned int m_request_parkingspace_label_id = 0; //楼上车位标签号 1~78
  133. unsigned int m_request_parkingspace_floor_id = 0; //楼上车位楼层号 2~11
  134. unsigned int m_request_parkingspace_room_id = 0; //楼上车位房间号 1~6
  135. Common_data::Parkingspace_direction m_request_parkingspace_direction ; //楼上车位方向 0=未知,1=朝南,2=朝北
  136. //汽车的定位信息(地面雷达)
  137. float m_request_car_center_x = 0; //整车的中心点x值, 四轮的中心, 单位:米 m
  138. float m_request_car_center_y = 0; //整车的中心点y值, 四轮的中心, 单位:米 m
  139. float m_request_car_angle = 0; //整车的车身旋转角, 单位:度 (-90~90)
  140. float m_request_car_front_theta = 0; //整车的前轮的旋转角, 单位:度 (-90~90)
  141. float m_request_car_length = 0; //整车的长度, 用于规避碰撞, 单位:米 m
  142. float m_request_car_width = 0; //整车的宽度, 用于规避碰撞, 单位:米 m
  143. float m_request_car_height = 0; //整车的高度, 用于规避碰撞, 单位:米 m
  144. float m_request_car_wheel_base = 0; //整车的轮距, 前后轮的距离, 用于机器人或agv的抓车, 单位:米 m
  145. float m_request_car_wheel_width = 0; //整车的轮距, 左右轮的距离, 用于机器人或agv的抓车, 单位:米 m
  146. std::string m_request_car_license; //车牌号(汽车唯一标示) 例如: 鄂A12345
  147. Common_data::Car_type m_request_car_type; //车的大小
  148. float m_request_uniformed_car_x = 0; //转角复位后,车辆中心点x
  149. float m_request_uniformed_car_y = 0; //转角复位后,车辆中心点y
  150. //防撞雷达
  151. Common_data::Anticollision_lidar_flag m_request_anticollision_lidar_flag ; //汽车是否停到正确的位置, 防撞雷达 预留, 楚天暂时不用,0=未知,1=位置正常,2=位置异常
  152. //轮距雷达
  153. float m_request_car_wheel_base_exact_value = 0; //汽车前后轮距,轮距雷达的精确值 预留, 楚天暂时不用,单位:米 m
  154. float m_request_clamp_lidar_deviation_1 = 0; //jia ce gan lei da pian cha zhi
  155. float m_request_clamp_lidar_deviation_2 = 0; //jia ce gan lei da pian cha zhi
  156. float m_request_clamp_lidar_deviation_3 = 0; //jia ce gan lei da pian cha zhi
  157. float m_request_clamp_lidar_deviation_4 = 0; //jia ce gan lei da pian cha zhi
  158. //plc给调度管理发送调度答复
  159. std::string m_response_key; //答复唯一码, 用作识别
  160. Response_status m_response_status; //指令完成状态, 机器人答复指令, 返回任务完成的情况
  161. float m_response_working_total_time; //搬运总时间(秒)
  162. float m_response_working_remaining_time; //剩余时间(秒)
  163. // 调度指令的起点,终点,方向
  164. Common_data::Dispatch_process_type m_response_dispatch_motion_direction ; //调度方向 0=未知,1=存车,2=取车
  165. unsigned int m_response_passageway_id = 0; //出入口id 6个入口和6个出口
  166. Common_data::Passageway_direction m_response_passageway_direction ; //出入口方向 0=未知,1=入口,2=出口
  167. unsigned int m_response_parkingspace_index_id = 0; //楼上车位索引id 1~180(3*6*13)
  168. unsigned int m_response_parkingspace_unit_id = 0; //楼上车位单元号 1~3
  169. unsigned int m_response_parkingspace_label_id = 0; //楼上车位标签号 1~78
  170. unsigned int m_response_parkingspace_floor_id = 0; //楼上车位楼层号 2~11
  171. unsigned int m_response_parkingspace_room_id = 0; //楼上车位房间号 1~6
  172. Common_data::Parkingspace_direction m_response_parkingspace_direction ; //楼上车位方向 0=未知,1=朝南,2=朝北
  173. //汽车的定位信息(地面雷达)
  174. float m_response_car_center_x = 0; //整车的中心点x值, 四轮的中心, 单位:米 m
  175. float m_response_car_center_y = 0; //整车的中心点y值, 四轮的中心, 单位:米 m
  176. float m_response_car_angle = 0; //整车的车身旋转角, 单位:度 (-90~90)
  177. float m_response_car_front_theta = 0; //整车的前轮的旋转角, 单位:度 (-90~90)
  178. float m_response_car_length = 0; //整车的长度, 用于规避碰撞, 单位:米 m
  179. float m_response_car_width = 0; //整车的宽度, 用于规避碰撞, 单位:米 m
  180. float m_response_car_height = 0; //整车的高度, 用于规避碰撞, 单位:米 m
  181. float m_response_car_wheel_base = 0; //整车的轮距, 前后轮的距离, 用于机器人或agv的抓车, 单位:米 m
  182. float m_response_car_wheel_width = 0; //整车的轮距, 左右轮的距离, 用于机器人或agv的抓车, 单位:米 m
  183. std::string m_response_car_license; //车牌号(汽车唯一标示) 例如: 鄂A12345
  184. Common_data::Car_type m_response_car_type; //车的大小
  185. float m_response_uniformed_car_x = 0; //转角复位后,车辆中心点x
  186. float m_response_uniformed_car_y = 0; //转角复位后,车辆中心点y
  187. //防撞雷达
  188. Common_data::Anticollision_lidar_flag m_response_anticollision_lidar_flag ; //汽车是否停到正确的位置, 防撞雷达 预留, 楚天暂时不用,0=未知,1=位置正常,2=位置异常
  189. //轮距雷达
  190. float m_response_car_wheel_base_exact_value = 0; //汽车前后轮距,轮距雷达的精确值 预留, 楚天暂时不用,单位:米 m
  191. float m_response_clamp_lidar_deviation_1 = 0; //jia ce gan lei da pian cha zhi
  192. float m_response_clamp_lidar_deviation_2 = 0; //jia ce gan lei da pian cha zhi
  193. float m_response_clamp_lidar_deviation_3 = 0; //jia ce gan lei da pian cha zhi
  194. float m_response_clamp_lidar_deviation_4 = 0; //jia ce gan lei da pian cha zhi
  195. //dispatch状态
  196. unsigned char m_dispatch_heartbeat = 0; //心跳位, 0-255循环
  197. //plc状态信息
  198. unsigned char m_plc_heartbeat = 0; //心跳位, 0-255循环
  199. unsigned char m_plc_status_info = 0; //plc状态的集合
  200. //0 bit, 手动模式
  201. //1 bit, 自动模式
  202. //2 bit, 自动运行中
  203. //3 bit, 复位
  204. //4 bit, 1号口可以进车
  205. //5 bit, 2号口可以进车
  206. //6 bit, 预留
  207. //7 bit, 预留
  208. // unsigned char m_reserved2_37[36] = {0}; //预留 36个
  209. float m_turnplate_angle_min1 = 0; //1号口转盘最小值
  210. float m_turnplate_angle_max1 = 0; //1号口转盘最大值
  211. float m_turnplate_angle_min2 = 0; //2号口转盘最小值
  212. float m_turnplate_angle_max2 = 0; //2号口转盘最大值
  213. //硬件状态, 目前只做显示判断
  214. std::chrono::system_clock::time_point m_status_updata_time; //状态更新时间点
  215. unsigned char m_last_heartbeat; //上一次的心跳
  216. //test time
  217. std::chrono::system_clock::time_point test_start_time;
  218. std::chrono::system_clock::time_point test_end_time;
  219. //20230213 huli add plc car_wheel_base
  220. float m_plc_car_wheel_base;
  221. float m_plc_clamp_lidar_deviation_1;
  222. float m_plc_clamp_lidar_deviation_2;
  223. float m_plc_clamp_lidar_deviation_3;
  224. float m_plc_clamp_lidar_deviation_4;
  225. private:
  226. };
  227. #endif //NNXX_TESTS_DISPATCH_PLC_H