26 changed files with 594 additions and 388 deletions
-
17src/main/java/a8k/app/engineer/service/qatest/ExperimentConsistencyTestingService.java
-
6src/main/java/a8k/app/engineer/service/qatest/LiquidAbsorptionAndDistributionTestService.java
-
42src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java
-
11src/main/java/a8k/app/hardware/type/pipette_module/DistribuType.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cfg/PipetteCommonConfigIndex.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cfgbean/PipetteCommonConfig.java
-
1src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/ContainerCpyId.java
-
2src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/LiquidConfigCpyIdx.java
-
22src/main/java/a8k/app/hardware/type/pipette_module/cpyidx/PlatInfoCpyIdx.java
-
32src/main/java/a8k/app/hardware/type/pipette_module/param/AspirationParam.java
-
25src/main/java/a8k/app/hardware/type/pipette_module/param/DistribuAllParam.java
-
8src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java
-
22src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java
-
269src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java
-
5src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java
-
22src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java
-
383src/main/java/a8k/app/service/module/LiquidOperationCtrlModule.java
-
18src/main/java/a8k/app/service/module/TipMgrModule.java
-
4src/main/java/a8k/app/service/param/exparam/HbotConsumableExParamMgr.java
-
12src/main/java/a8k/app/service/param/hbotpos/HbotLittleBSPosMgr.java
-
4src/main/java/a8k/app/service/param/hbotpos/HbotProbeSubstancePosMgr.java
-
2src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java
-
8src/main/java/a8k/extui/page/driver/pipette_module/PipetteGunCommonConfigPage.java
-
12src/main/java/a8k/extui/page/driver/pipette_module/PipetteGunOperationCtrlPage.java
-
2src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java
-
51src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java
@ -0,0 +1,11 @@ |
|||
package a8k.app.hardware.type.pipette_module; |
|||
|
|||
public enum DistribuType { |
|||
JET_DIST, //液面上分配 |
|||
SURFACE_DIST, //液体表面分配 |
|||
; |
|||
|
|||
public Integer toInteger() { |
|||
return this.ordinal(); |
|||
} |
|||
} |
@ -1,269 +0,0 @@ |
|||
package a8k.app.service.lowerctrl; |
|||
|
|||
|
|||
import a8k.app.dao.type.combination.ProjBuildinInfo; |
|||
import a8k.app.dao.type.db.ProjExtInfoCard; |
|||
import a8k.app.hardware.driver.PipetteCtrlDriverV2; |
|||
import a8k.app.hardware.type.A8kEcode; |
|||
import a8k.app.service.param.exparam.HbotConsumableExParamMgr; |
|||
import a8k.app.service.param.hbotpos.HbotSamplePosParamMgr; |
|||
import a8k.app.service.statemgr.ConsumablesMgrService; |
|||
import a8k.app.service.statemgr.GStateMgrService; |
|||
import a8k.app.service.utils.ZAppChecker; |
|||
import a8k.app.type.DeviceRunMode; |
|||
import a8k.app.type.JudgeFn; |
|||
import a8k.app.type.a8k.ConsumableType; |
|||
import a8k.app.type.a8k.Pos3d; |
|||
import a8k.app.type.a8k.pos.LargeBufferPos; |
|||
import a8k.app.type.a8k.pos.PreReactionPos; |
|||
import a8k.app.type.a8k.pos.TipGroupPos; |
|||
import a8k.app.type.a8k.pos.TipPos; |
|||
import a8k.app.type.exception.AppException; |
|||
import a8k.app.type.param.type.A8kSamplePos; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@Slf4j |
|||
@RequiredArgsConstructor |
|||
public class LiquidOperationCtrlService { |
|||
static public final Integer MIX_VOLUME_UL = 200; |
|||
|
|||
|
|||
private final GStateMgrService gstate; |
|||
|
|||
/* |
|||
* CTRL-SERVICE |
|||
*/ |
|||
private final HbotMoveExCtrlService hbotMoveExCtrlService; |
|||
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; |
|||
|
|||
/* |
|||
* PARAM-MGR |
|||
*/ |
|||
private final HbotConsumableExParamMgr hbotConsumableExParamMgr; |
|||
/** |
|||
* StateMgr |
|||
*/ |
|||
private final ConsumablesMgrService consumablesMgrService; |
|||
private final HbotSamplePosParamMgr hbotSamplePosParamMgr; |
|||
|
|||
|
|||
ProjBuildinInfo projBuildinInfo; |
|||
ProjExtInfoCard projExtInfo; |
|||
|
|||
|
|||
synchronized public void setProjContext(ProjBuildinInfo projBuildinInfo, ProjExtInfoCard projExtInfo) { |
|||
this.projBuildinInfo = projBuildinInfo; |
|||
this.projExtInfo = projExtInfo; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取大瓶缓冲液到探测物质位置 |
|||
* @param from 大瓶缓冲液 |
|||
* @param topos 探测物质位置 |
|||
* @param ul 吸取量 |
|||
*/ |
|||
public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, PreReactionPos topos, Integer ul) throws AppException { |
|||
// 取TIP |
|||
// forceTakeTip(); |
|||
|
|||
// 检查是否有TIP |
|||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|||
// Pos3d largeBottleEndPos = hbotConsumableExParamMgr.getLargeBufferSamplePosEnd(from.group); |
|||
// Pos3d largeBottlePos = hbotConsumableExParamMgr.getLargeBufferSamplePos(from.group); |
|||
Integer liquidLevel = 0; |
|||
|
|||
|
|||
// |
|||
// 刺破探测物质 |
|||
// |
|||
Pos3d piercePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(topos.group, topos.index); |
|||
hbotMoveExCtrlService.moveTo(piercePos); |
|||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
|
|||
|
|||
// |
|||
// 移动到取样位 |
|||
// |
|||
// hbotMoveExCtrlService.moveToXY(largeBottlePos); |
|||
|
|||
// |
|||
//取样 |
|||
// |
|||
//清空tip中的液体和空气,同时预先吸入部分空气,以便后续清空由于lld吸入的液体,提高lld的准确性 |
|||
{ |
|||
//TODO: 取样 |
|||
|
|||
} |
|||
// lddprepare(); |
|||
// ldd(largeBottlePos.z, largeBottleEndPos.z, LLD_P_THRESHOLD); |
|||
// if (!pipetteCtrlDriverV2.lldIsDetectLiquid() && gstate.isInMode(DeviceRunMode.RealMode)) { |
|||
// throw AppException.of(A8kEcode.APPE_TAKE_LARGE_BUFFER_LIQUID_FAIL); |
|||
// } |
|||
// liquidLevel = pipetteCtrlDriverV2.getReg(PipetteRegIndex.kreg_pipette_zm_pos); |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
// pumpMoveTo(8000, 0.0); |
|||
// |
|||
// // |
|||
// //取样 |
|||
// // |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(liquidLevel); |
|||
// if (ul < 100) { |
|||
// pumpMoveTo(8000, 50.0);//预先吸入部分空气 |
|||
// } else { |
|||
// pumpMoveTo(8000, 25.0);//预先吸入部分空气 |
|||
// } |
|||
// |
|||
// aspirate(largeBottleEndPos.z, pipetteGunExParamMgr.getLargeBSBottleLlfVel(), ul * 1.0); |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
|
|||
// |
|||
// 移动到探测物质的位置 |
|||
// |
|||
Pos3d toCPos = hbotConsumableExParamMgr.getProbeSubstanceSamplePos(topos.group, topos.index); |
|||
hbotMoveExCtrlService.moveTo(toCPos); |
|||
// pumpMoveTo(8000, 0.0); |
|||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
|
|||
// |
|||
// 丢弃TIP |
|||
// |
|||
hbotMoveExCtrlService.initPipetterGun(); |
|||
hbotMoveExCtrlService.moveQuickToZero(); |
|||
} |
|||
|
|||
private Pos3d getPreReactionPos(PreReactionPos pos) { |
|||
Pos3d toCPos = null; |
|||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|||
toCPos = hbotConsumableExParamMgr.getProbeSubstanceSamplePos(pos.group, pos.index); |
|||
} else { |
|||
toCPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
|||
} |
|||
return toCPos; |
|||
} |
|||
|
|||
/** |
|||
* 取样本 |
|||
* @param from 样本位置 |
|||
* @param ul 吸取量 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takeSampleOnly(A8kSamplePos from, Integer ul) throws AppException { |
|||
log.info("takeSampleOnly: from={},ul={}ul", from, ul); |
|||
|
|||
// 取TIP |
|||
// forceTakeTip(); |
|||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|||
|
|||
// |
|||
// 取样位 |
|||
// |
|||
|
|||
// 取样 |
|||
// Pos3d sampleStartPos = hbotSamplePosParamMgr.getSampleStartPos(from); |
|||
// Integer sampleEndZPos = hbotSamplePosParamMgr.getSampleEndPos(from); |
|||
Integer liquidLevel = 0; |
|||
// 移动到取样位 |
|||
// hbotMoveExCtrlService.moveToXY(sampleStartPos); |
|||
|
|||
//TODO:取样 |
|||
{ |
|||
|
|||
} |
|||
//lld |
|||
//清空tip中的液体和空气,同时预先吸入部分空气,以便后续清空由于lld吸入的液体,提高lld的准确性 |
|||
// lddprepare(); |
|||
// ldd(sampleStartPos.z, sampleEndZPos, LLD_P_THRESHOLD); |
|||
// if (!pipetteCtrlDriverV2.lldIsDetectLiquid() && gstate.isInMode(DeviceRunMode.RealMode)) { |
|||
// throw AppException.of(A8kEcode.APPE_TAKE_SAMPLE_FAIL); |
|||
// } |
|||
// |
|||
// //获取当前液面高度 |
|||
// liquidLevel = pipetteCtrlDriverV2.getReg(PipetteRegIndex.kreg_pipette_zm_pos); |
|||
// liquidLevel += 10;//保证液面高度 |
|||
// |
|||
// //取样准备 |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(sampleStartPos.z); //回到0 |
|||
// pumpMoveTo(8000, 0.0); //排空 |
|||
// pumpMoveTo(PRE_ASPIRATE_PUMP_VMAX, ASPIRATE_PRE_TAKE); //预先吸入部分空气 |
|||
// |
|||
// //取样 |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(liquidLevel); |
|||
// aspirate(sampleEndZPos, pipetteGunExParamMgr.getSampleLLFVel(ul * 1.0, from), ul * 1.0); |
|||
// pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取样本到探测物质 |
|||
* @param from 样本位置 |
|||
* @param pos 预先反应位置P |
|||
* @param ul 吸取量 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takeSample(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
|||
log.info("takeSampleToPreReactionPos: from={}, pos={}, ul={}ul", from, pos, ul); |
|||
|
|||
takeSampleOnly(from, ul); |
|||
|
|||
|
|||
// |
|||
// 移动到反应位 |
|||
// |
|||
log.info("move to pre reaction pos: {}", pos); |
|||
hbotMoveExCtrlService.moveTo(getPreReactionPos(pos)); |
|||
|
|||
Integer shakeUl = MIX_VOLUME_UL; |
|||
Integer shakeTimes = 5; |
|||
if (projBuildinInfo != null) { |
|||
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
|||
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
|||
} |
|||
//TODO: 吐样&&摇匀 |
|||
{ |
|||
|
|||
} |
|||
|
|||
//z轴回0 |
|||
pipetteCtrlDriverV2.zMotorMoveToZeroPointQuickBlock(); |
|||
} |
|||
|
|||
public void pirceLittleBuffer(PreReactionPos pos) throws AppException { |
|||
// forceTakeTip(); |
|||
|
|||
hbotMoveExCtrlService.moveToLittleBufferPiercePos(pos.group, pos.index); |
|||
pipetteCtrlDriverV2.zMotorMoveToBlock(0); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取反应液到反应板上 |
|||
* @param pos 反应板位置 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takePreReactionLiquidToReation(PreReactionPos pos) throws AppException { |
|||
log.info("takePreReactionLiquidToReactionPos: from pos={}", pos); |
|||
// forceTakeTip(); |
|||
// Pos3d reactionPos = getPreReactionPos(pos); |
|||
// |
|||
// hbotMoveExCtrlService.moveToXY(reactionPos); |
|||
// pipetteCtrlDriverV2.zMotorMoveByBlock(0); |
|||
// makeReserveAir(100); |
|||
// |
|||
// hbotMoveExCtrlService.moveToZ(reactionPos); |
|||
// aspirate(reactionPos.z, 0, (double) REACTION_VOLUME_UL); |
|||
// |
|||
// hbotMoveExCtrlService.moveToDropLiquidPos(); |
|||
// pumpMoveTo(8000, 0.0); |
|||
// |
|||
// hbotMoveExCtrlService.initPipetterGun(); |
|||
// hbotMoveExCtrlService.moveQuickToZero(); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,383 @@ |
|||
package a8k.app.service.module; |
|||
|
|||
|
|||
import a8k.app.dao.type.combination.ProjBuildinInfo; |
|||
import a8k.app.dao.type.db.ProjExtInfoCard; |
|||
import a8k.app.hardware.driver.PipetteCtrlDriverV2; |
|||
import a8k.app.hardware.type.A8kEcode; |
|||
import a8k.app.hardware.type.pipette_module.DistribuType; |
|||
import a8k.app.hardware.type.pipette_module.cpyidx.ContainerCpyId; |
|||
import a8k.app.hardware.type.pipette_module.cpyidx.LiquidConfigCpyIdx; |
|||
import a8k.app.hardware.type.pipette_module.param.AspirationParam; |
|||
import a8k.app.hardware.type.pipette_module.param.DistribuAllParam; |
|||
import a8k.app.service.lowerctrl.HbotMoveExCtrlService; |
|||
import a8k.app.service.param.exparam.HbotConsumableExParamMgr; |
|||
import a8k.app.service.param.hbotpos.HbotFixedPosParamMgr; |
|||
import a8k.app.service.param.hbotpos.HbotSamplePosParamMgr; |
|||
import a8k.app.service.statemgr.ConsumablesMgrService; |
|||
import a8k.app.service.statemgr.GStateMgrService; |
|||
import a8k.app.service.utils.UISender; |
|||
import a8k.app.service.utils.ZAppChecker; |
|||
import a8k.app.type.a8k.ConsumableType; |
|||
import a8k.app.type.a8k.Pos3d; |
|||
import a8k.app.type.a8k.pos.LargeBufferPos; |
|||
import a8k.app.type.a8k.pos.PreReactionPos; |
|||
import a8k.app.type.exception.AppException; |
|||
import a8k.app.type.param.type.A8kSamplePos; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@Slf4j |
|||
@RequiredArgsConstructor |
|||
public class LiquidOperationCtrlModule { |
|||
static public final Integer MIX_VOLUME_UL = 200; |
|||
|
|||
|
|||
private final GStateMgrService gstate; |
|||
|
|||
/* |
|||
* CTRL-SERVICE |
|||
*/ |
|||
private final HbotMoveExCtrlService hbotMoveExCtrlService; |
|||
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; |
|||
|
|||
/* |
|||
* PARAM-MGR |
|||
*/ |
|||
private final HbotConsumableExParamMgr hbotConsumableExParamMgr; |
|||
/** |
|||
* StateMgr |
|||
*/ |
|||
private final ConsumablesMgrService consumablesMgrService; |
|||
private final HbotSamplePosParamMgr hbotSamplePosParamMgr; |
|||
private final HbotFixedPosParamMgr hbotFixedPosParamMgr; |
|||
|
|||
private final TipMgrModule tipMgrModule; |
|||
|
|||
|
|||
ProjBuildinInfo projBuildinInfo; |
|||
ProjExtInfoCard projExtInfo; |
|||
|
|||
|
|||
synchronized public void setProjContext(ProjBuildinInfo projBuildinInfo, ProjExtInfoCard projExtInfo) { |
|||
this.projBuildinInfo = projBuildinInfo; |
|||
this.projExtInfo = projExtInfo; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取大瓶缓冲液到探测物质位置 |
|||
* @param from 大瓶缓冲液 |
|||
* @param topos 探测物质位置 |
|||
* @param ul 吸取量 |
|||
*/ |
|||
public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, PreReactionPos topos, Integer ul) throws AppException { |
|||
// 取TIP |
|||
tipMgrModule.tryTakeTip(); |
|||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|||
|
|||
Pos3d largeBSContainerPos = hbotConsumableExParamMgr.getLargeBuffer(from.group);//大瓶缓冲液位置 |
|||
Pos3d probeSubstanceContainerPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(topos.group, topos.index);//探测物质位置 |
|||
Pos3d probeSubstancePiercePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(topos.group, topos.index);//探测物质刺破位置 |
|||
|
|||
|
|||
// 刺破探测物质 |
|||
UISender.txInfoMsg(log, "刺破探测物质:%s" + topos); |
|||
hbotMoveExCtrlService.moveToXY(probeSubstancePiercePos); |
|||
pipetteCtrlDriverV2.pierceThroughBlock(ContainerCpyId.DetectSubstancesCup, probeSubstanceContainerPos.z); |
|||
|
|||
// 移动到取样位 && 取样 |
|||
UISender.txInfoMsg(log, "移动到大瓶缓冲液位置:%s", largeBSContainerPos); |
|||
hbotMoveExCtrlService.moveToXY(largeBSContainerPos); |
|||
// 预吸取 |
|||
UISender.txInfoMsg(log, "预吸取大瓶缓冲液:%dul", ul); |
|||
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
|||
ul * 10, |
|||
largeBSContainerPos.z, |
|||
ContainerCpyId.LargeBufferCup, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
0, |
|||
1, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0 |
|||
)); |
|||
|
|||
// 移动到探测物质位置,吐液 |
|||
|
|||
|
|||
// 移动到取样位 |
|||
UISender.txInfoMsg(log, "移动到探测物质位置:%s", probeSubstanceContainerPos); |
|||
hbotMoveExCtrlService.moveToXY(probeSubstanceContainerPos); |
|||
// 吐液 |
|||
UISender.txInfoMsg(log, "吐液到探测物质位置:%dul", ul); |
|||
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
|||
probeSubstanceContainerPos.z, |
|||
ContainerCpyId.DetectSubstancesCup, |
|||
LiquidConfigCpyIdx.NotSet, |
|||
true, |
|||
DistribuType.JET_DIST, |
|||
0, |
|||
0, |
|||
true |
|||
)); |
|||
// 丢弃TIP |
|||
UISender.txInfoMsg(log, "丢弃TIP"); |
|||
tipMgrModule.dropTip(); |
|||
|
|||
hbotMoveExCtrlService.moveQuickToZero(); |
|||
} |
|||
|
|||
|
|||
ContainerCpyId a8kSamplePosToContainerCpyId(A8kSamplePos a8kSamplePos) { |
|||
return switch (a8kSamplePos) { |
|||
case EmergencyTubePos, BloodSTubePos -> ContainerCpyId.ShortWholeBufferTube; |
|||
case BloodHTubePos -> ContainerCpyId.HighWholeBufferTube; |
|||
case MiniBloodPos -> ContainerCpyId.MiniBlood; |
|||
case Bulltube1P5Pos -> ContainerCpyId.BulletTube1P5; |
|||
case Bulltube0P5Pos -> ContainerCpyId.BulletTube0P5; |
|||
case StoolTestTubePos -> ContainerCpyId.StoolTestTube; |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* 取样本 |
|||
* @param from 样本位置 |
|||
* @param ul 吸取量 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takeSampleOnly(A8kSamplePos from, Integer ul) throws AppException { |
|||
log.info("takeSampleOnly: from={},ul={}ul", from, ul); |
|||
|
|||
Pos3d sampleContainerPos = hbotSamplePosParamMgr.getSampleContainerPos(from);//样本位置 |
|||
|
|||
|
|||
// 取TIP |
|||
tipMgrModule.tryTakeTip(); |
|||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|||
|
|||
//移动到取样位 |
|||
UISender.txInfoMsg(log, "移动到样本位置:%s", sampleContainerPos); |
|||
hbotMoveExCtrlService.moveToXY(sampleContainerPos); |
|||
|
|||
//取样 |
|||
UISender.txInfoMsg(log, "取样:%dul", ul); |
|||
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
|||
ul * 10, |
|||
sampleContainerPos.z, |
|||
a8kSamplePosToContainerCpyId(from), |
|||
LiquidConfigCpyIdx.NotSet, |
|||
0, |
|||
1, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0 |
|||
)); |
|||
} |
|||
|
|||
|
|||
public void pirceLittleBuffer(PreReactionPos pos) throws AppException { |
|||
// 取TIP |
|||
tipMgrModule.tryTakeTip(); |
|||
ZAppChecker.check(pipetteCtrlDriverV2.readTipState(), A8kEcode.CODEERROR, "未检测到TIP"); |
|||
|
|||
Pos3d pircePos; |
|||
ContainerCpyId containerCpyId; |
|||
|
|||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|||
pircePos = hbotConsumableExParamMgr.getProbeSubstancePiercePos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
|||
} else { |
|||
pircePos = hbotConsumableExParamMgr.getLittleBufferPiercePos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.LittleBufferCup; |
|||
} |
|||
|
|||
pipetteCtrlDriverV2.pierceThroughBlock(containerCpyId, pircePos.z); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取样本到探测物质 |
|||
* @param from 样本位置 |
|||
* @param pos 预先反应位置P |
|||
* @param ul 吸取量 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takeSampleToPreReactionPos(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
|||
log.info("takeSampleToPreReactionPos: from={}, pos={}, ul={}ul", from, pos, ul); |
|||
takeSampleOnly(from, ul); |
|||
|
|||
Pos3d reactionPos; |
|||
ContainerCpyId containerCpyId; |
|||
Integer shakeUl = MIX_VOLUME_UL; |
|||
Integer shakeTimes = 5; |
|||
|
|||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|||
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
|||
} else { |
|||
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.LittleBufferCup; |
|||
} |
|||
if (projBuildinInfo != null) { |
|||
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
|||
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
|||
} |
|||
|
|||
// 移动到反应位 |
|||
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
|||
hbotMoveExCtrlService.moveToXY(reactionPos); |
|||
|
|||
//z轴移动到反应位 |
|||
UISender.txInfoMsg(log, "分配样本"); |
|||
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
|||
reactionPos.z, |
|||
containerCpyId, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
false, |
|||
DistribuType.SURFACE_DIST, |
|||
shakeUl * 10, // 预先反应位置的液体量 |
|||
shakeTimes, |
|||
true |
|||
)); |
|||
} |
|||
|
|||
/** |
|||
* 取样本液到预反应位,混合后,再取样 |
|||
* @param from |
|||
* @param pos |
|||
* @param ul |
|||
* @throws AppException |
|||
*/ |
|||
public void takeSampleToPreReactionPosAndAspirate(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { |
|||
log.info("takeSampleToPreReactionPosAndTakeToReactionPlate: from={}, pos={}, ul={}ul", from, pos, ul); |
|||
takeSampleOnly(from, ul); |
|||
|
|||
Pos3d reactionPos; |
|||
ContainerCpyId containerCpyId; |
|||
Integer shakeUl = MIX_VOLUME_UL; |
|||
Integer shakeTimes = 5; |
|||
|
|||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|||
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
|||
} else { |
|||
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.LittleBufferCup; |
|||
} |
|||
if (projBuildinInfo != null) { |
|||
shakeUl = projBuildinInfo.mixedLiquidMixingVolUl; |
|||
shakeTimes = projBuildinInfo.mixedLiquidMixingTimes; |
|||
} |
|||
|
|||
// 移动到反应位 |
|||
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
|||
hbotMoveExCtrlService.moveToXY(reactionPos); |
|||
|
|||
//z轴移动到反应位 |
|||
UISender.txInfoMsg(log, "分配样本"); |
|||
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
|||
reactionPos.z, |
|||
containerCpyId, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
false, |
|||
DistribuType.SURFACE_DIST, |
|||
shakeUl * 10, // 预先反应位置的液体量 |
|||
shakeTimes, |
|||
false |
|||
)); |
|||
|
|||
UISender.txInfoMsg(log, "取混合液"); |
|||
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
|||
750, // 预先反应位置的液体量 |
|||
reactionPos.z, |
|||
containerCpyId, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0 |
|||
)); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取反应液到反应板上 |
|||
* @param pos 反应板位置 |
|||
* @throws AppException 异常 |
|||
*/ |
|||
public void takePreReactionLiquid(PreReactionPos pos) throws AppException { |
|||
log.info("takePreReactionLiquidToReactionPos: from pos={}", pos); |
|||
|
|||
tipMgrModule.tryTakeTip(); |
|||
|
|||
Pos3d reactionPos; |
|||
ContainerCpyId containerCpyId; |
|||
|
|||
if (pos.type.equals(ConsumableType.ProbeSubstance)) { |
|||
reactionPos = hbotConsumableExParamMgr.getProbeSubstanceContainerPos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.DetectSubstancesCup; |
|||
} else { |
|||
reactionPos = hbotConsumableExParamMgr.getLittleBufferSamplePos(pos.group, pos.index); |
|||
containerCpyId = ContainerCpyId.LittleBufferCup; |
|||
} |
|||
|
|||
|
|||
UISender.txInfoMsg(log, "移动到预先反应位置:%s", reactionPos); |
|||
hbotMoveExCtrlService.moveToXY(reactionPos); |
|||
|
|||
UISender.txInfoMsg(log, "取混合液"); |
|||
pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( |
|||
750, // 预先反应位置的液体量 |
|||
reactionPos.z, |
|||
containerCpyId, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0, |
|||
0 |
|||
)); |
|||
|
|||
|
|||
} |
|||
|
|||
public void dropLiquidToReactionPlate() throws AppException { |
|||
log.info("dropLiquidToReactionPlate"); |
|||
|
|||
Pos3d dropLiquidPos = hbotFixedPosParamMgr.getDropLiquidPos(); |
|||
|
|||
|
|||
UISender.txInfoMsg(log, "移动到预先反应位置:%s", dropLiquidPos); |
|||
hbotMoveExCtrlService.moveToXY(dropLiquidPos); |
|||
|
|||
UISender.txInfoMsg(log, "分配到反应板位置"); |
|||
pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( |
|||
dropLiquidPos.z, |
|||
ContainerCpyId.ReactionPlate, |
|||
LiquidConfigCpyIdx.BufferSolution, |
|||
false, |
|||
DistribuType.JET_DIST, |
|||
0, |
|||
0, |
|||
true |
|||
)); |
|||
} |
|||
|
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue