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 64f4139..6d008db 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 @@ -14,6 +14,7 @@ import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.SolutionCode; import com.iflytop.sgs.common.enums.SystemConfigCode; @@ -64,6 +65,11 @@ public class CleanStartCommand extends BaseCommandHandler { 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);//申请使用转运模块 deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//设置正在加液 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升 @@ -80,7 +86,7 @@ public class CleanStartCommand extends BaseCommandHandler { solutionModuleService.liquidPumpMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), cleanWaterVolume);//八通道蠕动泵 cleanWaterVolume * waterScale * 8 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升至最高,移出试管 } - solutionModuleService.liquidPumpMove(-backFlowDistance);//预充 + solutionModuleService.liquidPumpMove(-backFlowDistance);//倒吸 for (int j = 0; j < jsonArray.size(); j++) { int column = jsonArray.getInt(j); double distance = Math.abs(column - 5) * trayTubeHorizontalSpacingDistance;//x轴移动距离 @@ -94,6 +100,7 @@ public class CleanStartCommand extends BaseCommandHandler { } 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 7cd4a32..e094ee7 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 @@ -3,7 +3,6 @@ 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.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.DevicePositionService; import com.iflytop.sgs.app.service.api.SystemConfigService; @@ -13,8 +12,8 @@ import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; -import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.SolutionCode; import com.iflytop.sgs.common.enums.SystemConfigCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; @@ -24,7 +23,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.List; import java.util.concurrent.CompletableFuture; /** @@ -49,32 +47,41 @@ public class DrainLiquidCommand extends BaseCommandHandler { 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));//上料区不能存在托盘 - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); + boolean preFillFlag = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.pre_fill_when_open_service); + if (!preFillFlag) { + throw new AppException(ResultCode.INVALID_PARAMETER); + } + 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 moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); return runAsync(() -> { try { - boolean preFillFlag = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.pre_fill_when_open_service); - 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);//预充距离 - if (preFillFlag) { - solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 - transferModuleService.transferZMoveZero();//Z轴抬升至最高 - transferModuleService.transferXMove(heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 - solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 - solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开 - solutionModuleService.liquidPumpMove(-preFillDistance);//排空 - solutionModuleService.liquidValveSwitch(SolutionCode.thin);//电磁阀对应通道打开 - solutionModuleService.liquidPumpMove(-preFillDistance);//排空 - solutionModuleService.liquidValveSwitch(SolutionCode.thick);//电磁阀对应通道打开 - solutionModuleService.liquidPumpMove(-preFillDistance);//排空 - solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开 - solutionModuleService.liquidPumpMove(-preFillDistance);//排空 - solutionModuleService.solutionMotorMoveZero();//回原点 + 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));//上料区不能存在托盘 + solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 + solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开 + solutionModuleService.liquidPumpMove(-preFillDistance);//排空 + solutionModuleService.liquidValveSwitch(SolutionCode.thin);//电磁阀对应通道打开 + solutionModuleService.liquidPumpMove(-preFillDistance);//排空 + solutionModuleService.liquidValveSwitch(SolutionCode.thick);//电磁阀对应通道打开 + solutionModuleService.liquidPumpMove(-preFillDistance);//排空 + solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开 + solutionModuleService.liquidPumpMove(-preFillDistance);//排空 + solutionModuleService.solutionMotorMoveZero();//回原点 } finally { deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); + transferModuleService.releaseTransferModule();//释放转运模组 } }); } 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 ea4a97b..6fdd5bd 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 @@ -16,8 +16,8 @@ import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; -import com.iflytop.sgs.common.enums.SolutionCode; import com.iflytop.sgs.common.enums.SystemConfigCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; import com.iflytop.sgs.common.exception.AppException; @@ -62,9 +62,14 @@ 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));//确定选中了列 - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); 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 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint);//移动至加液位置 @@ -92,11 +97,12 @@ public class LiquidAddCommand extends BaseCommandHandler { solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 } } - solutionModuleService.liquidPumpMove(-backFlowDistance);//预充 + solutionModuleService.liquidPumpMove(-backFlowDistance);//倒吸 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint);//移动至加液位置 - deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 } 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 a2bc329..25acb03 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 @@ -11,6 +11,7 @@ import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.SolutionCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; import com.iflytop.sgs.common.exception.AppException; @@ -48,6 +49,11 @@ public class LiquidPreFillStartCommand extends BaseCommandHandler { Double liquidAreaPreFillPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaPreFillPoint).getPositon(); //预充时加液臂下降位置 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);//电磁阀对应的酸液通道打开 @@ -56,6 +62,7 @@ public class LiquidPreFillStartCommand extends BaseCommandHandler { solutionModuleService.liquidPumpRotateForward(cmdDTO.getCommandId(), cmdDTO.getCommand());//预充开始 } 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 003973c..fea52db 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 @@ -5,8 +5,12 @@ import com.iflytop.sgs.app.model.dto.CmdDTO; 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; +import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.SystemConfigCode; +import com.iflytop.sgs.common.exception.AppException; +import com.iflytop.sgs.common.result.ResultCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -24,15 +28,26 @@ 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(() -> { - solutionModuleService.liquidPumpStop(cmdDTO.getCommandId(), cmdDTO.getCommand());//停止预充 - solutionModuleService.liquidPumpMove(-backFlowDistance);//预充 - solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂归0 - deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 + 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();//释放转运模组 + } + }); } } 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 94e6487..b643a09 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 @@ -12,6 +12,7 @@ import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.SolutionCode; import com.iflytop.sgs.common.enums.SystemConfigCode; @@ -56,6 +57,11 @@ public class LiquidReduceCommand extends BaseCommandHandler { double reduceNumber = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.reduce_distance);//抽液volume配置 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);//移动至加液时托盘位置点 @@ -78,6 +84,7 @@ public class LiquidReduceCommand extends BaseCommandHandler { deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束 }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 3977bc3..64b510a 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 @@ -11,6 +11,7 @@ import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; @@ -58,9 +59,14 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 return runAsync(() -> { try { - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); 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) { transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint);//移动至加液位置 @@ -69,6 +75,8 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//上料区是否有托盘 Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY));//上料区必须有托盘 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//上料区是否有托盘 + Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY));//上料区必须有托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -transferModuleXPickTrayMoveDistance);//X轴进入卡槽 } @@ -77,17 +85,22 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热模块无托盘 Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取加热模块托盘夹取点 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至加热区托盘夹取点 + 进出卡槽移动距离 + heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取转移加热区的传感器状态 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热模块无托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -transferModuleXPickTrayMoveDistance);//X轴进入卡槽 deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态 } 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));//退火位不能有托盘 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();//释放转运模组 } }); } 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 25e09bc..df0b21b 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 @@ -11,6 +11,7 @@ import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; @@ -55,40 +56,54 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液区托盘夹爪位置点 - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); 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) { transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液位置 boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取夹爪位托盘状态 Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.OPERATION_NOT_ALLOWED));//夹爪托盘必须存在 - //deviceStateService.getDeviceState().getTrayByHeatModuleCode(targetHeatModuleCode).setInSolutionPositon(false);//设定托盘不在加液位中 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));//上料区存在托盘 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入上料区 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 + deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true);//设定上料区托盘状态 } else { boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 - Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 + Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 + heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 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轴移动至上料区位置点 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区位托盘状态 + Assert.isTrue(!feedTrayExist, () -> 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轴抬升至最高 deviceStateService.getDeviceState().getTransferModule().setTrayStatus(false);//设定托盘夹爪为FALSE deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态 + deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true);//设定上料区托盘状态 } - deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true);//设定上料区托盘状态 - }finally { + } 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 2f486e9..378ef6d 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 @@ -11,6 +11,7 @@ import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; @@ -54,6 +55,13 @@ public class MoveToHeatAreaCommand extends BaseCommandHandler { deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); 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);//获取传感器状态 @@ -61,17 +69,22 @@ public class MoveToHeatAreaCommand extends BaseCommandHandler { boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区传感器状态 Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY));//上料区必须存在托盘 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区传感器状态 + Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_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轴抬升至最高 } transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 + heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(!heatTrayExist, () -> 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();//释放转运模组 } }); } 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 1848e08..d50d515 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 @@ -11,6 +11,7 @@ import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; @@ -55,9 +56,14 @@ 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));//判断加液模块状态 - deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(true); 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);//移动至加液位置 boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取传感器状态 @@ -67,6 +73,8 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY));//上料区必须存在托盘 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY));//上料区必须存在托盘 transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), -transferModuleXPickTrayMoveDistance);//X轴进入卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(false);//设定上料区托盘状态 @@ -75,6 +83,8 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { Assert.isTrue(headTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 + headTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(headTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_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轴抬升至最高 @@ -86,6 +96,7 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { } }finally { deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false); + transferModuleService.releaseTransferModule();//释放转运模组 } }); } 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 cc15cc6..71d9903 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 @@ -6,7 +6,6 @@ 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.DevicePositionService; -import com.iflytop.sgs.app.service.device.DeviceLightSoundService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.HeatModuleService; @@ -16,17 +15,13 @@ import com.iflytop.sgs.common.annotation.CommandMapping; import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DeviceSensorCode; import com.iflytop.sgs.common.enums.HeatModuleCode; -import com.iflytop.sgs.common.enums.cmd.CmdBeepMode; import com.iflytop.sgs.common.enums.data.DevicePositionCode; import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -83,7 +78,7 @@ public class OutTrayCommand extends BaseCommandHandler { List trayList = deviceStateService.getDeviceState().getTrays(); for (TrayState trayState : trayList) { log.info("点击移出托盘按钮{}", trayState.getHeatModuleCode().name()); - }//todo 测试是否移除成功 + } trayList.removeIf((tray) -> tray.getHeatModuleCode() != null && tray.getHeatModuleCode().equals(targetHeatModuleCode)); } finally { transferModuleService.releaseTransferModule();//释放转运模组 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 06582e6..adf16e7 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 @@ -6,10 +6,12 @@ import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.service.device.DeviceCommandService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; +import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.common.annotation.CommandMapping; import com.iflytop.sgs.common.cmd.CommandFuture; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.enums.DevicePartId; import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; @@ -31,23 +33,30 @@ public class XOriginCommand extends BaseCommandHandler { private final DeviceCommandService deviceCommandService; private final DeviceSensorService deviceSensorService; private final DeviceStateService deviceStateService; + private final TransferModuleService transferModuleService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) { throw new AppException(ResultCode.CMD_BUSY); } - deviceStateService.getCommandMutexState().get().setGantryXOriginCommandExecuting(true); 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); - Assert.isTrue(zPosition <50, () -> new AppException(ResultCode.SOLUTION_MODULE_NO_TRAY)); + Assert.isTrue(zPosition <50, () -> new AppException(ResultCode.Z_HEIGHT_NO_ALLOWED)); DeviceCommandBundle deviceCommand = DeviceCommandGenerator.transferXOrigin(); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), deviceCommand); CommandUtil.wait(deviceCommandFuture); }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 96361f1..4b1a3e1 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 @@ -4,10 +4,12 @@ import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.model.dto.CmdDTO; 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; import com.iflytop.sgs.common.annotation.CommandMapping; import com.iflytop.sgs.common.cmd.CommandFuture; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; +import com.iflytop.sgs.common.enums.CraftsTransferTypeCode; import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; import com.iflytop.sgs.common.utils.CommandUtil; @@ -27,20 +29,27 @@ import java.util.concurrent.CompletableFuture; public class ZOriginCommand extends BaseCommandHandler { private final DeviceCommandService deviceCommandService; private final DeviceStateService deviceStateService; + private final TransferModuleService transferModuleService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) { throw new AppException(ResultCode.CMD_BUSY); } - deviceStateService.getCommandMutexState().get().setGantryZOriginCommandExecuting(true); 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();//释放转运模组 } }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugMotorXOriginCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugMotorXOriginCommand.java index 586e6cf..ebab666 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugMotorXOriginCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugMotorXOriginCommand.java @@ -1,12 +1,17 @@ package com.iflytop.sgs.app.cmd.debug; +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.device.DeviceCommandService; +import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.common.annotation.CommandDebugMapping; import com.iflytop.sgs.common.cmd.CommandFuture; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; +import com.iflytop.sgs.common.enums.DevicePartId; +import com.iflytop.sgs.common.exception.AppException; +import com.iflytop.sgs.common.result.ResultCode; import com.iflytop.sgs.common.utils.CommandUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,10 +28,13 @@ import java.util.concurrent.CompletableFuture; @CommandDebugMapping("x_origin") public class DebugMotorXOriginCommand extends BaseCommandHandler { private final DeviceCommandService deviceCommandService; + private final DeviceSensorService deviceSensorService; @Override public CompletableFuture handle(CmdDTO cmdDTO) { return runAsync(() -> { + Double zPosition = deviceSensorService.getMotorPosition(DevicePartId.ZM); + Assert.isTrue(zPosition <50, () -> new AppException(ResultCode.Z_HEIGHT_NO_ALLOWED)); DeviceCommandBundle deviceCommand = DeviceCommandGenerator.transferXOrigin(); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), deviceCommand); CommandUtil.wait(deviceCommandFuture); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidPreFillCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidPreFillCommand.java index 0a824c9..ada3ecd 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidPreFillCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidPreFillCommand.java @@ -1,7 +1,6 @@ package com.iflytop.sgs.app.cmd.selftest; import com.iflytop.sgs.app.core.BaseCommandHandler; -import com.iflytop.sgs.app.core.SelfMoveTestGenerator; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.service.api.DevicePositionService; diff --git a/src/main/java/com/iflytop/sgs/app/cmd/selftest/MoveTestCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/selftest/MoveTestCommand.java index 12774a1..1fe1533 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/selftest/MoveTestCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/selftest/MoveTestCommand.java @@ -4,9 +4,7 @@ import com.iflytop.sgs.app.core.BaseCommandHandler; import com.iflytop.sgs.app.core.SelfMoveTestGenerator; import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.model.dto.CmdDTO; -import com.iflytop.sgs.app.model.entity.SystemConfig; import com.iflytop.sgs.app.service.api.DevicePositionService; -import com.iflytop.sgs.app.service.api.SystemConfigService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.app.service.device.module.HeatModuleService; @@ -14,19 +12,16 @@ import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; import com.iflytop.sgs.app.ws.server.WebSocketSender; import com.iflytop.sgs.common.annotation.CommandMapping; -import com.iflytop.sgs.common.enums.*; -import com.iflytop.sgs.common.enums.cmd.CmdColor; +import com.iflytop.sgs.common.enums.DeviceSensorCode; +import com.iflytop.sgs.common.enums.HeatModuleCode; 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.stereotype.Component; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.concurrent.CompletableFuture; /** diff --git a/src/main/java/com/iflytop/sgs/app/cmd/selftest/TrayOutCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/selftest/TrayOutCommand.java index c9aada0..e21a550 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/selftest/TrayOutCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/selftest/TrayOutCommand.java @@ -7,7 +7,6 @@ import com.iflytop.sgs.app.model.dto.CmdDTO; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; -import com.iflytop.sgs.app.service.device.module.DoorModuleService; import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import com.iflytop.sgs.app.service.device.module.TransferModuleService; diff --git a/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java b/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java index 5def62c..287c30f 100644 --- a/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java +++ b/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java @@ -10,7 +10,6 @@ import com.iflytop.sgs.app.model.dto.StopCraftsDTO; import com.iflytop.sgs.app.model.entity.CraftMonitor; import com.iflytop.sgs.app.model.entity.Crafts; import com.iflytop.sgs.app.model.vo.CraftMonitorVO; -import com.iflytop.sgs.app.model.vo.OresCraftsListVO; import com.iflytop.sgs.app.model.vo.SetCraftsVO; import com.iflytop.sgs.app.service.api.CraftsService; import com.iflytop.sgs.app.service.device.DeviceStateService; @@ -22,8 +21,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; diff --git a/src/main/java/com/iflytop/sgs/app/model/entity/Crafts.java b/src/main/java/com/iflytop/sgs/app/model/entity/Crafts.java index e9b9591..a9b7007 100644 --- a/src/main/java/com/iflytop/sgs/app/model/entity/Crafts.java +++ b/src/main/java/com/iflytop/sgs/app/model/entity/Crafts.java @@ -5,7 +5,6 @@ import com.iflytop.sgs.common.base.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Positive; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/iflytop/sgs/app/service/api/CraftMonitorService.java b/src/main/java/com/iflytop/sgs/app/service/api/CraftMonitorService.java index 9c5092f..3efebeb 100644 --- a/src/main/java/com/iflytop/sgs/app/service/api/CraftMonitorService.java +++ b/src/main/java/com/iflytop/sgs/app/service/api/CraftMonitorService.java @@ -1,7 +1,6 @@ package com.iflytop.sgs.app.service.api; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.iflytop.sgs.app.mapper.CraftMonitorMapper; 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 3928cd9..b921917 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 @@ -146,6 +146,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离", heatModuleCode); transferModuleService.transferXMove(feedAreaTrayPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取上料区传感器状态 + Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_NO_TRAY)); transferModuleService.transferZMove(feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴进入卡槽", heatModuleCode); transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 @@ -159,16 +161,16 @@ public class CraftsStepService { deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//正在加液 deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(true);//托盘状态 boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取传感器状态 - Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加液区无托盘 + Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.CRAFT_SOLUTION_NO_TRAY));//加液区无托盘 /*移动至加液区结束*/ /*预充开始*/ - feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 - Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区有托盘 log.info("工艺{},预充开始", heatModuleCode); transferModuleService.transferXMove(heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 log.info("工艺{},加液机械臂下降至预充位置", heatModuleCode); + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区存在托盘 solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 log.info("工艺{},电磁阀对应通道打开", heatModuleCode); solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开 @@ -224,12 +226,14 @@ public class CraftsStepService { /*移动至加热区*/ boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘 - Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//提示被占用 + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示被占用 webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode)); log.info("工艺{},加液机械臂上升", heatModuleCode); solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘 + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示被占用 log.info("工艺{},Z轴下降至夹取点", heatModuleCode); transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出卡槽", heatModuleCode); @@ -303,13 +307,15 @@ public class CraftsStepService { /*移动至加液区*/ boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取加热区试管架 - Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//目标加热区无托盘 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_NO_TRAY));//目标加热区无托盘 log.info("工艺{},加热区存在托盘", heatModuleCode); log.info("工艺{},机械臂移动至加热区", heatModuleCode); webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode.name())); log.info("工艺{},将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 log.info("工艺{},Z轴下降至夹取点", heatModuleCode); + heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取加热区试管架 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_NO_TRAY));//目标加热区无托盘 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点 log.info("工艺{},X轴进入卡槽", heatModuleCode); transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 @@ -363,6 +369,8 @@ public class CraftsStepService { log.info("工艺{},加液机械臂上升", heatModuleCode); solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 transferModuleService.transferXMove(heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区有托盘 solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 log.info("工艺{},电磁阀对应通道打开", heatModuleCode); solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开 @@ -420,13 +428,15 @@ public class CraftsStepService { /*移动至加热区*/ log.info("工艺{},移动至加热区", heatModuleCode); boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘 - Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//提示被占用 + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示被占用 webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode)); log.info("工艺{},加液机械臂上升", heatModuleCode); solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点", heatModuleCode); + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有托盘 + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示被占用 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出卡槽", heatModuleCode); transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 @@ -511,7 +521,7 @@ public class CraftsStepService { /*获取参数开始*/ deviceStateService.getDeviceState().getSolutionModule().setPumping(true); - Double volume = params.getDouble("volume") == null ? 2.0 : params.getDouble("volume");//加水量 + Double volume = params.getDouble("volume");//加水量 Integer cycle = params.getInt("cycle");//次数 Double height = params.getDouble("height");//下降进入试管的高度 if (height > 55) { @@ -546,6 +556,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 log.info("工艺{},Z轴下降至夹取点", heatModuleCode); + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘 + Assert.isTrue(heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_TARGET_HEAT_NO_TRAY));//提示工艺加热区无托盘 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点 log.info("工艺{},X轴进入卡槽", heatModuleCode); transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 @@ -600,6 +612,8 @@ public class CraftsStepService { log.info("工艺{},清洗-预充开始", heatModuleCode); solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 transferModuleService.transferXMove(heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 + feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(!feedTrayExist, () -> new AppException(ResultCode.FEED_AREA_EXIST_TRAY));//上料区有托盘 solutionModuleService.solutionMotorMove(liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 solutionModuleService.liquidPumpMove(-drainDistance);//排空 solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开 @@ -654,6 +668,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘 + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示工艺加热区被占用 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出卡槽", heatModuleCode); transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 @@ -730,6 +746,9 @@ public class CraftsStepService { craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState())); craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0"); craftMonitorService.saveMonitor(craftMonitor); + Point3D annealTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(HeatModuleCode.heat_module_04);//获取退火区托盘夹取点 + Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点 + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 Double temperature = params.getDouble("temperature");//退火温度 Integer time = params.getInt("time");//秒 boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode); @@ -737,9 +756,6 @@ public class CraftsStepService { while (deviceSensorService.getTrayStateByHeatModuleCode(HeatModuleCode.heat_module_04)) {//判断退火区是否被占用 delay(1);//等待1秒 } - Point3D annealTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(HeatModuleCode.heat_module_04);//获取退火区托盘夹取点 - Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点 - Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 log.info("工艺{},机械臂移动至加热区", heatModuleCode); webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode)); log.info("工艺{},申请使用转运模块", heatModuleCode); @@ -749,6 +765,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode); + Assert.isTrue(heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_TARGET_HEAT_NO_TRAY));//提示加热模块无托盘 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出入槽", heatModuleCode); transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴移出入槽 @@ -759,6 +777,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至退火热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(annealTrayClawPoint3D.getX());//将X轴移动至退火热模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + boolean heatModule04TrayExist = deviceSensorService.getTrayStateByHeatModuleCode(HeatModuleCode.heat_module_04); + Assert.isTrue(!heatModule04TrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示退火模块存在托盘 transferModuleService.transferZMove(annealTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出卡槽", heatModuleCode); transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 @@ -808,8 +828,10 @@ public class CraftsStepService { log.info("工艺{},Z轴抬升至最高", heatModuleCode); transferModuleService.transferZMoveZero();//Z轴抬升至最高 log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); - transferModuleService.transferXMove(annealTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + transferModuleService.transferXMove(annealTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标退火模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + heatModule04TrayExist = deviceSensorService.getTrayStateByHeatModuleCode(HeatModuleCode.heat_module_04); + Assert.isTrue(heatModule04TrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_NO_TRAY));//提示退火区无托盘 transferModuleService.transferZMove(annealTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X移入卡槽", heatModuleCode); transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X移入卡槽 @@ -819,6 +841,8 @@ public class CraftsStepService { log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode); transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode); + heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode); + Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_HEAT_EXIST_TRAY));//提示加热模块存在托盘 transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 log.info("工艺{},X轴移出卡槽", heatModuleCode); transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 diff --git a/src/main/java/com/iflytop/sgs/app/service/device/DeviceStopService.java b/src/main/java/com/iflytop/sgs/app/service/device/DeviceStopService.java index 1696b5a..e819b23 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/DeviceStopService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/DeviceStopService.java @@ -2,14 +2,17 @@ package com.iflytop.sgs.app.service.device; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; +import com.iflytop.sgs.hardware.exception.HardwareException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; + @Slf4j @Service @RequiredArgsConstructor public class DeviceStopService { private final DeviceCommandService deviceCommandService; + private final DeviceLightSoundService deviceLightSoundService; public void stopAll() { @@ -28,5 +31,12 @@ public class DeviceStopService { //蠕动泵 DeviceCommandBundle liquidPumpStopDeviceCommandBundle = DeviceCommandGenerator.liquidPumpStop(); deviceCommandService.sendCommand(null, null, liquidPumpStopDeviceCommandBundle); + /*关闭蜂鸣器*/ + try { + deviceLightSoundService.closeBeep(); + } catch (HardwareException e) { + log.error("急停关闭蜂鸣器失败:{}", e.getMessage()); + } + } } diff --git a/src/main/java/com/iflytop/sgs/app/service/device/module/HeatModuleService.java b/src/main/java/com/iflytop/sgs/app/service/device/module/HeatModuleService.java index 8038b5e..17d02e9 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/module/HeatModuleService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/module/HeatModuleService.java @@ -17,8 +17,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.List; - /** * 加热模块 */ 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 57ee571..aab1b31 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 @@ -4,7 +4,6 @@ import com.iflytop.sgs.app.model.bo.Point3D; import com.iflytop.sgs.app.service.api.SystemConfigService; import com.iflytop.sgs.app.service.device.DeviceCommandService; import com.iflytop.sgs.app.service.device.DeviceStateService; -import com.iflytop.sgs.app.ws.server.WebSocketSender; import com.iflytop.sgs.common.cmd.CommandFuture; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; @@ -17,8 +16,6 @@ import org.springframework.stereotype.Service; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; /** * 转运模块 @@ -48,6 +45,12 @@ public class TransferModuleService { // 1. 先把自己加入对应类型的队列尾部 Thread current = Thread.currentThread(); switch (type) { + case move_by_manual: + boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle(); + if(!moduleIdle){ + throw new RuntimeException("转运模块当前正忙"); + } + break; case move_feed: feedQueue.add(current); break; diff --git a/src/main/java/com/iflytop/sgs/app/ws/server/WebSocketServer.java b/src/main/java/com/iflytop/sgs/app/ws/server/WebSocketServer.java index 0ea353d..07b9473 100644 --- a/src/main/java/com/iflytop/sgs/app/ws/server/WebSocketServer.java +++ b/src/main/java/com/iflytop/sgs/app/ws/server/WebSocketServer.java @@ -1,13 +1,10 @@ package com.iflytop.sgs.app.ws.server; -import com.iflytop.sgs.app.model.bo.status.device.DeviceState; import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.common.constant.WebSocketMessageType; import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/iflytop/sgs/common/enums/CraftsTransferTypeCode.java b/src/main/java/com/iflytop/sgs/common/enums/CraftsTransferTypeCode.java index 2df6a60..ad9705d 100644 --- a/src/main/java/com/iflytop/sgs/common/enums/CraftsTransferTypeCode.java +++ b/src/main/java/com/iflytop/sgs/common/enums/CraftsTransferTypeCode.java @@ -11,7 +11,8 @@ public enum CraftsTransferTypeCode { move_thin("移动至加液区加稀硝酸"), move_anneal("移动至退火区"), move_heat("移动至加热区"), - move_feed("移动至上料区"),; + move_feed("移动至上料区"), + move_by_manual("手动指令操作"),; private String description; private CraftsTransferTypeCode(String description) { 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 eb91584..41ffc6c 100644 --- a/src/main/java/com/iflytop/sgs/common/result/ResultCode.java +++ b/src/main/java/com/iflytop/sgs/common/result/ResultCode.java @@ -44,6 +44,8 @@ public enum ResultCode implements IResultCode, Serializable { CRAFT_TARGET_HEAT_NO_TRAY("4007", "工艺 加热区无托盘"), CRAFT_SOLUTION_NO_TRAY("4008", "工艺 加液区无托盘"), HEAT_TEMPERATURE_NULL("4009", "请先配置该加热区温度"), + CRAFT_HEAT_EXIST_TRAY("4010", "工艺 加热区已经存在托盘"), + CRAFT_HEAT_NO_TRAY("4010", "工艺 加热区无存在托盘"), //============================ 5xxx:系统 & 第三方 ============================ SYSTEM_ERROR("5000", "系统内部错误"), SERVICE_UNAVAILABLE("5001", "服务暂不可用"), @@ -72,7 +74,9 @@ 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轴高度不允许"), + ; /** 状态码 */ private final String code; /** 提示信息 */ diff --git a/src/main/java/com/iflytop/sgs/hardware/service/GDDeviceStatusServiceImpl.java b/src/main/java/com/iflytop/sgs/hardware/service/GDDeviceStatusServiceImpl.java index 825a7d4..90d29b0 100644 --- a/src/main/java/com/iflytop/sgs/hardware/service/GDDeviceStatusServiceImpl.java +++ b/src/main/java/com/iflytop/sgs/hardware/service/GDDeviceStatusServiceImpl.java @@ -1,6 +1,5 @@ package com.iflytop.sgs.hardware.service; -import cn.hutool.core.util.StrUtil; import com.iflytop.sgs.common.enums.cmd.CmdDevice; import com.iflytop.sgs.common.service.GDDeviceStatusService; import com.iflytop.sgs.hardware.drivers.DIDriver.InputDetectDriver; @@ -10,7 +9,6 @@ import com.iflytop.sgs.hardware.drivers.LeiSaiServoDriver; import com.iflytop.sgs.hardware.drivers.LiquidValveDriver; import com.iflytop.sgs.hardware.drivers.StepMotorDriver.StepMotorCtrlDriver; import com.iflytop.sgs.hardware.exception.HardwareException; -import com.iflytop.sgs.hardware.type.CmdId; import com.iflytop.sgs.hardware.type.IO.InputIOMId; import com.iflytop.sgs.hardware.type.IO.OutputIOMId; import com.iflytop.sgs.hardware.type.Servo.LeisaiServoMId;