Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
4a15da7ae4
  1. 19
      src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java
  2. 16
      src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java
  3. 21
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java
  4. 51
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java
  5. 35
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java
  6. 19
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java
  7. 36
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java
  8. 25
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md
  9. 11
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  10. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  11. 14
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java
  12. 4
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java
  13. 6
      src/main/java/a8k/service/app/appstate/GStateService.java
  14. 10
      src/main/java/a8k/service/app/appstate/SensorState.java
  15. 3
      src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java
  16. 32
      src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java
  17. 15
      src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java
  18. 102
      src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java
  19. 19
      src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java
  20. 49
      src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java
  21. 18
      src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java
  22. 50
      src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java
  23. 18
      src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java
  24. 62
      src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java
  25. 52
      src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java
  26. 2
      src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java
  27. 1
      src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java
  28. 15
      src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java
  29. 30
      src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java

19
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();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

16
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;
}

21
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();
}

51
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<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.ShakeModule,
A8kPublicResourceType.HBOT
A8kPublicResourceType.TubeFeedModule
);
}

35
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();

19
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<A8kPublicResourceType> getResourceList() {
return List.of(A8kPublicResourceType.ShakeModule);
return List.of(
A8kPublicResourceType.ShakeModule,
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.OPTModule,
A8kPublicResourceType.PlatesBoxModule,
A8kPublicResourceType.HBOT
);
}
}

36
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<A8kPublicResourceType> getResourceList() {
return List.of();
return List.of(
A8kPublicResourceType.ShakeModule,
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.OPTModule,
A8kPublicResourceType.PlatesBoxModule,
A8kPublicResourceType.HBOT
);
}
}

25
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md

@ -0,0 +1,25 @@
```angular2html
当某个试管处理过程中触发错误?
耗材不足错误:
检测点:开始处理试管前
错误处理逻辑: 上报错误,设备暂停,试管状态为待处理
取Tip头失败:
检查点:试管处理过程中
错误处理:当前样本相关的测试全部失败,设备暂停,试管状态被标记为错误。
取样本失败:
检查点:试管处理过程中
错误处理:当前样本相关的测试全部失败,不抛出异常,试管标记为错误,处理下一个试管。
什么情况下设备不允许暂停?
1. 当试管正在处理的过程中,不允许暂停,因为此时耗材已经作为资源分配出去了,暂停后如果用户修改耗材状态就会造成资源状态无法同步。
```

11
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

6
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;

14
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

4
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;

6
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;
}
}

10
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;
}

3
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,//板夹仓电机

32
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)

15
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);
}
}

102
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<Checkpoint> checkPoints = new ArrayList<>();
@ -64,26 +84,10 @@ public class DeviceInitCtrlService {
}
public List<CheckResult> checkBeforeInitDevice() throws AppException {
List<CheckResult> 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<CheckResult> doDeviceMoveToZero() throws AppException {
motorEnableExDriver.enableAllMotor();
//
public List<CheckResult> deviceMoveToZero() throws AppException {
List<CheckResult> 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<CheckResult> checkBeforeInitDevice() throws AppException {
List<CheckResult> 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<CheckResult> 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();
}
}

19
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();
}
}

49
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);
}
}

18
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");
}
//
//取样
//
}

50
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);
}
}

18
src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java → src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java

@ -28,8 +28,8 @@ import org.springframework.stereotype.Component;
@Component
@ExtApiTab(cfg = ExtApiTabConfig.TubeTubeFeedingModule)
public class TubeTubeFeedingCtrlService {
static Logger logger = LoggerFactory.getLogger(TubeTubeFeedingCtrlService.class);
public class TubeFeedingCtrlService {
static Logger logger = LoggerFactory.getLogger(TubeFeedingCtrlService.class);
static Integer infeedOvertime = 10000;
static Integer outfeedOvertime = 10000;
static Integer scanOvertime = 3000;
@ -48,16 +48,15 @@ public class TubeTubeFeedingCtrlService {
@Resource
A8kCanBusService canBus;
@Resource
TubeFeedingModuleParamMgr stp;
TubeFeedingModuleParamMgr stp;
@Resource
CodeScanerExDriver codeScaner;
CodeScanerExDriver codeScaner;
@Resource
TubeTransportExDriver tubeTransportExDriver;
TubeTransportExDriver tubeTransportExDriver;
@Resource
MiniServoDriver miniServoDriver;
MiniServoDriver miniServoDriver;
@Resource
StepMotorCtrlDriver stepMotorCtrlDriver;
StepMotorCtrlDriver stepMotorCtrlDriver;
private Boolean isTubeExist() throws AppException {
@ -163,6 +162,7 @@ public class TubeTubeFeedingCtrlService {
@ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos)
public void ejectTubeHolder() throws AppException {
logger.info("弹出试管架");
moveTubeRackToExitPos();
try {
stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1);
@ -232,7 +232,7 @@ public class TubeTubeFeedingCtrlService {
*/
@ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos)
public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException {
tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex) , TargetPosMeasureDirection.NEGATIVE, false);
tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false);
return isHighTube();
}

62
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;
}
}
}

52
src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java → src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java

@ -7,6 +7,7 @@ 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;
@ -15,26 +16,23 @@ 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl)
public class ReactionPlatesTransmitCtrlService {
static Logger logger = LoggerFactory.getLogger(ReactionPlatesTransmitCtrlService.class);
public class TurnableMoveCtrlService {
static final Integer overtime = 10000;
@Resource
A8kCanBusService canBus;
A8kCanBusService canBus;
@Resource
StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource
PlatesBoxPosParamMgr platesBoxPosParamMgr;
StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource
OptModuleParamsMgr optModuleParamsMgr;
ActionReactorService actionReactor;
@Resource
TurntablePosParamMgr turntablePosParamMgr;
@ -42,26 +40,26 @@ public class ReactionPlatesTransmitCtrlService {
private void checkBeforeMoveTrunable() throws AppException {
//板夹仓卡板检测
if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) {
logger.error("PlateBoxPlateStuckPPS is trigger");
log.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");
log.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");
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)) {
logger.error("PusherM is not in zero pos ");
log.error("PusherM is not in zero pos ");
throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR);
}
}
@ -105,30 +103,4 @@ public class ReactionPlatesTransmitCtrlService {
}
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);
}
}

2
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);
}

1
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);

15
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);
}
}

30
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());
}
}
}
Loading…
Cancel
Save