Browse Source

增加工艺和手动指令执行过程中的异常处理

master
王梦远 2 months ago
parent
commit
e8af523adf
  1. 20
      src/main/java/com/iflytop/sgs/app/cmd/control/CleanStartCommand.java
  2. 25
      src/main/java/com/iflytop/sgs/app/cmd/control/DrainLiquidCommand.java
  3. 22
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java
  4. 18
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java
  5. 13
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStopCommand.java
  6. 16
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java
  7. 22
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java
  8. 33
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java
  9. 22
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToHeatAreaCommand.java
  10. 24
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java
  11. 38
      src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java
  12. 16
      src/main/java/com/iflytop/sgs/app/cmd/control/XOriginCommand.java
  13. 18
      src/main/java/com/iflytop/sgs/app/cmd/control/ZOriginCommand.java
  14. 22
      src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java
  15. 67
      src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java
  16. 14
      src/main/java/com/iflytop/sgs/app/service/device/module/TransferModuleService.java
  17. 4
      src/main/java/com/iflytop/sgs/app/ws/client/DeviceEmergencyStopConfig.java
  18. 2
      src/main/java/com/iflytop/sgs/common/result/ResultCode.java

20
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<Void> 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);//防低落距离
return runAsync(() -> {
try {
boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
if(!moduleIdle){
if (!moduleIdle) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
return runAsync(() -> {
try {
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();//释放转运模组
}
});

25
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<Void> 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 moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
return runAsync(() -> {
try {
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);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
boolean requestResult=transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if(!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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);
}
});
}

22
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<Void> 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));//确定选中了列
return runAsync(() -> {
try {
boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
if(!moduleIdle){
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
boolean requestResult=transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if(!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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();//释放转运模组
}
});

18
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<Void> 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(); //预充时加液臂下降位置
return runAsync(() -> {
try {
boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
if(!moduleIdle){
if (!moduleIdle) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
return runAsync(() -> {
try {
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();//释放转运模组
}
});
}

13
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<Void> 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.liquidPumpMove(-backFlowDistance);//倒吸
solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂归0
deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//设置加液结束
} finally {
transferModuleService.releaseTransferModule();//释放转运模组
}
});
}

16
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<Void> 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配置
return runAsync(() -> {
try {
boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
if (!moduleIdle) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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();//释放转运模组
}
});

22
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<Void> 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();//获取上料区托盘夹爪位置点
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);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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);
}
});
}

33
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<Void> 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();//获取加液区托盘夹爪位置点
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);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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();//释放转运模组
}
});
}

22
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<Void> 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);
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);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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);
}
});
}

24
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<Void> 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));//判断加液模块状态
return runAsync(() -> {
try {
boolean moduleIdle = deviceStateService.getDeviceState().getTransferModule().isIdle();
if (!moduleIdle) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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);
}
});
}

38
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<Void> 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<TrayState> 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);
}
});
}

16
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<Void> handle(CmdDTO cmdDTO) {
if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) {
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);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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();//释放转运模组
}
});
}

18
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<Void> handle(CmdDTO cmdDTO) {
if (deviceStateService.getCommandMutexState().get().isGantryXOriginCommandExecuting()) {
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);//申请使用转运模块
boolean requestResult = transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_by_manual);//申请使用转运模块
if (!requestResult) {
throw new AppException(ResultCode.CMD_BUSY);//设备忙
}
return runAsync(() -> {
try {
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);
}
});
}

22
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<CraftsMapper, Crafts> {
private final WebSocketSender webSocketService;
private final CraftsStepService craftsStepService;
private final CraftMonitorService craftMonitorService;
@Getter
private final ConcurrentHashMap<HeatModuleCode, CraftsContext> contextMap = new ConcurrentHashMap<>();
@Getter
private final ConcurrentHashMap<HeatModuleCode, Future<?>> futureMap = new ConcurrentHashMap<>();
private ExecutorService executor;
private final DeviceStateService deviceStateService;
@ -113,7 +117,7 @@ public class CraftsService extends ServiceImpl<CraftsMapper, Crafts> {
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<CraftsMapper, Crafts> {
craftMonitorService.saveMonitor(craftMonitor);
log.info("准备开始工艺,加热模块{},工艺{}", heatModuleCode, craft.getName());
// 校验已有上下文状态仅允许在 READYSTOPPED 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();
//配置可操作试管

67
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,6 +488,7 @@ public class CraftsStepService {
* */
public boolean heat(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
/*工艺监控清理上步的记录*/
try {
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0");
craftMonitorService.saveMonitor(craftMonitor);
@ -508,6 +535,11 @@ public class CraftsStepService {
log.info("工艺{},加热结束", heatModuleCode);
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "加热结束,持续时间", time));
return true;
} catch (Exception e) {
log.error("工艺加热异常:{}", e.getMessage());
throw new Exception(e);
}
}
/*
@ -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,6 +730,7 @@ public class CraftsStepService {
* 烘干
* */
public boolean dry(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
try {
/*工艺监控清理上步的记录*/
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitor.setCurrentStepResult(CraftsMonitorResultCode.heat_time.getDescription() + ":0");
@ -749,6 +785,11 @@ public class CraftsStepService {
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);//使用机械臂标志
}
}

14
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;
}
}

4
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);
}
});

2
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轴高度不允许"),
;
/** 状态码 */

Loading…
Cancel
Save