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