石墨消解仪后端服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
8.5 KiB

3 months ago
3 months ago
  1. package com.iflytop.gd.app.cmd;
  2. import com.iflytop.gd.app.core.BaseCommandHandler;
  3. import com.iflytop.gd.app.core.device.TrayState;
  4. import com.iflytop.gd.app.model.bo.Point3D;
  5. import com.iflytop.gd.app.model.dto.CmdDTO;
  6. import com.iflytop.gd.app.service.DeviceCommandUtilService;
  7. import com.iflytop.gd.app.service.DevicePositionService;
  8. import com.iflytop.gd.app.service.DeviceStateService;
  9. import com.iflytop.gd.app.service.GantryArmService;
  10. import com.iflytop.gd.common.annotation.CommandMapping;
  11. import com.iflytop.gd.common.enums.HeatModuleCode;
  12. import com.iflytop.gd.common.enums.data.DevicePositionCode;
  13. import com.iflytop.gd.common.exception.AppException;
  14. import com.iflytop.gd.common.result.ResultCode;
  15. import com.iflytop.gd.hardware.exception.HardwareException;
  16. import lombok.RequiredArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Component;
  19. import java.util.concurrent.CompletableFuture;
  20. import java.util.concurrent.atomic.AtomicBoolean;
  21. /**
  22. * 移至加液
  23. */
  24. @Slf4j
  25. @Component
  26. @RequiredArgsConstructor
  27. @CommandMapping("move_to_solution_area")//业务指令注解
  28. public class MoveToSolutionAreaCommand extends BaseCommandHandler {
  29. private final DeviceCommandUtilService deviceCommandUtilService;
  30. private final DevicePositionService devicePositionService;
  31. private final GantryArmService gantryArmService;
  32. private final DeviceStateService deviceStateService;
  33. private final AtomicBoolean isExecuting = new AtomicBoolean(false);
  34. @Override
  35. public CompletableFuture<Void> handle(CmdDTO cmdDTO) throws Exception {
  36. if (isExecuting.get()) {
  37. throw new AppException(ResultCode.COMMAND_ALREADY_EXECUTING);
  38. }
  39. String heatId = cmdDTO.getStringParam("heatId");
  40. HeatModuleCode heatModuleId = HeatModuleCode.valueOf(heatId);
  41. //校验目标加热位是否有托盘
  42. try{
  43. deviceStateService.setGantryArmStateIdle(true);
  44. isExecuting.set(true);
  45. Boolean heatModuleTray = deviceCommandUtilService.heatModuleTray(heatModuleId);
  46. if (heatModuleTray) {
  47. throw new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED);
  48. }
  49. }finally {
  50. deviceStateService.setGantryArmStateIdle(false);
  51. isExecuting.set(false);
  52. }
  53. return runAsync(() -> {
  54. try{
  55. TrayState trayState = deviceStateService.getTrayInSolutionModule();
  56. gantryArmService.waitLiquidIdle();//等待加液区空闲
  57. gantryArmService.setLiquidIdleFalse();//锁定加液区
  58. double trayLift = devicePositionService.getPosition(DevicePositionCode.trayLift).getDistance(); //获取加热位抬升托盘位置
  59. deviceCommandUtilService.heaterMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleId, trayLift);//抬升加热位托盘
  60. deviceStateService.setHeatModuleStateTrayStatus(heatModuleId, 2);
  61. //TODO 判断托盘是否有拍子
  62. Point3D heatAreaCapClawPoint3D = deviceCommandUtilService.getHeatAreaCapClawPointPoint3D(heatModuleId);//获取托盘上方拍子点位
  63. deviceCommandUtilService.gantryMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatAreaCapClawPoint3D);//将机械臂移动至拍子上方
  64. double clawCapPick = devicePositionService.getPosition(DevicePositionCode.clawCapPick).getDistance(); //拍子夹取距离
  65. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawCapPick);//将夹爪张开
  66. double clawDescend = devicePositionService.getPosition(DevicePositionCode.clawDescend).getDistance();//获取下降机械臂使夹爪可以夹住的距离
  67. deviceCommandUtilService.gantryZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawDescend); //下降机械臂使夹爪可以夹住拍子
  68. double clawCapGrip = devicePositionService.getPosition(DevicePositionCode.clawCapGrip).getDistance(); //获取拍子夹紧距离
  69. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawCapGrip);//将夹爪收紧
  70. double capSafetyHeight = devicePositionService.getPosition(DevicePositionCode.capSafetyHeight).getDistance();//获取移动拍子的安全高度
  71. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -capSafetyHeight);//机械臂提升至移动拍子的安全高度
  72. deviceStateService.setHeatModuleStateCapExist(heatModuleId, false);
  73. deviceCommandUtilService.capMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), -1); //下降拍子存放区1个位置
  74. Point3D capStorageCapClawPoint3D = devicePositionService.getPosition(DevicePositionCode.capStorageCapClawPoint).getPoint3D();//获取拍子存放区上方点位;
  75. Point3D capStorageCapClawSafetyHeightPoint3D = new Point3D(capStorageCapClawPoint3D.getX(), capStorageCapClawPoint3D.getY(),capStorageCapClawPoint3D.getZ() - capSafetyHeight);//拍子存放区上方加上移动拍子的安全高度
  76. deviceCommandUtilService.gantryMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), capStorageCapClawSafetyHeightPoint3D);//移动机械臂至拍子存放区上方上减去拍子的安全高度
  77. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), capSafetyHeight);//下降机械臂,使拍子落入存放区
  78. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawCapPick); //松开夹爪,放开拍子
  79. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawDescend);//将机械臂抬升至托盘上方
  80. Point3D heatAreaTrayClawPoint3D = deviceCommandUtilService.getHeatAreaTrayClawPoint3D(heatModuleId);//获取指定托盘上方点位
  81. deviceCommandUtilService.gantryMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatAreaTrayClawPoint3D);//将机械臂移动至托盘上方
  82. double clawTrayPick = devicePositionService.getPosition(DevicePositionCode.clawTrayPick).getDistance();//获取夹爪托盘夹取距离
  83. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawTrayPick);//将夹爪张开
  84. deviceCommandUtilService.gantryZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawDescend); //下降机械臂使夹爪可以夹住托盘
  85. double clawTrayGrip = devicePositionService.getPosition(DevicePositionCode.clawTrayGrip).getDistance();//获取夹爪托盘夹紧距离
  86. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawTrayGrip);//将夹爪收紧
  87. double traySafetyHeight = devicePositionService.getPosition(DevicePositionCode.traySafetyHeight).getDistance();//获取移动托盘的安全高度
  88. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -traySafetyHeight);//机械臂提升至移动托盘的安全高度
  89. deviceStateService.setHeatModuleStateTrayStatus(heatModuleId, 0);
  90. trayState.setInHeatModule(false);
  91. Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液区托盘夹爪点
  92. Point3D liquidAreaTraySafetyHeightPoint3D = new Point3D(liquidAreaTrayPoint3D.getX(), liquidAreaTrayPoint3D.getY(),liquidAreaTrayPoint3D.getZ() - traySafetyHeight);//加液区托盘点位上方加上移动托盘的安全高度
  93. deviceCommandUtilService.gantryMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTraySafetyHeightPoint3D);//移动机械臂至加液区托盘点位上方减去移动托盘的安全高度
  94. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), traySafetyHeight);//下降机械臂将托盘与试管落入加液区
  95. deviceCommandUtilService.clawMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), clawTrayPick);//松开夹爪,放下托盘
  96. deviceStateService.setSolutionModuleStateTrayStatus(1);
  97. trayState.setInSolutionModule(true);
  98. deviceCommandUtilService.gantryZMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -clawDescend);//抬升机械臂至托盘上方
  99. }finally {
  100. deviceStateService.setGantryArmStateIdle(false);
  101. isExecuting.set(false);
  102. }
  103. });
  104. }
  105. }