14 changed files with 793 additions and 29 deletions
-
8src/main/java/a8k/controler/engineer/utils/EnginnerPageTabOrder.java
-
40src/main/java/a8k/service/appcfgs/AppCfgMgrService.java
-
34src/main/java/a8k/service/appfrontend/AppFrontEndEventRouter.java
-
7src/main/java/a8k/service/hardware/HardwareTestScript.java
-
4src/main/java/a8k/service/hardware/HbotControlService.java
-
2src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java
-
2src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java
-
2src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java
-
1src/main/java/a8k/service/hardware/canbus/protocol/A8kEcode.java
-
231src/main/java/a8k/service/hardwarev2/commonctrl/HardwareCommonCtrl.java
-
372src/main/java/a8k/service/hardwarev2/ctrl/SamplesPreProcesCtrl.java
-
87src/main/java/a8k/service/hardwarev2/param/PosParam.java
-
23src/main/java/a8k/service/hardwarev2/param/TimeParam.java
-
7src/main/java/a8k/utils/ZEQ.java
@ -0,0 +1,231 @@ |
|||
package a8k.service.hardwarev2.commonctrl; |
|||
|
|||
|
|||
import a8k.appbase.HardwareException; |
|||
import a8k.appbase.appret.AppRet; |
|||
import a8k.controler.engineer.utils.EngineerPageTab; |
|||
import a8k.controler.engineer.utils.EnginnerPageAction; |
|||
import a8k.controler.engineer.utils.EnginnerPageParams; |
|||
import a8k.controler.engineer.utils.EnginnerPageTabOrder; |
|||
import a8k.service.hardware.canbus.A8kCanBusService; |
|||
import a8k.service.hardware.canbus.protocol.A8kEcode; |
|||
import a8k.service.hardware.canbus.protocol.IOId; |
|||
import a8k.service.hardware.canbus.protocol.MId; |
|||
import a8k.service.hardwarev2.param.PosParam; |
|||
import a8k.service.hardwarev2.param.TimeParam; |
|||
import jakarta.annotation.Resource; |
|||
import org.slf4j.Logger; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@EngineerPageTab(name = "硬件控制-通用控制", order = EnginnerPageTabOrder.SamplesPreProcesCtrl) |
|||
@EnginnerPageParams(service = HardwareCommonCtrl.class) |
|||
public class HardwareCommonCtrl { |
|||
static Logger logger = org.slf4j.LoggerFactory.getLogger(HardwareCommonCtrl.class); |
|||
|
|||
static class ORDER { |
|||
static final int initializeDevice = 1; |
|||
static final int deviceEnable = 2; |
|||
static final int deviceClear = 3; |
|||
} |
|||
|
|||
@Resource |
|||
A8kCanBusService canBus; |
|||
|
|||
@Resource |
|||
TimeParam timep; |
|||
|
|||
@Resource |
|||
PosParam posp; |
|||
|
|||
Boolean workState = false; |
|||
|
|||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|||
// CHECK |
|||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|||
|
|||
private AppRet<Object> checkDeviceStateBeforeRunToZero() throws HardwareException { |
|||
logger.info("checkDeviceStateBeforeRunToZero"); |
|||
//试管平移通道是否有障碍 |
|||
if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) { |
|||
logger.warn("THChInterPPS or THChOuterPPS is trigger"); |
|||
return AppRet.fail(A8kEcode.TubeXChannelIsNotEmpty); |
|||
} |
|||
|
|||
//板夹仓盖子是否盖上 |
|||
if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
|||
return AppRet.fail(A8kEcode.PlateBoxNotCover); |
|||
} |
|||
|
|||
//板夹仓卡板检测 |
|||
if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { |
|||
return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger); |
|||
} |
|||
|
|||
//检查钩板电机是否处于终点位置 |
|||
if (!canBus.getIOState(IOId.PullerMZeroPPS)) { |
|||
return AppRet.fail(A8kEcode.PullerMInitPosError); |
|||
} |
|||
|
|||
//检查板夹仓光电是否处于起点位置 |
|||
if (!canBus.getIOState(IOId.PusherMZeroPPS)) { |
|||
return AppRet.fail(A8kEcode.PusherMInitPosError); |
|||
} |
|||
//板夹仓光电 |
|||
if (canBus.getIOState(IOId.RecycleBinOverflowPPS)) { |
|||
return AppRet.fail(A8kEcode.RecycleBinOverflow); |
|||
} |
|||
|
|||
return AppRet.success(); |
|||
} |
|||
|
|||
private void checkStopFlag() throws HardwareException { |
|||
if (!workState) { |
|||
throw new HardwareException(A8kEcode.StopByUser); |
|||
} |
|||
} |
|||
|
|||
|
|||
private AppRet<Object> moveMotorToZero() throws HardwareException, InterruptedException { |
|||
|
|||
//进出料初始化 |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 10, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, 10, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, 10, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
|
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, 90); |
|||
checkStopFlag(); |
|||
|
|||
//板夹仓初始化 |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxYM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxPusherM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
//光学模组初始化 |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
//HBot初始化 |
|||
canBus.hbotMoveToZero(MId.HbotM); |
|||
checkStopFlag(); |
|||
|
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.PipetteModZM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
//转盘归零 |
|||
canBus.stepMotorEasyMoveToZeroBlock(MId.IncubatorRotateCtrlM, timep.getActionOvertime()); |
|||
checkStopFlag(); |
|||
|
|||
|
|||
return AppRet.success(); |
|||
} |
|||
|
|||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|||
// Expose API |
|||
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|||
@EnginnerPageAction(name = "设备初始化", order = ORDER.initializeDevice) |
|||
public AppRet<Object> initializeDevice() throws HardwareException, InterruptedException { |
|||
logger.info("Initializing device ..."); |
|||
boolean initSuc = false; |
|||
workState = true; |
|||
AppRet<Object> ecode; |
|||
try { |
|||
//打开必要的电源 |
|||
canBus.setIOState(IOId.RecycleBinOverflowPPSPowerCtrl, true); |
|||
|
|||
//检查设备状态 |
|||
ecode = checkDeviceStateBeforeRunToZero(); |
|||
if (!ecode.isSuccess()) { |
|||
return ecode; |
|||
} |
|||
// 复位设备 |
|||
logger.info("moveMotorToZero"); |
|||
ecode = moveMotorToZero(); |
|||
if (!ecode.isSuccess()) { |
|||
return ecode; |
|||
} |
|||
initSuc = true; |
|||
logger.info("Device initialization completed"); |
|||
|
|||
} finally { |
|||
if (!initSuc) { |
|||
try { |
|||
canBus.stepMotorEnable(MId.ShakeModClampingM, 1); |
|||
} catch (HardwareException ignored) { |
|||
} |
|||
try { |
|||
canBus.stepMotorEasyMoveBy(MId.ShakeModClampingM, 2); |
|||
} catch (HardwareException ignored) { |
|||
} |
|||
} |
|||
} |
|||
return ecode; |
|||
|
|||
} |
|||
|
|||
@EnginnerPageAction(name = "清空板夹仓板夹", order = ORDER.deviceClear) |
|||
public void clearDevice() { |
|||
//TODO |
|||
} |
|||
|
|||
|
|||
@EnginnerPageAction(name = "设备使能", order = ORDER.deviceEnable) |
|||
public void deviceEnable(Boolean enable) throws HardwareException { |
|||
//进出料初始化 |
|||
canBus.stepMotorEnable(MId.FeedingModInfeedM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.FeedingModXM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.FeedingModOutfeedM, enable ? 1 : 0); |
|||
|
|||
//摇匀模组初始化 |
|||
canBus.stepMotorEnable(MId.ShakeModClampingM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.ShakeModGripperZM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.ShakeModShakeM, enable ? 1 : 0); |
|||
canBus.miniServoEnable(MId.ShakeModGripperYSV, enable ? 1 : 0); |
|||
canBus.miniServoEnable(MId.ShakeModGripperSV, enable ? 1 : 0); |
|||
canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, enable ? 1 : 0); |
|||
canBus.miniServoEnable(MId.ShakeModTubeScanerRotateSV, enable ? 1 : 0); |
|||
|
|||
//板夹仓初始化 |
|||
canBus.stepMotorEnable(MId.PlatesBoxYM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.PlatesBoxPusherM, enable ? 1 : 0); |
|||
|
|||
//光学模组初始化 |
|||
canBus.stepMotorEnable(MId.OptModPullM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.OptModScannerM, enable ? 1 : 0); |
|||
|
|||
//HBot初始化 |
|||
canBus.hbotEnable(MId.HbotM, enable ? 1 : 0); |
|||
canBus.stepMotorEnable(MId.PipetteModZM, enable ? 1 : 0); |
|||
|
|||
//转盘归零 |
|||
canBus.stepMotorEnable(MId.IncubatorRotateCtrlM, enable ? 1 : 0); |
|||
} |
|||
|
|||
public void checkBeforeMove(MId mId) throws HardwareException { |
|||
//板夹仓盖子是否盖上 |
|||
if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { |
|||
throw new HardwareException(A8kEcode.PlateBoxNotCover); |
|||
} |
|||
} |
|||
|
|||
public void stop() { |
|||
workState = false; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,372 @@ |
|||
package a8k.service.hardwarev2.ctrl; |
|||
|
|||
import a8k.appbase.HardwareException; |
|||
import a8k.appbase.appret.AppRet; |
|||
import a8k.appbase.type.A8kTubeType; |
|||
import a8k.controler.engineer.utils.*; |
|||
import a8k.service.hardware.CommonHardwareOpeartion; |
|||
import a8k.service.hardware.HardwareCtrlModule; |
|||
import a8k.service.hardware.canbus.A8kCanBusService; |
|||
import a8k.service.hardware.canbus.protocol.A8kEcode; |
|||
import a8k.service.hardware.canbus.protocol.MId; |
|||
import a8k.service.hardwarev2.param.TimeParam; |
|||
import a8k.service.hardwarev2.param.PosParam; |
|||
import a8k.utils.ZEQ; |
|||
import jakarta.annotation.Resource; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.lang.reflect.Method; |
|||
import java.util.List; |
|||
|
|||
@Component |
|||
@EngineerPageTab(name = "硬件控制-样本预处理模块", order = EnginnerPageTabOrder.SamplesPreProcesCtrl) |
|||
@EnginnerPageParams(service = SamplesPreProcesCtrl.class) |
|||
public class SamplesPreProcesCtrl { |
|||
static Logger logger = LoggerFactory.getLogger(SamplesPreProcesCtrl.class); |
|||
|
|||
@Resource |
|||
A8kCanBusService canBus; |
|||
@Resource |
|||
CommonHardwareOpeartion comHardwareOpear; |
|||
@Resource |
|||
TimeParam timep; |
|||
@Resource |
|||
PosParam pp; |
|||
|
|||
Boolean debug = false; |
|||
|
|||
@EnginnerPageAction(name = "使能调试模式", group = "调试") |
|||
public void enableDebugMode() { |
|||
this.debug = true; |
|||
} |
|||
|
|||
@EnginnerPageAction(name = "失能调试模式", group = "调试") |
|||
public void disableDebugMode() { |
|||
this.debug = false; |
|||
} |
|||
|
|||
@EnginnerPageAction(name = "模组归零") |
|||
public void modGroupMoveToZero() throws HardwareException, InterruptedException { |
|||
// if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { |
|||
// throw new HardwareException(A8kEcode.ShakeModGripperZMNotInZeroPos); |
|||
// } |
|||
|
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperClosePos());//此步骤,除了归零的同时还能够检测是否有试管在夹爪中 |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperZeroYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
canBus.stepMotorEasyMoveToZero(MId.ShakeModClampingM); |
|||
canBus.waitForMod(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
canBus.stepMotorEasyMoveToZero(MId.ShakeModGripperZM); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
canBus.stepMotorEasyMoveToZero(MId.ShakeModShakeM); |
|||
canBus.waitForMod(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, 90); |
|||
canBus.waitForMod(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModClampingM, -2); |
|||
} |
|||
|
|||
|
|||
@EnginnerPageAction(name = "模组快速归零") |
|||
public void modGroupMoveToZeroQuick() throws HardwareException, InterruptedException { |
|||
/* |
|||
* 1.Z轴回到零位 |
|||
* 2.试管夹紧回到零位 |
|||
* 3.摇匀回到零位 |
|||
*/ |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModClampingM, 0); |
|||
canBus.waitForMod(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
|
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, 0); |
|||
canBus.waitForMod(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
|
|||
modGroupMoveToZero(); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 取试管帽,如果试管帽存在, |
|||
* @param highTube true/false |
|||
*/ |
|||
@EnginnerPageAction(name = "取试管") |
|||
public AppRet<Boolean> takeTubeAndJudgeTubeExist(Boolean highTube) throws HardwareException, InterruptedException { |
|||
|
|||
/* |
|||
* 校验: |
|||
* 1.当前摇匀模组设计到的电机是否都处于待机位 |
|||
*/ |
|||
|
|||
//Z轴在原点 |
|||
if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { |
|||
throw new HardwareException(MId.ShakeModGripperZM, A8kEcode.MNotInZeroPos); |
|||
} |
|||
|
|||
//Y轴在零点附近 |
|||
if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperYSV), pp.getGripperZeroYPos(), 30)) { |
|||
throw new HardwareException(MId.ShakeModGripperYSV, A8kEcode.MNotInZeroPos); |
|||
} |
|||
|
|||
//夹爪没有零位置 |
|||
if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { |
|||
throw new HardwareException(MId.ShakeModGripperSV, A8kEcode.MNotInZeroPos); |
|||
} |
|||
|
|||
//检查摇匀夹紧是否在零位 |
|||
if (!canBus.stepMotorReadIoState(MId.ShakeModClampingM, 0)) { |
|||
throw new HardwareException(MId.ShakeModClampingM, A8kEcode.MNotInZeroPos); |
|||
} |
|||
|
|||
boolean isHighBlood = highTube; |
|||
boolean tubeCapExist = true; |
|||
Integer gripperJudgeCapZPos = isHighBlood ? pp.getGripperJudgeHTubeCapZPos() : pp.getGripperJudgeSTubeCapZPos(); |
|||
Integer gripperTakeTubeZPos = isHighBlood ? pp.getGripperTakeHTubeZPos() : pp.getGripperTakeSTubeZPos(); |
|||
Integer gripperShakeZPos = pp.getGripperShakeTubeZPos(); |
|||
|
|||
//固定试管架 |
|||
logger.info("固定试管架"); |
|||
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, 900); |
|||
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//试管夹紧移动到终点位置 |
|||
logger.info("试管夹紧移动到终点位置"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModClampingM, 70); |
|||
canBus.waitForMod(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//试管摇匀移动到90度 |
|||
logger.info("试管摇匀移动到90度"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, pp.getShakeModShakeMStandbyPos()); |
|||
canBus.waitForMod(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Y轴向前移动 |
|||
logger.info("夹爪Y轴移动到取试管位置"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperTakeTubeYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//打开夹爪 |
|||
logger.info("打开抓手"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperOpenPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴下移动到试管帽有无检测位 |
|||
logger.info("Z轴下移动到试管帽有无检测位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, gripperJudgeCapZPos); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//闭合夹爪检测试管帽是否存在 |
|||
logger.info("闭合夹爪检测试管帽是否存在"); |
|||
canBus.miniServoRotateWithTorque(MId.ShakeModGripperSV, -400); |
|||
Thread.sleep(timep.getTubeCapJudgeDelayTime()); |
|||
if (ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { |
|||
logger.info("试管帽不存在"); |
|||
tubeCapExist = false; |
|||
} |
|||
|
|||
|
|||
if (debug || tubeCapExist) { |
|||
//打开夹爪 |
|||
logger.info("打开夹爪"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperOpenPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴下移动到取试管位置 |
|||
logger.info("Z轴下移动到取试管位置"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, gripperTakeTubeZPos); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//夹爪夹紧 |
|||
logger.info("夹爪夹紧"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperTakeCapPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴上移动到零位 |
|||
logger.info("Z轴上移动到零位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Y轴移动到摇匀位 |
|||
logger.info("Y轴移动到摇匀位"); |
|||
|
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperShakeYPos() - 50); //该动作是为了消除齿轮间隙 |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperShakeYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴下移动到摇匀位放试管的位置 |
|||
logger.info("Z轴下移动到摇匀位放试管的位置"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, gripperShakeZPos); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//夹紧试管 |
|||
logger.info("夹紧试管"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModClampingM, pp.getShakeClampingPos()); |
|||
canBus.waitForMod(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//松开夹爪,放置试管 |
|||
logger.info("松开夹爪,放置试管"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperOpenPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴上移动到零位 |
|||
logger.info("Z轴上移动到零位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴归零,校准一次位置 |
|||
logger.info("Z轴归零"); |
|||
canBus.stepMotorEasyMoveToZero(MId.ShakeModGripperZM); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Y轴移动到零位 |
|||
logger.info("Y轴移动到零位"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperZeroYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
} else { |
|||
modGroupMoveToZeroQuick(); |
|||
} |
|||
return AppRet.success(tubeCapExist); //Z轴下移动试管判断的位置 |
|||
} |
|||
|
|||
|
|||
@EnginnerPageAction(name = "摇匀") |
|||
public void shakeTube(Integer shakeDegree, Integer times) throws HardwareException, InterruptedException { |
|||
var standByPos = pp.getShakeModShakeMStandbyPos(); |
|||
var startPos = standByPos - shakeDegree; |
|||
var endPos = standByPos + shakeDegree; |
|||
canBus.stepMotorEasyReciprocatingMotion(MId.ShakeModShakeM, startPos, endPos, times); |
|||
canBus.waitForMod(MId.ShakeModShakeM, timep.getActionOvertime()); |
|||
} |
|||
|
|||
@EnginnerPageAction(name = "取试管帽") |
|||
public void takeTubeCap() throws HardwareException, InterruptedException { |
|||
//Y移动到取试管帽位置 |
|||
logger.info("Y移动到取试管帽位置 && 打开夹爪"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperShakeYPos()); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperOpenPos()); |
|||
canBus.waitForMods(new MId[]{MId.ShakeModGripperYSV, MId.ShakeModGripperSV}, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z下移动到取试管帽位置 |
|||
logger.info("Z下移动到取试管帽位置"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 3); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//闭合夹爪 |
|||
logger.info("闭合夹爪"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperTakeCapPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
//Z上移动到零位 |
|||
logger.info("Z上移动到零位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMods(new MId[]{MId.ShakeModGripperZM}, timep.getActionOvertime()); |
|||
|
|||
//Y移动到待机位 |
|||
logger.info("Y移动到待机位"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperZeroYPos()); |
|||
canBus.waitForMods(new MId[]{MId.ShakeModGripperYSV}, timep.getActionOvertime()); |
|||
} |
|||
|
|||
/** |
|||
* 盖试管帽,并将试管移动回试管架中 |
|||
*/ |
|||
@EnginnerPageAction(name = "盖试管帽并放回试管架") |
|||
public void pushBackTubeCapAndTakeBakTube(A8kTubeType tubeType) throws HardwareException, InterruptedException { |
|||
//移动Y轴到取试管帽位置 |
|||
logger.info("移动Y轴到取试管帽位置"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperShakeYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//移动Z轴盖帽 |
|||
logger.info("移动Z轴盖帽"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 10); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//打开试管夹 |
|||
logger.info("打开试管夹"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModClampingM, 70); |
|||
canBus.waitForMod(MId.ShakeModClampingM, timep.getActionOvertime()); |
|||
|
|||
//移动Z轴到零位 |
|||
logger.info("移动Z轴到零位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
//移动Y轴到方式管的位置 |
|||
logger.info("移动Y轴到方式管的位置"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, pp.getGripperTakeTubeYPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperYSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//移动Z轴到取试管位置 |
|||
logger.info("移动Z轴到取试管位置"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, pp.getGripperTakeHTubeZPos() - 20); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
|
|||
//打开夹爪 |
|||
logger.info("打开夹爪"); |
|||
canBus.miniServoMoveTo(MId.ShakeModGripperSV, pp.getGripperOpenPos()); |
|||
canBus.waitForMod(MId.ShakeModGripperSV, timep.getActionOvertime()); |
|||
|
|||
|
|||
//Z轴上移动到零位 |
|||
logger.info("Z轴上移动到零位"); |
|||
canBus.stepMotorEasyMoveTo(MId.ShakeModGripperZM, 0); |
|||
canBus.waitForMod(MId.ShakeModGripperZM, timep.getActionOvertime()); |
|||
|
|||
//设备快速归零 |
|||
modGroupMoveToZeroQuick(); |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 气溶胶风扇控制 |
|||
*/ |
|||
@EnginnerPageAction( |
|||
name = "气溶胶风扇控制", |
|||
order = 1, |
|||
beforeExecute = "beforeActionExec" |
|||
) |
|||
public void setAeroslFanPower(Boolean enable) throws Exception { |
|||
if (enable) { |
|||
canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 99); |
|||
} else { |
|||
canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 0); |
|||
} |
|||
} |
|||
|
|||
public void beforeActionExec(Method method, List<Object> params) { |
|||
System.out.println("beforeActionExec"); |
|||
} |
|||
} |
@ -0,0 +1,87 @@ |
|||
package a8k.service.hardwarev2.param; |
|||
|
|||
import a8k.controler.engineer.utils.*; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@EngineerPageTab(name = "硬件参数-坐标参数", order = EnginnerPageTabOrder.PosParam) |
|||
@EnginnerPageParams(service = PosParam.class) |
|||
public class PosParam { |
|||
EnginnerParamReader hpReader = new EnginnerParamReader(EnginnerPageParams.class); |
|||
|
|||
@EnginnerPageParam(name = "抓手张开位置", group = "抓手") |
|||
public Integer getGripperOpenPos() { |
|||
return hpReader.getInteger("GripperOpenPos", 150); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "抓手闭合位置", group = "抓手") |
|||
public Integer getGripperClosePos() { |
|||
return hpReader.getInteger("GripperClosePos", 10); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "抓手取试管位置", group = "抓手") |
|||
public Integer getGripperTakeCapPos() { |
|||
return hpReader.getInteger("GripperTakeCapPos", 55); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "取试管位置", group = "Y轴位置") |
|||
public Integer getGripperTakeTubeYPos() { |
|||
return hpReader.getInteger("GripperTakeTubeYPos", 2750 + 300); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "摇匀位置", group = "Y轴位置") |
|||
public Integer getGripperShakeYPos() { |
|||
return hpReader.getInteger("GripperShakeYPos", 1828 + 300); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "待机位", group = "Y轴位置") |
|||
public Integer getGripperZeroYPos() { |
|||
return hpReader.getInteger("GripperZeroYPos", 300); |
|||
} |
|||
|
|||
|
|||
@EnginnerPageParam(name = "取高试管位置", group = "Z轴位置") |
|||
public Integer getGripperTakeHTubeZPos() { |
|||
return hpReader.getInteger("GripperTakeHTubeZPos", 739); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "取低试管位置", group = "Z轴位置") |
|||
public Integer getGripperTakeSTubeZPos() { |
|||
return hpReader.getInteger("GripperTakeSTubeZPos", 985); |
|||
} |
|||
|
|||
//JudgeTubeCapZ |
|||
@EnginnerPageParam(name = "高试管帽有无判断位", group = "Z轴位置") |
|||
public Integer getGripperJudgeHTubeCapZPos() { |
|||
return hpReader.getInteger("GripperJudgeHTubeCapZPos", 591); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "低试管帽有无判断位", group = "Z轴位置") |
|||
public Integer getGripperJudgeSTubeCapZPos() { |
|||
return hpReader.getInteger("GripperJudgeSTubeCapZPos", 867); |
|||
} |
|||
|
|||
//ShakeTubeZ |
|||
@EnginnerPageParam(name = "摇匀放置位置", group = "Z轴位置") |
|||
public Integer getGripperShakeTubeZPos() { |
|||
return hpReader.getInteger("GripperShakeTubeZPos", 835); |
|||
} |
|||
|
|||
//TakeCapZ |
|||
@EnginnerPageParam(name = "取试管帽位", group = "Z轴位置") |
|||
public Integer getGripperTakeCapZPos() { |
|||
return hpReader.getInteger("GripperTakeCapZPos", 835); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "试管夹紧位", group = "试管夹紧模块") |
|||
public Integer getShakeClampingPos() { |
|||
return hpReader.getInteger("ShakeClampingPos", 10); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "摇匀臂", group = "试管摇匀待机位") |
|||
public Integer getShakeModShakeMStandbyPos() { |
|||
return hpReader.getInteger("ShakeModShakeMStandbyPos", 90); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,23 @@ |
|||
package a8k.service.hardwarev2.param; |
|||
|
|||
|
|||
import a8k.controler.engineer.utils.*; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
@Component |
|||
@EngineerPageTab(name = "底层-参数-时间参数", order = EnginnerPageTabOrder.TimeParam) |
|||
@EnginnerPageParams(service = PosParam.class) |
|||
public class TimeParam { |
|||
EnginnerParamReader hpReader = new EnginnerParamReader(EnginnerPageParams.class); |
|||
|
|||
@EnginnerPageParam(name = "动作超时时间", group = "基础参数") |
|||
public Integer getActionOvertime() { |
|||
return hpReader.getInteger("ActionOvertime", 5000); |
|||
} |
|||
|
|||
@EnginnerPageParam(name = "试管帽有无判断时间", group = "基础参数") |
|||
public Integer getTubeCapJudgeDelayTime() { |
|||
return hpReader.getInteger("TubeCapJudgeDelayTime", 300); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,7 @@ |
|||
package a8k.utils; |
|||
|
|||
public class ZEQ { |
|||
static public Boolean IntEq(Integer pos1, Integer pos2, Integer diff) { |
|||
return Math.abs(pos1 - pos2) < diff; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue