Browse Source

systemconfig增加预充和排空的距离

master
王梦远 2 months ago
parent
commit
60c36dcee0
  1. BIN
      db/app.db
  2. 5
      src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java
  3. 387
      src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java
  4. 10
      src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java
  5. 5
      src/main/java/com/iflytop/sgs/common/enums/data/DevicePositionCode.java

BIN
db/app.db

5
src/main/java/com/iflytop/sgs/app/cmd/control/OutTrayCommand.java

@ -6,6 +6,7 @@ import com.iflytop.sgs.app.model.bo.Point3D;
import com.iflytop.sgs.app.model.bo.status.device.TrayState;
import com.iflytop.sgs.app.model.dto.CmdDTO;
import com.iflytop.sgs.app.service.api.DevicePositionService;
import com.iflytop.sgs.app.service.device.DeviceLightSoundService;
import com.iflytop.sgs.app.service.device.DeviceSensorService;
import com.iflytop.sgs.app.service.device.DeviceStateService;
import com.iflytop.sgs.app.service.device.module.HeatModuleService;
@ -14,6 +15,7 @@ import com.iflytop.sgs.app.service.device.module.TransferModuleService;
import com.iflytop.sgs.common.annotation.CommandMapping;
import com.iflytop.sgs.common.enums.DeviceSensorCode;
import com.iflytop.sgs.common.enums.HeatModuleCode;
import com.iflytop.sgs.common.enums.cmd.CmdBeepMode;
import com.iflytop.sgs.common.enums.data.DevicePositionCode;
import com.iflytop.sgs.common.exception.AppException;
import com.iflytop.sgs.common.result.ResultCode;
@ -73,9 +75,6 @@ public class OutTrayCommand extends BaseCommandHandler {
deviceStateService.getDeviceState().getTransferModule().setTrayStatus(false);//设定托盘夹爪为FALSE
deviceStateService.getDeviceState().getHeatModuleByCode(targetHeatModuleCode).setTrayStatus(false);//设定目标加热模块托盘状态
deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(true);//设定上料区托盘状态
List<TrayState> trayList = deviceStateService.getDeviceState().getTrays();
trayList.removeIf(TrayState::isInFeedArea);
deviceStateService.getDeviceState().getSolutionModule().setFeedAreaTrayStatus(false);
} finally {
deviceStateService.getCommandMutexState().get().setTransferCommandExecuting(false);
}

387
src/main/java/com/iflytop/sgs/app/service/crafts/CraftsStepService.java

