From 4a15da7ae4d9e8fe48378caa90dbcf573fa4e1e3 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 20 Oct 2024 19:52:21 +0800 Subject: [PATCH] update --- .../service/app/appctrl/AppDeviceCtrlService.java | 19 +- .../app/appctrl/AppMainFlowCtrlService.java | 16 +- .../action/DO_CLEAR_ERROR_BEFORE_WORK.java | 21 +- .../action/DO_FINISH_TUBE_PROCESS.java | 51 +++- .../action/DO_PROCESS_ERROR_PLATE.java | 35 +-- .../app/appctrl/mainflowctrl/action/DO_START.java | 19 +- .../app/appctrl/mainflowctrl/action/DO_STOP.java | 36 ++- .../app/appctrl/mainflowctrl/action/README.md | 25 ++ .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 11 +- .../action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 6 +- .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 14 +- .../mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java | 4 +- .../a8k/service/app/appstate/GStateService.java | 6 + .../java/a8k/service/app/appstate/SensorState.java | 10 + .../appstate/resource/A8kPublicResourceType.java | 3 +- ...ReactionPlatesTransmitControlerCalibration.java | 32 ++- .../TubeFeedingModulePosCalibration.java | 15 +- .../ctrlservice/DeviceInitCtrlService.java | 102 +++++-- .../devicectrl/ctrlservice/HbotCtrlService.java | 19 +- .../app/devicectrl/ctrlservice/OptScanModule.java | 49 ++++ .../ctrlservice/PipetteGunCtrlService.java | 18 +- .../ctrlservice/PlateBoxCtrlService.java | 50 ++++ .../ReactionPlatesTransmitCtrlService.java | 134 --------- .../ctrlservice/TubeFeedingCtrlService.java | 303 +++++++++++++++++++++ .../ctrlservice/TubePreProcesCtrlService.java | 62 ++++- .../ctrlservice/TubeTubeFeedingCtrlService.java | 303 --------------------- .../ctrlservice/TurnableMoveCtrlService.java | 106 +++++++ .../app/devicectrl/driver/PipetteCtrlDriver.java | 2 +- .../devicectrl/exdriver/HbotBaseMoveExDriver.java | 1 + .../devicectrl/exdriver/MotorEnableExDriver.java | 15 +- .../app/devicectrl/script/DeviceCtrlScripter.java | 30 ++ 31 files changed, 933 insertions(+), 584 deletions(-) create mode 100644 src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md create mode 100644 src/main/java/a8k/service/app/appstate/SensorState.java create mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java create mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java create mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java create mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java create mode 100644 src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index 5f92152..c7e8092 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -5,9 +5,10 @@ import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.service.app.appstate.ConsumablesMgrService; import a8k.service.app.appstate.ProjectProcessContextMgrService; +import a8k.service.app.appstate.SensorState; import a8k.service.app.appstate.type.*; import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; - + import a8k.type.ConsumableGroup; import a8k.type.checkpoint.CheckResult; import a8k.service.app.appstate.GStateService; @@ -25,15 +26,15 @@ import java.util.Map; public class AppDeviceCtrlService { @Resource - GStateService gstate; + GStateService gstate; @Resource - DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 + DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 @Resource - AppMainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 + AppMainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 @Resource - AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 + AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 @Resource - ConsumablesMgrService consumablesMgrService; //耗材管理模块 + ConsumablesMgrService consumablesMgrService; //耗材管理模块 @Resource ProjectProcessContextMgrService projectProcessContextMgrService; //项目处理上下文管理模块 @@ -55,7 +56,7 @@ public class AppDeviceCtrlService { * 设备控制 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "开始工作", group = "设备控制") - public void startWork() { + public void startWork() throws AppException { mainFlowCtrlSampleScanService.startWork(); } @@ -147,6 +148,10 @@ public class AppDeviceCtrlService { return gstate.getConsumableState(); } + @ExtApiFn(name = "获取<传感器>状态", group = "设备状态") + public SensorState getSensorState() { + return gstate.getSensorState(); + } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java index c01adf0..155f7d5 100644 --- a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java @@ -1,5 +1,6 @@ package a8k.service.app.appctrl; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appctrl.mainflowctrl.MainFlowCtrlScheduler; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; @@ -10,6 +11,8 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.service.app.appstate.type.state.TubeState; import a8k.SpringBootBeanUtil; +import a8k.type.exception.AppException; +import a8k.utils.AppExceptionBuilder; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -32,6 +35,9 @@ public class AppMainFlowCtrlService { @Resource SpringBootBeanUtil springBoot; + @Resource + AppExceptionBuilder ebuilder; + // // Init // @@ -128,7 +134,15 @@ public class AppMainFlowCtrlService { return scheduler.getA8kStepActionList(); } - public void startWork() { + public void startWork() throws AppException { + if (!gstate.isDeviceInited()) { + throw ebuilder.buildAppException(A8kEcode.APPE_DEVICE_NOT_INITED); + } + + if (gstate.getSensorState().wasteBinFullFlag) { + throw ebuilder.buildAppException(A8kEcode.APPE_RECYCLE_BIN_OVERFLOW); + } + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); state.startActionPending = true; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java index 59389ca..66b64c3 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java @@ -17,28 +17,30 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + + +/** + * 清空错误,针对部分错误,进行相应的硬件操作 + * + * 可能发生的错误 + * 1. 处理过程取tip头失败 + * + */ @Component public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR_BEFORE_WORK.class); DO_CLEAR_ERROR_BEFORE_WORK() { super(A8kActionStepType.DO_CLEAR_ERROR_BEFORE_WORK); } @Resource - GStateService gstate; - @Resource - CondtionMgrService cms; - @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; - @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + GStateService gstate; MainFlowCtrlState mfcs; - @PostConstruct void init() { mfcs = gstate.mainFlowCtrlState; @@ -46,7 +48,6 @@ public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction { @Override public void doaction() throws AppException { - //ProcessErrorBeforeContinue mfcs.errorFlag = false; mfcs.ecodeList.clear(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java index 2b5c25e..a9ec059 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java @@ -13,6 +13,8 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -26,8 +28,17 @@ import java.util.List; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; -/** - * 处理错误的试管 +/* + * 当某试管所有错误处理完成时,触发该逻辑 + * + * 条件: + * 1.试管状态为POST_PROCESSED + * 2.试管状态为ERROR + * + * 动作: + * 1.将试管状态修改成PROCESS_COMPLETED + * 2.如果试管状态为ERROR,则复位hbot和预处理模块 + * */ @Component public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { @@ -44,12 +55,15 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { @Resource VirtualDevice virtualDevice; + @Resource - CondtionMgrService cms; + TubePreProcesCtrlService tubePreProcesCtrlService; @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; + HbotCtrlService hbotCtrlService; + + @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @@ -61,10 +75,25 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { mfcs = gstate.mainFlowCtrlState; } + void resetHbotAndShakeModule() throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("处理错误试管", 2); + virtualDevice.doVirtualThings("复位摇匀模组", 2); + virtualDevice.doVirtualThings("复位HBOT", 2); + return; + } + + //复位hbot + hbotCtrlService.dropTip(); + hbotCtrlService.moveQuickToZero(); + //复位预处理模块 + tubePreProcesCtrlService.resteModule(); + + } + @Override public void doaction() throws AppException { //ProcessErrorBeforeContinue - Tube tube = gstate.getCurProcessingTube(); Assert.isTrue(tube != null, "tube != null"); if (tube.getState().equals(TubeState.POST_PROCESSED)) { @@ -72,24 +101,20 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { return; } - if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("处理错误试管", 2); - virtualDevice.doVirtualThings("复位摇匀模组", 2); - virtualDevice.doVirtualThings("复位HBOT", 2); - } + resetHbotAndShakeModule(); projectProcessContextMgrService.finishedTubeProcess(); } @Override public Boolean checkCondition() { Boolean cond1 = cms.isCanDoAction(); - Boolean cond2 = cms.isHasSomeErrorTubeToBeProcessed() || cms.isHasPostProcessedTube(); + Boolean cond2 = cms.isHasSomeErrorTubeToBeProcessed() || cms.isHasPostProcessedTube(); // return cond1 && cond2; } @Override public List getResourceList() { return List.of( A8kPublicResourceType.ShakeModule, - A8kPublicResourceType.HBOT + A8kPublicResourceType.TubeFeedModule ); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java index 32289fa..5476a88 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java @@ -1,16 +1,15 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.OS; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.IncubationPlateStateMgrService; -import a8k.service.app.appstate.OptScanModuleStateMgrService; import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.MainFlowCtrlState; +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -40,16 +39,17 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { @Resource VirtualDevice virtualDevice; - @Resource CondtionMgrService cms; @Resource IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; - @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + OptScanModule optScanModule; + + MainFlowCtrlState mfcs; @PostConstruct @@ -58,25 +58,28 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { } + void doEjectAllErrorPlate(IncubationSubTank errorTank) throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos()); + virtualDevice.doVirtualThings("推出板夹到光学模组"); + virtualDevice.doVirtualThings("丢弃板夹"); + return; + } + + logger.info("处理错误板夹:{}", errorTank.getPos()); + optScanModule.pullPlate(errorTank.getPos()); + optScanModule.dropPlate(); + } + @Override public void doaction() throws AppException { //ProcessErrorBeforeContinue - while (true) { IncubationSubTank errorTank = incubationPlateStateMgrService.getErrorPlate(); if (errorTank == null) { break; } - if (testStateMgrService.isVirtualDeviceEnable()) { - logger.info("处理错误板夹:{}", errorTank.getPos()); - //TODO:推出板夹到光学模组,同时丢弃板夹 - logger.info("推出板夹到光学模组"); - logger.info("丢弃板夹"); - OS.forceSleep(3000); - virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos()); - virtualDevice.doVirtualThings("推出板夹到光学模组"); - virtualDevice.doVirtualThings("丢弃板夹"); - } + doEjectAllErrorPlate(errorTank); // projectProcessContextMgrService.newPlateToOptScanPos(errorTank); projectProcessContextMgrService.dropPlate(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java index 6fc83c7..e9cabaf 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java @@ -6,7 +6,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -34,8 +34,7 @@ public class DO_START extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService tubeTubeFeedingCtrlService; - + DeviceInitCtrlService deviceInitCtrlService; MainFlowCtrlState mfcs; @@ -48,9 +47,11 @@ public class DO_START extends A8kStepAction { mfcs.workStateChangeFlag = false; if (testStateMgrService.isVirtualDeviceEnable()) { virtualDevice.doVirtualThings("弹出试管架"); - } else { - tubeTubeFeedingCtrlService.ejectTubeHolder(); + return; } + + deviceInitCtrlService.clearDevice(); + } @Override public Boolean checkCondition() { @@ -61,6 +62,12 @@ public class DO_START extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.ShakeModule); + return List.of( + A8kPublicResourceType.ShakeModule, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.PlatesBoxModule, + A8kPublicResourceType.HBOT + ); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java index 685507d..b6aefdd 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java @@ -7,7 +7,8 @@ import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; - + +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -16,8 +17,10 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + @Component public class DO_STOP extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_STOP.class); @@ -27,15 +30,16 @@ public class DO_STOP extends A8kStepAction { } @Resource - GStateService gstate; - @Resource + GStateService gstate; + @Resource TestStateMgrService testStateMgrService; @Resource VirtualDevice virtualDevice; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; - + @Resource + DeviceInitCtrlService deviceInitCtrlService; MainFlowCtrlState mfcs; @@ -44,16 +48,20 @@ public class DO_STOP extends A8kStepAction { mfcs = gstate.mainFlowCtrlState; } - @Override public void doaction() throws AppException { - mfcs.workStateChangeFlag = false; - + void doClearDevice() throws AppException { if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("清空设备", 1); + virtualDevice.doVirtualThings("清空设备", 1); + } else { + deviceInitCtrlService.clearDevice(); } + } + @Override public void doaction() throws AppException { + mfcs.workStateChangeFlag = false; + //清空设备 + doClearDevice(); + //清空所有反应状态 projectProcessContextMgrService.finishedAll(); - - //清空所有孵育盘中的孔位 } @Override public Boolean checkCondition() { @@ -64,6 +72,12 @@ public class DO_STOP extends A8kStepAction { } @Override public List getResourceList() { - return List.of(); + return List.of( + A8kPublicResourceType.ShakeModule, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.PlatesBoxModule, + A8kPublicResourceType.HBOT + ); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md new file mode 100644 index 0000000..fb19724 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md @@ -0,0 +1,25 @@ + +```angular2html + +当某个试管处理过程中触发错误? +耗材不足错误: + 检测点:开始处理试管前 + 错误处理逻辑: 上报错误,设备暂停,试管状态为待处理 + +取Tip头失败: + 检查点:试管处理过程中 + 错误处理:当前样本相关的测试全部失败,设备暂停,试管状态被标记为错误。 + +取样本失败: + 检查点:试管处理过程中 + 错误处理:当前样本相关的测试全部失败,不抛出异常,试管标记为错误,处理下一个试管。 + + + +什么情况下设备不允许暂停? + 1. 当试管正在处理的过程中,不允许暂停,因为此时耗材已经作为资源分配出去了,暂停后如果用户修改耗材状态就会造成资源状态无法同步。 + + + + +``` \ No newline at end of file diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index a119b53..d002114 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -16,7 +16,7 @@ import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.state.TubeHolderState; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; @@ -33,9 +33,6 @@ import org.springframework.util.Assert; import java.util.List; -import a8k.service.test.state.TestStateMgrService; -import a8k.service.test.state.VirtualDevice; - /** * * TubeHolderState @@ -60,11 +57,11 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { VirtualDevice virtualDevice; @Resource - CondtionMgrService cmgr; + CondtionMgrService cmgr; @Resource - TubeTubeFeedingCtrlService stc; + TubeFeedingCtrlService stc; @Resource - AppEventBusService ebus; + AppEventBusService ebus; @Resource AppTubeSettingMgrService appTubeSettingMgrService; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index 10b1a71..7f7d315 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -9,7 +9,7 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -45,9 +45,9 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService sstc; + TubeFeedingCtrlService sstc; @Resource - CondtionMgrService cms; + CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index b23e63b..feb5381 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -12,8 +12,8 @@ import a8k.service.app.appstate.*; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.Tube; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; -import a8k.service.app.devicectrl.ctrlservice.ReactionPlatesTransmitCtrlService; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.type.ecode.AppError; import a8k.type.exception.AppException; @@ -51,19 +51,19 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService sstc; + TubeFeedingCtrlService sstc; @Resource - ConsumablesMgrService consumablesMgrService; + ConsumablesMgrService consumablesMgrService; @Resource ProjCfgMgrService projCfgMgrService; @Resource AppEventBusService ebus; @Resource - AppExceptionBuilder ebuilder; + AppExceptionBuilder ebuilder; @Resource - ReactionPlatesTransmitCtrlService reactionPlatesTransmitCtrlService; + TurnableMoveCtrlService turnableMoveCtrlService; @Resource - TubePreProcesCtrlService tubePreProcesCtrlService; + TubePreProcesCtrlService tubePreProcesCtrlService; @Resource HbotBaseMoveExDriver hbotBaseMoveExDriver; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java index e4c0f0c..cd6c01f 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java @@ -7,7 +7,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.state.TubeHolderState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; @@ -40,7 +40,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { CondtionMgrService cms; @Resource - TubeTubeFeedingCtrlService SST_HControler; + TubeFeedingCtrlService SST_HControler; MainFlowCtrlState state; diff --git a/src/main/java/a8k/service/app/appstate/GStateService.java b/src/main/java/a8k/service/app/appstate/GStateService.java index d091acb..14d05ee 100644 --- a/src/main/java/a8k/service/app/appstate/GStateService.java +++ b/src/main/java/a8k/service/app/appstate/GStateService.java @@ -43,6 +43,8 @@ public class GStateService { String mcuVersion = "NOTSET"; String sn = "NOTSET"; + SensorState sensorState; + A8kIdCardInfo mountedIdCardInfo; //主流程控制状态 @@ -72,4 +74,8 @@ public class GStateService { return mainFlowCtrlState.workState.equals(A8kWorkState.WORKING); } + public synchronized SensorState getSensorState() { + return sensorState; + } + } diff --git a/src/main/java/a8k/service/app/appstate/SensorState.java b/src/main/java/a8k/service/app/appstate/SensorState.java new file mode 100644 index 0000000..f4a3020 --- /dev/null +++ b/src/main/java/a8k/service/app/appstate/SensorState.java @@ -0,0 +1,10 @@ +package a8k.service.app.appstate; + +import lombok.Data; + +@Data +public class SensorState { + public Integer pboxTemperature = 25; + public Integer incubateBoxTemperature = 25; + public Boolean wasteBinFullFlag = false; +} diff --git a/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java b/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java index 9096abb..764770e 100644 --- a/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java +++ b/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java @@ -1,7 +1,8 @@ package a8k.service.app.appstate.resource; public enum A8kPublicResourceType { - ShakeModule,//样本平移电机 + ShakeModule,//摇匀模组 + TubeFeedModule,//入料模组 IncubationPlateModule,//孵育盘电机 OPTModule, //光学电机 PlatesBoxModule,//板夹仓电机 diff --git a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java index 17d01fa..42f1949 100644 --- a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java @@ -3,13 +3,15 @@ package a8k.service.app.devicectrl.calibration; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.driver.MiniServoDriver; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.ctrlservice.ReactionPlatesTransmitCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.app.devicectrl.param.*; import a8k.type.ConsumableGroup; @@ -26,17 +28,21 @@ public class ReactionPlatesTransmitControlerCalibration { final static int overtime = 10000; @Resource - MiniServoDriver miniServoDriver; + MiniServoDriver miniServoDriver; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; + StepMotorCtrlDriver stepMotorCtrlDriver; @Resource - OptModuleParamsMgr optModuleParamsMgr; + OptModuleParamsMgr optModuleParamsMgr; @Resource - TurntablePosParamMgr turntablePosParamMgr; + TurntablePosParamMgr turntablePosParamMgr; @Resource - PlatesBoxPosParamMgr platesBoxPosParamMgr; + PlatesBoxPosParamMgr platesBoxPosParamMgr; @Resource - ReactionPlatesTransmitCtrlService reactionPlatesTransmitCtrlService; + TurnableMoveCtrlService turnableMoveCtrlService; + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModule optScanModule; @Resource PipetteCtrlDriver pipetteCtrlDriver; @@ -209,25 +215,25 @@ public class ReactionPlatesTransmitControlerCalibration { @ExtApiFn(name = "滴定", group = "校验", order = 1000) public void turntableMoveDropPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToDropLiquidPos(pos); + turnableMoveCtrlService.trunableMoveToDropLiquidPos(pos); hbotCtrlService.moveToDropLiquidPos(); } @ExtApiFn(name = "孵育盘移动到拉板位", group = "校验", order = 1001) public void turntableMovePullPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToPullPos(pos); + turnableMoveCtrlService.trunableMoveToPullPos(pos); } @ExtApiFn(name = "孵育盘移动到推板位", group = "校验", order = 1002) public void turntableMovePushPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToPushPos(pos); + turnableMoveCtrlService.trunableMoveToPushPos(pos); } @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { - reactionPlatesTransmitCtrlService.pushPlateQuick(PBCh, incubatorPos); - reactionPlatesTransmitCtrlService.pullPlate(incubatorPos); - reactionPlatesTransmitCtrlService.dropPlate(); + plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); + optScanModule.pullPlate(incubatorPos); + optScanModule.dropPlate(); } @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) diff --git a/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java index 8415adf..b637453 100644 --- a/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java @@ -4,13 +4,12 @@ import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.A8kCanBusService; -import a8k.service.app.devicectrl.driver.MiniServoDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.app.devicectrl.param.TubeFeedingModuleParamMgr; import a8k.service.db.type.Parameter; import a8k.type.TubeFeedingModulePos; @@ -32,11 +31,11 @@ public class TubeFeedingModulePosCalibration { TubeFeedingModuleParamMgr tubeScanPosMgr; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; @Resource - TubeTubeFeedingCtrlService tubeTubeFeedingCtrlService; + TubeFeedingCtrlService tubeFeedingCtrlService; @Resource - TubeTransportExDriver tubeTransportExDriver; + TubeTransportExDriver tubeTransportExDriver; @Resource StepMotorCtrlDriver stepMotorCtrlDriver; @Resource @@ -141,13 +140,13 @@ public class TubeFeedingModulePosCalibration { @ExtApiFn(name = "扫描试管架", group = "校验", order = 400) public TubeHolderScanResult calibrateScanTubeHolder() throws AppException { - TubeHolderScanResult result = tubeTubeFeedingCtrlService.scanTubeHodler(); - tubeTubeFeedingCtrlService.ejectTubeHolder(); + TubeHolderScanResult result = tubeFeedingCtrlService.scanTubeHodler(); + tubeFeedingCtrlService.ejectTubeHolder(); return result; } @ExtApiFn(name = "移动试管到预处理位置", group = "校验", order = 401) public void calibrateMoveTubeToPreProcessPos(Integer tubeIndex0To9) throws AppException { - tubeTubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); + tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); } } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java index 7861d35..7e73ba3 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java @@ -3,9 +3,12 @@ package a8k.service.app.devicectrl.ctrlservice; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.app.devicectrl.driver.MiniServoDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.MiniServoMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.script.DeviceCtrlScripter; import a8k.service.bases.ActionReactorService; import a8k.service.test.state.TestStateMgrService; @@ -31,18 +34,35 @@ public class DeviceInitCtrlService { @Resource TestStateMgrService testStateMgrService; @Resource - VirtualDevice virtualDevice; + VirtualDevice virtualDevice; @Resource ActionReactorService actionReactor; + + @Resource + A8kCanBusService canBus; + + @Resource + HbotDriver hbotDriver; + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource - A8kCanBusService canBus; + MotorEnableExDriver motorEnableExDriver; + + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; @Resource - HbotDriver hbotDriver; + TubeFeedingCtrlService tubeFeedingCtrlService; @Resource - MiniServoDriver miniServoDriver; + HbotCtrlService hbotCtrlService; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; + DeviceCtrlScripter deviceCtrlScripter; + Integer actionOvertime = 10000; List checkPoints = new ArrayList<>(); @@ -64,26 +84,10 @@ public class DeviceInitCtrlService { } - public List checkBeforeInitDevice() throws AppException { - List results = new java.util.ArrayList<>(); - for (Checkpoint checkPoint : checkPoints) { - CheckResult result = new CheckResult(); - result.type = checkPoint.type; - result.typechinfo = checkPoint.typechinfo; - if (!testStateMgrService.isVirtualDeviceEnable()) { - result.pass = checkPoint.checkfn.check(); - } else { - result.pass = true; - } - results.add(result); - } - return results; - } + List doDeviceMoveToZero() throws AppException { + motorEnableExDriver.enableAllMotor(); - // - public List deviceMoveToZero() throws AppException { List results = checkBeforeInitDevice(); - if (testStateMgrService.isVirtualDeviceEnable()) { virtualDevice.doVirtualThings("初始化设备", 3); gstate.setDeviceInited(true); @@ -95,7 +99,9 @@ public class DeviceInitCtrlService { return results; } } - + //HBot初始化 + actionReactor.dosome("HbotZ轴回零", () -> pipetteCtrlDriver.zMotorMoveZeroBlock()); + actionReactor.dosome("HBot回零", () -> hbotDriver.moveToZeroBlock()); //进出料初始化 actionReactor.dosome("入料平移电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM, actionOvertime)); actionReactor.dosome("摇匀模组-扫码夹紧舵机回零", () -> miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModTubeScanerClampingSV)); @@ -111,12 +117,56 @@ public class DeviceInitCtrlService { //光学模组初始化 actionReactor.dosome("光学模组-拉杆电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, actionOvertime)); actionReactor.dosome("光学模组-扫码电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, actionOvertime)); - //HBot初始化 - actionReactor.dosome("HBot回零", () -> hbotDriver.moveToZeroBlock()); //转盘归零 actionReactor.dosome("转盘回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, actionOvertime)); + + gstate.setDeviceInited(true); return results; } + + public List checkBeforeInitDevice() throws AppException { + List results = new java.util.ArrayList<>(); + for (Checkpoint checkPoint : checkPoints) { + CheckResult result = new CheckResult(); + result.type = checkPoint.type; + result.typechinfo = checkPoint.typechinfo; + + // + if (testStateMgrService.isVirtualDeviceEnable()) { + result.pass = true; + } else { + result.pass = checkPoint.checkfn.check(); + } + + results.add(result); + } + return results; + } + + // + + + public List deviceMoveToZero() throws AppException { + try { + return doDeviceMoveToZero(); + } catch (AppException e) { + motorEnableExDriver.forceDisableAllMotor(); + throw e; + } + } + + + public void clearDevice() throws AppException { + //弹出无效物料 + deviceCtrlScripter.dropAllPlates(); + //弹出试管架 + tubeFeedingCtrlService.ejectTubeHolder(); + //丢弃tip头 + hbotCtrlService.dropTip(); + //hbot快速归零 + hbotCtrlService.moveQuickToZero(); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java index ba8235d..1f28306 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java @@ -2,6 +2,7 @@ package a8k.service.app.devicectrl.ctrlservice; import a8k.constant.AppConstant; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.param.HbotConsumableParamMgr; @@ -13,18 +14,19 @@ import a8k.type.cfg.Pos3d; import a8k.type.exception.AppException; import a8k.type.type.TipGroup; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +@Slf4j @Component public class HbotCtrlService { - static Logger logger = LoggerFactory.getLogger(HbotCtrlService.class); @Resource - HbotFixedPosParamMgr hbotFixedPosParamMgr; + HbotFixedPosParamMgr hbotFixedPosParamMgr; @Resource - HbotSamplePosParamMgr hbotSamplePosParamMgr; + HbotSamplePosParamMgr hbotSamplePosParamMgr; @Resource HbotConsumableParamMgr hbotConsumableParamMgr; @@ -32,6 +34,8 @@ public class HbotCtrlService { PipetteCtrlDriver pipetteCtrlDriver; @Resource HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + HbotDriver hbotDriver; public void checkTipIndex(TipGroup tipGroup, Integer index) throws AppException { if (index >= AppConstant.TIP_NUM) { @@ -40,7 +44,7 @@ public class HbotCtrlService { } public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { - logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); + log.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); checkTipIndex(tipGroup, index); Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, index); @@ -73,6 +77,7 @@ public class HbotCtrlService { } public void dropTip() throws AppException { + log.info("丢弃tip"); hbotBaseMoveExDriver.hbotMoveTo(hbotFixedPosParamMgr.getDropTipPos()); pipetteCtrlDriver.putTipBlock(); } @@ -107,5 +112,11 @@ public class HbotCtrlService { } + public void moveQuickToZero() throws AppException { + log.info("Hbot快速归零"); + hbotBaseMoveExDriver.hbotMoveTo(new Pos3d(0, 0, 0)); + hbotDriver.moveToZeroBlock(); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java new file mode 100644 index 0000000..0bd1641 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java @@ -0,0 +1,49 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class OptScanModule { + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + @Resource + OptModuleParamsMgr optModuleParamsMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + + + public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { + turnableMoveCtrlService.trunableMoveToPullPos(turntablePosIndex); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); + } + + public void dropPlate() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java index b11c545..d3939b1 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java @@ -1,7 +1,12 @@ package a8k.service.app.devicectrl.ctrlservice; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; +import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Component; @@ -13,18 +18,23 @@ import org.springframework.stereotype.Component; */ @Component +@Slf4j public class PipetteGunCtrlService { - static Logger logger = org.slf4j.LoggerFactory.getLogger(PipetteGunCtrlService.class); - public Integer a; + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + HbotCtrlService hbotCtrlService; + @PostConstruct void init() throws NoSuchMethodException { System.out.println("PipetteGunCtrlService init"); } + // - //取样 - // } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java new file mode 100644 index 0000000..3de47c1 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java @@ -0,0 +1,50 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import freemarker.core.TruncateBuiltinAlgorithm; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class PlateBoxCtrlService { + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + + @Resource + PlatesBoxPosParamMgr platesBoxPosParamMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + + + public void pushPlateQuick(ConsumableGroup PBCh, IncubatorPos turntablePosIndex) throws AppException { + turnableMoveCtrlService.trunableMoveToPushPos(turntablePosIndex); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxYM, platesBoxPosParamMgr.getChXPos(PBCh.off), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxPusherM, platesBoxPosParamMgr.getPushEndXPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxPusherM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxYM, overtime); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java deleted file mode 100644 index 5541145..0000000 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java +++ /dev/null @@ -1,134 +0,0 @@ -package a8k.service.app.devicectrl.ctrlservice; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.param.OptModuleParamsMgr; -import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; -import a8k.service.app.devicectrl.param.TurntablePosParamMgr; -import a8k.type.ConsumableGroup; -import a8k.type.IncubatorPos; -import a8k.type.exception.AppException; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; - -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) -public class ReactionPlatesTransmitCtrlService { - static Logger logger = LoggerFactory.getLogger(ReactionPlatesTransmitCtrlService.class); - static final Integer overtime = 10000; - - - @Resource - A8kCanBusService canBus; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - - @Resource - PlatesBoxPosParamMgr platesBoxPosParamMgr; - @Resource - OptModuleParamsMgr optModuleParamsMgr; - @Resource - TurntablePosParamMgr turntablePosParamMgr; - - - private void checkBeforeMoveTrunable() throws AppException { - //板夹仓卡板检测 - if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { - logger.error("PlateBoxPlateStuckPPS is trigger"); - throw new AppException(A8kEcode.APPE_PLATE_STUCK_DETECTOR_SENSOR_TRIGGER); - } - - //检查钩板电机是否处于终点位置 - if (!canBus.getIOState(IOId.PullerMZeroPPS)) { - logger.error("PullerM is not in zero pos"); - throw new AppException(A8kEcode.APPE_PULLERM_INIT_POS_ERROR); - } - - //检查板夹仓光电是否处于起点位置 - if (!canBus.getIOState(IOId.PusherMZeroPPS)) { - logger.error("PusherM is not in zero pos"); - throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); - } - } - - private void checkBeforeMovePlateBox() throws AppException { - if (!canBus.getIOState(IOId.PusherMZeroPPS)) { - logger.error("PusherM is not in zero pos "); - throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); - } - } - - - private void trunableMoveTo(Integer pos) throws AppException { - checkBeforeMoveTrunable(); - //限制pos在 0--> 36000之间 - pos = pos % 36000; - if (pos < 0) { - pos += 36000; - } - - //先移动半个间距,用来检测是否发生卡板 - Integer nowPos = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); - if (nowPos < pos) { - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, turntablePosParamMgr.getPosSpacing(), overtime); - } else if (nowPos > pos) { - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, -turntablePosParamMgr.getPosSpacing(), overtime); - } - - //解决齿轮间隙的问题 - if (nowPos < pos) { - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos, overtime); - } else { - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos - 300/**/, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos, overtime); - } - } - - public void trunableMoveToPushPos(IncubatorPos index) throws AppException { - trunableMoveTo(turntablePosParamMgr.getPushPos0() + index.off * turntablePosParamMgr.getPosSpacing()); - } - - public void trunableMoveToPullPos(IncubatorPos index) throws AppException { - trunableMoveTo(turntablePosParamMgr.getPullPos0() + index.off * turntablePosParamMgr.getPosSpacing()); - } - - public void trunableMoveToDropLiquidPos(IncubatorPos index) throws AppException { - trunableMoveTo(turntablePosParamMgr.getDropLiquidPos0() + index.off * turntablePosParamMgr.getPosSpacing()); - } - - - public void pushPlateQuick(ConsumableGroup PBCh, IncubatorPos turntablePosIndex) throws AppException { - trunableMoveToPushPos(turntablePosIndex); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxYM, platesBoxPosParamMgr.getChXPos(PBCh.off), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxPusherM, platesBoxPosParamMgr.getPushEndXPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxPusherM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxYM, overtime); - } - - public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { - trunableMoveToPullPos(turntablePosIndex); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); - // if (!canBus.getIOState(IOId.PullerMEndPPS)) { - // logger.error("pull plate fail"); - // throw new AppException(A8kEcode.APPE_PULL_PLATE_FAIL); - // } - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); - } - - public void dropPlate() throws AppException { - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java new file mode 100644 index 0000000..568cfdd --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java @@ -0,0 +1,303 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.OS; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver; +import a8k.service.app.devicectrl.driver.MiniServoDriver; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; +import a8k.service.app.devicectrl.driver.type.MiniServoMId; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.TubeFeedingModuleParamMgr; +import a8k.service.bases.AppEventBusService; +import a8k.service.bases.appevent.AppWarningNotifyEvent; +import a8k.type.TubeHolderScanResult; +import a8k.type.TubesScanResult; +import a8k.type.exception.AppException; +import a8k.type.TargetPosMeasureDirection; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.hardware.type.a8kcanprotocol.MId; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.TubeTubeFeedingModule) +public class TubeFeedingCtrlService { + static Logger logger = LoggerFactory.getLogger(TubeFeedingCtrlService.class); + static Integer infeedOvertime = 10000; + static Integer outfeedOvertime = 10000; + static Integer scanOvertime = 3000; + + static class ORDER { + static final int moveTubeRackToExitPos = 1; + static final int moveTubeRackToScanPos = 2; + static final int moveTubeToScanPosAndScan = 3; + static final int moveTubeToAltitJudgXPos = 4; + static final int judgeTubeExist = 5; + + } + + @Resource + AppEventBusService ebus; + @Resource + A8kCanBusService canBus; + @Resource + TubeFeedingModuleParamMgr stp; + @Resource + CodeScanerExDriver codeScaner; + @Resource + TubeTransportExDriver tubeTransportExDriver; + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + + + private Boolean isTubeExist() throws AppException { + return canBus.getIOState(IOId.TubeExistPPS); + } + + private Boolean isTubeRackInEnterPos() throws AppException { + return canBus.getIOState(IOId.InfeedPPS); + } + + private Boolean isTubeRackInExitPos() throws AppException { + return canBus.getIOState(IOId.OutfeedPPS); + } + + private Boolean isHighTube() throws AppException { + return canBus.getIOState(IOId.TubeHeightPPS); + } + + + /** + * 移动试管到扫码位置 + * @param tubeIndex 试管索引 + */ + private void moveTubeToScanPos(Integer tubeIndex) throws AppException { + tubeTransportExDriver.scanClampModClamp(); + tubeTransportExDriver.moveTubeRackTo(stp.getTubeScanPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); + } + + /** + * 移动<试管架>到试管架扫码位置 + */ + private void moveTubeRackToScanPos() throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderScanXPos(), TargetPosMeasureDirection.POSITIVE, false); + } + + + public Boolean getTHchOuterPPS() throws AppException { + return canBus.getIOState(IOId.THChOuterPPS); + } + + public Boolean getTHchInterPPS() throws AppException { + return canBus.getIOState(IOId.THChInterPPS); + } + /*========================================================================================= + * 片段 + *========================================================================================*/ + + /** + * 移动试管架到入口位置 + */ + public void moveTubeRackMoveToEnterPos() throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderEnterXPos(), TargetPosMeasureDirection.NOTCARE, true); + } + + /** + * 移动<试管架>到出口位置 + */ + public void moveTubeRackToExitPos() throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderExitXPos(), TargetPosMeasureDirection.NOTCARE, false); + tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderExitXPos() - 10, TargetPosMeasureDirection.NOTCARE, false); + } + + public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubePreProcessPos(tubeIndex), TargetPosMeasureDirection.POSITIVE, false); + } + + + /** + * 移动<试管架>到出口位置 + */ + @ExtApiFn(name = "入料", group = "单步", order = ORDER.moveTubeRackToExitPos) + public Boolean enterTubeHolder() throws AppException { + if (getTHchInterPPS() || getTHchOuterPPS()) { + throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); + } + moveTubeRackMoveToEnterPos(); + try { + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, -1); + for (int i = 0; i < infeedOvertime / 100; i++) { + OS.hsleep(100); + if (getTHchInterPPS()) { + break; + } + logger.info("等待试管架到位 [{}/{}]", i, infeedOvertime / 100); + } + OS.hsleep(1000); + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); + if (!getTHchInterPPS()) { + return false; + } + } finally { + canBus.moduleStop(MId.FeedingModInfeedM); + } + return true; + } + + public void ejectTubeHolderInEnterPos() throws AppException { + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, 1); + OS.hsleep(3000); + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); + } + + + @ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos) + public void ejectTubeHolder() throws AppException { + logger.info("弹出试管架"); + moveTubeRackToExitPos(); + try { + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); + for (int i = 0; i < outfeedOvertime / 100; i++) { + OS.hsleep(100); + logger.info("getTHchInterPPS:{} getTHchOuterPPS:{}", getTHchInterPPS(), getTHchOuterPPS()); + if (!getTHchInterPPS() && !getTHchOuterPPS()) { + break; + } + } + OS.hsleep(1000); + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModOutfeedM); + if (getTHchInterPPS() || getTHchOuterPPS()) { + throw new AppException(A8kEcode.APPE_EJECT_TUBEHOLDER_TIMEOUT); + } + } finally { + canBus.moduleStop(MId.FeedingModOutfeedM); + } + } + + /** + * 移动试管架到扫码并扫码 + */ + @ExtApiFn(name = "扫描<试管架>编码", group = "单步扫码", order = ORDER.moveTubeRackToScanPos) + public String moveTubeRackToScanPosAndScan() throws AppException { + String result; + moveTubeRackToScanPos(); + + tubeTransportExDriver.scanClampModClamp(); + canBus.codeScanerStartScan(MId.FeedingModScannerMod); + result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000); + tubeTransportExDriver.scanClampModRelease(); + if (result == null || result.isEmpty()) { + return ""; + } + return result; + } + // + // 试管移动 + // + + /** + * 移动试管到扫码位置,并扫码 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "扫描<试管X>编码", group = "单步扫码", order = ORDER.moveTubeToScanPosAndScan) + public String moveTubeToScanPosAndScan(Integer tubeIndex) throws AppException { + moveTubeToScanPos(tubeIndex); + try { + tubeTransportExDriver.scanClampModClamp(); + miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, stp.getTubeScanServoTorque()); + return codeScaner.feedingModScannerModCodeScannerScanCode(scanOvertime); + } finally { + miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerRotateSV); + tubeTransportExDriver.scanClampModRelease(); + } + } + + public Boolean tubeXChannelIsEmpty() throws AppException { + return !getTHchInterPPS() && !getTHchOuterPPS(); + } + + + /** + * 移动试管到试管高低判断位置 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos) + public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); + return isHighTube(); + } + + /** + * 移动试管到试管有无判断位置 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "判断<试管N>是否存在", group = "单步-其他", order = ORDER.judgeTubeExist) + public Boolean moveAndjudgeTubeExist(Integer tubeIndex) throws AppException { + tubeTransportExDriver.moveTubeRackTo(stp.getTubeExistJudgPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); + return isTubeExist(); + } + + + public TubeHolderScanResult scanTubeHodler() throws AppException { + TubeHolderScanResult result = new TubeHolderScanResult(); + + //清空试管架 + if (!tubeXChannelIsEmpty()) { + ejectTubeHolder(); + } + //入料 + logger.info("开始进料"); + Boolean enterSuc = enterTubeHolder(); + if (!enterSuc) { + logger.warn("进料超时,从入料口,弹出试管架"); + ejectTubeHolderInEnterPos(); + throw new AppException(A8kEcode.APPE_INFEED_OVERTIME_FAIL); + } + //扫描试管架类型 + String tubeType = moveTubeRackToScanPosAndScan(); + if (tubeType.isEmpty()) { + logger.warn("扫描试管架类型失败,弹出试管架"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT)); + ejectTubeHolder(); + return null; + } + logger.info("扫描试管架类型成功,{}", tubeType); + //逐个扫描试管 + TubesScanResult[] tubesScanResult = new TubesScanResult[10]; + boolean hasTube = false; + for (int i = 0; i < tubesScanResult.length; i++) { + tubesScanResult[i] = new TubesScanResult(); + Boolean isTubeExist = moveAndjudgeTubeExist(i); + if (isTubeExist) { + hasTube = true; + tubesScanResult[i].isTubeExist = true; + tubesScanResult[i].isHighTube = moveAndJudgeTubeAltit(i); + tubesScanResult[i].tubeCode = moveTubeToScanPosAndScan(i); + } else { + tubesScanResult[i].isTubeExist = false; + } + logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); + } + //处理扫描结果 + if (!hasTube) { + logger.error("试管架中没有试管"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); + ejectTubeHolder(); + return null; + } + result.tubeHolderType = tubeType; + result.tube = tubesScanResult; + return result; + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java index 0927fc4..d1d24bd 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java @@ -13,20 +13,25 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.MId; import a8k.utils.ZEQ; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component +@Slf4j public class TubePreProcesCtrlService { - static Logger logger = LoggerFactory.getLogger(TubePreProcesCtrlService.class); static Integer actionOvertime = 10000; - @Resource - A8kCanBusService canBus; - @Resource - TubePreProcesPosParamMgr tubePreProcesPosParamMgr; + enum PROGRESS { + IDLE, + TAKE_TUBE, + SHAKE_TUBE, + TAKE_CAP, + PUT_BAK_TUBE, + } + @Resource MiniServoDriver miniServoDriver; @Resource @@ -37,12 +42,15 @@ public class TubePreProcesCtrlService { // PRIVATE // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + PROGRESS progress = PROGRESS.IDLE; + Boolean isHTube = false; /** * 取试管帽,并放置在摇匀位 */ public void takeTubeFromTubeholderToShakePos(Boolean isHTube) throws AppException { + this.isHTube = isHTube; /* * 校验: * 1.当前摇匀模组设计到的电机是否都处于待机位 @@ -93,10 +101,12 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); //Y轴移动到零位 tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + progress = PROGRESS.TAKE_TUBE; } public void shakeTube(Integer shakeDegree, Integer times) throws AppException { tubePreProcesModuleExDriver.shakeMShake(shakeDegree, times); + progress = PROGRESS.SHAKE_TUBE; } public void takeTubeCap(Boolean isHTube) throws AppException { @@ -110,6 +120,11 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); //Y移动到待机位 tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + progress = PROGRESS.TAKE_CAP; + } + + public void putBakTube() { + } public void putbakTubeCapAndPutbakTubeToTubeHolder(Boolean isHTube) throws AppException { @@ -122,7 +137,7 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.clampingMReleaseTube(); //Z轴上移动到零位 tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); - //Y轴移动到零位 + //Y轴移动到取试管的位置 tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); //移动到放试管的位置 tubePreProcesModuleExDriver.zMotorMoveToTakeHBakTubePos(isHTube); @@ -130,5 +145,40 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.gripperSVOpen(); //设备快速归零 tubePreProcesModuleExDriver.moveToZeroQuick(); + progress = PROGRESS.PUT_BAK_TUBE; + } + + public void resteModule() throws AppException { + + if (progress.equals(PROGRESS.IDLE)) { + return; + } else if (progress.equals(PROGRESS.TAKE_TUBE) || progress.equals(PROGRESS.SHAKE_TUBE)) { + //Y移动到取试管帽位置 + tubePreProcesModuleExDriver.YSVMoveToShakePos(); + //Z下移动到取试管帽位置 + tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); + //闭合夹爪 + tubePreProcesModuleExDriver.gripperSVClampTube(); + //释放试管 + tubePreProcesModuleExDriver.clampingMReleaseTube(); + //Z上移动到零位 + tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); + //Y轴移动到取试管的位置 + tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); + //移动到放试管的位置 + tubePreProcesModuleExDriver.zMotorMoveToTakeHBakTubePos(isHTube); + //打开夹爪 + tubePreProcesModuleExDriver.gripperSVOpen(); + //设备快速归零 + tubePreProcesModuleExDriver.moveToZeroQuick(); + progress = PROGRESS.IDLE; + } else if (progress.equals(PROGRESS.TAKE_CAP)) { + putbakTubeCapAndPutbakTubeToTubeHolder(isHTube); + progress = PROGRESS.IDLE; + return; + } else if (progress.equals(PROGRESS.PUT_BAK_TUBE)) { + progress = PROGRESS.IDLE; + return; + } } } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java deleted file mode 100644 index 47ba527..0000000 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java +++ /dev/null @@ -1,303 +0,0 @@ -package a8k.service.app.devicectrl.ctrlservice; - -import a8k.OS; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver; -import a8k.service.app.devicectrl.driver.MiniServoDriver; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; -import a8k.service.app.devicectrl.driver.type.MiniServoMId; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.param.TubeFeedingModuleParamMgr; -import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.AppWarningNotifyEvent; -import a8k.type.TubeHolderScanResult; -import a8k.type.TubesScanResult; -import a8k.type.exception.AppException; -import a8k.type.TargetPosMeasureDirection; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; -import a8k.hardware.type.a8kcanprotocol.MId; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.TubeTubeFeedingModule) -public class TubeTubeFeedingCtrlService { - static Logger logger = LoggerFactory.getLogger(TubeTubeFeedingCtrlService.class); - static Integer infeedOvertime = 10000; - static Integer outfeedOvertime = 10000; - static Integer scanOvertime = 3000; - - static class ORDER { - static final int moveTubeRackToExitPos = 1; - static final int moveTubeRackToScanPos = 2; - static final int moveTubeToScanPosAndScan = 3; - static final int moveTubeToAltitJudgXPos = 4; - static final int judgeTubeExist = 5; - - } - - @Resource - AppEventBusService ebus; - @Resource - A8kCanBusService canBus; - @Resource - TubeFeedingModuleParamMgr stp; - @Resource - CodeScanerExDriver codeScaner; - @Resource - TubeTransportExDriver tubeTransportExDriver; - @Resource - MiniServoDriver miniServoDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - - - - private Boolean isTubeExist() throws AppException { - return canBus.getIOState(IOId.TubeExistPPS); - } - - private Boolean isTubeRackInEnterPos() throws AppException { - return canBus.getIOState(IOId.InfeedPPS); - } - - private Boolean isTubeRackInExitPos() throws AppException { - return canBus.getIOState(IOId.OutfeedPPS); - } - - private Boolean isHighTube() throws AppException { - return canBus.getIOState(IOId.TubeHeightPPS); - } - - - /** - * 移动试管到扫码位置 - * @param tubeIndex 试管索引 - */ - private void moveTubeToScanPos(Integer tubeIndex) throws AppException { - tubeTransportExDriver.scanClampModClamp(); - tubeTransportExDriver.moveTubeRackTo(stp.getTubeScanPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); - } - - /** - * 移动<试管架>到试管架扫码位置 - */ - private void moveTubeRackToScanPos() throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderScanXPos(), TargetPosMeasureDirection.POSITIVE, false); - } - - - public Boolean getTHchOuterPPS() throws AppException { - return canBus.getIOState(IOId.THChOuterPPS); - } - - public Boolean getTHchInterPPS() throws AppException { - return canBus.getIOState(IOId.THChInterPPS); - } - /*========================================================================================= - * 片段 - *========================================================================================*/ - - /** - * 移动试管架到入口位置 - */ - public void moveTubeRackMoveToEnterPos() throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderEnterXPos(), TargetPosMeasureDirection.NOTCARE, true); - } - - /** - * 移动<试管架>到出口位置 - */ - public void moveTubeRackToExitPos() throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderExitXPos(), TargetPosMeasureDirection.NOTCARE, false); - tubeTransportExDriver.moveTubeRackTo(stp.getTubeHolderExitXPos() - 10, TargetPosMeasureDirection.NOTCARE, false); - } - - public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubePreProcessPos(tubeIndex), TargetPosMeasureDirection.POSITIVE, false); - } - - - /** - * 移动<试管架>到出口位置 - */ - @ExtApiFn(name = "入料", group = "单步", order = ORDER.moveTubeRackToExitPos) - public Boolean enterTubeHolder() throws AppException { - if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); - } - moveTubeRackMoveToEnterPos(); - try { - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, -1); - for (int i = 0; i < infeedOvertime / 100; i++) { - OS.hsleep(100); - if (getTHchInterPPS()) { - break; - } - logger.info("等待试管架到位 [{}/{}]", i, infeedOvertime / 100); - } - OS.hsleep(1000); - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); - if (!getTHchInterPPS()) { - return false; - } - } finally { - canBus.moduleStop(MId.FeedingModInfeedM); - } - return true; - } - - public void ejectTubeHolderInEnterPos() throws AppException { - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, 1); - OS.hsleep(3000); - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); - } - - - @ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos) - public void ejectTubeHolder() throws AppException { - moveTubeRackToExitPos(); - try { - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); - for (int i = 0; i < outfeedOvertime / 100; i++) { - OS.hsleep(100); - logger.info("getTHchInterPPS:{} getTHchOuterPPS:{}", getTHchInterPPS(), getTHchOuterPPS()); - if (!getTHchInterPPS() && !getTHchOuterPPS()) { - break; - } - } - OS.hsleep(1000); - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModOutfeedM); - if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_EJECT_TUBEHOLDER_TIMEOUT); - } - } finally { - canBus.moduleStop(MId.FeedingModOutfeedM); - } - } - - /** - * 移动试管架到扫码并扫码 - */ - @ExtApiFn(name = "扫描<试管架>编码", group = "单步扫码", order = ORDER.moveTubeRackToScanPos) - public String moveTubeRackToScanPosAndScan() throws AppException { - String result; - moveTubeRackToScanPos(); - - tubeTransportExDriver.scanClampModClamp(); - canBus.codeScanerStartScan(MId.FeedingModScannerMod); - result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000); - tubeTransportExDriver.scanClampModRelease(); - if (result == null || result.isEmpty()) { - return ""; - } - return result; - } - // - // 试管移动 - // - - /** - * 移动试管到扫码位置,并扫码 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "扫描<试管X>编码", group = "单步扫码", order = ORDER.moveTubeToScanPosAndScan) - public String moveTubeToScanPosAndScan(Integer tubeIndex) throws AppException { - moveTubeToScanPos(tubeIndex); - try { - tubeTransportExDriver.scanClampModClamp(); - miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, stp.getTubeScanServoTorque()); - return codeScaner.feedingModScannerModCodeScannerScanCode(scanOvertime); - } finally { - miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerRotateSV); - tubeTransportExDriver.scanClampModRelease(); - } - } - - public Boolean tubeXChannelIsEmpty() throws AppException { - return !getTHchInterPPS() && !getTHchOuterPPS(); - } - - - /** - * 移动试管到试管高低判断位置 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos) - public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex) , TargetPosMeasureDirection.NEGATIVE, false); - return isHighTube(); - } - - /** - * 移动试管到试管有无判断位置 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "判断<试管N>是否存在", group = "单步-其他", order = ORDER.judgeTubeExist) - public Boolean moveAndjudgeTubeExist(Integer tubeIndex) throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeExistJudgPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); - return isTubeExist(); - } - - - public TubeHolderScanResult scanTubeHodler() throws AppException { - TubeHolderScanResult result = new TubeHolderScanResult(); - - //清空试管架 - if (!tubeXChannelIsEmpty()) { - ejectTubeHolder(); - } - //入料 - logger.info("开始进料"); - Boolean enterSuc = enterTubeHolder(); - if (!enterSuc) { - logger.warn("进料超时,从入料口,弹出试管架"); - ejectTubeHolderInEnterPos(); - throw new AppException(A8kEcode.APPE_INFEED_OVERTIME_FAIL); - } - //扫描试管架类型 - String tubeType = moveTubeRackToScanPosAndScan(); - if (tubeType.isEmpty()) { - logger.warn("扫描试管架类型失败,弹出试管架"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT)); - ejectTubeHolder(); - return null; - } - logger.info("扫描试管架类型成功,{}", tubeType); - //逐个扫描试管 - TubesScanResult[] tubesScanResult = new TubesScanResult[10]; - boolean hasTube = false; - for (int i = 0; i < tubesScanResult.length; i++) { - tubesScanResult[i] = new TubesScanResult(); - Boolean isTubeExist = moveAndjudgeTubeExist(i); - if (isTubeExist) { - hasTube = true; - tubesScanResult[i].isTubeExist = true; - tubesScanResult[i].isHighTube = moveAndJudgeTubeAltit(i); - tubesScanResult[i].tubeCode = moveTubeToScanPosAndScan(i); - } else { - tubesScanResult[i].isTubeExist = false; - } - logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); - } - //处理扫描结果 - if (!hasTube) { - logger.error("试管架中没有试管"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); - ejectTubeHolder(); - return null; - } - result.tubeHolderType = tubeType; - result.tube = tubesScanResult; - return result; - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java new file mode 100644 index 0000000..53bccdd --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java @@ -0,0 +1,106 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class TurnableMoveCtrlService { + static final Integer overtime = 10000; + + + @Resource + A8kCanBusService canBus; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + @Resource + TurntablePosParamMgr turntablePosParamMgr; + + + private void checkBeforeMoveTrunable() throws AppException { + //板夹仓卡板检测 + if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { + log.error("PlateBoxPlateStuckPPS is trigger"); + throw new AppException(A8kEcode.APPE_PLATE_STUCK_DETECTOR_SENSOR_TRIGGER); + } + + //检查钩板电机是否处于终点位置 + if (!canBus.getIOState(IOId.PullerMZeroPPS)) { + log.error("PullerM is not in zero pos"); + throw new AppException(A8kEcode.APPE_PULLERM_INIT_POS_ERROR); + } + + //检查板夹仓光电是否处于起点位置 + if (!canBus.getIOState(IOId.PusherMZeroPPS)) { + log.error("PusherM is not in zero pos"); + throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); + } + } + + private void checkBeforeMovePlateBox() throws AppException { + if (!canBus.getIOState(IOId.PusherMZeroPPS)) { + log.error("PusherM is not in zero pos "); + throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); + } + } + + + private void trunableMoveTo(Integer pos) throws AppException { + checkBeforeMoveTrunable(); + //限制pos在 0--> 36000之间 + pos = pos % 36000; + if (pos < 0) { + pos += 36000; + } + + //先移动半个间距,用来检测是否发生卡板 + Integer nowPos = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); + if (nowPos < pos) { + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, turntablePosParamMgr.getPosSpacing(), overtime); + } else if (nowPos > pos) { + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, -turntablePosParamMgr.getPosSpacing(), overtime); + } + + //解决齿轮间隙的问题 + if (nowPos < pos) { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos, overtime); + } else { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos - 300/**/, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos, overtime); + } + } + + public void trunableMoveToPushPos(IncubatorPos index) throws AppException { + trunableMoveTo(turntablePosParamMgr.getPushPos0() + index.off * turntablePosParamMgr.getPosSpacing()); + } + + public void trunableMoveToPullPos(IncubatorPos index) throws AppException { + trunableMoveTo(turntablePosParamMgr.getPullPos0() + index.off * turntablePosParamMgr.getPosSpacing()); + } + + public void trunableMoveToDropLiquidPos(IncubatorPos index) throws AppException { + trunableMoveTo(turntablePosParamMgr.getDropLiquidPos0() + index.off * turntablePosParamMgr.getPosSpacing()); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java b/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java index b2b5bf1..d2863c4 100644 --- a/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java @@ -130,7 +130,7 @@ public class PipetteCtrlDriver { @ExtApiFn(name = "初始化设备", order = FnOrder.initDeviceBlock) - public void pipetteInitDeviceBlock() throws AppException { + private void pipetteInitDeviceBlock() throws AppException { canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_init_device.toInt()); canBusService.waitForMod(MId.PipetteMod, overtime); } diff --git a/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java index f04247b..91a2c1d 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java @@ -81,6 +81,7 @@ public class HbotBaseMoveExDriver { hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); } + // public String scan2dCode(Integer waittime) throws AppException { // try { // canBus.codeScanerStartScan(MId.PipetteModCodeScanner); diff --git a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java index 8024de7..360bb68 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java @@ -84,7 +84,7 @@ public class MotorEnableExDriver { try { hbotDriver.enable(0); } catch (AppException e) { - log.info("hbotDriver disable failed, {}", e.getMessage()); + log.info("hbotDriver disable failed, {}", e.getMessage()); } try { @@ -94,5 +94,18 @@ public class MotorEnableExDriver { } } + public void enableAllMotor() throws AppException { + for (StepMotorMId stepMotorMId : StepMotorMId.values()) { + stepMotorCtrlDriver.stepMotorEnable(stepMotorMId, 1); + } + + for (MiniServoMId miniServoMId : MiniServoMId.values()) { + miniServoDriver.miniServoEnable(miniServoMId, 1); + } + + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java new file mode 100644 index 0000000..e16dfa3 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java @@ -0,0 +1,30 @@ +package a8k.service.app.devicectrl.script; + +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.bases.ActionReactorService; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class DeviceCtrlScripter { + + @Resource + ActionReactorService actionReactor; + + @Resource + OptScanModule optScanModule; + + + public void dropAllPlates() throws AppException { + log.info("清空孵育盘"); + actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + for (var incubatorPos : IncubatorPos.values()) { + actionReactor.dosome("拉板" + incubatorPos.name(), () -> optScanModule.pullPlate(incubatorPos)); + actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + } + } +}