白凤吉 2 months ago
parent
commit
b5a4a88877
  1. 2
      src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java
  2. 6
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidAddCommand.java
  3. 2
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidPreFillStartCommand.java
  4. 2
      src/main/java/com/iflytop/sgs/app/cmd/control/LiquidReduceCommand.java
  5. 3
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToAnnealAreaCommand.java
  6. 5
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToFeedAreaCommand.java
  7. 10
      src/main/java/com/iflytop/sgs/app/cmd/control/MoveToLiquidAreaCommand.java
  8. 2
      src/main/java/com/iflytop/sgs/app/cmd/debug/DebugDoorOpenCommand.java
  9. 7
      src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java
  10. 7
      src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java
  11. 2
      src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java
  12. 25
      src/main/java/com/iflytop/sgs/app/controller/CraftsController.java
  13. 4
      src/main/java/com/iflytop/sgs/app/controller/DeviceParamController.java
  14. 2
      src/main/java/com/iflytop/sgs/app/controller/TrayController.java
  15. 24
      src/main/java/com/iflytop/sgs/app/core/CraftsContext.java
  16. 10
      src/main/java/com/iflytop/sgs/app/model/bo/status/device/CraftsState.java
  17. 19
      src/main/java/com/iflytop/sgs/app/model/bo/status/device/DeviceState.java
  18. 5
      src/main/java/com/iflytop/sgs/app/model/bo/status/device/TrayState.java
  19. 5
      src/main/java/com/iflytop/sgs/app/model/dto/PauseCraftsDTO.java
  20. 3
      src/main/java/com/iflytop/sgs/app/model/dto/ResumeCraftsDTO.java
  21. 10
      src/main/java/com/iflytop/sgs/app/model/dto/StartCraftsDTO.java
  22. 3
      src/main/java/com/iflytop/sgs/app/model/dto/StopCraftsDTO.java
  23. 3
      src/main/java/com/iflytop/sgs/app/model/vo/CraftStatusVO.java
  24. 3
      src/main/java/com/iflytop/sgs/app/model/vo/SetCraftsVO.java
  25. 187
      src/main/java/com/iflytop/sgs/app/service/api/CraftsService.java
  26. 2
      src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java
  27. 13
      src/main/java/com/iflytop/sgs/app/service/api/TrayService.java
  28. 260
      src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java
  29. 2
      src/main/java/com/iflytop/sgs/app/service/device/DeviceInitService.java
  30. 16
      src/main/java/com/iflytop/sgs/app/service/device/SelfTestService.java
  31. 15
      src/main/java/com/iflytop/sgs/app/service/device/module/HeatModuleService.java
  32. 25
      src/main/java/com/iflytop/sgs/app/service/device/module/SolutionModuleService.java
  33. 8
      src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java
  34. 4
      src/main/java/com/iflytop/sgs/common/result/ResultCode.java
  35. 2
      src/main/java/com/iflytop/sgs/hardware/config/StepMotorConfig.java
  36. 8
      src/main/java/com/iflytop/sgs/monitor/controller/CraftsMonitorController.java
  37. 2
      src/main/resources/application-dev.yml
  38. 8
      src/main/resources/sql/init.sql

2
src/main/java/com/iflytop/sgs/app/cmd/control/DoorCloseCommand.java

@ -25,7 +25,7 @@ public class DoorCloseCommand extends BaseCommandHandler {
@Override
public CompletableFuture<Void> handle(CmdDTO cmdDTO) {
return runAsync(() -> {
doorModuleService.doorMove(cmdDTO.getCommandId(), cmdDTO.getCommand(),0);
doorModuleService.doorOrigin(cmdDTO.getCommandId(), cmdDTO.getCommand());
deviceStateService.getDeviceState().getDoorModule().setOpen(false); //将门状态设置为false
});
}

6
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());//加液机械臂上升
}
}

2
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());//预充开始
});
}
}

2
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());//加液模块上升
}

3
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轴移动至目标加热模块托盘夹取点

5
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);//设定上料区托盘状态
});

10
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 报错

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

7
src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpAddCommand.java

