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