19 changed files with 799 additions and 909 deletions
-
2src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java
-
11src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java
-
2src/main/java/a8k/service/app/devicedriver/basectrl/CodeScaner.java
-
208src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java
-
4src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java
-
4src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java
-
2src/main/java/a8k/service/app/devicedriver/basectrl/type/HbotRegIndex.java
-
2src/main/java/a8k/service/app/devicedriver/basectrl/type/PipetteRegIndex.java
-
4src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java
-
2src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java
-
19src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java
-
314src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java
-
2src/main/java/a8k/service/app/devicedriver/ctrl/PipetteGunCtrlService.java
-
6src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java
@ -1,4 +1,4 @@ |
|||||
package a8k.service.app.devicedriver.ctrl; |
|
||||
|
package a8k.service.app.devicedriver.basectrl; |
||||
|
|
||||
import a8k.hardware.A8kCanBusService; |
import a8k.hardware.A8kCanBusService; |
||||
import a8k.hardware.type.a8kcanprotocol.MId; |
import a8k.hardware.type.a8kcanprotocol.MId; |
@ -0,0 +1,208 @@ |
|||||
|
package a8k.service.app.devicedriver.basectrl; |
||||
|
|
||||
|
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; |
||||
|
import a8k.extapi_controler.utils.ExtApiTab; |
||||
|
import a8k.service.app.devicedriver.basectrl.type.PipetteRegIndex; |
||||
|
import a8k.type.exception.AppException; |
||||
|
import a8k.type.cfg.*; |
||||
|
import a8k.hardware.A8kCanBusService; |
||||
|
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
||||
|
import a8k.hardware.type.a8kcanprotocol.IOId; |
||||
|
import a8k.hardware.type.a8kcanprotocol.MId; |
||||
|
import a8k.hardware.type.regindex.RegIndex; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
/** |
||||
|
* Hbot控制服务 |
||||
|
*/ |
||||
|
@Component |
||||
|
@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) |
||||
|
public class HbotBaseMoveControlService { |
||||
|
static Logger logger = LoggerFactory.getLogger(HbotBaseMoveControlService.class); |
||||
|
|
||||
|
@Resource |
||||
|
A8kCanBusService canBus; |
||||
|
@Resource |
||||
|
PipetteCtrlModule pipetteCtrlModule; |
||||
|
@Resource |
||||
|
HbotModule hbotModule; |
||||
|
Integer ao = 20000; |
||||
|
|
||||
|
public void hbotMoveTo(Pos3d targetPos) throws AppException { |
||||
|
logger.info("hbotCheckAndMoveTo:{}", targetPos); |
||||
|
|
||||
|
// 检查盖板是否关闭 |
||||
|
if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
||||
|
throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); |
||||
|
} |
||||
|
|
||||
|
boolean zEnable = true; |
||||
|
boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; |
||||
|
|
||||
|
//检查Z轴是否使能,如果没有使能,使能并移动到零点 |
||||
|
if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { |
||||
|
pipetteCtrlModule.zMotorEnable(1); |
||||
|
pipetteCtrlModule.zMotorMoveZeroBlock(); |
||||
|
zEnable = false; |
||||
|
} |
||||
|
|
||||
|
//检查Z轴是否在零点 |
||||
|
if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { |
||||
|
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
||||
|
} |
||||
|
if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { |
||||
|
throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); |
||||
|
} |
||||
|
|
||||
|
// HBot移动 |
||||
|
hbotModule.enable(1); |
||||
|
hbotModule.moveToBlock(targetPos.x - 20, targetPos.y - 20, ao); |
||||
|
hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); |
||||
|
hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); |
||||
|
|
||||
|
// Z轴移动 |
||||
|
if (targetPos.z != 0) { |
||||
|
pipetteCtrlModule.zMotorEnable(1); |
||||
|
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
||||
|
pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); |
||||
|
} |
||||
|
pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); |
||||
|
hbotModule.enable(hbotEnable ? 1 : 0); |
||||
|
} |
||||
|
|
||||
|
public void hbotMoveTo(Pos2d tpos) throws AppException { |
||||
|
hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); |
||||
|
} |
||||
|
|
||||
|
// public String scan2dCode(Integer waittime) throws AppException { |
||||
|
// try { |
||||
|
// canBus.codeScanerStartScan(MId.PipetteModCodeScanner); |
||||
|
// String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); |
||||
|
// canBus.codeScanerStopScan(MId.PipetteModCodeScanner); |
||||
|
// return result; |
||||
|
// } catch (AppException e) { |
||||
|
// return ""; |
||||
|
// } |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// public void zMoveTo(Integer z) throws AppException { |
||||
|
// if (z == 0) { |
||||
|
// pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
||||
|
// } else { |
||||
|
// pipetteCtrlModule.zMotorMoveToBlock(z); |
||||
|
// } |
||||
|
// } |
||||
|
// |
||||
|
// private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { |
||||
|
// hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); |
||||
|
// } |
||||
|
|
||||
|
// private void modGroupMoveToZero() throws AppException { |
||||
|
// if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
||||
|
// throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); |
||||
|
// } |
||||
|
// |
||||
|
// pipetteCtrlModule.zMotorEnable(1); |
||||
|
// hbotModule.enable(1); |
||||
|
// |
||||
|
// hbotModule.moveToZeroBlock(timep.getHbotRuntoZeroActionOvertime()); |
||||
|
// |
||||
|
// // 丢弃tip |
||||
|
// Pos3d dropPos = pp.getTipDropPos(); |
||||
|
// hbotMoveTo(dropPos); |
||||
|
// // TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); |
||||
|
// |
||||
|
// // 快速归零 |
||||
|
// modGroupMoveToZeroQuick(); |
||||
|
// } |
||||
|
|
||||
|
// private void modGroupMoveToZeroQuick() throws AppException { |
||||
|
// hbotCheckAndMoveTo(new Pos2d(0, 0)); |
||||
|
// } |
||||
|
|
||||
|
|
||||
|
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||
|
// 单步测试 |
||||
|
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||
|
|
||||
|
// @ExtApiFn(name = "丢Tip", group = "单步测试") |
||||
|
// public void dropTip() throws AppException { |
||||
|
// Pos3d pos = pp.getTipDropPos(); |
||||
|
// hbotMoveTo(pos.x, pos.y); |
||||
|
// zMoveTo(pos.z); |
||||
|
// pipetteCtrlModule.putTipBlock(); |
||||
|
// zMoveTo(0); |
||||
|
// } |
||||
|
// |
||||
|
// @ExtApiFn(name = "取Tip", group = "单步测试") |
||||
|
// public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { |
||||
|
// logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); |
||||
|
// |
||||
|
// if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { |
||||
|
// throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
||||
|
// } |
||||
|
// |
||||
|
// TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); |
||||
|
// Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); |
||||
|
// hbotMoveTo(pos.x, pos.y); |
||||
|
// |
||||
|
// //TODO: 补偿,group大于1时,z轴需要补偿0.2mm |
||||
|
// Integer zCompensate = 0; |
||||
|
// if (tipGroup.ordinal() > 1) { |
||||
|
// zCompensate = 2; |
||||
|
// } |
||||
|
// |
||||
|
// pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); |
||||
|
// pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
||||
|
// |
||||
|
// Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; |
||||
|
// if (!isGetTip) { |
||||
|
// logger.error("takeTip fail"); |
||||
|
// } |
||||
|
// return isGetTip; |
||||
|
// } |
||||
|
|
||||
|
// @ExtApiFn(name = "HBot移动到", group = "单步测试") |
||||
|
// public void hbotMoveTo(Integer x, Integer y) throws AppException { |
||||
|
// hbotCheckAndMoveTo(new Pos2d(x, y)); |
||||
|
// } |
||||
|
|
||||
|
// @ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") |
||||
|
// public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) |
||||
|
// throws AppException { |
||||
|
// BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); |
||||
|
// if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { |
||||
|
// throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
||||
|
// } |
||||
|
// Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); |
||||
|
// hbotCheckAndMoveTo(pos); |
||||
|
// } |
||||
|
// |
||||
|
// @ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") |
||||
|
// public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) |
||||
|
// throws AppException { |
||||
|
// BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); |
||||
|
// if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { |
||||
|
// throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
||||
|
// } |
||||
|
// Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); |
||||
|
// hbotCheckAndMoveTo(pos); |
||||
|
// } |
||||
|
// |
||||
|
// @ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") |
||||
|
// public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { |
||||
|
// LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); |
||||
|
// Pos2d pos = posInfo.cgetBottlePos(ch.off); |
||||
|
// hbotCheckAndMoveTo(pos); |
||||
|
// } |
||||
|
// |
||||
|
// @ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") |
||||
|
// public void hbotMoveToEmergencyPos() throws AppException { |
||||
|
// hbotMoveTo(pp.getEmergencyPos()); |
||||
|
// } |
||||
|
|
||||
|
} |
@ -1,9 +1,9 @@ |
|||||
package a8k.service.app.devicedriver.ctrl.basic; |
|
||||
|
package a8k.service.app.devicedriver.basectrl; |
||||
|
|
||||
import a8k.hardware.A8kCanBusService; |
import a8k.hardware.A8kCanBusService; |
||||
import a8k.hardware.type.a8kcanprotocol.CmdId; |
import a8k.hardware.type.a8kcanprotocol.CmdId; |
||||
import a8k.hardware.type.a8kcanprotocol.MId; |
import a8k.hardware.type.a8kcanprotocol.MId; |
||||
import a8k.service.app.devicedriver.ctrl.type.HbotRegIndex; |
|
||||
|
import a8k.service.app.devicedriver.basectrl.type.HbotRegIndex; |
||||
import a8k.type.cfg.Pos2d; |
import a8k.type.cfg.Pos2d; |
||||
import a8k.type.exception.AppException; |
import a8k.type.exception.AppException; |
||||
import jakarta.annotation.Resource; |
import jakarta.annotation.Resource; |
@ -1,4 +1,4 @@ |
|||||
package a8k.service.app.devicedriver.ctrl.type; |
|
||||
|
package a8k.service.app.devicedriver.basectrl.type; |
||||
|
|
||||
import a8k.hardware.type.regindex.RegIndex; |
import a8k.hardware.type.regindex.RegIndex; |
||||
|
|
@ -1,4 +1,4 @@ |
|||||
package a8k.service.app.devicedriver.ctrl.type; |
|
||||
|
package a8k.service.app.devicedriver.basectrl.type; |
||||
|
|
||||
public enum PipetteRegIndex { |
public enum PipetteRegIndex { |
||||
kreg_module_version(0), // 模块版本 |
kreg_module_version(0), // 模块版本 |
@ -1,314 +0,0 @@ |
|||||
package a8k.service.app.devicedriver.ctrl; |
|
||||
|
|
||||
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; |
|
||||
import a8k.extapi_controler.utils.ExtApiFn; |
|
||||
import a8k.extapi_controler.utils.ExtApiTab; |
|
||||
import a8k.service.app.devicedriver.ctrl.basic.PipetteCtrlModule; |
|
||||
import a8k.service.app.devicedriver.ctrl.basic.HbotModule; |
|
||||
import a8k.service.app.devicedriver.ctrl.type.PipetteRegIndex; |
|
||||
import a8k.service.app.devicedriver.param.PosParam; |
|
||||
import a8k.service.app.devicedriver.param.TimeParam; |
|
||||
import a8k.type.ConsumableGroup; |
|
||||
import a8k.type.exception.AppException; |
|
||||
import a8k.type.cfg.*; |
|
||||
import a8k.hardware.A8kCanBusService; |
|
||||
import a8k.hardware.type.a8kcanprotocol.A8kEcode; |
|
||||
import a8k.hardware.type.a8kcanprotocol.IOId; |
|
||||
import a8k.hardware.type.a8kcanprotocol.MId; |
|
||||
import a8k.hardware.type.regindex.RegIndex; |
|
||||
import a8k.type.type.TipGroup; |
|
||||
import jakarta.annotation.Resource; |
|
||||
import org.slf4j.Logger; |
|
||||
import org.slf4j.LoggerFactory; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
/** |
|
||||
* Hbot控制服务 |
|
||||
*/ |
|
||||
@Component |
|
||||
@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) |
|
||||
public class HbotControlService { |
|
||||
static Logger logger = LoggerFactory.getLogger(HbotControlService.class); |
|
||||
|
|
||||
@Resource |
|
||||
A8kCanBusService canBus; |
|
||||
|
|
||||
@Resource |
|
||||
PipetteCtrlModule pipetteCtrlModule; |
|
||||
|
|
||||
@Resource |
|
||||
HbotModule hbotModule; |
|
||||
|
|
||||
@Resource |
|
||||
PosParam pp; |
|
||||
|
|
||||
@Resource |
|
||||
TimeParam timep; |
|
||||
|
|
||||
Integer ao = 20000; |
|
||||
|
|
||||
|
|
||||
public void hbotMoveTo(Pos3d targetPos) throws AppException { |
|
||||
logger.info("hbotCheckAndMoveTo:{}", targetPos); |
|
||||
|
|
||||
// 检查盖板是否关闭 |
|
||||
if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
|
||||
throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); |
|
||||
} |
|
||||
|
|
||||
boolean zEnable = true; |
|
||||
boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; |
|
||||
|
|
||||
//检查Z轴是否使能,如果没有使能,使能并移动到零点 |
|
||||
if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { |
|
||||
pipetteCtrlModule.zMotorEnable(1); |
|
||||
pipetteCtrlModule.zMotorMoveZeroBlock(); |
|
||||
zEnable = false; |
|
||||
} |
|
||||
|
|
||||
//检查Z轴是否在零点 |
|
||||
if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { |
|
||||
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
|
||||
} |
|
||||
if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { |
|
||||
throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); |
|
||||
} |
|
||||
|
|
||||
// HBot移动 |
|
||||
hbotModule.enable( 1); |
|
||||
hbotModule.moveToBlock( targetPos.x - 20, targetPos.y - 20, ao); |
|
||||
hbotModule.moveToBlock( targetPos.x, targetPos.y, ao); |
|
||||
hbotModule.moveToBlock( targetPos.x, targetPos.y, ao); |
|
||||
|
|
||||
// Z轴移动 |
|
||||
if (targetPos.z != 0) { |
|
||||
pipetteCtrlModule.zMotorEnable(1); |
|
||||
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
|
||||
pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); |
|
||||
} |
|
||||
pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); |
|
||||
hbotModule.enable( hbotEnable ? 1 : 0); |
|
||||
} |
|
||||
|
|
||||
public void hbotMoveTo(Pos2d tpos) throws AppException { |
|
||||
hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); |
|
||||
} |
|
||||
|
|
||||
public String scan2dCode(Integer waittime) throws AppException { |
|
||||
try { |
|
||||
canBus.codeScanerStartScan(MId.PipetteModCodeScanner); |
|
||||
String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); |
|
||||
canBus.codeScanerStopScan(MId.PipetteModCodeScanner); |
|
||||
return result; |
|
||||
} catch (AppException e) { |
|
||||
return ""; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// |
|
||||
// public Integer getGripperZeroYPos() { |
|
||||
// 之所以这样写,是因为是为了放置两个类之间的循环依赖 |
|
||||
// assert appCxt != null; |
|
||||
// TODO |
|
||||
// return |
|
||||
// appCxt.getBean(SamplesPreProcessModuleCtrlService.class).getGripperZeroYPos(); |
|
||||
// return 0; |
|
||||
// } |
|
||||
|
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
// 基础控制 |
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
|
|
||||
|
|
||||
public void zMoveTo(Integer z) throws AppException { |
|
||||
if (z == 0) { |
|
||||
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
|
||||
} else { |
|
||||
pipetteCtrlModule.zMotorMoveToBlock(z); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { |
|
||||
hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); |
|
||||
} |
|
||||
|
|
||||
private void modGroupMoveToZero() throws AppException { |
|
||||
if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
|
||||
throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); |
|
||||
} |
|
||||
|
|
||||
pipetteCtrlModule.zMotorEnable(1); |
|
||||
hbotModule.enable( 1); |
|
||||
|
|
||||
hbotModule.moveToZeroBlock( timep.getHbotRuntoZeroActionOvertime()); |
|
||||
|
|
||||
// 丢弃tip |
|
||||
Pos3d dropPos = pp.getTipDropPos(); |
|
||||
hbotMoveTo(dropPos); |
|
||||
// TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); |
|
||||
|
|
||||
// 快速归零 |
|
||||
modGroupMoveToZeroQuick(); |
|
||||
} |
|
||||
|
|
||||
private void modGroupMoveToZeroQuick() throws AppException { |
|
||||
hbotCheckAndMoveTo(new Pos2d(0, 0)); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
// 单步测试 |
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
|
|
||||
@ExtApiFn(name = "丢Tip", group = "单步测试") |
|
||||
public void dropTip() throws AppException { |
|
||||
Pos3d pos = pp.getTipDropPos(); |
|
||||
hbotMoveTo(pos.x, pos.y); |
|
||||
zMoveTo(pos.z); |
|
||||
pipetteCtrlModule.putTipBlock(); |
|
||||
zMoveTo(0); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "取Tip", group = "单步测试") |
|
||||
public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { |
|
||||
logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); |
|
||||
|
|
||||
if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { |
|
||||
throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
|
||||
} |
|
||||
|
|
||||
TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); |
|
||||
Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); |
|
||||
hbotMoveTo(pos.x, pos.y); |
|
||||
|
|
||||
//TODO: 补偿,group大于1时,z轴需要补偿0.2mm |
|
||||
Integer zCompensate = 0; |
|
||||
if (tipGroup.ordinal() > 1) { |
|
||||
zCompensate = 2; |
|
||||
} |
|
||||
|
|
||||
pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); |
|
||||
pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); |
|
||||
|
|
||||
Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; |
|
||||
if (!isGetTip) { |
|
||||
logger.error("takeTip fail"); |
|
||||
} |
|
||||
return isGetTip; |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "HBot移动到", group = "单步测试") |
|
||||
public void hbotMoveTo(Integer x, Integer y) throws AppException { |
|
||||
hbotCheckAndMoveTo(new Pos2d(x, y)); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") |
|
||||
public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) |
|
||||
throws AppException { |
|
||||
BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); |
|
||||
if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { |
|
||||
throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
|
||||
} |
|
||||
Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); |
|
||||
hbotCheckAndMoveTo(pos); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") |
|
||||
public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) |
|
||||
throws AppException { |
|
||||
BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); |
|
||||
if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { |
|
||||
throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); |
|
||||
} |
|
||||
Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); |
|
||||
hbotCheckAndMoveTo(pos); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") |
|
||||
public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { |
|
||||
LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); |
|
||||
Pos2d pos = posInfo.cgetBottlePos(ch.off); |
|
||||
hbotCheckAndMoveTo(pos); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") |
|
||||
public void hbotMoveToEmergencyPos() throws AppException { |
|
||||
hbotMoveTo(pp.getEmergencyPos()); |
|
||||
} |
|
||||
|
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
// 坐标获取工具 |
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
|
|
||||
@ExtApiFn(name = "Hbot使能", group = "坐标获取工具") |
|
||||
public void hBotEnable() throws AppException { |
|
||||
hbotModule.enable( 1); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "Hbot失能", group = "坐标获取工具") |
|
||||
public void hBotDisable() throws AppException { |
|
||||
hbotModule.enable(0); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "Z轴使能", group = "坐标获取工具") |
|
||||
public void zAxisEnable() throws AppException { |
|
||||
pipetteCtrlModule.zMotorEnable(1); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "Z轴失能", group = "坐标获取工具") |
|
||||
public void zAxisDisable() throws AppException { |
|
||||
pipetteCtrlModule.zMotorEnable(0); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "归零读取Z轴坐标", group = "坐标获取工具") |
|
||||
public Integer readZAxisPosByMoveToZero() throws AppException { |
|
||||
pipetteCtrlModule.zMotorMeasureDistance(); |
|
||||
return pipetteCtrlModule.zMotorReadMeasureDistanceResult(); |
|
||||
} |
|
||||
|
|
||||
@ExtApiFn(name = "打开扫码器", group = "坐标获取工具") |
|
||||
public void openCodeScaner(Boolean power) throws AppException { |
|
||||
if (power) { |
|
||||
canBus.codeScanerStartScan(MId.PipetteModCodeScanner); |
|
||||
} else { |
|
||||
canBus.codeScanerStopScan(MId.PipetteModCodeScanner); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
Pos2d hbotRefPos = new Pos2d(0, 0); |
|
||||
|
|
||||
@ExtApiFn(name = "设置HBOT参考坐标", group = "坐标获取工具") |
|
||||
public void setHbotRefPos(Integer x, Integer y) throws AppException { |
|
||||
hbotRefPos.x = x; |
|
||||
hbotRefPos.y = y; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
// hbot取样品 |
|
||||
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
||||
|
|
||||
public Boolean getXPPS() throws AppException { |
|
||||
return hbotModule.readInIO(0); |
|
||||
} |
|
||||
|
|
||||
public Boolean getYPPS() throws AppException { |
|
||||
return hbotModule.readInIO(1); |
|
||||
} |
|
||||
|
|
||||
public Boolean getTipPPS() throws AppException { |
|
||||
return canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; |
|
||||
} |
|
||||
|
|
||||
public String getPos() throws AppException { |
|
||||
Pos2d pos = hbotModule.readPos(); |
|
||||
return pos.toString(); |
|
||||
} |
|
||||
|
|
||||
// public String getHbotRelaPos() throws AppException { |
|
||||
// Pos2d pos = hbotModule.hbotReadPos(MId.HbotM); |
|
||||
// pos.x -= hbotRefPos.x; |
|
||||
// pos.y -= hbotRefPos.y; |
|
||||
// return pos.toString(); |
|
||||
// } |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue