diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java index d7adfb9..0b98404 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java @@ -25,7 +25,7 @@ public class DoorCloseCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CmdDTO cmdDTO) { return runAsync(() -> { - doorModuleService.doorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(),0); + doorModuleService.doorOrigin(cmdDTO.getCommandId(), cmdDTO.getCommand()); deviceStateService.getDeviceState().getDoorModule().setOpen(false); //将门状态设置为false }); } diff --git a/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java index 1ba102d..d23e4b7 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 @@ -108,10 +108,10 @@ public class LiquidAddCommand extends BaseCommandHandler { for (int i = 0; i < jsonArray.size(); i++) { int column = jsonArray.getInt(i); if (column > 0 && column < 6) { - double distance = (column - 1) * trayTubeHorizontalSpacingDistance;//机械臂右移距离 + double distance = Math.abs(column - 5) * trayTubeHorizontalSpacingDistance;//机械臂右移距离 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint.getX() + distance);//机械臂移动到试管位置 - solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), 10);//加液机械臂下降 todo 未测量 测量后要改成 solutionModuleMotorDownInTubeAddPositon - solutionModuleService.liquidPumpMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), 0.5);//加液 position设置固定值 todo 未测量 测量后要改成distance + solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), solutionModuleMotorDownInTubeAddPositon);//加液机械臂下降 + solutionModuleService.liquidPumpMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), position);//加液 position设置固定值 todo 未测量 position solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 } } 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 73978ac..951af25 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 @@ -50,7 +50,7 @@ public class LiquidPreFillStartCommand extends BaseCommandHandler { solutionModuleService.liquidValveSwitch(cmdDTO.getCommandId(), cmdDTO.getCommand(), valveStateCode);//电磁阀对应的酸液通道打开 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatArea1TrayClawPoint.getX());//转运模块移动至加热位1 solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(),liquidAreaPreFillPoint);//加液机械臂下降至至预充点位 - solutionModuleService.liquidPumpRotateForward(cmdDTO.getCommandId(), cmdDTO.getCommand());//预充开始 todo 测试后改动 需要测试一下 + solutionModuleService.liquidPumpRotateForward(cmdDTO.getCommandId(), cmdDTO.getCommand());//预充开始 }); } } 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 f8f0ee7..f1a288d 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 @@ -61,7 +61,7 @@ public class LiquidReduceCommand extends BaseCommandHandler { if (column > 0 && column < 6) { double distance = (jsonArray.getInt(i) - 1) * trayTubeHorizontalSpacingDistance; transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D.getX()+distance);//机械臂移动到试管位置 - solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), 10);//加液模块下降进入试管 solutionModuleMotorDownInTubeExtPositon todo + solutionModuleService.solutionMotorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), solutionModuleMotorDownInTubeExtPositon);//加液模块下降进入试管 solutionModuleService.liquidPumpMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), 0.1);//抽液 reduceNumber0.1 solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液模块上升 } 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 681014d..5550acc 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 @@ -56,8 +56,8 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { return runAsync(() -> { boolean annealTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.HEATER_TRAY_4_EXIST);//获取传感器状态 Assert.isTrue(!annealTrayExist, () -> new AppException(ResultCode.ANNEAL_MODULE_EXIST_TRAY));//退火位不能有托盘 + solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 if (heatModuleCode == null) { - solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint);//移动至加液位置 boolean liquidTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取夹爪是否有托盘 if(!liquidTrayExist){ @@ -74,6 +74,7 @@ public class MoveToAnnealAreaCommand extends BaseCommandHandler { transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至加热区托盘夹取点 + 进出卡槽移动距离 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轴移动至目标加热模块托盘夹取点 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 ba1a2f7..c19d669 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 @@ -65,8 +65,8 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { transferModuleService.transferXMoveBy(cmdDTO.getCommandId(), cmdDTO.getCommand(), transferModuleXPickTrayMoveDistance);//X轴移出卡槽 transferModuleService.transferZMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//Z轴抬升至最高 } else { - boolean feedTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 - Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 + boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(targetHeatModuleCode);//获取目标加热模块托盘夹取点 transferModuleService.transferXMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 transferModuleService.transferZMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 @@ -80,6 +80,7 @@ public class MoveToFeedAreaCommand extends BaseCommandHandler { 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);//设定上料区托盘状态 }); 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 5afbfd2..81e4a38 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 @@ -51,7 +51,7 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 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));//判断加液模块状态 + Assert.isTrue(deviceStateService.getDeviceState().getSolutionModule().isIdle(), () -> new AppException(ResultCode.SOLUTION_MODULE_IS_BUSY));//判断加液模块状态 return runAsync(() -> { solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());//加液机械臂上升 @@ -68,17 +68,19 @@ public class MoveToLiquidAreaCommand extends BaseCommandHandler { deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(false);//设定上料区托盘状态 //deviceStateService.getDeviceState().getTrayByHeatModuleCode(targetHeatModuleCode).setInFeedArea(false);//设定托盘不在上料区中 todo 报错 } else {//有加热模块参数 - boolean feedTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 - Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 + boolean headTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(targetHeatModuleCode);//获取传感器状态 + 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轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 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(false);//设定目标加热模块托盘状态 - //deviceStateService.getDeviceState().getTrayByHeatModuleCode(targetHeatModuleCode).setInHeatModule(false);//设定托盘不在加热模块中 todo 报错 + //deviceStateService.getDeviceState().getTrayByHeatModuleCode(targetHeatModuleCode).setInHeatModule(false);//设定托盘不在加热模块中 } transferModuleService.transferMove(cmdDTO.getCommandId(), cmdDTO.getCommand(), liquidAreaTrayPoint3D);//移动至加液时托盘位置点 + } else { + throw new AppException(ResultCode.TRANSFER_MODULE_YES_TRAY);//夹爪存在托盘 } //deviceStateService.getDeviceState().getTrayByHeatModuleCode(targetHeatModuleCode).setInSolutionPositon(true);//设定托盘在加液位中 todo 报错 diff --git a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugDoorOpenCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugDoorOpenCommand.java index 7f0b22d..e596b64 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugDoorOpenCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugDoorOpenCommand.java @@ -38,7 +38,7 @@ public class DebugDoorOpenCommand extends BaseCommandHandler { CommandFuture doorSetDeviceCommandSetFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), doorSetDeviceCommandBundle); CommandUtil.wait(doorSetDeviceCommandSetFuture); } - DeviceCommandBundle doorMoveDeviceCommand =DeviceCommandGenerator.doorMoveBy(devicePosition.getDistance()); + DeviceCommandBundle doorMoveDeviceCommand =DeviceCommandGenerator.doorMove(devicePosition.getDistance()); CommandFuture deviceCommandOpenFuture = deviceCommandService.sendCommand(cmdDTO.getCommandId(), cmdDTO.getCommand(), doorMoveDeviceCommand); CommandUtil.wait(deviceCommandOpenFuture); }); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java index ec8e208..ba6d63a 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java @@ -32,9 +32,10 @@ public class DebugLiquidPumpAddCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CmdDTO cmdDTO) { - Double volume = cmdDTO.getDoubleParam("volume"); - Double scale = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.scale_water); - Double position = volume * scale; +// Double volume = cmdDTO.getDoubleParam("volume"); +// Double scale = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.scale_water); + // Double position = volume * scale; + double position=100; Double speed = cmdDTO.getDoubleParam("speed"); diff --git a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java index c9ee6a7..1090818 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java @@ -32,9 +32,10 @@ public class DebugLiquidPumpReduceCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CmdDTO cmdDTO) { - Double volume = cmdDTO.getDoubleParam("volume"); - double scale = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.scale_water); - double position = volume * scale; +// Double volume = cmdDTO.getDoubleParam("volume"); +// double scale = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.scale_water); +// double position = volume * scale; + double position=100; Double speed = cmdDTO.getDoubleParam("speed"); return runAsync(() -> { if (speed != null) { diff --git a/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java b/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java index ab27b54..56cff10 100644 --- a/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java +++ b/src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java @@ -25,7 +25,7 @@ public class LiquidLiftingOriginCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CmdDTO cmdDTO) { return runAsync(() -> { - solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand()); + solutionModuleService.solutionMotorOrigin(cmdDTO.getCommandId(), cmdDTO.getCommand()); selfTestService.getSelfTestState().setDualRobotOrigin(true); }); } 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 12b3388..2e87e54 100644 --- a/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java +++ b/src/main/java/com/iflytop/sgs/app/controller/CraftsController.java @@ -1,6 +1,9 @@ package com.iflytop.sgs.app.controller; -import com.iflytop.sgs.app.model.dto.*; +import com.iflytop.sgs.app.model.dto.PauseCraftsDto; +import com.iflytop.sgs.app.model.dto.ResumeCraftsDTO; +import com.iflytop.sgs.app.model.dto.StartCraftsDTO; +import com.iflytop.sgs.app.model.dto.StopCraftsDTO; import com.iflytop.sgs.app.model.entity.Crafts; import com.iflytop.sgs.app.model.vo.SetCraftsVO; import com.iflytop.sgs.app.service.api.CraftsService; @@ -65,8 +68,7 @@ public class CraftsController { @Operation(summary = "删除工艺") @DeleteMapping("/{ids}") - public Result delete( - @Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) { + public Result delete(@Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) { boolean isSuccess = craftsService.deleteCrafts(ids); if (isSuccess) { return Result.success(); @@ -74,23 +76,22 @@ public class CraftsController { return Result.failed(); } - @Operation(summary = "配置加热区工艺") - @PostMapping("/set") - public Result setCrafts(@Valid @RequestBody SetCraftsDTO setCraftsDTO) { - return Result.success(craftsService.setCraft(setCraftsDTO.getCraftId(), setCraftsDTO.getHeatId())); - } +// @Operation(summary = "配置加热区工艺") +// @PostMapping("/set") +// public Result setCrafts(@Valid @RequestBody SetCraftsDTO setCraftsDTO) { +// return Result.success(craftsService.setCraft(setCraftsDTO.getCraftId(), setCraftsDTO.getHeatId())); +// } @Operation(summary = "开始执行工艺") @PostMapping("/start") - public Result startCrafts(@Valid @RequestBody StartCraftsDTO startCraftsDTO) { - craftsService.startCrafts(startCraftsDTO.getHeatId()); - return Result.success(); + public Result startCrafts(@Valid @RequestBody StartCraftsDTO startCraftsDTO) { + return Result.success(craftsService.startCrafts(startCraftsDTO.getCraftId(), startCraftsDTO.getHeatId())); } @Operation(summary = "暂停执行工艺") @PostMapping("/pause") - public Result pauseCrafts(@Valid @RequestBody PauseCraftsDTO pauseCraftsDto) { + public Result pauseCrafts(@Valid @RequestBody PauseCraftsDto pauseCraftsDto) { craftsService.pauseCrafts(pauseCraftsDto.getHeatId()); return Result.success(); } diff --git a/src/main/java/com/iflytop/sgs/app/controller/DeviceParamController.java b/src/main/java/com/iflytop/sgs/app/controller/DeviceParamController.java index 2bd252b..85d981b 100644 --- a/src/main/java/com/iflytop/sgs/app/controller/DeviceParamController.java +++ b/src/main/java/com/iflytop/sgs/app/controller/DeviceParamController.java @@ -1,5 +1,6 @@ package com.iflytop.sgs.app.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.iflytop.sgs.app.model.entity.DeviceParamConfig; import com.iflytop.sgs.app.model.vo.DeviceParamGroupVO; import com.iflytop.sgs.app.model.vo.ModuleIdVO; @@ -91,6 +92,7 @@ public class DeviceParamController { try (BufferedReader reader = new BufferedReader( new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) { String line; + deviceParamConfigService.remove(new QueryWrapper<>());//删除所有配置 //是否含有表头 boolean isHeader = true; List deviceParamConfigList = new ArrayList<>(); @@ -107,9 +109,9 @@ public class DeviceParamController { deviceParamConfig.setRegIndex(String.valueOf(data[2])); deviceParamConfig.setRegVal(Integer.valueOf(data[3])); deviceParamConfigList.add(deviceParamConfig); + deviceParamConfigService.save(deviceParamConfig); } } - deviceParamConfigService.saveOrUpdateBatch(deviceParamConfigList); } catch (IOException e) { log.error("csv文件导入数据库失败:{}", e.getMessage()); throw new RuntimeException(e); diff --git a/src/main/java/com/iflytop/sgs/app/controller/TrayController.java b/src/main/java/com/iflytop/sgs/app/controller/TrayController.java index cd51795..d44e9b8 100644 --- a/src/main/java/com/iflytop/sgs/app/controller/TrayController.java +++ b/src/main/java/com/iflytop/sgs/app/controller/TrayController.java @@ -32,7 +32,7 @@ public class TrayController { @Operation(summary = "拿走托盘") @PostMapping("/out") - public Result trayOut(){ + public Result trayOut() throws InterruptedException { trayService.trayOut(); return Result.success(); } diff --git a/src/main/java/com/iflytop/sgs/app/core/CraftsContext.java b/src/main/java/com/iflytop/sgs/app/core/CraftsContext.java index 7e6fa52..5da2557 100644 --- a/src/main/java/com/iflytop/sgs/app/core/CraftsContext.java +++ b/src/main/java/com/iflytop/sgs/app/core/CraftsContext.java @@ -2,7 +2,7 @@ package com.iflytop.sgs.app.core; import cn.hutool.json.JSONUtil; import com.iflytop.sgs.app.model.bo.CraftsStep; -import com.iflytop.sgs.app.model.bo.status.crafts.CraftsState; +import com.iflytop.sgs.app.model.bo.status.device.CraftsState; import com.iflytop.sgs.app.model.entity.Crafts; import com.iflytop.sgs.app.model.entity.Ores; import com.iflytop.sgs.app.service.crafts.CraftsStepService; @@ -57,22 +57,19 @@ public class CraftsContext implements Runnable { this.deviceStateService = deviceStateService; this.sm = factory.getStateMachine(heatModuleCode.toString()); - - CraftsState craftsState = new CraftsState(); - craftsState.setState(sm.getState().getId()); - craftsState.setOres(ores); - craftsState.setCraft(craft); - craftsState.setCurrentIndex(currentIndex); - deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setCrafts(craftsState); - sm.addStateListener(new StateMachineListenerAdapter<>() { @Override public void stateEntered(State state) { + CraftsState craftsState = deviceStateService.getDeviceState().getTrayStateByHeatModuleCode(heatModuleCode).getCrafts(); + craftsState.setState(state.getId()); + craftsState.setCurrentIndex(currentIndex); + Map dataMap = new HashMap<>(); - dataMap.put("heatId", heatModuleCode.toString()); + dataMap.put("heatId", heatModuleCode); dataMap.put("state", state.getId()); dataMap.put("index", currentIndex); webSocketService.push(WebSocketMessageType.CRAFTS_STATE, dataMap); + } }); Mono.from(sm.startReactively()).block(); @@ -107,6 +104,7 @@ public class CraftsContext implements Runnable { } } if (sm.getState().getId() == CraftStates.RUNNING) { + craftsStepService.finish(heatModuleCode);//工艺执行完毕将托盘移动至加液模块 Message finishMsg = MessageBuilder.withPayload(CraftEvents.FINISH).build(); Mono.from(sm.sendEvent(Mono.just(finishMsg))).block(); } @@ -127,10 +125,10 @@ public class CraftsContext implements Runnable { */ private boolean executeStep(CraftsStep step) throws Exception { Map startData = new HashMap<>(); - startData.put("heatId", heatModuleCode.toString()); + startData.put("heatId", heatModuleCode); startData.put("currentStep", step.getMethod()); webSocketService.push(WebSocketMessageType.CRAFTS_STEP, startData); - return craftsStepService.executeStep(heatModuleCode.toString(), step); + return craftsStepService.executeStep(heatModuleCode, step); } /** @@ -162,4 +160,4 @@ public class CraftsContext implements Runnable { this.notify(); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/sgs/app/model/bo/status/crafts/CraftsState.java b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/CraftsState.java similarity index 54% rename from src/main/java/com/iflytop/sgs/app/model/bo/status/crafts/CraftsState.java rename to src/main/java/com/iflytop/sgs/app/model/bo/status/device/CraftsState.java index 8d4dfaf..27471dd 100644 --- a/src/main/java/com/iflytop/sgs/app/model/bo/status/crafts/CraftsState.java +++ b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/CraftsState.java @@ -1,13 +1,21 @@ -package com.iflytop.sgs.app.model.bo.status.crafts; +package com.iflytop.sgs.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.iflytop.sgs.app.model.entity.Crafts; import com.iflytop.sgs.app.model.entity.Ores; import com.iflytop.sgs.common.enums.automaton.CraftStates; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; @Schema(description = "工艺") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class CraftsState { @Schema(description = "工艺状态") private CraftStates state; diff --git a/src/main/java/com/iflytop/sgs/app/model/bo/status/device/DeviceState.java b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/DeviceState.java index 0872c80..db17a99 100644 --- a/src/main/java/com/iflytop/sgs/app/model/bo/status/device/DeviceState.java +++ b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/DeviceState.java @@ -106,4 +106,23 @@ public class DeviceState { return null; } + public synchronized TrayState getTrayStateByHeatModuleCode(HeatModuleCode heatModuleCode) { + for (TrayState t : trays) { + if (t.getHeatModuleCode().equals(heatModuleCode)) { + return t; + } + } + return null; + } + + public synchronized TrayState getTrayInSolutionModule() { + for (TrayState t : trays) { + if (t.isInSolutionPositon()) { + return t; + } + } + return null; + } + + } diff --git a/src/main/java/com/iflytop/sgs/app/model/bo/status/device/TrayState.java b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/TrayState.java index bb4ef11..05d1dd3 100644 --- a/src/main/java/com/iflytop/sgs/app/model/bo/status/device/TrayState.java +++ b/src/main/java/com/iflytop/sgs/app/model/bo/status/device/TrayState.java @@ -1,7 +1,6 @@ package com.iflytop.sgs.app.model.bo.status.device; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.iflytop.sgs.app.model.bo.status.crafts.CraftsState; import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.PostConstruct; @@ -14,10 +13,6 @@ import java.util.UUID; @Schema(description = "托盘") @Data -@Component -@Scope("prototype") -@RequiredArgsConstructor -@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class TrayState { @Schema(description = "托盘唯一id") private String uuid = UUID.randomUUID().toString(); diff --git a/src/main/java/com/iflytop/sgs/app/model/dto/PauseCraftsDTO.java b/src/main/java/com/iflytop/sgs/app/model/dto/PauseCraftsDTO.java index 85c8c04..18d7e01 100644 --- a/src/main/java/com/iflytop/sgs/app/model/dto/PauseCraftsDTO.java +++ b/src/main/java/com/iflytop/sgs/app/model/dto/PauseCraftsDTO.java @@ -1,13 +1,14 @@ package com.iflytop.sgs.app.model.dto; +import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @Schema(description = "暂停执行工艺") @Data -public class PauseCraftsDTO { +public class PauseCraftsDto { @NotNull @Schema(description = "加热区id") - private String heatId; + private HeatModuleCode heatId; } diff --git a/src/main/java/com/iflytop/sgs/app/model/dto/ResumeCraftsDTO.java b/src/main/java/com/iflytop/sgs/app/model/dto/ResumeCraftsDTO.java index b8c57f3..538e449 100644 --- a/src/main/java/com/iflytop/sgs/app/model/dto/ResumeCraftsDTO.java +++ b/src/main/java/com/iflytop/sgs/app/model/dto/ResumeCraftsDTO.java @@ -1,5 +1,6 @@ package com.iflytop.sgs.app.model.dto; +import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -9,5 +10,5 @@ import lombok.Data; public class ResumeCraftsDTO { @NotNull @Schema(description = "加热区id") - private String heatId; + private HeatModuleCode heatId; } diff --git a/src/main/java/com/iflytop/sgs/app/model/dto/StartCraftsDTO.java b/src/main/java/com/iflytop/sgs/app/model/dto/StartCraftsDTO.java index e400677..6062a56 100644 --- a/src/main/java/com/iflytop/sgs/app/model/dto/StartCraftsDTO.java +++ b/src/main/java/com/iflytop/sgs/app/model/dto/StartCraftsDTO.java @@ -1,13 +1,19 @@ package com.iflytop.sgs.app.model.dto; +import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; import lombok.Data; @Schema(description = "开始工艺") @Data public class StartCraftsDTO { + @Positive(message = "工艺ID 必须是正数") @NotNull - @Schema(description = "加热区id") - private String heatId; + @Schema(description = "工艺id") + private Long craftId; + + @Schema(description = "加热区id,非必填,如果不传递则自动分配加热区") + private HeatModuleCode heatId; } diff --git a/src/main/java/com/iflytop/sgs/app/model/dto/StopCraftsDTO.java b/src/main/java/com/iflytop/sgs/app/model/dto/StopCraftsDTO.java index 46de21c..cfa0c13 100644 --- a/src/main/java/com/iflytop/sgs/app/model/dto/StopCraftsDTO.java +++ b/src/main/java/com/iflytop/sgs/app/model/dto/StopCraftsDTO.java @@ -1,5 +1,6 @@ package com.iflytop.sgs.app.model.dto; +import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -9,5 +10,5 @@ import lombok.Data; public class StopCraftsDTO { @NotNull @Schema(description = "加热区id") - private String heatId; + private HeatModuleCode heatId; } diff --git a/src/main/java/com/iflytop/sgs/app/model/vo/CraftStatusVO.java b/src/main/java/com/iflytop/sgs/app/model/vo/CraftStatusVO.java index 3fd5c5a..b52c920 100644 --- a/src/main/java/com/iflytop/sgs/app/model/vo/CraftStatusVO.java +++ b/src/main/java/com/iflytop/sgs/app/model/vo/CraftStatusVO.java @@ -1,6 +1,7 @@ package com.iflytop.sgs.app.model.vo; import com.iflytop.sgs.app.model.bo.CraftsStep; +import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.automaton.CraftStates; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -14,7 +15,7 @@ import java.util.List; public class CraftStatusVO { @Schema(description = "加热区 ID") - private String heatId; + private HeatModuleCode heatId; @Schema(description = "矿石 ID") private Long oresId; diff --git a/src/main/java/com/iflytop/sgs/app/model/vo/SetCraftsVO.java b/src/main/java/com/iflytop/sgs/app/model/vo/SetCraftsVO.java index f3578c0..30dce97 100644 --- a/src/main/java/com/iflytop/sgs/app/model/vo/SetCraftsVO.java +++ b/src/main/java/com/iflytop/sgs/app/model/vo/SetCraftsVO.java @@ -1,12 +1,13 @@ package com.iflytop.sgs.app.model.vo; +import com.iflytop.sgs.common.enums.HeatModuleCode; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data public class SetCraftsVO { @Schema(description = "加热区id") - private String heatId; + private HeatModuleCode heatId; @Schema(description = "工艺名称") private String craftsName; diff --git a/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java b/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java index a45e7e4..3fedcf5 100644 --- a/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java +++ b/src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java @@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.iflytop.sgs.app.core.CraftsContext; import com.iflytop.sgs.app.mapper.CraftsMapper; +import com.iflytop.sgs.app.model.bo.status.device.CraftsState; import com.iflytop.sgs.app.model.bo.status.device.HeatModuleState; +import com.iflytop.sgs.app.model.bo.status.device.TrayState; import com.iflytop.sgs.app.model.entity.Crafts; import com.iflytop.sgs.app.model.entity.Ores; import com.iflytop.sgs.app.model.vo.CraftStatusVO; import com.iflytop.sgs.app.model.vo.SetCraftsVO; import com.iflytop.sgs.app.service.crafts.CraftsStepService; import com.iflytop.sgs.app.service.device.DeviceStateService; +import com.iflytop.sgs.app.service.device.module.HeatModuleService; import com.iflytop.sgs.app.ws.server.WebSocketSender; import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.enums.automaton.CraftEvents; @@ -19,6 +22,8 @@ import com.iflytop.sgs.common.exception.AppException; import com.iflytop.sgs.common.result.ResultCode; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Service; @@ -31,53 +36,107 @@ import java.util.concurrent.Future; import java.util.stream.Collectors; /** - * 工艺执行管理服务 + * 工艺接口服务 */ +@Slf4j @Service @RequiredArgsConstructor public class CraftsService extends ServiceImpl { - private final DeviceStateService deviceStateService; + private final HeatModuleService heatModuleService; private final StateMachineFactory stateMachineFactory; private final WebSocketSender webSocketService; private final CraftsStepService craftsStepService; private final OresService oresService; - private final ConcurrentHashMap contextMap = new ConcurrentHashMap<>(); - private final ConcurrentHashMap> futureMap = new ConcurrentHashMap<>(); + private final DeviceStateService deviceStateService; + private final ObjectProvider craftsStateObjectProvider; + + private final ConcurrentHashMap contextMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> futureMap = new ConcurrentHashMap<>(); private ExecutorService executor; + @PostConstruct public void init() { this.executor = Executors.newCachedThreadPool(); } +// +// /** +// * 配置工艺 +// */ +// public synchronized SetCraftsVO setCraft(Long craftId, String heatId) { +// // 校验已有上下文状态,仅允许在 READY、STOPPED 或 FINISHED 状态下重置 +// CraftsContext existing = contextMap.get(heatId); +// if (existing != null) { +// CraftStates state = existing.getSm().getState().getId(); +// if (state == CraftStates.RUNNING || state == CraftStates.PAUSED) { +// throw new AppException(ResultCode.CRAFT_RUNNING); +// } +// clearCraftContext(heatId); +// } +// Crafts craft = this.getById(craftId); +// Ores ores = oresService.getById(craft.getOresId()); +// CraftsContext ctx = new CraftsContext( +// heatId, +// ores, +// craft, +// stateMachineFactory, +// webSocketService, +// craftsStepService +// ); +// contextMap.put(heatId, ctx); +// SetCraftsVO setCraftsVO = new SetCraftsVO(); +// setCraftsVO.setHeatId(heatId); +// setCraftsVO.setCraftsName(craft.getName()); +// setCraftsVO.setCraftsId(craft.getId()); +// setCraftsVO.setOresName(ores.getName()); +// setCraftsVO.setOresId(ores.getId()); +// return setCraftsVO; +// } /** - * 配置工艺 + * 启动执行工艺 */ - public synchronized SetCraftsVO setCraft(Long craftId, String heatId) { - HeatModuleCode heatModuleCode; - if(heatId == null){ - //获取一个空加热模块 - HeatModuleState idleHeatModule = deviceStateService.getDeviceState().getFirstIdleHeatModule(); - if (idleHeatModule == null) { - throw new AppException(ResultCode.CRAFT_IDLE_HEAT_MODULE_NOT_FOUND); - } - heatModuleCode = idleHeatModule.getModuleCode(); - heatId = heatModuleCode.toString(); - - }else{ - heatModuleCode = HeatModuleCode.valueOf(heatId); + public synchronized SetCraftsVO startCrafts(Long craftId, HeatModuleCode heatModuleCode) { + Crafts craft = this.getById(craftId); + if (craft == null) { + throw new AppException(ResultCode.INVALID_PARAMETER); } - // 校验已有上下文状态,仅允许在 READY、STOPPED 或 FINISHED 状态下重置 - CraftsContext existing = contextMap.get(heatId); - if (existing != null) { - CraftStates state = existing.getSm().getState().getId(); - if (state == CraftStates.RUNNING || state == CraftStates.PAUSED) { - throw new AppException(ResultCode.CRAFT_RUNNING); + Ores ores = oresService.getById(craft.getOresId()); + if (ores == null) { + throw new AppException(ResultCode.INVALID_PARAMETER); + } + if(deviceStateService.getDeviceState().getSolutionModule().isFeedAreaTrayStatus()){ + throw new AppException(ResultCode.SOLUTION_MODULE_NO_TRAY); + } + //判断是否指定加热区id + if (heatModuleCode == null) { + //如果没有指定加热区id,则自动获取一个 + HeatModuleState heatModuleState = heatModuleService.getIdleHeatModule(); + if (heatModuleState == null) { + log.error("自动分配工艺失败,无空闲加热模块。"); + throw new AppException(ResultCode.HEAT_MODULE_NO_IDLE); + } else { + heatModuleCode = heatModuleState.getModuleCode(); } - clearCraftContext(heatId); + } else { +// if (futureMap.containsKey(heatModuleCode)) {//校验指定加热模块是否正在执行工艺 +// log.error("工艺正在执行中,不可重复开始执行。"); +// throw new AppException(ResultCode.CRAFT_RUNNING); +// } } - Crafts craft = this.getById(craftId); - Ores ores = oresService.getById(craft.getOresId()); + log.info("准备开始工艺,加热模块{},工艺{}", heatModuleCode, craft.getName()); + //TODO 传感器校验heatModuleCode是否被占用 + + // 校验已有上下文状态,仅允许在 READY、STOPPED 或 FINISHED 状态下重置 +// CraftsContext existing = contextMap.get(heatModuleCode); +// if (existing != null) { +// CraftStates state = existing.getSm().getState().getId(); +// if (state == CraftStates.RUNNING || state == CraftStates.PAUSED) { +// throw new AppException(ResultCode.CRAFT_RUNNING); +// } +// clearCraftContext(heatModuleCode); +// } + CraftsContext ctx = new CraftsContext( heatModuleCode, ores, @@ -87,10 +146,20 @@ public class CraftsService extends ServiceImpl { craftsStepService, deviceStateService ); - contextMap.put(heatId, ctx); + contextMap.put(heatModuleCode, ctx); + Future future = executor.submit(ctx); + futureMap.put(heatModuleCode, future); + + TrayState trayState = deviceStateService.getDeviceState().getTrayInSolutionModule(); + CraftsState craftsState = craftsStateObjectProvider.getObject(); + craftsState.setCraft(craft); + craftsState.setOres(ores); + craftsState.setState(CraftStates.READY); + craftsState.setCurrentIndex(0); + trayState.setCrafts(craftsState); SetCraftsVO setCraftsVO = new SetCraftsVO(); - setCraftsVO.setHeatId(heatId); + setCraftsVO.setHeatId(heatModuleCode); setCraftsVO.setCraftsName(craft.getName()); setCraftsVO.setCraftsId(craft.getId()); setCraftsVO.setOresName(ores.getName()); @@ -99,25 +168,10 @@ public class CraftsService extends ServiceImpl { } /** - * 启动执行工艺(需先调用 setCraft) - */ - public synchronized void startCrafts(String heatId) { - CraftsContext ctx = contextMap.get(heatId); - if (ctx == null) { - throw new AppException(ResultCode.CRAFT_CONTEXT_NULL); - } - if (futureMap.containsKey(heatId)) { - throw new AppException(ResultCode.CRAFT_RUNNING); - } - Future future = executor.submit(ctx); - futureMap.put(heatId, future); - } - - /** * 暂停执行工艺 */ - public synchronized void pauseCrafts(String heatId) { - CraftsContext ctx = contextMap.get(heatId); + public synchronized void pauseCrafts(HeatModuleCode heatModuleCode) { + CraftsContext ctx = contextMap.get(heatModuleCode); if (ctx == null) { throw new AppException(ResultCode.CRAFT_CONTEXT_NULL); } @@ -127,8 +181,8 @@ public class CraftsService extends ServiceImpl { /** * 恢复执行工艺 */ - public synchronized void resumeCrafts(String heatId) { - CraftsContext ctx = contextMap.get(heatId); + public synchronized void resumeCrafts(HeatModuleCode heatModuleCode) { + CraftsContext ctx = contextMap.get(heatModuleCode); if (ctx == null) { throw new AppException(ResultCode.CRAFT_CONTEXT_NULL); } @@ -138,9 +192,9 @@ public class CraftsService extends ServiceImpl { /** * 停止执行工艺,不清除上下文 */ - public synchronized void stopCrafts(String heatId) { - CraftsContext ctx = contextMap.get(heatId); - Future future = futureMap.remove(heatId); + public synchronized void stopCrafts(HeatModuleCode heatModuleCode) { + CraftsContext ctx = contextMap.get(heatModuleCode); + Future future = futureMap.remove(heatModuleCode); if (ctx == null || future == null) { throw new AppException(ResultCode.CRAFT_CONTEXT_NULL); } @@ -149,24 +203,37 @@ public class CraftsService extends ServiceImpl { } /** + * 停止执行所有工艺,不清除上下文 + */ + public synchronized void stopAllCrafts() { + contextMap.forEach((key, ctx) -> { + Future future = futureMap.remove(key); + if (ctx != null && future != null) { + ctx.stop(); + future.cancel(true); + } + }); + } + + /** * 清理指定 heatId 的执行上下文和 Future */ - public synchronized void clearCraftContext(String heatId) { - contextMap.remove(heatId); - Future future = futureMap.remove(heatId); + public synchronized void clearCraftContext(HeatModuleCode heatModuleCode) { + contextMap.remove(heatModuleCode); + Future future = futureMap.remove(heatModuleCode); if (future != null) future.cancel(true); } /** * 查询指定 heatId 的执行状态 */ - public CraftStatusVO getStatus(String heatId) { - CraftsContext ctx = contextMap.get(heatId); + public CraftStatusVO getStatus(HeatModuleCode heatModuleCode) { + CraftsContext ctx = contextMap.get(heatModuleCode); if (ctx == null) { return null; } CraftStatusVO vo = new CraftStatusVO(); - vo.setHeatId(heatId); + vo.setHeatId(heatModuleCode); vo.setOresId(ctx.getOres().getId()); vo.setOresName(ctx.getOres().getName()); vo.setCraftsId(ctx.getCraft().getId()); @@ -182,10 +249,10 @@ public class CraftsService extends ServiceImpl { */ public List getAllStatuses() { return contextMap.entrySet().stream().map(entry -> { - String heatIdKey = entry.getKey(); + HeatModuleCode heatModuleCode = entry.getKey(); CraftsContext ctx = entry.getValue(); CraftStatusVO vo = new CraftStatusVO(); - vo.setHeatId(heatIdKey); + vo.setHeatId(heatModuleCode); vo.setOresId(ctx.getOres().getId()); vo.setOresName(ctx.getOres().getName()); vo.setCraftsId(ctx.getCraft().getId()); @@ -209,4 +276,4 @@ public class CraftsService extends ServiceImpl { List ids = Arrays.stream(idsStr.split(",")).map(Long::parseLong).collect(Collectors.toList()); return this.removeByIds(ids); } -} +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java b/src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java index 6b92b90..b868f07 100644 --- a/src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java +++ b/src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java @@ -97,7 +97,7 @@ public class SystemConfigService extends ServiceImpl().eq(SystemConfig::getCode, systemConfigCode.name())); - systemConfig.setValue(value); + systemConfig.setCode(value); return this.updateById(systemConfig); } diff --git a/src/main/java/com/iflytop/sgs/app/service/api/TrayService.java b/src/main/java/com/iflytop/sgs/app/service/api/TrayService.java index d2c3a36..1c8902a 100644 --- a/src/main/java/com/iflytop/sgs/app/service/api/TrayService.java +++ b/src/main/java/com/iflytop/sgs/app/service/api/TrayService.java @@ -3,6 +3,7 @@ package com.iflytop.sgs.app.service.api; import com.iflytop.sgs.app.model.bo.status.device.TrayState; import com.iflytop.sgs.app.model.vo.SetTrayTubeVO; import com.iflytop.sgs.app.service.device.DeviceStateService; +import com.iflytop.sgs.app.service.device.module.SolutionModuleService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @@ -16,15 +17,16 @@ import java.util.List; @RequiredArgsConstructor public class TrayService { private final DeviceStateService deviceStateService; - private final ObjectProvider trayStateProvider; + private final SolutionModuleService solutionModuleService; /** * 放入了新托盘 */ public synchronized TrayState trayIn() { - TrayState trayState = trayStateProvider.getObject(); - trayState.setInFeedArea(true); + TrayState trayState = new TrayState(); + trayState.setInSolutionPositon(true); deviceStateService.getDeviceState().getTrays().add(trayState); + deviceStateService.getDeviceState().getSolutionModule().setIdle(false); deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true); return trayState; } @@ -32,10 +34,11 @@ public class TrayService { /** * 拿走了托盘 */ - public synchronized void trayOut(){ + public synchronized void trayOut() throws InterruptedException { List trayList = deviceStateService.getDeviceState().getTrays(); - trayList.removeIf(TrayState::isInFeedArea); + trayList.removeIf(TrayState::isInSolutionPositon); deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(false); + solutionModuleService.releaseSolutionModule(); } /** 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 84a3a47..808fc8e 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 @@ -1,47 +1,278 @@ package com.iflytop.sgs.app.service.crafts; +import cn.hutool.core.lang.Assert; +import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import com.iflytop.sgs.app.model.bo.CraftsStep; +import com.iflytop.sgs.app.model.bo.Point3D; +import com.iflytop.sgs.app.model.bo.status.device.HeatModuleState; +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.device.DeviceSensorService; import com.iflytop.sgs.app.service.device.DeviceStateService; +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.app.ws.server.WebSocketSender; +import com.iflytop.sgs.common.enums.DeviceSensorCode; +import com.iflytop.sgs.common.enums.HeatModuleCode; +import com.iflytop.sgs.common.enums.ValveStateCode; +import com.iflytop.sgs.common.enums.data.DevicePositionCode; +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.Service; /** * 工艺步骤执行服务 */ +@Slf4j @Service @RequiredArgsConstructor public class CraftsStepService { - private final DevicePositionService devicePositionService; + private final ContainerService containerService; private final WebSocketSender webSocketService; - private final DeviceStateService deviceStateService; + private final HeatModuleService heatModuleService; + private final SolutionModuleService solutionModuleService; + private final DevicePositionService devicePositionService; + private final DeviceStateService deviceStateService; + private final DeviceSensorService deviceSensorService; + private final TransferModuleService transferModuleService; + private final SolutionsService solutionsService; + private final SystemConfigService systemConfigService; /** * 执行单个工艺步骤 * - * @param heatId 加热区 ID - * @param step 工艺步骤,包括 method 和 params + * @param heatModuleCode 加热区 ID + * @param step 工艺步骤,包括 method 和 params * @return true 表示执行成功,false 表示失败 */ - public boolean executeStep(String heatId, CraftsStep step) throws Exception { + public boolean executeStep(HeatModuleCode heatModuleCode, CraftsStep step) throws Exception { String method = step.getMethod(); JSONObject params = step.getParams(); + return switch (method) { + case "preHeat" -> preHeat(heatModuleCode, params); + case "feedAreaMoveToLiquidArea" -> feedAreaMoveToLiquidArea(heatModuleCode, params); + case "addLiquid" -> addLiquid(heatModuleCode, params); + case "reduceLiquid" -> reduceLiquid(heatModuleCode, params); + case "LiquidAreaMoveToHeatArea"->LiquidAreaMoveToHeatArea(heatModuleCode, params); + case "heatStart"->heatStart(heatModuleCode, params); + case "fanStart"->fanStart(heatModuleCode, params); + case "heatMovetoAnnealArea"->heatMovetoAnnealArea(heatModuleCode, params); + case "heatAreaMoveToLiquidArea"->heatAreaMoveToLiquidArea(heatModuleCode, params); + //预热 移至加液区 加液 加热 移动至加液区 抽液 加液 预热 移动至加热区 加热 抽液 清洗 烘干 退火 回上来料区 + /* + *preHeat() double temperature + * + * + * + * */ - //加液(弱、强、水、量) - //抽取 - //加热(温度、时间) - //退火(温度、时间) + // - return switch (method) { default -> true; }; } + /* + * + * 预热 + * */ + public boolean preHeat(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + Double temperature=params.getDouble("temperature"); + heatModuleService.heatRodOpen(heatModuleCode, temperature); + deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTemperature(temperature); + return true; + } + + /* + * 上料区移动至加液区 + * */ + public boolean feedAreaMoveToLiquidArea(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 + Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点 + Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点 + boolean feedTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取传感器状态 + Assert.isTrue(feedTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加热区无托盘 + transferModuleService.transferXMove(feedAreaTrayPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 + transferModuleService.transferZMove(feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点 + transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 + transferModuleService.transferZMoveZero();//Z轴抬升至最高 + transferModuleService.transferMove(liquidAreaTrayPoint3D);//移动至加液时托盘位置点 + return true; + + + } + + /* + * 加液 + * */ + public boolean addLiquid(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加液区无托盘 + Integer solutionId = params.getInt("solutionId"); + double volume = params.getDouble("volume");//量 + JSONArray columns = params.getJSONArray("columns"); + Solutions solutions = solutionsService.getById(solutionId);//获取溶液 + ValveStateCode valveStateCode = ValveStateCode.valueOf(solutions.getCode());//根据溶液获取电磁阀code + Integer currentChannel = deviceSensorService.readLiquidValvePosition();//获取当前阀门的状态 + ValveStateCode oldValveState = ValveStateCode.thick.getByChannel(currentChannel);//获取当前电磁阀的值 + Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance(); //托盘试管水平间距 + double preFillDistance = 0; + Point3D liquidAreaTrayPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D(); //获取加液区上方托盘点位 + if (!oldValveState.equals(valveStateCode)) {//判断是否与当前加酸的通道一致 不一致排空 + double drainDistance = 0; + switch (oldValveState) { + case ValveStateCode.thin -> { + drainDistance = devicePositionService.getPosition(DevicePositionCode.thinPreFillDistance).getDistance();//稀硝酸预充距离 + } + case ValveStateCode.thick -> { + drainDistance = devicePositionService.getPosition(DevicePositionCode.thickPreFillDistance).getDistance();//浓硝酸预充距离 + } + case ValveStateCode.water -> { + drainDistance = devicePositionService.getPosition(DevicePositionCode.waterPreFillDistance).getDistance();//蒸馏水预充距离 + } + } + solutionModuleService.liquidValveSwitch(ValveStateCode.waste);//废液通道打开 + solutionModuleService.liquidPumpMove(-drainDistance);//排空 + switch (valveStateCode) { + case ValveStateCode.thin -> { + double distance = devicePositionService.getPosition(DevicePositionCode.thinPreFillDistance).getDistance();//稀硝酸预充距离 + preFillDistance += distance; + } + case ValveStateCode.thick -> { + double distance = devicePositionService.getPosition(DevicePositionCode.thickPreFillDistance).getDistance();//浓硝酸预充距离 + preFillDistance += distance; + } + case ValveStateCode.water -> { + double distance = devicePositionService.getPosition(DevicePositionCode.waterPreFillDistance).getDistance();//蒸馏水预充距离 + preFillDistance += distance; + } + } + } + double scale = systemConfigService.getSystemConfigDoubleByCode(valveStateCode.getSystemConfigCode());//根据溶液获取转换比 + double position = volume * scale * 8 + preFillDistance;//todo 需要测试加液量是否准确 + solutionModuleService.liquidValveSwitch(valveStateCode);//电磁阀对应通道打开 + deviceStateService.getDeviceState().getSolutionModule().setValveState(valveStateCode);//设置阀门状态 + for (int i = 0; i < columns.size(); i++) { + int column = columns.getInt(i); + if (column > 0 && column < 6) { + double distance = (column - 1) * trayTubeHorizontalSpacingDistance;//机械臂右移距离 + transferModuleService.transferXMove(liquidAreaTrayPoint.getX() + distance);//机械臂移动到试管位置 + solutionModuleService.solutionMotorMove(10);//加液机械臂下降 todo 未测量 测量后要改成 solutionModuleMotorDownInTubeAddPositon + solutionModuleService.liquidPumpMove(0.5);//加液 position设置固定值 todo 未测量 测量后要改成distance + solutionModuleService.solutionMotorMoveZero();//加液机械臂上升 + } + } + return true; + } + + /* + * 抽液 + * */ + public boolean reduceLiquid(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加液区无托盘 + solutionModuleService.liquidValveSwitch(ValveStateCode.waste);//电磁阀对应通道打开 + Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点 + Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距 + JSONArray columns = params.getJSONArray("columns"); + for (int i = 0; i < columns.size(); i++) { + int column = columns.getInt(i); + if (column > 0 && column < 6) { + double distance = (columns.getInt(i) - 1) * trayTubeHorizontalSpacingDistance; + transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置 + solutionModuleService.solutionMotorMove(10);//加液模块下降进入试管 solutionModuleMotorDownInTubeExtPositon todo + solutionModuleService.liquidPumpMove(0.1);//抽液 reduceNumber0.1 + solutionModuleService.solutionMotorMoveZero();//加液模块上升 + } + } + solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高,移出试管 + transferModuleService.transferMove(liquidAreaTrayPoint3D);//移动至托盘至加液位置点 + return true; + } + + /* + * 加液移至加热区 + * */ + public boolean LiquidAreaMoveToHeatArea(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//获取传感器状态 + Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加液区无托盘 + boolean trayTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取传感器状态 + Assert.isTrue(!trayTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加液区无托盘 + Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点 + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 + transferModuleService.transferXMove(targetHeatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 + transferModuleService.transferZMove(targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 + transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 + transferModuleService.transferZMoveZero();//Z轴抬升至最高 + return true; + } + + /* + * 加热保持 + * */ + public boolean heatStart(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + Integer time=params.getInt("time");//秒 + delay(time); + return true; + } + + /* + * 散热 + * */ + public boolean fanStart(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + heatModuleService.fanStart(heatModuleCode); + return true; + } + + /* + * 加热区转移至退火区 + * */ + public boolean heatMovetoAnnealArea(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + boolean trayTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取传感器状态 + Assert.isTrue(trayTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区有托盘 + boolean annealTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取传感器状态 + Assert.isTrue(!annealTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//退火区不存在托盘 + Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取加热模块托盘夹取点 + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 + Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(HeatModuleCode.heat_module_04);//获取目标加热模块托盘夹取点 + transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至加热区托盘夹取点 + 进出卡槽移动距离 + transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 + transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 + transferModuleService.transferZMoveZero();//Z轴抬升至最高 + transferModuleService.transferXMove(targetHeatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点 + transferModuleService.transferZMove(targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 + transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽 + transferModuleService.transferZMoveZero();//Z轴抬升至最高 + return true; + } + + /* + * 加热区移动至机加液区 + * */ + public boolean heatAreaMoveToLiquidArea(HeatModuleCode heatModuleCode, JSONObject params) throws Exception { + Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点 + Point3D targetHeatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点 + boolean trayTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取传感器状态 + Assert.isTrue(trayTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//加热区托盘判断 + Assert.isTrue(deviceStateService.getDeviceState().getSolutionModule().isIdle(),() -> new AppException(ResultCode.SOLUTION_MODULE_IS_BUSY)); + Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离 + transferModuleService.transferXMove(targetHeatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离 + transferModuleService.transferZMove(targetHeatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点,使托盘落入石墨加热盘 + transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴进入卡槽 + transferModuleService.transferZMoveZero();//Z轴抬升至最高 + transferModuleService.transferMove(liquidAreaTrayPoint3D);//移动至加液时托盘位置点 + return true; + } /** * 延时等待 @@ -54,4 +285,13 @@ public class CraftsStepService { } return true; } + + /** + * 工艺执行完毕 + */ + public void finish(HeatModuleCode heatModuleCode) throws Exception { + //移动至上料区 todo + } + + } diff --git a/src/main/java/com/iflytop/sgs/app/service/device/DeviceInitService.java b/src/main/java/com/iflytop/sgs/app/service/device/DeviceInitService.java index a6843f9..5a68c06 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/DeviceInitService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/DeviceInitService.java @@ -36,6 +36,7 @@ public class DeviceInitService { private final DeviceSensorService deviceSensorService; private final ObjectProvider heatModuleStateProvider; private final ObjectProvider solutionContainerStateProvider; + private final DeviceLightSoundService deviceLightSoundService; @PostConstruct public void init() { @@ -51,6 +52,7 @@ public class DeviceInitService { canBusService.initOvertime(); initEnable(); initSensorState(); + deviceLightSoundService.openColor(CmdColor.blue); deviceStateService.getDeviceState().setInitComplete(true); } catch (Exception e) { log.error("设备初始化失败", e); diff --git a/src/main/java/com/iflytop/sgs/app/service/device/SelfTestService.java b/src/main/java/com/iflytop/sgs/app/service/device/SelfTestService.java index 44e2c51..d1ca50c 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/SelfTestService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/SelfTestService.java @@ -26,13 +26,13 @@ public class SelfTestService { @PostConstruct private void init() { - Boolean doorIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.doorOriginIsIgnore); + Boolean doorIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.ignore_door_self_test); selfTestState.setDoorOriginIsIgnore(doorIsIgnore); - Boolean dualRobotIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.dualRobotOriginIsIgnore); + Boolean dualRobotIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.ignore_dual_robot_self_test); selfTestState.setDualRobotOriginIsIgnore(dualRobotIsIgnore); - Boolean transferXIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.transferXOriginIsIgnore); + Boolean transferXIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.ignore_transfer_x_self_test); selfTestState.setTransferXOriginIsIgnore(transferXIsIgnore); - Boolean transferZIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.transferZOriginIsIgnore); + Boolean transferZIsIgnore = systemConfigService.getSystemConfigBooleanByCode(SystemConfigCode.ignore_transfer_z_self_test); selfTestState.setTransferZOriginIsIgnore(transferZIsIgnore); } @@ -54,13 +54,13 @@ public class SelfTestService { */ public void setIgnoreItem(SetIgnoreItemDTO setIgnoreItemDTO) { systemConfigService.setSystemConfigByCode(setIgnoreItemDTO.getIgnoreSelfTestType(), setIgnoreItemDTO.getIgnore().toString()); - if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.doorOriginIsIgnore)) { + if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.ignore_door_self_test)) { selfTestState.setDoorOriginIsIgnore(setIgnoreItemDTO.getIgnore()); - } else if (setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.dualRobotOriginIsIgnore)) { + } else if (setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.ignore_dual_robot_self_test)) { selfTestState.setDualRobotOriginIsIgnore(setIgnoreItemDTO.getIgnore()); - }else if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.transferXOriginIsIgnore)){ + }else if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.ignore_transfer_x_self_test)){ selfTestState.setTransferXOriginIsIgnore(setIgnoreItemDTO.getIgnore()); - }else if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.transferZOriginIsIgnore)){ + }else if(setIgnoreItemDTO.getIgnoreSelfTestType().equals(SystemConfigCode.ignore_transfer_z_self_test)){ selfTestState.setTransferZOriginIsIgnore(setIgnoreItemDTO.getIgnore()); } } 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 38d5d01..89aca4b 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 @@ -1,9 +1,11 @@ package com.iflytop.sgs.app.service.device.module; import com.iflytop.sgs.app.model.bo.Point3D; +import com.iflytop.sgs.app.model.bo.status.device.HeatModuleState; import com.iflytop.sgs.app.model.entity.DevicePosition; import com.iflytop.sgs.app.service.api.DevicePositionService; import com.iflytop.sgs.app.service.device.DeviceCommandService; +import com.iflytop.sgs.app.service.device.DeviceStateService; import com.iflytop.sgs.common.cmd.CommandFuture; import com.iflytop.sgs.common.cmd.DeviceCommandBundle; import com.iflytop.sgs.common.cmd.DeviceCommandGenerator; @@ -23,6 +25,7 @@ import org.springframework.stereotype.Service; public class HeatModuleService { private final DeviceCommandService deviceCommandService; private final DevicePositionService devicePositionService; + private final DeviceStateService deviceStateService; /** * 指定加热模块开始加热 @@ -128,4 +131,16 @@ public class HeatModuleService { CommandUtil.wait(deviceCommandFuture); } + /** + * 获取一个空闲加热区 + */ + public HeatModuleState getIdleHeatModule() { + for (HeatModuleState heatModuleState : deviceStateService.getDeviceState().getHeatModule()) { + if(heatModuleState.isTrayStatus()){ + return heatModuleState; + } + } + return null; + } + } diff --git a/src/main/java/com/iflytop/sgs/app/service/device/module/SolutionModuleService.java b/src/main/java/com/iflytop/sgs/app/service/device/module/SolutionModuleService.java index c3108f0..1c2cf02 100644 --- a/src/main/java/com/iflytop/sgs/app/service/device/module/SolutionModuleService.java +++ b/src/main/java/com/iflytop/sgs/app/service/device/module/SolutionModuleService.java @@ -103,6 +103,14 @@ public class SolutionModuleService { CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdId, cmdCode, deviceCommand); CommandUtil.wait(deviceCommandFuture); } + /** + * 加液机械臂移动到原点 + */ + public void solutionMotorOrigin(String cmdId, String cmdCode) throws Exception { + DeviceCommandBundle deviceCommand = DeviceCommandGenerator.motorLiquidOrigin(); + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdId, cmdCode, deviceCommand); + CommandUtil.wait(deviceCommandFuture); + } /** * 加液机械臂移动到指定点 @@ -129,6 +137,15 @@ public class SolutionModuleService { CommandUtil.wait(deviceCommandFuture); } + /** + * 加液泵加液 + */ + public void liquidPumpMove( double position) throws Exception { + DeviceCommandBundle deviceCommandBundle = DeviceCommandGenerator.liquidPumpMoveBy(position); + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(deviceCommandBundle); + CommandUtil.wait(deviceCommandFuture); + + } /** * 加液泵正转 @@ -170,6 +187,14 @@ public class SolutionModuleService { /** * 电磁阀转换通道 * */ + public void liquidValveSwitch(ValveStateCode valveStateCode) throws Exception{ + DeviceCommandBundle deviceCommand = DeviceCommandGenerator.valveTurn(valveStateCode.getChannel()); + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(null,null , deviceCommand); + CommandUtil.wait(deviceCommandFuture); + } + /** + * 电磁阀转换通道 + * */ public void liquidValveSwitch(String cmdId, String cmdCode,ValveStateCode valveStateCode) throws Exception{ DeviceCommandBundle deviceCommand = DeviceCommandGenerator.valveTurn(valveStateCode.getChannel()); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(cmdId, cmdCode, deviceCommand); diff --git a/src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java b/src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java index 13e97cf..bf06d5e 100644 --- a/src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java +++ b/src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java @@ -18,10 +18,10 @@ public enum SystemConfigCode { cycle_clean_max("清洁最大次数"), liquid_max_speed("蠕动泵最大转速"), - doorOriginIsIgnore("忽略门自检"), - dualRobotOriginIsIgnore("忽略加液升降自检"), - transferXOriginIsIgnore("忽略转运机械臂X轴自检"), - transferZOriginIsIgnore("忽略转运机械臂Z轴自检"), + ignore_door_self_test("忽略门自检"), + ignore_dual_robot_self_test("忽略加液升降自检"), + ignore_transfer_x_self_test("忽略转运机械臂X轴自检"), + ignore_transfer_z_self_test("忽略转运机械臂Z轴自检"), ; 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 5b77b71..c7c1023 100644 --- a/src/main/java/com/iflytop/sgs/common/result/ResultCode.java +++ b/src/main/java/com/iflytop/sgs/common/result/ResultCode.java @@ -62,7 +62,9 @@ public enum ResultCode implements IResultCode, Serializable { SOLUTION_MODULE_IS_BUSY("6029", "加液模块正忙"), ANNEAL_MODULE_EXIST_TRAY("6030", "退火模块存在托盘"), HAVE_IN_ANNEAL_MODULE("6031", "已经在退热模块"), - Z_IS_NOT_SAFE("6032", "Z轴位置不安全"),; + Z_IS_NOT_SAFE("6032", "Z轴位置不安全"), + HEAT_MODULE_NO_IDLE("6033", "加热模块无空闲"), + TRANSFER_MODULE_YES_TRAY("6034", "夹爪存在托盘"),; /** 状态码 */ private final String code; /** 提示信息 */ diff --git a/src/main/java/com/iflytop/sgs/hardware/config/StepMotorConfig.java b/src/main/java/com/iflytop/sgs/hardware/config/StepMotorConfig.java index 3d7d751..6b7cb63 100644 --- a/src/main/java/com/iflytop/sgs/hardware/config/StepMotorConfig.java +++ b/src/main/java/com/iflytop/sgs/hardware/config/StepMotorConfig.java @@ -33,7 +33,7 @@ public class StepMotorConfig { // 最大限位配置 static final double DEFAULT_MAX_LIMIT = 0.0; // mm final static Map stepMotorMaxLimitMap = Map.ofEntries( - Map.entry(StepMotorMId.DoorM, 200.0), + Map.entry(StepMotorMId.DoorM, 280.0), Map.entry(StepMotorMId.LiquidM, 160.0), Map.entry(StepMotorMId.ZM, 110.0), Map.entry(StepMotorMId.LiquidPumpM, 9999999.0) diff --git a/src/main/java/com/iflytop/sgs/monitor/controller/CraftsMonitorController.java b/src/main/java/com/iflytop/sgs/monitor/controller/CraftsMonitorController.java index 96414d7..f36a74b 100644 --- a/src/main/java/com/iflytop/sgs/monitor/controller/CraftsMonitorController.java +++ b/src/main/java/com/iflytop/sgs/monitor/controller/CraftsMonitorController.java @@ -2,6 +2,7 @@ package com.iflytop.sgs.monitor.controller; import com.iflytop.sgs.app.model.vo.CraftStatusVO; import com.iflytop.sgs.app.service.api.CraftsService; +import com.iflytop.sgs.common.enums.HeatModuleCode; import com.iflytop.sgs.common.result.Result; import com.iflytop.sgs.common.result.ResultCode; import io.swagger.v3.oas.annotations.Operation; @@ -27,10 +28,9 @@ public class CraftsMonitorController { private final CraftsService craftsService; @Operation(summary = "获取某个加热区工艺状态") - @GetMapping("/status/{heatId}") - public Result getStatus( - @NotNull @PathVariable String heatId) { - CraftStatusVO vo = craftsService.getStatus(heatId); + @GetMapping("/status/{heatModuleCode}") + public Result getStatus(@NotNull @PathVariable HeatModuleCode heatModuleCode) { + CraftStatusVO vo = craftsService.getStatus(heatModuleCode); if (vo == null) { return Result.failed(ResultCode.NOT_FOUND, "未找到执行任务"); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7bc6f58..fd90bfd 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -36,7 +36,7 @@ command_bus: device.enableCanBus: true iflytophald: - ip: 192.168.10.168 + ip: 192.168.8.168 cmdch.port: 19004 datach.port: 19005 diff --git a/src/main/resources/sql/init.sql b/src/main/resources/sql/init.sql index 566db82..018e308 100644 --- a/src/main/resources/sql/init.sql +++ b/src/main/resources/sql/init.sql @@ -57,10 +57,10 @@ VALUES ('1', '稀硝酸容量与泵行程比率', 'scale_thin', '1'), ('7', '抽液时机蠕动泵的转数', 'number_reduce', '5'), ('8', '最大清洁次数', 'cycle_clean_max', '8'), ('9', '蠕动泵最大转速限制', 'liquid_max_speed', '150'), - ('10', '忽略门自检', 'doorOriginIsIgnore', 'false'), - ('11', '忽略加液升降自检', 'dualRobotOriginIsIgnore', 'false'), - ('12', '忽略转运机械臂X轴自检', 'transferXOriginIsIgnore', 'false'), - ('13', '忽略转运机械臂Z轴自检', 'transferZOriginIsIgnore', 'false'); + ('10', '忽略门自检', 'ignore_door_self_test', 'false'), + ('11', '忽略加液升降自检', 'ignore_dual_robot_self_test', 'false'), + ('12', '忽略转运机械臂X轴自检', 'ignore_transfer_x_self_test', 'false'), + ('13', '忽略转运机械臂Z轴自检', 'ignore_transfer_z_self_test', 'false'); -- 系统日志 表