diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/CleanStartCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/CleanStartCommand.java index 6d008db..7f4a525 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/CleanStartCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/CleanStartCommand.java @@ -6,6 +6,7 @@ import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.model.entity.Solutions; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.api.SolutionsService; import com.iflytop.sgs.app.service.api.SystemConfigService; @@ -42,6 +43,7 @@ public class CleanStartCommand extends BaseCommandHandler { private final SystemConfigService systemConfigService; private final DeviceSensorService deviceSensorService; private final SolutionsService solutionsService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { @@ -52,7 +54,7 @@ public class CleanStartCommand extends BaseCommandHandler { Assert.notEmpty(jsonArray, () -> new AppException(ResultCode.INVALID_PARAMETER)); Integer cycle = cmdDTO.getIntegerParam("cycle");//清洗次数 Double height = cmdDTO.getDoubleParam("height");//针头下降高度 - Double volume = cmdDTO.getDoubleParam("volume");//加水的量 + Double volume = cmdDTO.getDoubleParam("volume") == null ? 2.0 : cmdDTO.getDoubleParam("volume");//加水的量 Integer maxCycles = systemConfigService.getSystemConfigIntegerByCode(SystemConfigCode.cycle_clean_max);//获取最大清洁次数配置 Assert.isTrue(cycle != null && cycle > 0 && cycle < maxCycles && height < 55 && volume != null, () -> new AppException(ResultCode.INVALID_PARAMETER));//清洁次数不为空 切清洁次数大于0 Solutions solutions = solutionsService.getByCode(SolutionCode.water.name()); @@ -63,13 +65,16 @@ public class CleanStartCommand extends BaseCommandHandler { Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点 Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距 Double backFlowDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.back_flow_distance);//防低落距离 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if(!moduleIdle){ - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//设置正在加液 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升 @@ -97,10 +102,13 @@ public class CleanStartCommand extends BaseCommandHandler { solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升至最高,移出试管 } } + transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("清洗指令执行异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/DrainLiquidCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/DrainLiquidCommand.java index e094ee7..1dc7a66 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/DrainLiquidCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/DrainLiquidCommand.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.api.SystemConfigService; import com.iflytop.sgs.app.service.device.DeviceSensorService; @@ -41,6 +42,8 @@ public class DrainLiquidCommand extends BaseCommandHandler { private final DeviceSensorService deviceSensorService; private final SolutionModuleService solutionModuleService; private final SystemConfigService systemConfigService; + private final CraftsService craftsService; + @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { @@ -54,21 +57,24 @@ public class DrainLiquidCommand extends BaseCommandHandler { Point3D heatArea1TrayClawPoint = devicePositionService.getPosition(DevicePositionCode.heatArea1TrayClawPoint).getPoint3D();//加热位1坐标 Double liquidAreaPreFillPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaPreFillPoint).getPositon(); //预充时加液臂下降位置 Double preFillDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.pre_fill_distance_when_open_service);//预充距离 + boolean liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 + Assert.isTrue(!liquidTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult=transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if(!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 - Assert.isTrue(!liquidTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 transferModuleService.transferZMoveZero();//Z轴抬升至最高 transferModuleService.transferXMove(heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 - liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 - Assert.isTrue(!liquidTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 + boolean liquidTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 + Assert.isTrue(!liquidTrayExistAgain, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开 solutionModuleService.liquidPumpMove(-preFillDistance);//排空 @@ -79,9 +85,12 @@ public class DrainLiquidCommand extends BaseCommandHandler { solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开 solutionModuleService.liquidPumpMove(-preFillDistance);//排空 solutionModuleService.solutionMotorMoveZero();//回原点 - } finally { - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("排空指令执行异常:{}", e.getMessage()); + throw new Exception(e); + }finally { + deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java index 6fdd5bd..15120d5 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java @@ -7,10 +7,7 @@ import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.model.entity.Container; import com.iflytop.sgs.app.model.entity.Solutions; -import com.iflytop.sgs.app.service.api.ContainerService; -import com.iflytop.sgs.app.service.api.DevicePositionService; -import com.iflytop.sgs.app.service.api.SolutionsService; -import com.iflytop.sgs.app.service.api.SystemConfigService; +import com.iflytop.sgs.app.service.api.*; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; @@ -44,6 +41,7 @@ public class LiquidAddCommand extends BaseCommandHandler { private final DeviceSensorService deviceSensorService; private final ContainerService containerService; private final SystemConfigService systemConfigService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { @@ -62,13 +60,16 @@ public class LiquidAddCommand extends BaseCommandHandler { Container container = containerService.getById(containerId); Solutions solutions = solutionsService.getById(container.getSolutionId());//获取溶液 Assert.isTrue(!jsonArray.isEmpty(), () -> new AppException(ResultCode.INVALID_PARAMETER));//确定选中了列 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if(!moduleIdle){ + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult=transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if(!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if(!moduleIdle){ - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//设置正在加液 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升至0 @@ -99,10 +100,13 @@ public class LiquidAddCommand extends BaseCommandHandler { } solutionModuleService.liquidPumpMove(-backFlowDistance);//倒吸 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint);//移动至加液位置 - } finally { + transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("加液指令执行异常:{}", e.getMessage()); + throw new Exception(e); + }finally { deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java index 25acb03..63e33ae 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java @@ -5,6 +5,7 @@ import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.model.entity.Solutions; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.api.SolutionsService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -35,6 +36,7 @@ public class LiquidPreFillStartCommand extends BaseCommandHandler { private final DevicePositionService devicePositionService; private final TransferModuleService transferModuleService; private final SolutionsService solutionsService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { @@ -47,22 +49,28 @@ public class LiquidPreFillStartCommand extends BaseCommandHandler { SolutionCode solutionCode = SolutionCode.valueOf(solutions.getCode());//获取对应的电磁阀通道 Point3D heatArea1TrayClawPoint = devicePositionService.getPosition(DevicePositionCode.heatArea1TrayClawPoint).getPoint3D(); //加热区1上方点位用于放置转运机械臂 Double liquidAreaPreFillPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaPreFillPoint).getPositon(); //预充时加液臂下降位置 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if(!moduleIdle){ - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setSolutionAddCommandExecuting(true); deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//设置正在加液 solutionModuleService.liquidValveSwitch(cmdDTO.getCommandId(), cmdDTO.getCommand(), solutionCode);//电磁阀对应的酸液通道打开 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 solutionModuleService.liquidPumpRotateForward(cmdDTO.getCommandId(), cmdDTO.getCommand());//预充开始 + transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("预充指令执行异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getCommandMutexState().get().setSolutionAddCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStopCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStopCommand.java index fea52db..0509335 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStopCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStopCommand.java @@ -2,6 +2,7 @@ package com.iflytop.sgs.app.cmd.control; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.SystemConfigService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; @@ -28,25 +29,15 @@ public class LiquidPreFillStopCommand extends BaseCommandHandler { private final SolutionModuleService solutionModuleService; private final DeviceStateService deviceStateService; private final SystemConfigService systemConfigService; - private final TransferModuleService transferModuleService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { Double backFlowDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.back_flow_distance);//防低落距离 return runAsync(() -> { - try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 - solutionModuleService.liquidPumpStop(cmdDTO.getCommandId(), cmdDTO.getCommand());//停止预充 - solutionModuleService.liquidPumpMove(-backFlowDistance);//预充 - solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂归0 - deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 - } finally { - transferModuleService.releaseTransferModule();//释放转运模组 - } + solutionModuleService.liquidPumpStop(cmdDTO.getCommandId(), cmdDTO.getCommand());//停止预充 + solutionModuleService.liquidPumpMove(-backFlowDistance);//倒吸 + solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂归0 + deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java index b643a09..52faae7 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java @@ -5,6 +5,7 @@ import cn.hutool.json.JSONArray; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.api.SystemConfigService; import com.iflytop.sgs.app.service.device.DeviceSensorService; @@ -39,6 +40,7 @@ public class LiquidReduceCommand extends BaseCommandHandler { private final TransferModuleService transferModuleService; private final SystemConfigService systemConfigService; private final DeviceSensorService deviceSensorService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { @@ -55,13 +57,16 @@ public class LiquidReduceCommand extends BaseCommandHandler { Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距 Double solutionModuleMotorDownInTubeExtPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeExtPositon).getPositon();//加液模块电机下降进入试管抽取位置 double reduceNumber = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.reduce_distance);//抽液volume配置 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液时托盘位置点 @@ -82,9 +87,12 @@ public class LiquidReduceCommand extends BaseCommandHandler { solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升至最高,移出试管 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至托盘至加液位置点 deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 + transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("抽液指令执行异常:{}", e.getMessage()); + throw new Exception(e); }finally { deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java index 64b510a..eb007eb 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -38,6 +39,7 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { private final DeviceStateService deviceStateService; private final DeviceSensorService deviceSensorService; private final SolutionModuleService solutionModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { @@ -57,15 +59,18 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 Point3D liquidAreaTrayPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D(); //获取加液区上方点位 Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 + boolean annealTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.HEATER_TRAY_4_EXIST);//获取传感器状态 + Assert.isTrue(!annealTrayExist, () -> new AppException(ResultCode.ANNEAL_MODULE_EXIST_TRAY));//退火位不能有托盘 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean annealTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.HEATER_TRAY_4_EXIST);//获取传感器状态 - Assert.isTrue(!annealTrayExist, () -> new AppException(ResultCode.ANNEAL_MODULE_EXIST_TRAY));//退火位不能有托盘 - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 if (heatModuleCode == null) { @@ -93,14 +98,17 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { } transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 - annealTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.HEATER_TRAY_4_EXIST);//获取传感器状态 - Assert.isTrue(!annealTrayExist, () -> new AppException(ResultCode.ANNEAL_MODULE_EXIST_TRAY));//退火位不能有托盘 + boolean annealTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.HEATER_TRAY_4_EXIST);//获取传感器状态 + Assert.isTrue(!annealTrayExistAgain, () -> new AppException(ResultCode.ANNEAL_MODULE_EXIST_TRAY));//退火位不能有托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 - } finally { - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("移动至退火区指令执行异常:{}", e.getMessage()); + throw new Exception(e); + }finally { + deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java index df0b21b..188035c 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -38,33 +39,38 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { private final DeviceStateService deviceStateService; private final DeviceSensorService deviceSensorService; private final SolutionModuleService solutionModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { if (deviceStateService.getCommandMutexState().get().isTransferCommandExecuting()) { throw new AppException(ResultCode.CMD_BUSY); } - boolean liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 - Assert.isTrue(!liquidTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 + boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 + Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 String targetHeatModuleCodeStr = cmdDTO.getStringParam("heatModuleCode"); HeatModuleCode targetHeatModuleCode;//目标加热模块 if (targetHeatModuleCodeStr != null) {//目标加热模块非必填,如果没有传递目标加热模块则尝试获取加液位是否有托盘 targetHeatModuleCode = HeatModuleCode.valueOf(targetHeatModuleCodeStr); + boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 + } else { targetHeatModuleCode = null; } Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液区托盘夹爪位置点 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 - Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 if (targetHeatModuleCode == null) { @@ -72,8 +78,8 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取夹爪位托盘状态 Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//夹爪托盘必须存在 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX());//将X轴移动至上料区位置点 - feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 - Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 + boolean feedTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 + Assert.isTrue(!feedTrayExistAgain, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入上料区 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 @@ -90,8 +96,8 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { deviceStateService.getDeviceState().getTransferModule().setTrayStatus(true);//设定托盘在机械臂上 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX());//将X轴移动至上料区位置点 - feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 - Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 + boolean feedTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 + Assert.isTrue(!feedTrayExistAgain, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入上料区 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 @@ -99,9 +105,12 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态 deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true);//设定上料区托盘状态 } + transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("移动至上料区指令执行异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToHeatAreaCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToHeatAreaCommand.java index 378ef6d..f189287 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToHeatAreaCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToHeatAreaCommand.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -38,6 +39,7 @@ public class MoveToHeatAreaCommand extends BaseCommandHandler { private final DeviceStateService deviceStateService; private final DeviceSensorService deviceSensorService; private final SolutionModuleService solutionModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { @@ -53,15 +55,18 @@ public class MoveToHeatAreaCommand extends BaseCommandHandler { boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//目标加热模块有无托盘 Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//提示被占用 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); + boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(!heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区存在托盘 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 - Assert.isTrue(!heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区存在托盘 - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液位置 boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取传感器状态 @@ -76,15 +81,18 @@ public class MoveToHeatAreaCommand extends BaseCommandHandler { transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 } transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 - heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 - Assert.isTrue(!heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区存在托盘 + boolean heatTrayExistAgain = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(!heatTrayExistAgain, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区存在托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(true);//设置目标加热区有托盘 - } finally { - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("移动至加热区指令执行异常:{}", e.getMessage()); + throw new Exception(e); + }finally { + deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java index d50d515..8f5f64a 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -38,6 +39,8 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { private final DeviceStateService deviceStateService; private final SolutionModuleService solutionModuleService; private final DeviceSensorService deviceSensorService; + private final CraftsService craftsService; + @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { @@ -56,13 +59,16 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点 Assert.isTrue(deviceStateService.getDeviceState().getSolutionModule().isIdle(), () -> new AppException(ResultCode.SOLUTION_MODULE_IS_BUSY));//判断加液模块状态 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液位置 @@ -91,12 +97,16 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态 } transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液时托盘位置点 - } else { - throw new AppException(ResultCode.TRANSFER_MODULE_YES_TRAY);//夹爪存在托盘 } - }finally { - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); + /*else { + throw new AppException(ResultCode.TRANSFER_MODULE_YES_TRAY);//夹爪存在托盘 + }*/ transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("移动至加液区指令执行异常:{}", e.getMessage()); + throw new Exception(e); + } finally { + deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java index 739cd37..c574774 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java @@ -5,6 +5,7 @@ import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.bo.status.device.TrayState; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -40,50 +41,55 @@ public class OutTrayCommand extends BaseCommandHandler { private final DeviceStateService deviceStateService; private final DeviceSensorService deviceSensorService; private final SolutionModuleService solutionModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) throws Exception { String targetHeatModuleCodeStr = cmdDTO.getStringParam("heatModuleCode"); + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 + Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 HeatModuleCode targetHeatModuleCode = HeatModuleCode.valueOf(targetHeatModuleCodeStr);//目标加热模块 + Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 + Point3D heat1ModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(HeatModuleCode.heat_module_01);//获取加热模块1托盘夹取点 if (targetHeatModuleCode == HeatModuleCode.heat_module_04) { throw new AppException(ResultCode.NOT_ALLOWED_HEAT_MODULE);//不允许的加热模块 } - boolean liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 - Assert.isTrue(!liquidTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 + boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 + Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode. FEED_AREA_EXIST_TRAY));//上料区不能存在托盘 boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 - Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 - Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 - Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_feed);//申请使用转运模块 - boolean liquidTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 - Assert.isTrue(!liquidTrayExistAgain, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 - boolean heatTrayExistAgain = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 - Assert.isTrue(heatTrayExistAgain, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -transferModuleXPickTrayMoveDistance);//X轴进入卡槽 deviceStateService.getDeviceState().getTransferModule().setTrayStatus(true);//设定托盘在机械臂上 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX());//将X轴移动至上料区位置点 + boolean feedTrayExistAgain = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区托盘状态 + Assert.isTrue(!feedTrayExistAgain, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//上料区不能存在托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入上料区 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 + transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heat1ModuleTrayClawPoint3D.getX());//将X轴移动至加热区1上方 deviceStateService.getDeviceState().getTransferModule().setTrayStatus(false);//设定托盘夹爪为FALSE deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态 List trayList = deviceStateService.getDeviceState().getTrays(); -// for (TrayState trayState : trayList) { -// if (trayState != null) { -// log.info("点击移出托盘按钮{}", trayState.getHeatModuleCode().name()); -// } -// } trayList.removeIf((tray) -> tray.getHeatModuleCode() != null && tray.getHeatModuleCode().equals(targetHeatModuleCode)); - } finally { transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("工艺执行中异常:{}", e.getMessage()); + throw new Exception(e); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/XOriginCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/XOriginCommand.java index 1d7df59..1fe1afb 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/XOriginCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/XOriginCommand.java @@ -3,6 +3,7 @@ package com.iflytop.sgs.app.cmd.control; import cn.hutool.core.lang.Assert; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.device.DeviceCommandService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -34,19 +35,23 @@ public class XOriginCommand extends BaseCommandHandler { private final DeviceSensorService deviceSensorService; private final DeviceStateService deviceStateService; private final TransferModuleService transferModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) { throw new AppException(ResultCode.CMD_BUSY); } + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setGantryXOriginCommandExecuting(true); //确保z轴的高度 Double zPosition = deviceSensorService.getMotorPosition(DevicePartId.ZM); @@ -54,9 +59,12 @@ public class XOriginCommand extends BaseCommandHandler { DeviceCommandBundle deviceCommand = DeviceCommandGenerator.transferXOrigin(); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), deviceCommand); CommandUtil.wait(deviceCommandFuture); + transferModuleService.releaseTransferModule();//释放转运模组 + }catch (Exception e) { + log.error("x轴电机回原点指令执行异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getCommandMutexState().get().setGantryXOriginCommandExecuting(false); - transferModuleService.releaseTransferModule();//释放转运模组 } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/ZOriginCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/ZOriginCommand.java index 4b1a3e1..1a7cb84 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/ZOriginCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/ZOriginCommand.java @@ -2,6 +2,7 @@ package com.iflytop.sgs.app.cmd.control; import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.dto.CmdDTO; +import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.device.DeviceCommandService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; @@ -30,26 +31,33 @@ public class ZOriginCommand extends BaseCommandHandler { private final DeviceCommandService deviceCommandService; private final DeviceStateService deviceStateService; private final TransferModuleService transferModuleService; + private final CraftsService craftsService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) { throw new AppException(ResultCode.CMD_BUSY); } + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if (!moduleIdle) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } + boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 + if (!requestResult) { + throw new AppException(ResultCode.CMD_BUSY);//设备忙 + } return runAsync(() -> { try { - boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if (!moduleIdle) { - throw new AppException(ResultCode.CMD_BUSY);//设备忙 - } - transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setGantryZOriginCommandExecuting(true); DeviceCommandBundle deviceCommand = DeviceCommandGenerator.transferZOrigin(); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), deviceCommand); CommandUtil.wait(deviceCommandFuture); - } finally { - deviceStateService.getCommandMutexState().get().setGantryZOriginCommandExecuting(false); transferModuleService.releaseTransferModule();//释放转运模组 + } catch (Exception e) { + log.error("z轴电机回原点指令执行异常:{}", e.getMessage()); + throw new Exception(e); + }finally { + deviceStateService.getCommandMutexState().get().setGantryZOriginCommandExecuting(false); } }); } diff --git a/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java b/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java index e4dac24..4e673c9 100644 --- a/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java +++ b/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java @@ -31,9 +31,11 @@ import com.iflytop.sgs.common.enums.automaton.CraftStates; import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; import jakarta.annotation.PostConstruct; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Service; @@ -58,7 +60,9 @@ public class CraftsService extends ServiceImpl { private final WebSocketSender webSocketService; private final CraftsStepService craftsStepService; private final CraftMonitorService craftMonitorService; + @Getter private final ConcurrentHashMap contextMap = new ConcurrentHashMap<>(); + @Getter private final ConcurrentHashMap> futureMap = new ConcurrentHashMap<>(); private ExecutorService executor; private final DeviceStateService deviceStateService; @@ -113,7 +117,7 @@ public class CraftsService extends ServiceImpl { if (craftMonitor == null) { craftMonitor = new CraftMonitor(); craftMonitor.setCurrentStepId(currentIndex); - }else{ + } else { //currentIndex = craftMonitor.getCurrentStepId(); todo测试后放开 } craftMonitor.setModifyParam(startCraftsDTO.getModifyParam()); @@ -124,14 +128,14 @@ public class CraftsService extends ServiceImpl { craftMonitorService.saveMonitor(craftMonitor); log.info("准备开始工艺,加热模块{},工艺{}", heatModuleCode, craft.getName()); // 校验已有上下文状态,仅允许在 READY、STOPPED 或 FINISHED 状态下重置 - CraftsContext existing = contextMap.get(heatModuleCode); - if (existing != null) { - CraftStates state = existing.getSm().getState().getId(); - if (state == CraftStates.RUNNING || state == CraftStates.PAUSED) { - throw new AppException(ResultCode.CRAFT_RUNNING); - } - clearCraftContext(heatModuleCode); - } +// CraftsContext existing = contextMap.get(heatModuleCode); +// if (existing != null) { +// CraftStates state = existing.getSm().getState().getId(); +// if (state == CraftStates.RUNNING || state == CraftStates.PAUSED) { +// throw new AppException(ResultCode.CRAFT_RUNNING); +// } +// clearCraftContext(heatModuleCode); +// } TrayState trayState = deviceStateService.getDeviceState().getTrayInFeedModule(); //配置可操作试管 diff --git a/src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java b/src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java index db09232..29ca8ef 100644 --- a/src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java +++ b/src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java @@ -23,13 +23,14 @@ import com.iflytop.sgs.app.ws.server.WebSocketSender; import com.iflytop.sgs.common.constant.WebSocketMessageType; import com.iflytop.sgs.common.enums.*; import com.iflytop.sgs.common.enums.cmd.CmdBeepMode; -import com.iflytop.sgs.common.enums.cmd.CmdColor; import com.iflytop.sgs.common.enums.data.DevicePositionCode; import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; -import com.iflytop.sgs.hardware.exception.HardwareException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -37,6 +38,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; /** * 工艺步骤执行服务 @@ -44,7 +46,8 @@ import java.util.concurrent.CompletableFuture; @Slf4j @Service @RequiredArgsConstructor -public class CraftsStepService { +public class CraftsStepService implements ApplicationContextAware { + private ApplicationContext applicationContext; private final ContainerService containerService; private final WebSocketSender webSocketService; private final HeatModuleService heatModuleService; @@ -58,6 +61,22 @@ public class CraftsStepService { private final DeviceLightSoundService deviceLightSoundService; private final CraftMonitorService craftMonitorService; + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + public synchronized void stopAllCrafts() { + CraftsService craftsService = applicationContext.getBean(CraftsService.class); + craftsService.getContextMap().forEach((key, ctx) -> { + Future future = craftsService.getFutureMap().remove(key); + if (ctx != null && future != null) { + ctx.stop(); + future.cancel(true); + } + }); + } + /** * 执行单个工艺步骤 * @@ -244,12 +263,16 @@ public class CraftsStepService { transferModuleService.transferZMoveZero();//Z轴抬升至最高 deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTrayStatus(true);//加热区托盘状态 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(true);//托盘状态 - deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//正在加液 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(false);//托盘状态 + deviceStateService.getDeviceState().getSolutionModule().setPumping(false); + deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setUseArm(false);//使用机械臂标志 + transferModuleService.releaseTransferModule();//释放转运模组 return true; + } catch (Exception e) { + log.error("工艺执行中异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getDeviceState().getSolutionModule().setPumping(false); - transferModuleService.releaseTransferModule();//释放转运模组 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setUseArm(false);//使用机械臂标志 } } @@ -448,10 +471,13 @@ public class CraftsStepService { deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(true);//托盘状态 deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//正在加液 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(false);//托盘状态 + transferModuleService.releaseTransferModule();//释放转运模组 return true; + } catch (Exception e) { + log.error("工艺执行中异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getDeviceState().getSolutionModule().setPumping(false); - transferModuleService.releaseTransferModule();//释放转运模组 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setUseArm(false);//使用机械臂标志 } } @@ -462,52 +488,58 @@ public class CraftsStepService { * */ public boolean heat(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception { /*工艺监控清理上步的记录*/ - craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); - craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0"); - craftMonitorService.saveMonitor(craftMonitor); - /*工艺监控清理上步的记录*/ - Double temperature = params.getDouble("temperature");//温度 - Integer time = params.getInt("time");//秒 - - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.heating); //设置加热区状态 加热中 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTemperature(temperature);//将加热温度设定为目标温度 - log.info("工艺{},开始加热", heatModuleCode); - heatModuleService.fanClose(heatModuleCode);//关闭风扇 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(false); //设置加热区风扇关闭 - heatModuleService.heatRodOpen(heatModuleCode, temperature);//打开加热棒 - while (!heatIsSuitable(heatModuleCode, temperature)) {//判断温度是否到达 - delay(1); - } - log.info("工艺{},温度达到", heatModuleCode); - log.info("工艺{},恒温时间", time); - webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "温度达到", temperature)); - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.constant); //恒温中 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(LocalDateTime.now());//开始加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(time);//加热器目标加热时间 - int clock = 0; - int cycle = time / 60; - int seconds = time % 60; - log.info("工艺{},恒温时间分钟:", cycle); - log.info("工艺{},恒温时间秒数:", seconds); - while (cycle > 0) { - log.info("工艺,恒温第{}分:", cycle); - delay(60); - cycle--; - clock = clock + 60; - /*保存到工艺监控*/ + try { craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); - craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":" + clock / 60); + craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0"); craftMonitorService.saveMonitor(craftMonitor); - /*保存到工艺监控*/ + /*工艺监控清理上步的记录*/ + Double temperature = params.getDouble("temperature");//温度 + Integer time = params.getInt("time");//秒 + + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.heating); //设置加热区状态 加热中 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTemperature(temperature);//将加热温度设定为目标温度 + log.info("工艺{},开始加热", heatModuleCode); + heatModuleService.fanClose(heatModuleCode);//关闭风扇 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(false); //设置加热区风扇关闭 + heatModuleService.heatRodOpen(heatModuleCode, temperature);//打开加热棒 + while (!heatIsSuitable(heatModuleCode, temperature)) {//判断温度是否到达 + delay(1); + } + log.info("工艺{},温度达到", heatModuleCode); + log.info("工艺{},恒温时间", time); + webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "温度达到", temperature)); + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.constant); //恒温中 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(LocalDateTime.now());//开始加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(time);//加热器目标加热时间 + int clock = 0; + int cycle = time / 60; + int seconds = time % 60; + log.info("工艺{},恒温时间分钟:", cycle); + log.info("工艺{},恒温时间秒数:", seconds); + while (cycle > 0) { + log.info("工艺,恒温第{}分:", cycle); + delay(60); + cycle--; + clock = clock + 60; + /*保存到工艺监控*/ + craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); + craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":" + clock / 60); + craftMonitorService.saveMonitor(craftMonitor); + /*保存到工艺监控*/ + } + delay(seconds); + log.info("工艺,恒温结束:"); + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(null);//开始加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(null);//加热器目标加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.finish); //加热完成 + log.info("工艺{},加热结束", heatModuleCode); + webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "加热结束,持续时间", time)); + return true; + } catch (Exception e) { + log.error("工艺加热异常:{}", e.getMessage()); + throw new Exception(e); } - delay(seconds); - log.info("工艺,恒温结束:"); - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(null);//开始加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(null);//加热器目标加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.finish); //加热完成 - log.info("工艺{},加热结束", heatModuleCode); - webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "加热结束,持续时间", time)); - return true; + } /* @@ -682,11 +714,14 @@ public class CraftsStepService { deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(true);//托盘状态 deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//正在加液 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(false);//托盘状态 + log.info("工艺{},释放转运模组", heatModuleCode); + transferModuleService.releaseTransferModule();//释放转运模组 return true; + } catch (Exception e) { + log.error("工艺执行中异常:{}", e.getMessage()); + throw new Exception(e); } finally { deviceStateService.getDeviceState().getSolutionModule().setPumping(false); - log.info("工艺{},释放转运模组", heatModuleCode); - transferModuleService.releaseTransferModule();//释放转运模组 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setUseArm(false);//使用机械臂标志 } } @@ -695,60 +730,66 @@ public class CraftsStepService { * 烘干 * */ public boolean dry(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception { - /*工艺监控清理上步的记录*/ - craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); - craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0"); - craftMonitorService.saveMonitor(craftMonitor); - /*工艺监控清理上步的记录*/ - - - Double temperature = params.getDouble("temperature");//秒 - Integer time = params.getInt("time");//秒 - Integer keepTime = systemConfigService.getSystemConfigIntegerByCode(SystemConfigCode.fan_start_keep_time); - webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "打开加热棒", temperature)); - heatModuleService.heatRodOpen(heatModuleCode, temperature);//打开加热棒 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.heating); //设置加热区状态 烘干中 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTemperature(temperature);//将加热温度设定为目标温度 - log.info("工艺{},开始加热", heatModuleCode); - heatModuleService.heatRodOpen(heatModuleCode, temperature); - log.info("工艺{},判断当前温度是否在设置温度范围内", heatModuleCode); - while (!heatIsSuitable(heatModuleCode, temperature)) { //判断当前温度是否在设置温度范围内 - delay(1); - } - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.drying); //烘干中 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(LocalDateTime.now());//开始加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(time);//加热器目标加热时间 - int clock = 0; - int cycle = time / 60; - int seconds = time % 60; - while (cycle > 0) { - delay(60); - cycle--; - clock = clock + 60; + try { + /*工艺监控清理上步的记录*/ craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); - craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":" + clock / 60); + craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0"); craftMonitorService.saveMonitor(craftMonitor); - } - log.info("工艺{},恒温中", heatModuleCode); - delay(seconds); - log.info("工艺{},关闭加热棒", heatModuleCode); - webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "关闭加热棒", "")); - heatModuleService.heatRodClose(heatModuleCode);//关闭加热棒 - CompletableFuture.runAsync(() -> { - try { - heatModuleService.fanStart(heatModuleCode);//散热打开 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(true); //设置加热区风扇打开 - delay(keepTime); - heatModuleService.fanClose(heatModuleCode);//散热打开 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(false); //设置加热区风扇打开 - } catch (Exception e) { - log.error("工艺 烘干降温失败{}", e.getMessage()); + /*工艺监控清理上步的记录*/ + + + Double temperature = params.getDouble("temperature");//秒 + Integer time = params.getInt("time");//秒 + Integer keepTime = systemConfigService.getSystemConfigIntegerByCode(SystemConfigCode.fan_start_keep_time); + webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "打开加热棒", temperature)); + heatModuleService.heatRodOpen(heatModuleCode, temperature);//打开加热棒 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.heating); //设置加热区状态 烘干中 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTemperature(temperature);//将加热温度设定为目标温度 + log.info("工艺{},开始加热", heatModuleCode); + heatModuleService.heatRodOpen(heatModuleCode, temperature); + log.info("工艺{},判断当前温度是否在设置温度范围内", heatModuleCode); + while (!heatIsSuitable(heatModuleCode, temperature)) { //判断当前温度是否在设置温度范围内 + delay(1); } - }); - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(null);//开始加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(null);//加热器目标加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.stop); //设置加热区状态 - return true; + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.drying); //烘干中 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(LocalDateTime.now());//开始加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(time);//加热器目标加热时间 + int clock = 0; + int cycle = time / 60; + int seconds = time % 60; + while (cycle > 0) { + delay(60); + cycle--; + clock = clock + 60; + craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); + craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":" + clock / 60); + craftMonitorService.saveMonitor(craftMonitor); + } + log.info("工艺{},恒温中", heatModuleCode); + delay(seconds); + log.info("工艺{},关闭加热棒", heatModuleCode); + webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "关闭加热棒", "")); + heatModuleService.heatRodClose(heatModuleCode);//关闭加热棒 + CompletableFuture.runAsync(() -> { + try { + heatModuleService.fanStart(heatModuleCode);//散热打开 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(true); //设置加热区风扇打开 + delay(keepTime); + heatModuleService.fanClose(heatModuleCode);//散热打开 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(false); //设置加热区风扇打开 + } catch (Exception e) { + log.error("工艺 烘干降温失败{}", e.getMessage()); + } + }); + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(null);//开始加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(null);//加热器目标加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.stop); //设置加热区状态 + return true; + } catch (Exception e) { + log.error("工艺烘干异常:{}", e.getMessage()); + throw new Exception(e); + } + } /* @@ -829,10 +870,8 @@ public class CraftsStepService { } log.info("工艺{},恒温中", HeatModuleCode.heat_module_04); delay(seconds); - // heatModuleService.heatRodClose(HeatModuleCode.heat_module_04);//关闭加热棒 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setStartHeatTime(null);//开始加热时间 - deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTime(null);//加热器目标加热时间 - //deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setHeatingType(HeatingType.stop); //设置加热区状态 停止加热 + deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setStartHeatTime(null);//开始加热时间 + deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setTargetTime(null);//加热器目标加热时间 log.info("工艺{},加热完毕", heatModuleCode); log.info("工艺{},获取转运模组锁", heatModuleCode); @@ -869,8 +908,10 @@ public class CraftsStepService { deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setTrayStatus(false); deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(true);//托盘状态 return true; + } catch (Exception e) { + log.error("工艺执行中异常:{}", e.getMessage()); + throw new Exception(e); } finally { - transferModuleService.releaseTransferModule();//释放转运模组 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setUseArm(false);//使用机械臂标志 } } diff --git a/src/main/java/com/iflytop/sgs/app/service/device/module/TransferModuleService.java b/src/main/java/com/iflytop/sgs/app/service/device/module/TransferModuleService.java index 71bd29f..f9fbe81 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/module/TransferModuleService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/module/TransferModuleService.java @@ -38,7 +38,7 @@ public class TransferModuleService { * 如果模块当前被占用(isIdle()==false)或自己不是“当前队列的队头”,则挂起在 this.wait(), * 被唤醒后再重新检查条件。直到自己既是队头,又模块空闲,才跳出循环拿到模块。 */ - public void requestTransferModule(CraftsTransferTypeCode type) { + public boolean requestTransferModule(CraftsTransferTypeCode type) { synchronized (this) { log.info("申请使用转运模块,类型 = {}", type); @@ -47,10 +47,13 @@ public class TransferModuleService { switch (type) { case move_by_manual: boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); - if(!moduleIdle){ - throw new RuntimeException("转运模块当前正忙"); + if (!moduleIdle) { + return false; + //throw new RuntimeException("转运模块当前正忙,请稍后操作!"); + } else { + deviceStateService.getDeviceState().getTransferModule().setIdle(false); + return true; } - break; case move_feed: feedQueue.add(current); break; @@ -86,7 +89,7 @@ public class TransferModuleService { head = heatQueue.peek(); } else if (!annealQueue.isEmpty()) { head = annealQueue.peek(); - }else if (!thinQueue.isEmpty()) { + } else if (!thinQueue.isEmpty()) { head = thinQueue.peek(); } else if (!thickQueue.isEmpty()) { head = thickQueue.peek(); @@ -115,6 +118,7 @@ public class TransferModuleService { removeCurrentFromQueue(type, current); deviceStateService.getDeviceState().getTransferModule().setIdle(false); log.info("线程 [{}] 成功获取到转运模块,类型 = {}", current.getName(), type); + return true; } } diff --git a/src/main/java/com/iflytop/sgs/app/ws/client/DeviceEmergencyStopConfig.java b/src/main/java/com/iflytop/sgs/app/ws/client/DeviceEmergencyStopConfig.java index 0834084..ca38023 100644 --- a/src/main/java/com/iflytop/sgs/app/ws/client/DeviceEmergencyStopConfig.java +++ b/src/main/java/com/iflytop/sgs/app/ws/client/DeviceEmergencyStopConfig.java @@ -4,6 +4,7 @@ import com.iflytop.sgs.app.core.CommandPoolManager; import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.DeviceStopService; +import com.iflytop.sgs.app.service.device.module.TransferModuleService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -28,7 +29,7 @@ public class DeviceEmergencyStopConfig { @Bean - DeviceEmergencyStopClient stopAllClientService() { + DeviceEmergencyStopClient stopAllClientService(TransferModuleService transferModuleService) { URI uri = URI.create(String.format("ws://%s:%d/%s", ip, port, "key")); return new DeviceEmergencyStopClient(uri, s -> { if (s.get("event").equals("press")) { @@ -46,6 +47,7 @@ public class DeviceEmergencyStopConfig { commandPoolManager.restartExecutor(); deviceStateService.getCommandMutexState().get().reset(); deviceStateService.getDeviceState().setEmergencyStop(false); + deviceStateService.getDeviceState().getTransferModule().setIdle(true);//释放锁 log.info("解除急停{}", s); } }); diff --git a/src/main/java/com/iflytop/sgs/common/result/ResultCode.java b/src/main/java/com/iflytop/sgs/common/result/ResultCode.java index 41ffc6c..05b0cc9 100644 --- a/src/main/java/com/iflytop/sgs/common/result/ResultCode.java +++ b/src/main/java/com/iflytop/sgs/common/result/ResultCode.java @@ -74,7 +74,7 @@ public enum ResultCode implements IResultCode, Serializable { NOT_ALLOWED_HEAT_MODULE("6035", "不允许选择的加热区"), FEED_AREA_EXIST_TRAY("6036", "上料区存在托盘"), FAN_START_FAIL("6037", "散热打开失败"), - HEAT_MODULE_TEMPERATURE_IS_HEIGHT("6038", "目标加热区温度过高"), + HEAT_MODULE_TEMPERATURE_IS_HEIGHT("6038", "目标加热区温度过高,请开启降温!"), Z_HEIGHT_NO_ALLOWED("6039", "z轴高度不允许"), ; /** 状态码 */