@ -7,6 +7,7 @@ import cn.hutool.json.JSONUtil;
import com.iflytop.sgs.app.core.CraftsDebugGenerator;
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.TrayState;
import com.iflytop.sgs.app.model.bo.status.device.TubeState;
import com.iflytop.sgs.app.model.entity.Container;
import com.iflytop.sgs.app.model.entity.CraftMonitor;
@ -78,16 +79,15 @@ public class CraftsStepService {
}
/*
*
* 预热
* 退火区预热
* */
public boolean preHeat(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
// Double temperature = params.getDouble("temperature");
// log.info("工艺{},预热", heatModuleCode);
// heatModuleService.heatRodOpen(heatModuleCode, temperature);
// deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTargetTemperature(temperature);//设置加热温度
// deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setHeatingType(HeatingType.heating);//加热中
// webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "开始预热", temperature));
Double temperature = params.getDouble("temperature");
log.info("工艺{},预热", HeatModuleCode.heat_module_04);
heatModuleService.heatRodOpen(HeatModuleCode.heat_module_04, temperature);
deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setTargetTemperature(temperature);//设置加热温度
deviceStateService.getDeviceState().getHeatModuleByCode(HeatModuleCode.heat_module_04).setHeatingType(HeatingType.heating);//加热中
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(HeatModuleCode.heat_module_04.toString(), "退火区开始预热", temperature));
return true;
}
@ -96,22 +96,53 @@ public class CraftsStepService {
* */
public boolean addLiquid(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
try {
/*工艺监控*/
JSONObject result = new JSONObject();
List<Integer> finishColumns = new ArrayList<>();
result.set(ResultCode.SUCCESS.getCode(), finishColumns);
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitorService.saveOrUpdate(craftMonitor);//保存监控
craftMonitorService.saveOrUpdate(craftMonitor);
/*工艺监控结束*/
/*获取配置信息*/
deviceStateService.getDeviceState().getSolutionModule().setPumping(true);
Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离
Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点
Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点
Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点
Double drainDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.drain_distance);//排空距离
Double preFillDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.pre_fill_distance);//预充距离
Double preFillPosition = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownPreFillPositon).getPositon();
Integer containerId = params.getInt("containerId");//容器id
Double volume = params.getDouble("volume");//
JSONArray jsonArray = params.getJSONArray("columns");//列数
//Assert.isTrue(containerId != null && volume != null, () -> new AppException(ResultCode.CRAFT_PARAMS_MISTAKE));//参数错误
Container container = containerService.getById(containerId);//容器id
Solutions solutions = solutionsService.getById(container.getSolutionId());//获取溶液
Integer channel = container.getChannel();//获取阀门通道
Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance(); //托盘试管水平间距
double scale = solutions.getDoubleScale();//根据溶液获取转换比
Double solutionModuleMotorDownInTubeAddPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeAddPositon).getPositon(); //加液模块电机下降进入试管加液位置
double addLiquidDistance = volume * scale;
/*获取参数结束*/
log.info("工艺{},申请转运模组并等待", heatModuleCode);
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_liquid);//申请转运模组并等待
/*预充开始*/
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取加热区传感器状态
if (heatTrayExist) {//加热区存在托盘
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
solutionModuleService.solutionMotorMove(preFillPosition);//加液机械臂下降至预充位置
solutionModuleService.liquidPumpMove(-drainDistance);//排空
solutionModuleService.liquidValveSwitchByChannel(channel);//电磁阀对应通道打开
solutionModuleService.liquidPumpMove(preFillDistance);//预充
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
/*预充结束*/
/*移动至加液区开始*/
boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取加热区试管架
if (heatTrayExist) {//加热区存在试管架
log.info("工艺{},加热区存在托盘", heatModuleCode);
log.info("工艺{},机械臂移动至加热区", heatModuleCode);
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode.name()));
@ -148,81 +179,49 @@ public class CraftsStepService {
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(true);//托盘状态
boolean clawTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.CLAW_TRAY_EXIST);//获取传感器状态
Assert.isTrue(clawTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_NO_TRAY));//加液区无托盘
Integer containerId = params.getInt("containerId");//容器id
Double volume = params.getDouble("volume");//
JSONArray jsonArray = params.getJSONArray("columns");//列数
//Assert.isTrue(containerId != null && volume != null, () -> new AppException(ResultCode.CRAFT_PARAMS_MISTAKE));//参数错误
Container container = containerService.getById(containerId);//容器id
Solutions solutions = solutionsService.getById(container.getSolutionId());//获取溶液
Integer channel = container.getChannel();//获取阀门通道
Integer currentChannel = deviceSensorService.readLiquidValvePosition();//获取当前阀门的状态
Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance(); //托盘试管水平间距
//double preFillDistance = solutions.getDoublePreDistance();//获取预充距离
Double drainDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.drain_distance);//排空距离
Double preFillDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.pre_fill_distance);//预充距离
Point3D liquidAreaTrayPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D(); //获取加液区上方托盘点位
if (!channel.equals(currentChannel)) {//判断是否与当前加酸的通道一致 不一致排空
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "电磁阀废液通道打开", SolutionCode.waste));
log.info("工艺{},电磁阀废液通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//废液通道打开
log.info("工艺{},排空", heatModuleCode);
solutionModuleService.liquidPumpMove(-drainDistance);//排空
}
double scale = solutions.getDoubleScale();//根据溶液获取转换比
solutionModuleService.liquidPumpMove(preFillDistance);//预充
double position = volume * scale;
Double solutionModuleMotorDownInTubeAddPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeAddPositon).getPositon(); //加液模块电机下降进入试管加液位置
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitchByChannel(channel);//电磁阀对应通道打开
if (jsonArray != null) {//断电恢复
for (int i = 0; i < jsonArray.size(); i++) {
int column = jsonArray.getInt(i);//列号
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "移动加液机械臂到指定试管", column));
double distance = Math.abs(column - 5) * trayTubeHorizontalSpacingDistance;//机械臂右移距离
log.info("工艺{},机械臂移动到试管位置{}", heatModuleCode, column);
transferModuleService.transferXMove(liquidAreaTrayPoint.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液机械臂下降", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeAddPositon);//加液机械臂下降
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "添加溶液", position));
log.info("工艺{},加液", heatModuleCode);
solutionModuleService.liquidPumpMove(position);//加液 position
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
finishColumns.add(column);
result.set("columns", finishColumns);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
}
} else {
/*移动至加液区结束*/
/*开始加液*/
List<Integer> columns = new ArrayList<>();
if (jsonArray != null) {
jsonArray.forEach(item -> {
columns.add(Integer.parseInt(item.toString()));
});
} else {
TubeState[] tubes = deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).getTubes();
for (int i = 0; i < tubes.length; i++) {
if (tubes[i].isNeedAddSolution()) {
columns.add(tubes[i].getColumnNum());
for (TubeState tube : tubes) {
if (tube.isNeedAddSolution()) {
columns.add(tube.getColumnNum());
}
}
}
if (!columns.isEmpty()) {
for (int i = 0; i < columns.size(); i++) {
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "移动加液机械臂到指定试管", i));
double distance = Math.abs(columns.get(i) - 5) * trayTubeHorizontalSpacingDistance;//机械臂右移距离
log.info("工艺{},机械臂移动到试管位置{}", heatModuleCode, i);
transferModuleService.transferXMove(liquidAreaTrayPoint.getX() + distance);//机械臂移动到试管位置
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液机械臂下降", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeAddPositon);//加液机械臂下降
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "添加溶液", position));
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "添加溶液", addLiquidDistance));
log.info("工艺{},加液", heatModuleCode);
solutionModuleService.liquidPumpMove(position);//加液 position
solutionModuleService.liquidPumpMove(addLiquidDistance);//加液 position
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
/*工艺监控开始*/
finishColumns.add(i);
result.set("columns", finishColumns);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
craftMonitorService.saveOrUpdate(craftMonitor);
/*工艺监控结束*/
}
}
//移动至加热区
/*结束加液*/
/*移动至加热区*/
boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘
Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//提示被占用
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode));
@ -252,13 +251,16 @@ public class CraftsStepService {
public boolean reduceLiquid(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
try {
/*工艺监控开始*/
JSONObject result = new JSONObject();
List<Integer> finishColumns = new ArrayList<>();
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
craftMonitorService.saveOrUpdate(craftMonitor);
/*工艺监控结束*/
deviceStateService.getDeviceState().getSolutionModule().setPumping(true);
/*获取参数开始*/
Double height = params.getDouble("height");//抽液试管头部到试管底部的高度
JSONArray jsonArray = params.getJSONArray("columns");//列数
if (height > 50) {
throw new AppException(ResultCode.CRAFT_PARAMS_MISTAKE);
}
@ -266,6 +268,11 @@ public class CraftsStepService {
Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点
Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离
Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点
Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距
double solutionModuleMotorDownInTubeExtPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeExtPositon).getDistance();//加液模块电机下降进入试管抽取位置
Double reduceDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.reduce_distance);//抽液距离
/*获取参数结束*/
boolean heatTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//获取加热区传感器状态
Assert.isTrue(heatTrayExist, () -> new AppException(ResultCode.CRAFT_TARGET_HEAT_NO_TRAY));//加热区无托盘
log.info("工艺{},申请转运模组并等待", heatModuleCode);
@ -290,68 +297,53 @@ public class CraftsStepService {
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(true);//托盘状态
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "电磁阀打开", SolutionCode.waste.name()));
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
/*抽液开始*/
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距
double solutionModuleMotorDownInTubeExtPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeExtPositon).getDistance() + height;//加液模块电机下降进入试管抽取位置
Double drainDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.drain_distance);//排空距离
JSONArray jsonArray = params.getJSONArray("columns");//列数
List<Integer> columns = new ArrayList<>();
if (jsonArray != null) {
for (int i = 0; i < jsonArray.size(); i++) {
int column = jsonArray.getInt(i);//列号
double distance = Math.abs(column - 5) * trayTubeHorizontalSpacingDistance;
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至试管位置", column));
log.info("工艺{},机械臂移动到试管位置", heatModuleCode);
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液模块下降进入试管", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeExtPositon);//加液模块下降进入试管
log.info("工艺{},开始抽液", heatModuleCode);
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "开始抽液", -10));
solutionModuleService.liquidPumpMove(-drainDistance);//排空
log.info("工艺{},加液模块上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升
finishColumns.add(column);
result.set("columns", finishColumns);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
}
jsonArray.forEach(item -> {
columns.add(Integer.parseInt(item.toString()));
});
} else {
List<Integer> columns = new ArrayList<>();
TubeState[] tubes = deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).getTubes();
for (int i = 0; i < tubes.length; i++) {
if (tubes[i].isNeedAddSolution()) {
columns.add(tubes[i].getColumnNum());
for (TubeState tube : tubes) {
if (tube.isNeedAddSolution()) {
columns.add(tube.getColumnNum());
}
}
}
for (int i = 0; i < columns.size(); i++) {
double distance = Math.abs(columns.get(i) - 5) * trayTubeHorizontalSpacingDistance;
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至试管位置", i));
log.info("工艺{},机械臂移动至试管位置", heatModuleCode);
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液模块下降进入试管", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeExtPositon);//加液模块下降进入试管
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeExtPositon + height);//加液模块下降进入试管
log.info("工艺{},开始抽液", heatModuleCode);
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "开始抽液", -10));
solutionModuleService.liquidPumpMove(-10);//抽液 reduceNumber0.1
solutionModuleService.liquidPumpMove(-reduceDistance);//开始抽液
log.info("工艺{},加液模块上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升
/*工艺监控开始*/
finishColumns.add(i);
result.set("columns", finishColumns);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
}
/*工艺监控结束*/
}
log.info("工艺{},加液模块上升至最高,移出试管", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高移出试管
/*抽液结束*/
/*移动至加热区开始*/
log.info("工艺{},移动至托盘至加液位置点", heatModuleCode);
transferModuleService.transferMove(liquidAreaTrayPoint3D);//移动至托盘至加液位置点
boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//目标加热模块有无托盘
Assert.isTrue(!heatModuleTrayExist, () -> new AppException(ResultCode.TARGET_HEAT_MODULE_OCCUPIED));//提示被占用
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleCode));
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode);
transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点
log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode);
@ -360,9 +352,10 @@ public class CraftsStepService {
transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴移出卡槽
log.info("工艺{},Z轴抬升至最高", heatModuleCode);
transferModuleService.transferZMoveZero();//Z轴抬升至最高
/*移动至加热区结束*/
deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTrayStatus(true);//加热区托盘状态
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(true);//托盘状态
deviceStateService.getDeviceState().getSolutionModule().setPumping(false);//正在加液
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(false);//托盘状态
return true;
} finally {
@ -377,9 +370,12 @@ public class CraftsStepService {
* 加热
* */
public boolean heat(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
/*工艺监控清理上步的记录*/
JSONObject result = new JSONObject();
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitorService.saveOrUpdate(craftMonitor);
/*工艺监控清理上步的记录*/
Double temperature = params.getDouble("temperature");//温度
Integer time = params.getInt("time");//
//Assert.isTrue(temperature != null && time != null, () -> new AppException(ResultCode.CRAFT_PARAMS_MISTAKE));//参数错误
@ -400,14 +396,17 @@ public class CraftsStepService {
delay(60);
cycle--;
clock = clock + 60;
/*保存到工艺监控*/
result.set("time", clock);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
/*保存到工艺监控*/
}
delay(seconds);
log.info("工艺{},加热结束", heatModuleCode);
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "加热结束,持续时间", time));
return true;
@ -418,11 +417,13 @@ public class CraftsStepService {
* */
public boolean clean(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
try {
/*保存到监控开始*/
JSONObject result = new JSONObject();
List<Integer> finishColumns = new ArrayList<>();
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
/*保存到监控结束*/
/*获取参数开始*/
deviceStateService.getDeviceState().getSolutionModule().setPumping(true);
Double volume = params.getDouble("volume") == null ? 2.0 : params.getDouble("volume");//加水量
Integer cycle = params.getInt("cycle");//次数
@ -435,13 +436,19 @@ public class CraftsStepService {
Point3D liquidAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液时托盘位置点
Double trayTubeHorizontalSpacingDistance = devicePositionService.getPosition(DevicePositionCode.trayTubeHorizontalSpacingDistance).getDistance();//获取托盘试管水平间距
Double solutionModuleMotorDownInTubeExtPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeExtPositon).getPositon();//加液模块电机下降进入试管抽取位置
Solutions solutions = solutionsService.getByCode(SolutionCode.water.name());//获取酸
double cleanWaterVolume = volume * solutions.getDoubleScale();//清洁时加水的量
double pumpPosition = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.number_reduce);//抽液时蠕动泵移动
Double solutionModuleMotorDownInTubeAddPositon = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownInTubeAddPositon).getPositon();//加液模块电机下降进入试管加液位置
Double waterScale = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.water);//蒸馏水的系数
double cleanWaterDistance = volume * waterScale;//清洁时泵的移动距离
Double reduceDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.reduce_distance);//抽液距离
Double drainDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.drain_distance);//排空距离
Double preFillDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.pre_fill_distance);//过量预充距离
Double preFillPosition = devicePositionService.getPosition(DevicePositionCode.solutionModuleMotorDownPreFillPositon).getPositon();//机械臂预充时下降距离
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加热区", heatModuleTrayClawPoint3D));
/*获取参数结束*/
log.info("工艺{},申请转运模组并等待", heatModuleCode);
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_liquid);//申请转运模组并等待
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
log.info("工艺{},将X轴移动至目标加热模块托盘夹取点 + 进出卡槽移动距离", heatModuleCode);
@ -456,58 +463,70 @@ public class CraftsStepService {
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动至加液区", liquidAreaTrayPoint3D));
deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTrayStatus(false);//加热区托盘状态
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(false);//托盘状态
deviceStateService.getDeviceState().getSolutionModule().setPumping(true);//正在加液
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInSolutionPositon(true);//托盘状态
deviceStateService.getDeviceState().getSolutionModule().setPumping(true);
transferModuleService.transferMove(liquidAreaTrayPoint3D);//移动至加液时托盘位置点
//排空
Double drainDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.drain_distance);//排空距离
/*列号开始*/
List<Integer> columns = new ArrayList<>();
TubeState[] tubes = deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).getTubes();
for (TubeState tube : tubes) {
if (tube.isNeedAddSolution()) {
columns.add(tube.getColumnNum());
}
}
/*列号结束*/
/*抽液开始*/
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
solutionModuleService.liquidPumpMove(-drainDistance);//蠕动泵排空
//预充
Double preFillDistance = systemConfigService.getSystemConfigDoubleByCode(SystemConfigCode.pre_fill_distance);//预充距离
JSONArray jsonArray = params.getJSONArray("columns");//列数
if (jsonArray != null) {
for (int j = 0; j < jsonArray.size(); j++) {
int column = jsonArray.getInt(j);
double distance = Math.abs(column - 5) * trayTubeHorizontalSpacingDistance;//x轴移动距离
for (int j = 0; j < columns.size(); j++) {
double distance = Math.abs(columns.get(j) - 5) * trayTubeHorizontalSpacingDistance;//x轴移动距离
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动到试管位置", j));
log.info("工艺{},机械臂移动到试管位置", heatModuleCode);
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液模块下降进入试管抽取位置", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeExtPositon + height);//加液模块下降进入试管抽取位置
for (int i = 0; i < cycle; i++) {
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开
solutionModuleService.liquidPumpMove(preFillDistance);//预充
Thread.sleep(500);
log.info("工艺{},蠕动泵加水", heatModuleCode);
solutionModuleService.liquidPumpMove(cleanWaterVolume);//蠕动泵加水
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
Thread.sleep(500);
log.info("工艺{},蠕动泵抽水", heatModuleCode);
solutionModuleService.liquidPumpMove(-pumpPosition);//蠕动泵抽水
solutionModuleService.liquidPumpMove(-drainDistance);//蠕动泵排空
}
finishColumns.add(column);
result.set("columns", finishColumns);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
solutionModuleService.liquidPumpMove(-reduceDistance);//蠕动泵抽水
log.info("工艺{},加液模块上升至最高,移出试管", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高移出试管
}
} else {
List<Integer> columns = new ArrayList<>();
TubeState[] tubes = deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).getTubes();
for (int i = 0; i < tubes.length; i++) {
if (tubes[i].isNeedAddSolution()) {
columns.add(tubes[i].getColumnNum());
}
/*抽液结束*/
/*预充开始*/
log.info("工艺{},清洗-预充开始", heatModuleCode);
solutionModuleService.liquidPumpMove(-drainDistance);//排空
solutionModuleService.solutionMotorMove(preFillPosition);//加液机械臂下降至预充位置
solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开
solutionModuleService.liquidPumpMove(preFillDistance);//预充
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
/*预充结束*/
/*清洗开始*/
for (int i = 0; i < cycle; i++) {
/*加*/
log.info("工艺{},电磁阀蒸馏水通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开
for (int j = 0; j < columns.size(); j++) {
double distance = Math.abs(columns.get(j) - 5) * trayTubeHorizontalSpacingDistance;//x轴移动距离
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动到试管位置", j));
log.info("工艺{},机械臂移动到试管位置", heatModuleCode);
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液模块下降进入试管抽取位置", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeAddPositon);//加液模块下降进入试管加液位置
log.info("工艺{},蠕动泵加水", heatModuleCode);
solutionModuleService.liquidPumpMove(cleanWaterDistance);//蠕动泵加水
log.info("工艺{},加液模块上升至最高,移出试管", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高移出试管
}
log.info("工艺{},电磁阀废液通道打开", heatModuleCode);
Thread.sleep(1000);
/*抽*/
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
for (int j = 0; j < columns.size(); j++) {
double distance = Math.abs(columns.get(j) - 5) * trayTubeHorizontalSpacingDistance;//x轴移动距离
webSocketService.pushCraftsDebug(CraftsDebugGenerator.generateJson(heatModuleCode.toString(), "机械臂移动到试管位置", j));
@ -515,30 +534,22 @@ public class CraftsStepService {
transferModuleService.transferXMove(liquidAreaTrayPoint3D.getX() + distance);//机械臂移动到试管位置
log.info("工艺{},加液模块下降进入试管抽取位置", heatModuleCode);
solutionModuleService.solutionMotorMove(solutionModuleMotorDownInTubeExtPositon + height);//加液模块下降进入试管抽取位置
for (int i = 0; i < cycle; i++) {
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.water);//电磁阀对应通道打开
solutionModuleService.liquidPumpMove(preFillDistance);//预充
Thread.sleep(500);
log.info("工艺{},蠕动泵加水", heatModuleCode);
solutionModuleService.liquidPumpMove(cleanWaterVolume);//蠕动泵加水
log.info("工艺{},电磁阀对应通道打开", heatModuleCode);
solutionModuleService.liquidValveSwitch(SolutionCode.waste);//电磁阀对应通道打开
Thread.sleep(500);
log.info("工艺{},蠕动泵抽水", heatModuleCode);
solutionModuleService.liquidPumpMove(-pumpPosition);//蠕动泵抽水
solutionModuleService.liquidPumpMove(-drainDistance);//蠕动泵排空
solutionModuleService.liquidPumpMove(-reduceDistance);//抽水
log.info("工艺{},加液模块上升至最高,移出试管", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高移出试管
}
finishColumns.add(j);
result.set("columns", finishColumns);//添加到结果
result.set("cycle", i+1);//添加到结果
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitor.setDeviceState(JSONUtil.toJsonStr(deviceStateService.getDeviceState()));
craftMonitorService.saveOrUpdate(craftMonitor);//保存到监控
log.info("工艺{},加液模块上升至最高,移出试管", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液模块上升至最高移出试管
}
}
/*清洗结束*/
log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode);
transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX());//将X轴移动至目标加热模块托盘夹取点
log.info("工艺{},Z轴下降至夹取点,使托盘落入石墨加热盘", heatModuleCode);
@ -563,9 +574,13 @@ public class CraftsStepService {
* 烘干
* */
public boolean dry(HeatModuleCode heatModuleCode, JSONObject params, CraftMonitor craftMonitor) throws Exception {
/*工艺监控清理上步的记录*/
JSONObject result = new JSONObject();
craftMonitor.setCurrentStepResult(String.valueOf(result));
craftMonitorService.saveOrUpdate(craftMonitor);
/*工艺监控清理上步的记录*/
Double temperature = params.getDouble("temperature");//
Integer time = params.getInt("time");//
//Assert.isTrue(temperature != null && time != null, () -> new AppException(ResultCode.CRAFT_PARAMS_MISTAKE));//参数错误
@ -616,10 +631,10 @@ public class CraftsStepService {
Double feedTemperature = params.getDouble("feedTemperature");//下料温度
Integer time = params.getInt("time");//
//Assert.isTrue(temperature != null && time != null, () -> new AppException(ResultCode.CRAFT_PARAMS_MISTAKE));//参数错误
boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);//加热模块有无托盘
Assert.isTrue(heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_TARGET_HEAT_NO_TRAY));//提示无托盘
boolean heatModuleTrayExist = deviceSensorService.getTrayStateByHeatModuleCode(heatModuleCode);
Assert.isTrue(heatModuleTrayExist, () -> new AppException(ResultCode.CRAFT_TARGET_HEAT_NO_TRAY));//提示加热模块无托盘
while (deviceSensorService.getTrayStateByHeatModuleCode(HeatModuleCode.heat_module_04)) {//判断退火区是否被占用
delay(10);//等待30秒
delay(10);//等待10秒
}
Point3D annealTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(HeatModuleCode.heat_module_04);//获取退火区托盘夹取点
Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点
@ -715,7 +730,7 @@ public class CraftsStepService {
heatModuleService.fanStart(heatModuleCode);//散热打开
deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setFanOpen(true); //设置加热区风扇打开
while (!codeIsSuitable(heatModuleCode, 100.0)) {
delay(3);
delay(5);
}
log.info("工艺{},散热关闭", heatModuleCode);
heatModuleService.fanClose(heatModuleCode);//散热关闭
@ -766,54 +781,8 @@ public class CraftsStepService {
*/
public void finish(HeatModuleCode heatModuleCode, CraftMonitor craftMonitor) throws Exception {
craftMonitorService.removeById(craftMonitor.getId());
//moveToFeedModule(heatModuleCode);
}
public void moveToFeedModule(HeatModuleCode heatModuleCode) throws Exception {
try {
boolean feedTrayExist = deviceSensorService.getSensorStatus(DeviceSensorCode.LIQUID_TRAY_EXIST);//上料区托盘状态
while (feedTrayExist) {
deviceLightSoundService.openBeep(CmdBeepMode.info);
delay(2);
deviceLightSoundService.closeBeep();
}
Point3D heatModuleTrayClawPoint3D = heatModuleService.getHeatModuleTrayClawPoint3D(heatModuleCode);//获取目标加热模块托盘夹取点
Double transferModuleXPickTrayMoveDistance = devicePositionService.getPosition(DevicePositionCode.transferModuleXPickTrayMoveDistance).getDistance();//获取转运模块X轴拿取托盘进出卡槽移动距离
Point3D feedAreaTrayPoint3D = devicePositionService.getPosition(DevicePositionCode.feedAreaTrayPoint).getPoint3D();//获取上料区托盘夹爪位置点
transferModuleService.requestTransferModule(CraftsTransferTypeCode.move_feed);//获取转运模组锁
log.info("工艺{},加液机械臂上升", heatModuleCode);
solutionModuleService.solutionMotorMoveZero();//加液机械臂上升
log.info("工艺{},Z轴抬升至最高", heatModuleCode);
transferModuleService.transferZMoveZero();//Z轴抬升至最高
log.info("工艺{},将X轴移动至目标加热模块托盘夹取点", heatModuleCode);
transferModuleService.transferXMove(heatModuleTrayClawPoint3D.getX() + transferModuleXPickTrayMoveDistance);//将X轴移动至目标加热模块托盘夹取点
log.info("工艺{},Z轴下降至夹取点", heatModuleCode);
transferModuleService.transferZMove(heatModuleTrayClawPoint3D.getZ());//Z轴下降至夹取点使托盘落入石墨加热盘
log.info("工艺{},X轴移出卡槽", heatModuleCode);
transferModuleService.transferXMoveBy(-transferModuleXPickTrayMoveDistance);//X轴移出卡槽
log.info("工艺{},Z轴抬升至最高", heatModuleCode);
transferModuleService.transferZMoveZero();//Z轴抬升至最高
deviceStateService.getDeviceState().getHeatModuleByCode(heatModuleCode).setTrayStatus(false);//加热区托盘状态
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInHeatModule(false);//托盘状态
log.info("工艺{},将X轴移动至上料区托盘夹取点", heatModuleCode);
transferModuleService.transferXMove(feedAreaTrayPoint3D.getX());//将X轴移动至上料区托盘夹取点 + 进出卡槽移动距离
log.info("工艺{},Z轴下降至夹取点", heatModuleCode);
transferModuleService.transferZMove(feedAreaTrayPoint3D.getZ());//Z轴下降至夹取点使托盘落入石墨加热盘
log.info("工艺{},X轴进入卡槽", heatModuleCode);
transferModuleService.transferXMoveBy(transferModuleXPickTrayMoveDistance);//X轴进入卡槽
log.info("工艺{},Z轴抬升至最高", heatModuleCode);
transferModuleService.transferZMoveZero();//Z轴抬升至最高
log.info("工艺{},转运模组释放", heatModuleCode);
transferModuleService.releaseTransferModule();//转运模组释放
deviceStateService.getDeviceState().getTrayByHeatModuleCode(heatModuleCode).setInFeedArea(true);//托盘状态
deviceLightSoundService.openBeep(CmdBeepMode.info);
delay(2);
deviceLightSoundService.closeBeep();
} finally {
transferModuleService.releaseTransferModule();//转运模组释放
}
List<TrayState> trayList = deviceStateService.getDeviceState().getTrays();
trayList.removeIf((tray)->tray.getHeatModuleCode().equals(heatModuleCode));
}

10
src/main/java/com/iflytop/sgs/common/enums/SystemConfigCode.java

@ -7,11 +7,15 @@ import lombok.Getter;
*/
@Getter
public enum SystemConfigCode {
water("水加液系数"),
thick("浓硝酸加液系数"),
thin("稀硝酸加液系数"),
back_flow_distance("稀硝酸加液系数"),
pre_fill_distance("预充距离"),
drain_distance("排空距离"),
number_reduce("抽液时机蠕动泵的转数"),
cycle_clean_max("清洁最大次数"),
liquid_max_speed("蠕动泵最大转速"),
reduce_distance("过量抽液距离"),
cycle_clean_max("允许的最大清洁次数"),
liquid_max_speed("蠕动泵最大转速限制"),
ignore_door_self_test("忽略门自检"),
ignore_dual_robot_self_test("忽略加液升降自检"),

5
src/main/java/com/iflytop/sgs/common/enums/data/DevicePositionCode.java

@ -18,7 +18,10 @@ public enum DevicePositionCode {
transferModuleXPickTrayMoveDistance(DevicePositionType.DISTANCE, "转运模块X轴拿取托盘进出卡槽移动距离"),
////////////////位置
/**
* 加液模块电机下降进入试管加液位置
*/
solutionModuleMotorDownPreFillPositon(DevicePositionType.POSITION, "加液模块电机下降进入预充位置"),
/**
* 加液模块电机下降进入试管加液位置
*/

Loading…
Cancel
Save