@ -32,9 +32,10 @@ public class DebugLiquidPumpAddCommand extends BaseCommandHandler {
@Override
public CompletableFuture<Void> 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");

7
src/main/java/com/iflytop/sgs/app/cmd/debug/DebugLiquidPumpReduceCommand.java

@ -32,9 +32,10 @@ public class DebugLiquidPumpReduceCommand extends BaseCommandHandler {
@Override
public CompletableFuture<Void> 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) {

2
src/main/java/com/iflytop/sgs/app/cmd/selftest/LiquidLiftingOriginCommand.java

@ -25,7 +25,7 @@ public class LiquidLiftingOriginCommand extends BaseCommandHandler {
@Override
public CompletableFuture<Void> handle(CmdDTO cmdDTO) {
return runAsync(() -> {
solutionModuleService.solutionMotorMoveZero(cmdDTO.getCommandId(), cmdDTO.getCommand());
solutionModuleService.solutionMotorOrigin(cmdDTO.getCommandId(), cmdDTO.getCommand());
selfTestService.getSelfTestState().setDualRobotOrigin(true);
});
}

25
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<String> delete(
@Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) {
public Result<String> 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<SetCraftsVO> setCrafts(@Valid @RequestBody SetCraftsDTO setCraftsDTO) {
return Result.success(craftsService.setCraft(setCraftsDTO.getCraftId(), setCraftsDTO.getHeatId()));
}
// @Operation(summary = "配置加热区工艺")
// @PostMapping("/set")
// public Result<SetCraftsVO> setCrafts(@Valid @RequestBody SetCraftsDTO setCraftsDTO) {
// return Result.success(craftsService.setCraft(setCraftsDTO.getCraftId(), setCraftsDTO.getHeatId()));
// }
@Operation(summary = "开始执行工艺")
@PostMapping("/start")
public Result<String> startCrafts(@Valid @RequestBody StartCraftsDTO startCraftsDTO) {
craftsService.startCrafts(startCraftsDTO.getHeatId());
return Result.success();
public Result<SetCraftsVO> startCrafts(@Valid @RequestBody StartCraftsDTO startCraftsDTO) {
return Result.success(craftsService.startCrafts(startCraftsDTO.getCraftId(), startCraftsDTO.getHeatId()));
}
@Operation(summary = "暂停执行工艺")
@PostMapping("/pause")
public Result<String> pauseCrafts(@Valid @RequestBody PauseCraftsDTO pauseCraftsDto) {
public Result<String> pauseCrafts(@Valid @RequestBody PauseCraftsDto pauseCraftsDto) {
craftsService.pauseCrafts(pauseCraftsDto.getHeatId());
return Result.success();
}

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

2
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();
}

24
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<CraftStates, CraftEvents> state) {
CraftsState craftsState = deviceStateService.getDeviceState().getTrayStateByHeatModuleCode(heatModuleCode).getCrafts();
craftsState.setState(state.getId());
craftsState.setCurrentIndex(currentIndex);
Map<String, Object> 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<CraftEvents> 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<String, Object> 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();
}
}
}
}

10
src/main/java/com/iflytop/sgs/app/model/bo/status/crafts/CraftsState.java → 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;

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

5
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();

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

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

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

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

3
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;

3
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;

187
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<CraftsMapper, Crafts> {
private final DeviceStateService deviceStateService;
private final HeatModuleService heatModuleService;
private final StateMachineFactory<CraftStates, CraftEvents> stateMachineFactory;
private final WebSocketSender webSocketService;
private final CraftsStepService craftsStepService;
private final OresService oresService;
private final ConcurrentHashMap<String, CraftsContext> contextMap = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Future<?>> futureMap = new ConcurrentHashMap<>();
private final DeviceStateService deviceStateService;
private final ObjectProvider<CraftsState> craftsStateObjectProvider;
private final ConcurrentHashMap<HeatModuleCode, CraftsContext> contextMap = new ConcurrentHashMap<>();
private final ConcurrentHashMap<HeatModuleCode, Future<?>> futureMap = new ConcurrentHashMap<>();
private ExecutorService executor;
@PostConstruct
public void init() {
this.executor = Executors.newCachedThreadPool();
}
//
// /**
// * 配置工艺
// */
// public synchronized SetCraftsVO setCraft(Long craftId, String heatId) {
// // 校验已有上下文状态仅允许在 READYSTOPPED 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);
}
// 校验已有上下文状态仅允许在 READYSTOPPED 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是否被占用
// 校验已有上下文状态仅允许在 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 ctx = new CraftsContext(
heatModuleCode,
ores,
@ -87,10 +146,20 @@ public class CraftsService extends ServiceImpl<CraftsMapper, Crafts> {
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<CraftsMapper, Crafts> {
}
/**
* 启动执行工艺需先调用 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<CraftsMapper, Crafts> {
/**
* 恢复执行工艺
*/
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<CraftsMapper, Crafts> {
/**
* 停止执行工艺不清除上下文
*/
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<CraftsMapper, Crafts> {
}
/**
* 停止执行所有工艺不清除上下文
*/
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<CraftsMapper, Crafts> {
*/
public List<CraftStatusVO> 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<CraftsMapper, Crafts> {
List<Long> ids = Arrays.stream(idsStr.split(",")).map(Long::parseLong).collect(Collectors.toList());
return this.removeByIds(ids);
}
}
}

2
src/main/java/com/iflytop/sgs/app/service/api/SystemConfigService.java

@ -97,7 +97,7 @@ public class SystemConfigService extends ServiceImpl<SystemConfigMapper, SystemC
public boolean setSystemConfigByCode(SystemConfigCode systemConfigCode, String value) {
SystemConfig systemConfig = this.getOne(new LambdaQueryWrapper<SystemConfig>().eq(SystemConfig::getCode, systemConfigCode.name()));
systemConfig.setValue(value);
systemConfig.setCode(value);
return this.updateById(systemConfig);
}

13
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<TrayState> 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<TrayState> trayList = deviceStateService.getDeviceState().getTrays();
trayList.removeIf(TrayState::isInFeedArea);
trayList.removeIf(TrayState::isInSolutionPositon);
deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(false);
solutionModuleService.releaseSolutionModule();
}
/**

260
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
}
}

2
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<HeatModuleState> heatModuleStateProvider;
private final ObjectProvider<SolutionContainerState> 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);

16
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());
}
}

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

25
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);

8
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轴自检"),
;

4
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;
/** 提示信息 */

2
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<StepMotorMId, Double> 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)

8
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<CraftStatusVO> getStatus(
@NotNull @PathVariable String heatId) {
CraftStatusVO vo = craftsService.getStatus(heatId);
@GetMapping("/status/{heatModuleCode}")
public Result<CraftStatusVO> getStatus(@NotNull @PathVariable HeatModuleCode heatModuleCode) {
CraftStatusVO vo = craftsService.getStatus(heatModuleCode);
if (vo == null) {
return Result.failed(ResultCode.NOT_FOUND, "未找到执行任务");
}

2
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

8
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');
-- 系统日志 表

Loading…
Cancel
Save