From fc1370201459d14c09e767384fe29609cf394808 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 15 Oct 2024 09:46:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=B0=86miniServo=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95=E6=8F=90?= =?UTF-8?q?=E5=8F=96=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pagecontrol/ExtApiTabConfig.java | 9 +- src/main/java/a8k/hardware/A8kCanBusService.java | 82 +----- .../java/a8k/hardware/type/regindex/RegIndex.java | 2 - .../app/appctrl/mainflowctrl/action/DO_START.java | 6 +- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 8 +- .../action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 8 +- .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 10 +- .../mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java | 4 +- .../devicedriver/basectrl/MiniServoControler.java | 91 +++++++ .../basectrl/TubeTransportControler.java | 31 +-- .../devicedriver/basectrl/type/MiniServoMid.java | 18 ++ .../basectrl/type/MiniServoRegIndex.java | 23 ++ .../calibration/PositionCalibration.java | 4 +- .../calibration/TubePreProcesPosCalibration.java | 56 ++++ .../calibration/TubeScanPosCalibration.java | 126 +++++++++ .../calibration/TubeTransportPosCalibration.java | 121 --------- .../commonctrl/HardwareCommonCtrl.java | 10 +- .../devicedriver/ctrl/DeviceInitCtrlService.java | 10 +- .../ctrl/SamplesPreProcesControler.java | 275 ------------------- .../ctrl/TubeHolderScanerControler.java | 295 -------------------- .../devicedriver/ctrl/TubePreProcesControler.java | 279 +++++++++++++++++++ .../app/devicedriver/ctrl/TubeScanerControler.java | 299 +++++++++++++++++++++ .../app/devicedriver/pos/TubePreProcesPosMgr.java | 186 +++++++++++++ .../app/devicedriver/pos/TubeScanPosMgr.java | 120 +++++++++ .../app/devicedriver/pos/TubeTransportPosMgr.java | 120 --------- .../app/devicedriver/testscript/TestScript.java | 8 +- 26 files changed, 1264 insertions(+), 937 deletions(-) create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/MiniServoControler.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoMid.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoRegIndex.java create mode 100644 src/main/java/a8k/service/app/devicedriver/calibration/TubePreProcesPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/calibration/TubeTransportPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesControler.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/TubeHolderScanerControler.java create mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java create mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java create mode 100644 src/main/java/a8k/service/app/devicedriver/pos/TubePreProcesPosMgr.java create mode 100644 src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/pos/TubeTransportPosMgr.java diff --git a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java index b7ca87c..03a7acf 100644 --- a/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java +++ b/src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java @@ -14,8 +14,9 @@ public enum ExtApiTabConfig { AppReactionResultMgrService("应用数据.反应结果管理", true), //OK - Hbot2DCodeScanPosCalibration("校准.耗材扫描二维码坐标校准", true), - TubeTransportPosCalibration("校准.样本平移坐标校准", true), + Hbot2DCodeScanPosCalibration("校准.耗材扫描校准", true), + TubeScanPosCalibration("校准.试管扫描校准", true), + TubePreProcesPosCalibration("校准.试管预处理校准", true), ActionReactorService("底层调试.单步调试", false),//OK @@ -31,8 +32,8 @@ public enum ExtApiTabConfig { HardwareCommonCtrl("HardwareCommonCtrl", false), ReactionPlatesTransmitCtrl("ReactionPlatesTransmitCtrl", false), HbotControlService("HbotControlService", false), - SamplesPreProcesCtrl("硬件控制.样本预处理模块", false), - TubeHolderScanerControler("硬件控制.样本搬运与扫描", false), + TubePreProcesControler("硬件控制.样本预处理模块", false), + TubeScanerControler("硬件控制.样本搬运与扫描", false), ConsumablesScanCtrlService("硬件控制.耗材扫描", false), diff --git a/src/main/java/a8k/hardware/A8kCanBusService.java b/src/main/java/a8k/hardware/A8kCanBusService.java index 50ac05f..29174b4 100644 --- a/src/main/java/a8k/hardware/A8kCanBusService.java +++ b/src/main/java/a8k/hardware/A8kCanBusService.java @@ -430,79 +430,6 @@ public class A8kCanBusService { // MINI_SERVO // - public void miniServoEnable(MId id, int enable) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_enable.toInt(), enable); - } - - public int miniServoReadPos(MId id) throws AppException { - var packet = callcmd(id.toInt(), CmdId.mini_servo_read_pos.toInt()); - return packet.getContentI32(0); - } - - - public void miniServoActiveCfg(MId id) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_active_cfg.toInt()); - } - - public void miniServoStop(MId id) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_stop.toInt()); - } - - public void miniServoSetMidPoint(MId id) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_set_mid_point.toInt()); - } - - public int miniServoReadIoState(MId id) throws AppException { - var packet = callcmd(id.toInt(), CmdId.mini_servo_read_io_state.toInt()); - return packet.getContentI32(0); - } - - public void miniServoMoveTo(MId id, int pos) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_move_to.toInt(), pos); - } - - public void miniServoMoveToBlock(MId id, int pos, Integer actionOvertime) throws AppException { - miniServoMoveTo(id, pos); - waitForMod(id, actionOvertime); - } - - public void miniServoRotate(MId id, int direction) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_rotate.toInt(), direction); - } - - public void miniServoRotateBlock(MId id, int direction, Integer actionOvertime) throws AppException { - miniServoRotate(id, direction); - waitForMod(id, actionOvertime); - } - - public void miniServoRotateWithTorque(MId id, int torque) throws AppException { - callcmd(id.toInt(), CmdId.mini_servo_rotate_with_torque.toInt(), torque); - } - - public void miniServoRotateWithTorqueBlock(MId id, int torque, Integer actionOvertime) throws AppException { - miniServoRotateWithTorque(id, torque); - miniServoWaitIsNotMove(id, actionOvertime); - } - - // kmini_servo_set_cur_pos - public void miniServoSetCurPos(MId id, Integer pos) throws AppException { - callcmdOvertime(id.toInt(), CmdId.mini_servo_set_cur_pos.toInt(), 5000, pos); - } - - public void miniServoWaitIsNotMove(MId id, int acitionOvertime) throws AppException { - long startedAt = System.currentTimeMillis(); - do { - var isMove = moduleGetReg(id, RegIndex.kreg_mini_servo_is_move); - if (isMove != 0) { - break; - } - long now = System.currentTimeMillis(); - if (now - startedAt > acitionOvertime) { - throw AppException.of(new HardwareError(A8kEcode.LOW_ERROR_OVERTIME, id, null)); - } - - } while (true); - } public Boolean priGetIOState(IOId ioid) throws AppException { if (ioid.mtype == ModuleType.kboard) { @@ -578,6 +505,15 @@ public class A8kCanBusService { } while (true); } + public A8kPacket callcmd(MId moduleId, CmdId cmdId, Integer... param) throws AppException { + return callcmd(moduleId.toInt(), cmdId.toInt(), param); + } + + public A8kPacket callcmdOvertime(MId moduleId, CmdId cmdId, Integer overtime, Integer... params) throws AppException { + return callcmdOvertime(moduleId.toInt(), cmdId.toInt(), overtime, params); + } + + public A8kPacket callcmd(Integer moduleId, Integer cmdId, Integer... param) throws AppException { var packet = packParamsToPacket(moduleId, cmdId, List.of(param)); return sendCmdAutoResend(packet, A8kPacket.CMD_OVERTIME); diff --git a/src/main/java/a8k/hardware/type/regindex/RegIndex.java b/src/main/java/a8k/hardware/type/regindex/RegIndex.java index 8000379..d01c4c1 100644 --- a/src/main/java/a8k/hardware/type/regindex/RegIndex.java +++ b/src/main/java/a8k/hardware/type/regindex/RegIndex.java @@ -188,8 +188,6 @@ public enum RegIndex { kreg_mini_servo_limit_torque(10252), // 限制扭矩 kreg_mini_servo_protective_torque(10253), // 保护扭矩 kreg_mini_servo_is_move(10254), // 是否在运动 - kreg_mini_servo_set_mid_point(26119), // 设置中间点 - kmini_servo_set_cur_pos(26124), // 设置当前位置 /*********************************************************************************************************************** * ID_CARD_READER * ***********************************************************************************************************************/ diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java index a7bd7a7..42889e7 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java @@ -6,7 +6,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; import a8k.service.debug.AppDebugHelperService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -29,7 +29,7 @@ public class DO_START extends A8kStepAction { GStateService gstate; @Resource - TubeHolderScanerControler tubeHolderScanerControler; + TubeScanerControler tubeScanerControler; @Resource AppDebugHelperService appDebugHelper; @@ -47,7 +47,7 @@ public class DO_START extends A8kStepAction { if (appDebugHelper.isDebug()) { appDebugHelper.doVirtualThings("弹出试管架", 2); } else { - tubeHolderScanerControler.ejectTubeHolder(); + tubeScanerControler.ejectTubeHolder(); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 00e2819..3347304 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -15,7 +15,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.devicedriver.ctrl.TubeHolderScanerControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; import a8k.service.debug.AppDebugHelperService; import a8k.type.TubeHolderScanResult; import a8k.type.exception.AppException; @@ -47,11 +47,11 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { @Resource - CondtionMgrService cmgr; + CondtionMgrService cmgr; @Resource - TubeHolderScanerControler stc; + TubeScanerControler stc; @Resource - AppEventBusService ebus; + AppEventBusService ebus; @Resource AppTubeSettingMgrService appTubeSettingMgrService; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index b4aafc9..a09b54d 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -9,7 +9,7 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; import a8k.service.debug.AppDebugHelperService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -39,11 +39,11 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { } @Resource - GStateService gstate; + GStateService gstate; @Resource - TubeHolderScanerControler sstc; + TubeScanerControler sstc; @Resource - CondtionMgrService cms; + CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index fac72ff..57a1fcc 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -13,8 +13,8 @@ import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.Tube; import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; -import a8k.service.app.devicedriver.ctrl.SamplesPreProcesControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; +import a8k.service.app.devicedriver.ctrl.TubePreProcesControler; import a8k.type.ecode.AppError; import a8k.type.exception.AppException; import a8k.utils.ZFnCall; @@ -46,9 +46,9 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { GStateService gstate; @Resource - TubeHolderScanerControler sstc; + TubeScanerControler sstc; @Resource - ConsumablesMgrService consumablesMgrService; + ConsumablesMgrService consumablesMgrService; @Resource AppProjInfoMgrService appProjInfoMgrService; @Resource @@ -58,7 +58,7 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { @Resource ReactionPlatesTransmitCtrl reactionPlatesTransmitCtrl; @Resource - SamplesPreProcesControler samplesPreProcesControler; + TubePreProcesControler tubePreProcesControler; @Resource HbotBaseMoveControler hbotBaseMoveControler; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java index 65baec2..c86401e 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java @@ -7,7 +7,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.state.TubeHolderState; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; import a8k.service.debug.AppDebugHelperService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -34,7 +34,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { AppDebugHelperService appDebugHelper; @Resource - TubeHolderScanerControler SST_HControler; + TubeScanerControler SST_HControler; MainFlowCtrlState state; diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/MiniServoControler.java b/src/main/java/a8k/service/app/devicedriver/basectrl/MiniServoControler.java new file mode 100644 index 0000000..2871b25 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/MiniServoControler.java @@ -0,0 +1,91 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.CmdId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.hardware.type.regindex.RegIndex; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.type.ecode.HardwareError; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; + +public class MiniServoControler { + @Resource + A8kCanBusService canBus; + + + public void miniServoEnable(MiniServoMid id, int enable) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_enable, enable); + } + + public int miniServoReadPos(MiniServoMid id) throws AppException { + var packet = canBus.callcmd(id.mid, CmdId.mini_servo_read_pos); + return packet.getContentI32(0); + } + + public void miniServoActiveCfg(MiniServoMid id) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_active_cfg); + } + + public void miniServoStop(MiniServoMid id) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_stop); + } + + public void miniServoSetMidPoint(MiniServoMid id) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_set_mid_point); + } + + public int miniServoReadIoState(MiniServoMid id) throws AppException { + var packet = canBus.callcmd(id.mid, CmdId.mini_servo_read_io_state); + return packet.getContentI32(0); + } + + public void miniServoMoveTo(MiniServoMid id, int pos) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_move_to, pos); + } + + public void miniServoMoveToBlock(MiniServoMid id, int pos, Integer actionOvertime) throws AppException { + miniServoMoveTo(id, pos); + canBus.waitForMod(id.mid, actionOvertime); + } + + public void miniServoRotate(MiniServoMid id, int direction) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_rotate, direction); + } + + public void miniServoRotateBlock(MiniServoMid id, int direction, Integer actionOvertime) throws AppException { + miniServoRotate(id, direction); + canBus.waitForMod(id.mid, actionOvertime); + } + + public void miniServoRotateWithTorque(MiniServoMid id, int torque) throws AppException { + canBus.callcmd(id.mid, CmdId.mini_servo_rotate_with_torque, torque); + } + + public void miniServoRotateWithTorqueBlock(MiniServoMid id, int torque, Integer actionOvertime) throws AppException { + miniServoRotateWithTorque(id, torque); + miniServoWaitIsNotMove(id, actionOvertime); + } + + // kmini_servo_set_cur_pos + public void miniServoSetCurPos(MiniServoMid id, Integer pos) throws AppException { + canBus.callcmdOvertime(id.mid, CmdId.mini_servo_set_cur_pos, 5000, pos); + } + + public void miniServoWaitIsNotMove(MiniServoMid id, int acitionOvertime) throws AppException { + long startedAt = System.currentTimeMillis(); + do { + var isMove = canBus.moduleGetReg(id.mid, RegIndex.kreg_mini_servo_is_move); + if (isMove != 0) { + break; + } + long now = System.currentTimeMillis(); + if (now - startedAt > acitionOvertime) { + throw AppException.of(new HardwareError(A8kEcode.LOW_ERROR_OVERTIME, id.mid, null)); + } + + } while (true); + } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/TubeTransportControler.java b/src/main/java/a8k/service/app/devicedriver/basectrl/TubeTransportControler.java index afaf4c3..e8349c4 100644 --- a/src/main/java/a8k/service/app/devicedriver/basectrl/TubeTransportControler.java +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/TubeTransportControler.java @@ -1,20 +1,12 @@ package a8k.service.app.devicedriver.basectrl; -import a8k.OS; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.app.devicedriver.pos.TubeHolderParamMgr; -import a8k.service.app.devicedriver.pos.TubeTransportPosMgr; -import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.AppWarningNotifyEvent; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.service.app.devicedriver.pos.TubeScanPosMgr; import a8k.type.TargetPosMeasureDirection; -import a8k.type.TubeHolderScanResult; -import a8k.type.TubesScanResult; import a8k.type.exception.AppException; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -27,10 +19,13 @@ public class TubeTransportControler { static Integer overtime = 10000; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; + @Resource + MiniServoControler miniServoControler; @Resource - TubeTransportPosMgr tubeTransportPosMgr; + TubeScanPosMgr tubeScanPosMgr; + /*========================================================================================= * 基础方法 @@ -54,7 +49,7 @@ public class TubeTransportControler { canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.FeedingModXM, overtime); } - // 处理试管架和试管架之间的间隙导致的运行位置误差 + //处理试管架和试管架之间的间隙导致的运行位置误差 Integer nowPos = canBus.stepMotorReadPos(MId.FeedingModXM); if (TargetPosMeasureDirection.POSITIVE.equals(moveDiretion)) { if (nowPos > (pos + 1)) { @@ -72,15 +67,17 @@ public class TubeTransportControler { @ExtApiFn(name = "扫描夹紧机构夹紧", group = "基础方法", order = 1) public void scanClampModClamp() throws AppException { - canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 1); - canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, tubeTransportPosMgr.ScanerClampingSVClampingPos); + logger.info("扫描夹紧机构夹紧"); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 1); + miniServoControler.miniServoMoveTo(MiniServoMid.ShakeModTubeScanerClampingSV, tubeScanPosMgr.ScanerClampingSVClampingPos); canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, overtime); } @ExtApiFn(name = "扫描夹紧机构复位", group = "基础方法", order = 2) public void scanClampModRelease() throws AppException { - canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 1); - canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, tubeTransportPosMgr.ScanerClampingSVReleasePos); + logger.info("扫描夹紧机构复位"); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 1); + miniServoControler.miniServoMoveTo(MiniServoMid.ShakeModTubeScanerClampingSV, tubeScanPosMgr.ScanerClampingSVReleasePos); canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, overtime); } diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoMid.java b/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoMid.java new file mode 100644 index 0000000..5a3519b --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoMid.java @@ -0,0 +1,18 @@ +package a8k.service.app.devicedriver.basectrl.type; + +import a8k.hardware.type.a8kcanprotocol.MId; + +public enum MiniServoMid { + ShakeModGripperYSV( MId.ShakeModGripperYSV),// + ShakeModGripperSV( MId.ShakeModGripperSV),// + ShakeModTubeScanerClampingSV( MId.ShakeModTubeScanerClampingSV),// + ShakeModTubeScanerRotateSV( MId.ShakeModTubeScanerRotateSV),// + ; + + final public MId mid; + + MiniServoMid(MId mid) { + this.mid = mid; + } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoRegIndex.java b/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoRegIndex.java new file mode 100644 index 0000000..363aa4a --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoRegIndex.java @@ -0,0 +1,23 @@ +package a8k.service.app.devicedriver.basectrl.type; + +import a8k.hardware.type.regindex.RegIndex; + +public enum MiniServoRegIndex { + kreg_module_version(RegIndex.kreg_module_version), // 模块版本 + kreg_module_type(RegIndex.kreg_module_type), // 模块类型 + kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error + kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag + kreg_extboard_resetflag(RegIndex.kreg_extboard_resetflag), + + kreg_mini_servo_pos(RegIndex.kreg_mini_servo_pos), // 位置 + kreg_mini_servo_limit_velocity(RegIndex.kreg_mini_servo_limit_velocity), // 限制速度 + kreg_mini_servo_limit_torque(RegIndex.kreg_mini_servo_limit_torque), // 限制扭矩 + kreg_mini_servo_protective_torque(RegIndex.kreg_mini_servo_protective_torque), // 保护扭矩 + kreg_mini_servo_is_move(RegIndex.kreg_mini_servo_is_move), // 是否在运动 + ; + public final RegIndex regIndex; + + MiniServoRegIndex(RegIndex regIndex) { + this.regIndex = regIndex; + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java index 4ff5a91..3f59742 100644 --- a/src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java +++ b/src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java @@ -106,13 +106,13 @@ import org.springframework.stereotype.Component; // // @ExtApiStatu(name = "抓手Y轴位置", group = "摇匀模组") // public String getShakeModGripperYPos() throws AppException { -// Integer pos = canBus.miniServoReadPos(MId.ShakeModGripperYSV); +// Integer pos = miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperYSV); // return pos.toString(); // } // // @ExtApiStatu(name = "抓手位置", group = "摇匀模组") // public String getGripperPos() throws AppException { -// Integer pos = canBus.miniServoReadPos(MId.ShakeModGripperSV); +// Integer pos = miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperSV); // return pos.toString(); // } // diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/TubePreProcesPosCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/TubePreProcesPosCalibration.java new file mode 100644 index 0000000..989a422 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/calibration/TubePreProcesPosCalibration.java @@ -0,0 +1,56 @@ +package a8k.service.app.devicedriver.calibration; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.service.app.devicedriver.pos.TubePreProcesPosMgr; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@ExtApiTab(cfg = ExtApiTabConfig.TubeScanPosCalibration) +@Component +public class TubePreProcesPosCalibration { + + @Resource + TubePreProcesPosMgr tubePreProcesPosMgr; + + @Resource + A8kCanBusService canBus; + @Resource + MiniServoControler miniServoControler; + + //基础工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void deviceReset() throws AppException { + enableModule(); + canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, 15000); + + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + miniServoControler.miniServoEnable(MiniServoMid.ShakeModGripperSV, 1); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModGripperYSV, 1); + canBus.stepMotorEnable(MId.ShakeModClampingM, 1); + canBus.stepMotorEnable(MId.ShakeModGripperZM, 1); + canBus.stepMotorEnable(MId.ShakeModShakeM, 1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + canBus.stepMotorEnable(MId.FeedingModInfeedM, 0); + canBus.stepMotorEnable(MId.FeedingModOutfeedM, 0); + canBus.stepMotorEnable(MId.FeedingModXM, 0); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 0); + } + + + //标定和校准 + + +} diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java new file mode 100644 index 0000000..6a4738e --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java @@ -0,0 +1,126 @@ +package a8k.service.app.devicedriver.calibration; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.TubeTransportControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; +import a8k.service.app.devicedriver.pos.TubeScanPosMgr; +import a8k.type.TubeHolderScanResult; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + + +@ExtApiTab(cfg = ExtApiTabConfig.TubeScanPosCalibration) +@Component +public class TubeScanPosCalibration { + + @Resource + TubeScanPosMgr tubeScanPosMgr; + + @Resource + A8kCanBusService canBus; + @Resource + TubeScanerControler tubeScanerControler; + @Resource + TubeTransportControler tubeTransportControler; + @Resource + MiniServoControler miniServoControler; + + private Integer readFeedingModXMPos() throws AppException { + canBus.stepMotorEnable(MId.FeedingModXM, 1); + Integer pos = canBus.stepMotorReadPosByMoveToZeroBlock(MId.FeedingModXM, 15000); + return pos; + } + + @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) + public TubeScanPosMgr getPoss() throws AppException { + return tubeScanPosMgr; + } + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void deviceReset() throws AppException { + enableModule(); + canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, 15000); + + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + canBus.stepMotorEnable(MId.FeedingModInfeedM, 1); + canBus.stepMotorEnable(MId.FeedingModOutfeedM, 1); + canBus.stepMotorEnable(MId.FeedingModXM, 1); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + canBus.stepMotorEnable(MId.FeedingModInfeedM, 0); + canBus.stepMotorEnable(MId.FeedingModOutfeedM, 0); + canBus.stepMotorEnable(MId.FeedingModXM, 0); + miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 0); + } + + + @ExtApiFn(name = "<平移电机>设置当前位置为<入料位置>", group = "标定", order = 21) + public void setTubeHolderEnterXPos() throws AppException { + tubeScanPosMgr.setTubeHolderEnterXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<平移电机>设置当前位置为<出料位置>", group = "标定", order = 22) + public void setTubeHolderExitXPos() throws AppException { + tubeScanPosMgr.setTubeHolderExitXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<平移电机>设置当前位置为<试管架扫描位置>", group = "标定", order = 23) + public void setTubeHolderScanXPos() throws AppException { + tubeScanPosMgr.setTubeHolderScanXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<平移电机>设置当前位置为<0号试管扫描位置>", group = "标定", order = 24) + public void setTube0ScanXPos() throws AppException { + tubeScanPosMgr.setTube0ScanXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<平移电机>设置当前位置为<0试管高度判断位置>", group = "标定", order = 25) + public void setTube0AltitJudgXPos() throws AppException { + tubeScanPosMgr.setTube0AltitJudgXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<平移电机>设置当前位置为<0试管存在判断位置>", group = "标定", order = 26) + public void setTube0ExistJudgXPos() throws AppException { + tubeScanPosMgr.setTube0ExistJudgXPos(readFeedingModXMPos()); + } + + @ExtApiFn(name = "<夹紧舵机>设置当前位置为夹紧位置", group = "标定", order = 26) + public void setTubeScanClampPos() throws AppException { + miniServoControler.miniServoSetCurPos(MiniServoMid.ShakeModTubeScanerClampingSV, tubeScanPosMgr.ScanerClampingSVClampingPos); + } + + + @ExtApiFn(name = "夹紧试管架", group = "校验", order = 31) + public void scanClampModClamp() throws AppException { + tubeTransportControler.scanClampModClamp(); + } + + @ExtApiFn(name = "释放试管架", group = "校验", order = 32) + public void scanClampModRelease() throws AppException { + tubeTransportControler.scanClampModRelease(); + } + + @ExtApiFn(name = "扫描试管架", group = "校验", order = 33) + public TubeHolderScanResult scanAll() throws AppException { + return tubeScanerControler.scanTubeHodler(); + } + + @ExtApiFn(name = "设置<试管扫描伺服力矩(100-1000)>", group = "其他", order = 41) + public void setTubeScanServoTorque(Integer torque) throws AppException { + tubeScanPosMgr.setTubeScanServoTorque(torque); + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/TubeTransportPosCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/TubeTransportPosCalibration.java deleted file mode 100644 index b2b18a8..0000000 --- a/src/main/java/a8k/service/app/devicedriver/calibration/TubeTransportPosCalibration.java +++ /dev/null @@ -1,121 +0,0 @@ -package a8k.service.app.devicedriver.calibration; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.app.devicedriver.basectrl.TubeTransportControler; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; -import a8k.service.app.devicedriver.pos.TubeTransportPosMgr; -import a8k.type.TubeHolderScanResult; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - - -@ExtApiTab(cfg = ExtApiTabConfig.TubeTransportPosCalibration) -@Component -public class TubeTransportPosCalibration { - - @Resource - TubeTransportPosMgr tubeTransportPosMgr; - - @Resource - A8kCanBusService canBus; - @Resource - TubeHolderScanerControler tubeHolderScanerControler; - @Resource - TubeTransportControler tubeTransportControler; - - private Integer readFeedingModXMPos() throws AppException { - canBus.stepMotorEnable(MId.FeedingModXM, 1); - Integer pos = canBus.stepMotorReadPosByMoveToZeroBlock(MId.FeedingModXM, 15000); - return pos; - } - - @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) - public TubeTransportPosMgr getPoss() throws AppException { - return tubeTransportPosMgr; - } - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void deviceReset() throws AppException { - enableModule(); - canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, 15000); - - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - canBus.stepMotorEnable(MId.FeedingModInfeedM, 1); - canBus.stepMotorEnable(MId.FeedingModOutfeedM, 1); - canBus.stepMotorEnable(MId.FeedingModXM, 1); - canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - canBus.stepMotorEnable(MId.FeedingModInfeedM, 0); - canBus.stepMotorEnable(MId.FeedingModOutfeedM, 0); - canBus.stepMotorEnable(MId.FeedingModXM, 0); - canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 0); - } - - - @ExtApiFn(name = "<平移电机>设置当前位置为<入料位置>", group = "标定", order = 21) - public void setTubeHolderEnterXPos() throws AppException { - tubeTransportPosMgr.setTubeHolderEnterXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<平移电机>设置当前位置为<出料位置>", group = "标定", order = 22) - public void setTubeHolderExitXPos() throws AppException { - tubeTransportPosMgr.setTubeHolderExitXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<平移电机>设置当前位置为<试管架扫描位置>", group = "标定", order = 23) - public void setTubeHolderScanXPos() throws AppException { - tubeTransportPosMgr.setTubeHolderScanXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<平移电机>设置当前位置为<0号试管扫描位置>", group = "标定", order = 24) - public void setTube0ScanXPos() throws AppException { - tubeTransportPosMgr.setTube0ScanXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<平移电机>设置当前位置为<0试管高度判断位置>", group = "标定", order = 25) - public void setTube0AltitJudgXPos() throws AppException { - tubeTransportPosMgr.setTube0AltitJudgXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<平移电机>设置当前位置为<0试管存在判断位置>", group = "标定", order = 26) - public void setTube0ExistJudgXPos() throws AppException { - tubeTransportPosMgr.setTube0ExistJudgXPos(readFeedingModXMPos()); - } - - @ExtApiFn(name = "<夹紧舵机>设置当前位置为夹紧位置", group = "标定", order = 26) - public void setTubeScanClampPos() throws AppException { - canBus.miniServoSetCurPos(MId.ShakeModTubeScanerClampingSV, tubeTransportPosMgr.ScanerClampingSVClampingPos); - } - - - @ExtApiFn(name = "夹紧试管架", group = "校验", order = 31) - public void scanClampModClamp() throws AppException { - tubeTransportControler.scanClampModClamp(); - } - - @ExtApiFn(name = "释放试管架", group = "校验", order = 32) - public void scanClampModRelease() throws AppException { - tubeTransportControler.scanClampModRelease(); - } - @ExtApiFn(name = "扫描试管架", group = "校验", order = 33) - public TubeHolderScanResult scanAll() throws AppException { - return tubeHolderScanerControler.scanTubeHodler(); - } - - @ExtApiFn(name = "设置<试管扫描伺服力矩(100-1000)>", group = "其他", order = 41) - public void setTubeScanServoTorque(Integer torque) throws AppException { - tubeTransportPosMgr.setTubeScanServoTorque(torque); - } -} diff --git a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java index 34bf430..b6f8581 100644 --- a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java @@ -2,6 +2,8 @@ package a8k.service.app.devicedriver.commonctrl; import a8k.service.app.devicedriver.basectrl.HbotModule; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; import a8k.type.exception.AppException; import a8k.type.appret.AppRet; import a8k.extapi_controler.utils.ExtApiTab; @@ -32,6 +34,8 @@ public class HardwareCommonCtrl { @Resource A8kCanBusService canBus; + @Resource + MiniServoControler miniServoControler; @Resource TimeParam timep; @@ -87,11 +91,11 @@ public class HardwareCommonCtrl { //进出料初始化 canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, timep.getRuntoZeroActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 20, timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModTubeScanerClampingSV, 20, timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, 300, timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, 300, timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, 300, timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, 300, timep.getActionOvertime()); canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, timep.getRuntoZeroActionOvertime()); diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java index 70edc55..51c893b 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java @@ -4,6 +4,8 @@ import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; import a8k.service.bases.ActionReactorService; import a8k.service.debug.AppDebugHelperService; import a8k.type.CheckPointType; @@ -32,6 +34,8 @@ public class DeviceInitCtrlService { HbotModule hbotModule; @Resource AppDebugHelperService appDebugHelper; + @Resource + MiniServoControler miniServoControler; Integer actionOvertime = 10000; List checkPoints = new ArrayList<>(); @@ -87,9 +91,9 @@ public class DeviceInitCtrlService { //进出料初始化 actionReactor.dosome("入料平移电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, actionOvertime)); - actionReactor.dosome("摇匀模组-扫码夹紧舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 20, actionOvertime)); - actionReactor.dosome("摇匀模组-夹爪舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, 300, actionOvertime)); - actionReactor.dosome("摇匀模组-夹爪Y轴舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, 300, actionOvertime)); + actionReactor.dosome("摇匀模组-扫码夹紧舵机回零", () -> miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModTubeScanerClampingSV, 20, actionOvertime)); + actionReactor.dosome("摇匀模组-夹爪舵机回零", () -> miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, 300, actionOvertime)); + actionReactor.dosome("摇匀模组-夹爪Y轴舵机回零", () -> miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, 300, actionOvertime)); actionReactor.dosome("摇匀模组-夹紧电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, actionOvertime)); actionReactor.dosome("摇匀模组-夹爪Z轴电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, actionOvertime)); actionReactor.dosome("摇匀模组-摇匀电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, actionOvertime)); diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesControler.java b/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesControler.java deleted file mode 100644 index f1851a8..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesControler.java +++ /dev/null @@ -1,275 +0,0 @@ -package a8k.service.app.devicedriver.ctrl; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.type.exception.AppException; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.app.devicedriver.param.DebugParam; -import a8k.service.app.devicedriver.param.TimeParam; -import a8k.service.app.devicedriver.param.PosParam; -import a8k.utils.ZEQ; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.SamplesPreProcesCtrl) -public class SamplesPreProcesControler { - static Logger logger = LoggerFactory.getLogger(SamplesPreProcesControler.class); - - static class ORDER { - - static final int moduleReset = 1; - static final int moduleEnable = 2; - static final int moduleDisable = 3; - static final int takeTubeAndJudgeTubeExist = 4; - static final int shakeTube = 5; - static final int takeTubeCap = 6; - static final int pushBackTubeCapAndTakeBakTube = 7; - static final int setAeroslFanPower = 8; - } - - @Resource - A8kCanBusService canBus; - @Resource - TimeParam timep; - @Resource - PosParam pp; - @Resource - DebugParam dp; - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // PRIVATE - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - private void modGroupMoveToZero() throws AppException { - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperClosePos(), timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToBlock(MId.ShakeModShakeM, 90, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, -2, timep.getActionOvertime()); - } - - private void modGroupMoveToZeroQuick() throws AppException { - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModClampingM, timep.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModShakeM, timep.getActionOvertime()); - modGroupMoveToZero(); - } - - // @ExtApiFn(name = "模块复位", group = "辅助调试", order = ORDER.moduleReset) - // public void moduleReset() throws AppException { - // modGroupMoveToZero(); - // } - // - // @ExtApiFn(name = "模块使能", group = "辅助调试", order = ORDER.moduleEnable) - // public void moduleEnable() throws AppException { - // canBus.miniServoEnable(MId.ShakeModGripperSV, 1); - // canBus.miniServoEnable(MId.ShakeModGripperYSV, 1); - // canBus.stepMotorEnable(MId.ShakeModClampingM, 1); - // canBus.stepMotorEnable(MId.ShakeModGripperZM, 1); - // canBus.stepMotorEnable(MId.ShakeModShakeM, 1); - // canBus.stepMotorEnable(MId.ShakeModShakeM, 1); - // } - // - // @ExtApiFn(name = "模块失能", group = "辅助调试", order = ORDER.moduleDisable) - // public void moduleDisable() throws AppException { - // canBus.stepMotorEnable(MId.ShakeModClampingM, 1); - // canBus.stepMotorEasyMoveByBlock(MId.ShakeModClampingM, 10, timep.getActionOvertime()); - // - // - // canBus.miniServoEnable(MId.ShakeModGripperSV, 0); - // canBus.miniServoEnable(MId.ShakeModGripperYSV, 0); - // canBus.stepMotorEnable(MId.ShakeModClampingM, 0); - // canBus.stepMotorEnable(MId.ShakeModGripperZM, 0); - // canBus.stepMotorEnable(MId.ShakeModShakeM, 0); - // canBus.stepMotorEnable(MId.ShakeModShakeM, 0); - // } - // - // @ExtApiFn(name = "夹紧试管", group = "辅助调试", order = ORDER.moduleDisable) - // public void clampTube() throws AppException { - // canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, pp.getShakeClampingPos(), timep.getActionOvertime()); - // } - - - void tryClampTube() throws AppException { - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos() - 20, timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos() - 20, timep.getActionOvertime()); - } - - /** - * 取试管帽,如果试管帽存在, - * @param highTube true/false - */ - @ExtApiFn(name = "取试管", group = "单步", order = ORDER.takeTubeAndJudgeTubeExist) - public Boolean takeTubeAndJudgeTubeExist(Boolean highTube) throws AppException { - /* - * 校验: - * 1.当前摇匀模组设计到的电机是否都处于待机位 - */ - - //Z轴在原点 - if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { - throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperZM); - } - - //Y轴在零点附近 - if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperYSV), pp.getGripperZeroYPos(), 30)) { - throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperYSV); - } - - //夹爪没有零位置 - if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { - throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperSV); - } - - //检查摇匀夹紧是否在零位 - if (!canBus.stepMotorReadIoState(MId.ShakeModClampingM, 0)) { - throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModClampingM); - } - - boolean isHighBlood = highTube; - boolean tubeCapExist = true; - Integer gripperJudgeCapZPos = isHighBlood ? pp.getGripperJudgeHTubeCapZPos() : pp.getGripperJudgeSTubeCapZPos(); - Integer gripperTakeTubeZPos = isHighBlood ? pp.getGripperTakeHTubeZPos() : pp.getGripperTakeSTubeZPos(); - Integer gripperShakeZPos = pp.getGripperShakeTubeZPos(); - - //固定试管架 - canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 900, timep.getActionOvertime()); - //试管夹紧移动到终点位置 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, 70, timep.getActionOvertime()); - //试管摇匀移动到90度 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModShakeM, pp.getShakeModShakeMStandbyPos(), timep.getActionOvertime()); - //Y轴向前移动 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime()); - //打开夹爪 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); - // //Z轴下移动到试管帽有无检测位 - // canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperJudgeCapZPos, timep.getActionOvertime()); - // 闭合夹爪检测试管帽是否存在 - // canBus.miniServoRotateWithTorque(MId.ShakeModGripperSV, -400); - // Thread.sleep(timep.getTubeCapJudgeDelayTime()); - // if (ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { - // logger.info("试管帽不存在"); - // tubeCapExist = false; - // } - if (dp.getDebugMode() || tubeCapExist) { - //打开夹爪 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); - //Z轴下移动到取试管位置 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos, timep.getActionOvertime()); - //夹爪夹紧 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos - 100, timep.getActionOvertime()); - tryClampTube(); - - //Z轴上移动到零位 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - //夹爪夹紧 - //Y轴移动到摇匀位 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos() - 50, timep.getActionOvertime()); //该动作是为了消除齿轮间隙 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); - //Z轴下移动到摇匀位放试管的位置 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperShakeZPos, timep.getActionOvertime()); - //夹紧试管 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, pp.getShakeClampingPos(), timep.getActionOvertime()); - //松开夹爪,放置试管 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); - //Z轴上移动到零位 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - //Z轴归零,校准一次位置 - canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - //Y轴移动到零位 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); - } else { - modGroupMoveToZeroQuick(); - } - return tubeCapExist; - } - - @ExtApiFn(name = "摇匀", group = "单步", order = ORDER.shakeTube) - public void shakeTube(Integer shakeDegree, Integer times) throws AppException { - 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()); - } - - @ExtApiFn(name = "取试管帽", group = "单步", order = ORDER.takeTubeCap) - public void takeTubeCap() throws AppException { - //Y移动到取试管帽位置 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); - //Z下移动到取试管帽位置 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 3, timep.getActionOvertime()); - //闭合夹爪 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); - //Z上移动到零位 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - // tryClampTube(); - // canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos()-30, timep.getActionOvertime()); - - - //Y移动到待机位 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); - } - - /** - * 盖试管帽,并将试管移动回试管架中 - */ - @ExtApiFn(name = "盖试管帽并放回试管架", group = "单步", order = ORDER.pushBackTubeCapAndTakeBakTube) - public void pushBackTubeCapAndTakeBakTube() throws AppException { - //移动Y轴到取试管帽位置 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); - //移动Z轴盖帽 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 20, timep.getActionOvertime()); - //打开试管夹 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, 70, timep.getActionOvertime()); - //移动Z轴到零位 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - - tryClampTube(); - - - //移动Y轴到方式管的位置 - canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime()); - //移动Z轴到取试管位置 - canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeHTubeZPos() - 20, timep.getActionOvertime()); - //打开夹爪 - canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); - //Z轴上移动到零位 - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); - //设备快速归零 - modGroupMoveToZeroQuick(); - } - - /** - * 气溶胶风扇控制 - */ - @ExtApiFn(name = "气溶胶风扇控制", group = "其他", order = ORDER.setAeroslFanPower) - public void setAeroslFanPower(Boolean enable) throws Exception { - if (enable) { - canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 99); - } else { - canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 0); - } - } - -// /** -// * 移动试管到试管预处理的位置 -// * @param tubeIndex 试管索引 -// */ -// public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { -// moveTubeRackTo(stp.getTPreProcessXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.POSITIVE, false); -// } - -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/TubeHolderScanerControler.java b/src/main/java/a8k/service/app/devicedriver/ctrl/TubeHolderScanerControler.java deleted file mode 100644 index 6dfe0f3..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/TubeHolderScanerControler.java +++ /dev/null @@ -1,295 +0,0 @@ -package a8k.service.app.devicedriver.ctrl; - -import a8k.OS; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicedriver.basectrl.CodeScaner; -import a8k.service.app.devicedriver.basectrl.TubeTransportControler; -import a8k.service.app.devicedriver.pos.TubeTransportPosMgr; -import a8k.service.app.devicedriver.pos.TubeHolderParamMgr; -import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.AppWarningNotifyEvent; -import a8k.type.TubeHolderScanResult; -import a8k.type.TubesScanResult; -import a8k.type.exception.AppException; -import a8k.type.TargetPosMeasureDirection; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; -import a8k.hardware.type.a8kcanprotocol.MId; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.TubeHolderScanerControler) -public class TubeHolderScanerControler { - static Logger logger = LoggerFactory.getLogger(TubeHolderScanerControler.class); - static Integer infeedOvertime = 10000; - static Integer outfeedOvertime = 10000; - static Integer scanOvertime = 3000; - - static class ORDER { - static final int moveTubeRackToExitPos = 1; - static final int moveTubeRackToScanPos = 2; - static final int moveTubeToScanPosAndScan = 3; - static final int moveTubeToAltitJudgXPos = 4; - static final int judgeTubeExist = 5; - - } - - @Resource - AppEventBusService ebus; - @Resource - A8kCanBusService canBus; - @Resource - TubeTransportPosMgr stp; - @Resource - TubeHolderParamMgr tubeHolderParamMgr; - @Resource - CodeScaner codeScaner; - @Resource - TubeTransportControler tubeTransportControler; - - - private Boolean isTubeExist() throws AppException { - return canBus.getIOState(IOId.TubeExistPPS); - } - - private Boolean isTubeRackInEnterPos() throws AppException { - return canBus.getIOState(IOId.InfeedPPS); - } - - private Boolean isTubeRackInExitPos() throws AppException { - return canBus.getIOState(IOId.OutfeedPPS); - } - - private Boolean isHighTube() throws AppException { - return canBus.getIOState(IOId.TubeHeightPPS); - } - - - /** - * 移动试管到扫码位置 - * @param tubeIndex 试管索引 - */ - private void moveTubeToScanPos(Integer tubeIndex) throws AppException { - var scanPos = stp.getTube0ScanXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(); - tubeTransportControler.scanClampModClamp(); - tubeTransportControler.moveTubeRackTo(scanPos, TargetPosMeasureDirection.NEGATIVE, false); - } - - /** - * 移动<试管架>到试管架扫码位置 - */ - private void moveTubeRackToScanPos() throws AppException { - tubeTransportControler.moveTubeRackTo(stp.getTubeHolderScanXPos(), TargetPosMeasureDirection.POSITIVE, false); - } - - - public Boolean getTHchOuterPPS() throws AppException { - return canBus.getIOState(IOId.THChOuterPPS); - } - - public Boolean getTHchInterPPS() throws AppException { - return canBus.getIOState(IOId.THChInterPPS); - } - - - /*========================================================================================= - * 片段 - *========================================================================================*/ - - /** - * 移动试管架到入口位置 - */ - public void moveTubeRackMoveToEnterPos() throws AppException { - tubeTransportControler.moveTubeRackTo(stp.getTubeHolderEnterXPos(), TargetPosMeasureDirection.NOTCARE, true); - } - - /** - * 移动<试管架>到出口位置 - */ - public void moveTubeRackToExitPos() throws AppException { - tubeTransportControler.moveTubeRackTo(stp.getTubeHolderExitXPos(), TargetPosMeasureDirection.NOTCARE, false); - tubeTransportControler.moveTubeRackTo(stp.getTubeHolderExitXPos() - 10, TargetPosMeasureDirection.NOTCARE, false); - } - - /** - * 移动<试管架>到出口位置 - */ - @ExtApiFn(name = "入料", group = "单步", order = ORDER.moveTubeRackToExitPos) - public Boolean enterTubeHolder() throws AppException { - if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); - } - moveTubeRackMoveToEnterPos(); - try { - canBus.stepMotorEasyRotate(MId.FeedingModInfeedM, -1); - for (int i = 0; i < infeedOvertime / 100; i++) { - OS.hsleep(100); - if (getTHchInterPPS()) { - break; - } - logger.info("等待试管架到位 [{}/{}]", i, infeedOvertime / 100); - } - OS.hsleep(1000); - canBus.stepMotorStop(MId.FeedingModInfeedM); - if (!getTHchInterPPS()) { - return false; - } - } finally { - canBus.moduleStop(MId.FeedingModInfeedM); - } - return true; - } - - public void ejectTubeHolderInEnterPos() throws AppException { - canBus.stepMotorEasyRotate(MId.FeedingModInfeedM, 1); - OS.hsleep(3000); - canBus.stepMotorStop(MId.FeedingModInfeedM); - } - - - @ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos) - public void ejectTubeHolder() throws AppException { - moveTubeRackToExitPos(); - try { - canBus.stepMotorEasyRotate(MId.FeedingModOutfeedM, 1); - for (int i = 0; i < outfeedOvertime / 100; i++) { - OS.hsleep(100); - logger.info("getTHchInterPPS:{} getTHchOuterPPS:{}", getTHchInterPPS(), getTHchOuterPPS()); - if (!getTHchInterPPS() && !getTHchOuterPPS()) { - break; - } - } - OS.hsleep(1000); - canBus.stepMotorStop(MId.FeedingModOutfeedM); - if (getTHchInterPPS() || getTHchOuterPPS()) { - throw new AppException(A8kEcode.APPE_EJECT_TUBEHOLDER_TIMEOUT); - } - } finally { - canBus.moduleStop(MId.FeedingModOutfeedM); - } - } - - /** - * 移动试管架到扫码并扫码 - */ - @ExtApiFn(name = "扫描<试管架>编码", group = "单步扫码", order = ORDER.moveTubeRackToScanPos) - public String moveTubeRackToScanPosAndScan() throws AppException { - String result; - moveTubeRackToScanPos(); - - tubeTransportControler.scanClampModClamp(); - canBus.codeScanerStartScan(MId.FeedingModScannerMod); - result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000); - tubeTransportControler.scanClampModRelease(); - if (result == null || result.isEmpty()) { - return ""; - } - return result; - } - // - // 试管移动 - // - - /** - * 移动试管到扫码位置,并扫码 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "扫描<试管X>编码", group = "单步扫码", order = ORDER.moveTubeToScanPosAndScan) - public String moveTubeToScanPosAndScan(Integer tubeIndex) throws AppException { - moveTubeToScanPos(tubeIndex); - try { - tubeTransportControler.scanClampModClamp(); - - canBus.codeScanerStartScan(MId.FeedingModScannerMod); - canBus.miniServoRotateWithTorque(MId.ShakeModTubeScanerClampingSV, stp.getTubeScanServoTorque()); - return codeScaner.feedingModScannerModCodeScannerScanCode(scanOvertime); - } finally { - canBus.moduleStop(MId.ShakeModTubeScanerClampingSV); - canBus.moduleStop(MId.FeedingModScannerMod); - tubeTransportControler.scanClampModRelease(); - } - } - - public Boolean tubeXChannelIsEmpty() throws AppException { - return !getTHchInterPPS() && !getTHchOuterPPS(); - } - - - /** - * 移动试管到试管高低判断位置 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos) - public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { - tubeTransportControler.moveTubeRackTo(stp.getTube0AltitJudgXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.NEGATIVE, false); - return isHighTube(); - } - - /** - * 移动试管到试管有无判断位置 - * @param tubeIndex 试管索引 - */ - @ExtApiFn(name = "判断<试管N>是否存在", group = "单步-其他", order = ORDER.judgeTubeExist) - public Boolean moveAndjudgeTubeExist(Integer tubeIndex) throws AppException { - tubeTransportControler.moveTubeRackTo(stp.getTube0ExistJudgXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.NEGATIVE, false); - return isTubeExist(); - } - - - public TubeHolderScanResult scanTubeHodler() throws AppException { - TubeHolderScanResult result = new TubeHolderScanResult(); - - //清空试管架 - if (!tubeXChannelIsEmpty()) { - ejectTubeHolder(); - } - //入料 - logger.info("开始进料"); - Boolean enterSuc = enterTubeHolder(); - if (!enterSuc) { - logger.warn("进料超时,从入料口,弹出试管架"); - ejectTubeHolderInEnterPos(); - throw new AppException(A8kEcode.APPE_INFEED_OVERTIME_FAIL); - } - //扫描试管架类型 - String tubeType = moveTubeRackToScanPosAndScan(); - if (tubeType.isEmpty()) { - logger.warn("扫描试管架类型失败,弹出试管架"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT)); - return null; - } - logger.info("扫描试管架类型成功,{}", tubeType); - //逐个扫描试管 - TubesScanResult[] tubesScanResult = new TubesScanResult[10]; - boolean hasTube = false; - for (int i = 0; i < tubesScanResult.length; i++) { - tubesScanResult[i] = new TubesScanResult(); - Boolean isTubeExist = moveAndjudgeTubeExist(i); - if (isTubeExist) { - hasTube = true; - tubesScanResult[i].isTubeExist = true; - tubesScanResult[i].isHighTube = moveAndJudgeTubeAltit(i); - tubesScanResult[i].tubeCode = moveTubeToScanPosAndScan(i); - } else { - tubesScanResult[i].isTubeExist = false; - } - logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); - } - //处理扫描结果 - if (!hasTube) { - logger.error("试管架中没有试管"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); - return null; - } - result.tubeHolderType = tubeType; - result.tube = tubesScanResult; - return result; - } - -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java b/src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java new file mode 100644 index 0000000..8ec3050 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java @@ -0,0 +1,279 @@ +package a8k.service.app.devicedriver.ctrl; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.type.exception.AppException; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.param.DebugParam; +import a8k.service.app.devicedriver.param.TimeParam; +import a8k.service.app.devicedriver.param.PosParam; +import a8k.utils.ZEQ; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.TubePreProcesControler) +public class TubePreProcesControler { + static Logger logger = LoggerFactory.getLogger(TubePreProcesControler.class); + + static class ORDER { + + static final int moduleReset = 1; + static final int moduleEnable = 2; + static final int moduleDisable = 3; + static final int takeTubeAndJudgeTubeExist = 4; + static final int shakeTube = 5; + static final int takeTubeCap = 6; + static final int pushBackTubeCapAndTakeBakTube = 7; + static final int setAeroslFanPower = 8; + } + + @Resource + A8kCanBusService canBus; + @Resource + TimeParam timep; + @Resource + PosParam pp; + @Resource + DebugParam dp; + + @Resource + MiniServoControler miniServoControler; + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // PRIVATE + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + private void modGroupMoveToZero() throws AppException { + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperClosePos(), timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.ShakeModShakeM, 90, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, -2, timep.getActionOvertime()); + } + + private void modGroupMoveToZeroQuick() throws AppException { + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModClampingM, timep.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModShakeM, timep.getActionOvertime()); + modGroupMoveToZero(); + } + + // @ExtApiFn(name = "模块复位", group = "辅助调试", order = ORDER.moduleReset) + // public void moduleReset() throws AppException { + // modGroupMoveToZero(); + // } + // + // @ExtApiFn(name = "模块使能", group = "辅助调试", order = ORDER.moduleEnable) + // public void moduleEnable() throws AppException { + // canBus.miniServoEnable(MId.ShakeModGripperSV, 1); + // canBus.miniServoEnable(MId.ShakeModGripperYSV, 1); + // canBus.stepMotorEnable(MId.ShakeModClampingM, 1); + // canBus.stepMotorEnable(MId.ShakeModGripperZM, 1); + // canBus.stepMotorEnable(MId.ShakeModShakeM, 1); + // canBus.stepMotorEnable(MId.ShakeModShakeM, 1); + // } + // + // @ExtApiFn(name = "模块失能", group = "辅助调试", order = ORDER.moduleDisable) + // public void moduleDisable() throws AppException { + // canBus.stepMotorEnable(MId.ShakeModClampingM, 1); + // canBus.stepMotorEasyMoveByBlock(MId.ShakeModClampingM, 10, timep.getActionOvertime()); + // + // + // canBus.miniServoEnable(MId.ShakeModGripperSV, 0); + // canBus.miniServoEnable(MId.ShakeModGripperYSV, 0); + // canBus.stepMotorEnable(MId.ShakeModClampingM, 0); + // canBus.stepMotorEnable(MId.ShakeModGripperZM, 0); + // canBus.stepMotorEnable(MId.ShakeModShakeM, 0); + // canBus.stepMotorEnable(MId.ShakeModShakeM, 0); + // } + // + // @ExtApiFn(name = "夹紧试管", group = "辅助调试", order = ORDER.moduleDisable) + // public void clampTube() throws AppException { + // canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, pp.getShakeClampingPos(), timep.getActionOvertime()); + // } + + + void tryClampTube() throws AppException { + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos() - 20, timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos() - 20, timep.getActionOvertime()); + } + + /** + * 取试管帽,如果试管帽存在, + * @param highTube true/false + */ + @ExtApiFn(name = "取试管", group = "单步", order = ORDER.takeTubeAndJudgeTubeExist) + public Boolean takeTubeAndJudgeTubeExist(Boolean highTube) throws AppException { + /* + * 校验: + * 1.当前摇匀模组设计到的电机是否都处于待机位 + */ + + //Z轴在原点 + if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperZM); + } + + //Y轴在零点附近 + if (!ZEQ.IntEq(miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperYSV), pp.getGripperZeroYPos(), 30)) { + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperYSV); + } + + //夹爪没有零位置 + if (!ZEQ.IntEq(miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperSV); + } + + //检查摇匀夹紧是否在零位 + if (!canBus.stepMotorReadIoState(MId.ShakeModClampingM, 0)) { + throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModClampingM); + } + + boolean isHighBlood = highTube; + boolean tubeCapExist = true; + Integer gripperJudgeCapZPos = isHighBlood ? pp.getGripperJudgeHTubeCapZPos() : pp.getGripperJudgeSTubeCapZPos(); + Integer gripperTakeTubeZPos = isHighBlood ? pp.getGripperTakeHTubeZPos() : pp.getGripperTakeSTubeZPos(); + Integer gripperShakeZPos = pp.getGripperShakeTubeZPos(); + + //固定试管架 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModTubeScanerClampingSV, 900, timep.getActionOvertime()); + //试管夹紧移动到终点位置 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, 70, timep.getActionOvertime()); + //试管摇匀移动到90度 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModShakeM, pp.getShakeModShakeMStandbyPos(), timep.getActionOvertime()); + //Y轴向前移动 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime()); + //打开夹爪 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); + // //Z轴下移动到试管帽有无检测位 + // canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperJudgeCapZPos, timep.getActionOvertime()); + // 闭合夹爪检测试管帽是否存在 + // miniServoControler.miniServoRotateWithTorque(MiniServoMid.ShakeModGripperSV, -400); + // Thread.sleep(timep.getTubeCapJudgeDelayTime()); + // if (ZEQ.IntEq(miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperSV), pp.getGripperClosePos(), 30)) { + // logger.info("试管帽不存在"); + // tubeCapExist = false; + // } + if (dp.getDebugMode() || tubeCapExist) { + //打开夹爪 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); + //Z轴下移动到取试管位置 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos, timep.getActionOvertime()); + //夹爪夹紧 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos - 100, timep.getActionOvertime()); + tryClampTube(); + + //Z轴上移动到零位 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + //夹爪夹紧 + //Y轴移动到摇匀位 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperShakeYPos() - 50, timep.getActionOvertime()); //该动作是为了消除齿轮间隙 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); + //Z轴下移动到摇匀位放试管的位置 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperShakeZPos, timep.getActionOvertime()); + //夹紧试管 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, pp.getShakeClampingPos(), timep.getActionOvertime()); + //松开夹爪,放置试管 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); + //Z轴上移动到零位 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + //Z轴归零,校准一次位置 + canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + //Y轴移动到零位 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); + } else { + modGroupMoveToZeroQuick(); + } + return tubeCapExist; + } + + @ExtApiFn(name = "摇匀", group = "单步", order = ORDER.shakeTube) + public void shakeTube(Integer shakeDegree, Integer times) throws AppException { + 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()); + } + + @ExtApiFn(name = "取试管帽", group = "单步", order = ORDER.takeTubeCap) + public void takeTubeCap() throws AppException { + //Y移动到取试管帽位置 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); + //Z下移动到取试管帽位置 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 3, timep.getActionOvertime()); + //闭合夹爪 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime()); + //Z上移动到零位 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + // tryClampTube(); + // miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos()-30, timep.getActionOvertime()); + + + //Y移动到待机位 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime()); + } + + /** + * 盖试管帽,并将试管移动回试管架中 + */ + @ExtApiFn(name = "盖试管帽并放回试管架", group = "单步", order = ORDER.pushBackTubeCapAndTakeBakTube) + public void pushBackTubeCapAndTakeBakTube() throws AppException { + //移动Y轴到取试管帽位置 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime()); + //移动Z轴盖帽 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 20, timep.getActionOvertime()); + //打开试管夹 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModClampingM, 70, timep.getActionOvertime()); + //移动Z轴到零位 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + + tryClampTube(); + + + //移动Y轴到方式管的位置 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime()); + //移动Z轴到取试管位置 + canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeHTubeZPos() - 20, timep.getActionOvertime()); + //打开夹爪 + miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime()); + //Z轴上移动到零位 + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime()); + //设备快速归零 + modGroupMoveToZeroQuick(); + } + + /** + * 气溶胶风扇控制 + */ + @ExtApiFn(name = "气溶胶风扇控制", group = "其他", order = ORDER.setAeroslFanPower) + public void setAeroslFanPower(Boolean enable) throws Exception { + if (enable) { + canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 99); + } else { + canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 0); + } + } + +// /** +// * 移动试管到试管预处理的位置 +// * @param tubeIndex 试管索引 +// */ +// public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { +// moveTubeRackTo(stp.getTPreProcessXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.POSITIVE, false); +// } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java b/src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java new file mode 100644 index 0000000..707ba83 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java @@ -0,0 +1,299 @@ +package a8k.service.app.devicedriver.ctrl; + +import a8k.OS; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicedriver.basectrl.CodeScaner; +import a8k.service.app.devicedriver.basectrl.MiniServoControler; +import a8k.service.app.devicedriver.basectrl.TubeTransportControler; +import a8k.service.app.devicedriver.basectrl.type.MiniServoMid; +import a8k.service.app.devicedriver.pos.TubeScanPosMgr; +import a8k.service.app.devicedriver.pos.TubeHolderParamMgr; +import a8k.service.bases.AppEventBusService; +import a8k.service.bases.appevent.AppWarningNotifyEvent; +import a8k.type.TubeHolderScanResult; +import a8k.type.TubesScanResult; +import a8k.type.exception.AppException; +import a8k.type.TargetPosMeasureDirection; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.hardware.type.a8kcanprotocol.MId; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.TubeScanerControler) +public class TubeScanerControler { + static Logger logger = LoggerFactory.getLogger(TubeScanerControler.class); + static Integer infeedOvertime = 10000; + static Integer outfeedOvertime = 10000; + static Integer scanOvertime = 3000; + + static class ORDER { + static final int moveTubeRackToExitPos = 1; + static final int moveTubeRackToScanPos = 2; + static final int moveTubeToScanPosAndScan = 3; + static final int moveTubeToAltitJudgXPos = 4; + static final int judgeTubeExist = 5; + + } + + @Resource + AppEventBusService ebus; + @Resource + A8kCanBusService canBus; + @Resource + TubeScanPosMgr stp; + @Resource + TubeHolderParamMgr tubeHolderParamMgr; + @Resource + CodeScaner codeScaner; + @Resource + TubeTransportControler tubeTransportControler; + @Resource + MiniServoControler miniServoControler; + + + private Boolean isTubeExist() throws AppException { + return canBus.getIOState(IOId.TubeExistPPS); + } + + private Boolean isTubeRackInEnterPos() throws AppException { + return canBus.getIOState(IOId.InfeedPPS); + } + + private Boolean isTubeRackInExitPos() throws AppException { + return canBus.getIOState(IOId.OutfeedPPS); + } + + private Boolean isHighTube() throws AppException { + return canBus.getIOState(IOId.TubeHeightPPS); + } + + + /** + * 移动试管到扫码位置 + * @param tubeIndex 试管索引 + */ + private void moveTubeToScanPos(Integer tubeIndex) throws AppException { + var scanPos = stp.getTube0ScanXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(); + tubeTransportControler.scanClampModClamp(); + tubeTransportControler.moveTubeRackTo(scanPos, TargetPosMeasureDirection.NEGATIVE, false); + } + + /** + * 移动<试管架>到试管架扫码位置 + */ + private void moveTubeRackToScanPos() throws AppException { + tubeTransportControler.moveTubeRackTo(stp.getTubeHolderScanXPos(), TargetPosMeasureDirection.POSITIVE, false); + } + + + public Boolean getTHchOuterPPS() throws AppException { + return canBus.getIOState(IOId.THChOuterPPS); + } + + public Boolean getTHchInterPPS() throws AppException { + return canBus.getIOState(IOId.THChInterPPS); + } + + + /*========================================================================================= + * 片段 + *========================================================================================*/ + + /** + * 移动试管架到入口位置 + */ + public void moveTubeRackMoveToEnterPos() throws AppException { + tubeTransportControler.moveTubeRackTo(stp.getTubeHolderEnterXPos(), TargetPosMeasureDirection.NOTCARE, true); + } + + /** + * 移动<试管架>到出口位置 + */ + public void moveTubeRackToExitPos() throws AppException { + tubeTransportControler.moveTubeRackTo(stp.getTubeHolderExitXPos(), TargetPosMeasureDirection.NOTCARE, false); + tubeTransportControler.moveTubeRackTo(stp.getTubeHolderExitXPos() - 10, TargetPosMeasureDirection.NOTCARE, false); + } + + /** + * 移动<试管架>到出口位置 + */ + @ExtApiFn(name = "入料", group = "单步", order = ORDER.moveTubeRackToExitPos) + public Boolean enterTubeHolder() throws AppException { + if (getTHchInterPPS() || getTHchOuterPPS()) { + throw new AppException(A8kEcode.APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY); + } + moveTubeRackMoveToEnterPos(); + try { + canBus.stepMotorEasyRotate(MId.FeedingModInfeedM, -1); + for (int i = 0; i < infeedOvertime / 100; i++) { + OS.hsleep(100); + if (getTHchInterPPS()) { + break; + } + logger.info("等待试管架到位 [{}/{}]", i, infeedOvertime / 100); + } + OS.hsleep(1000); + canBus.stepMotorStop(MId.FeedingModInfeedM); + if (!getTHchInterPPS()) { + return false; + } + } finally { + canBus.moduleStop(MId.FeedingModInfeedM); + } + return true; + } + + public void ejectTubeHolderInEnterPos() throws AppException { + canBus.stepMotorEasyRotate(MId.FeedingModInfeedM, 1); + OS.hsleep(3000); + canBus.stepMotorStop(MId.FeedingModInfeedM); + } + + + @ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos) + public void ejectTubeHolder() throws AppException { + moveTubeRackToExitPos(); + try { + canBus.stepMotorEasyRotate(MId.FeedingModOutfeedM, 1); + for (int i = 0; i < outfeedOvertime / 100; i++) { + OS.hsleep(100); + logger.info("getTHchInterPPS:{} getTHchOuterPPS:{}", getTHchInterPPS(), getTHchOuterPPS()); + if (!getTHchInterPPS() && !getTHchOuterPPS()) { + break; + } + } + OS.hsleep(1000); + canBus.stepMotorStop(MId.FeedingModOutfeedM); + if (getTHchInterPPS() || getTHchOuterPPS()) { + throw new AppException(A8kEcode.APPE_EJECT_TUBEHOLDER_TIMEOUT); + } + } finally { + canBus.moduleStop(MId.FeedingModOutfeedM); + } + } + + /** + * 移动试管架到扫码并扫码 + */ + @ExtApiFn(name = "扫描<试管架>编码", group = "单步扫码", order = ORDER.moveTubeRackToScanPos) + public String moveTubeRackToScanPosAndScan() throws AppException { + String result; + moveTubeRackToScanPos(); + + tubeTransportControler.scanClampModClamp(); + canBus.codeScanerStartScan(MId.FeedingModScannerMod); + result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000); + tubeTransportControler.scanClampModRelease(); + if (result == null || result.isEmpty()) { + return ""; + } + return result; + } + // + // 试管移动 + // + + /** + * 移动试管到扫码位置,并扫码 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "扫描<试管X>编码", group = "单步扫码", order = ORDER.moveTubeToScanPosAndScan) + public String moveTubeToScanPosAndScan(Integer tubeIndex) throws AppException { + moveTubeToScanPos(tubeIndex); + try { + tubeTransportControler.scanClampModClamp(); + + canBus.codeScanerStartScan(MId.FeedingModScannerMod); + miniServoControler.miniServoRotateWithTorque(MiniServoMid.ShakeModTubeScanerClampingSV, stp.getTubeScanServoTorque()); + return codeScaner.feedingModScannerModCodeScannerScanCode(scanOvertime); + } finally { + canBus.moduleStop(MId.ShakeModTubeScanerClampingSV); + canBus.moduleStop(MId.FeedingModScannerMod); + tubeTransportControler.scanClampModRelease(); + } + } + + public Boolean tubeXChannelIsEmpty() throws AppException { + return !getTHchInterPPS() && !getTHchOuterPPS(); + } + + + /** + * 移动试管到试管高低判断位置 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos) + public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { + tubeTransportControler.moveTubeRackTo(stp.getTube0AltitJudgXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.NEGATIVE, false); + return isHighTube(); + } + + /** + * 移动试管到试管有无判断位置 + * @param tubeIndex 试管索引 + */ + @ExtApiFn(name = "判断<试管N>是否存在", group = "单步-其他", order = ORDER.judgeTubeExist) + public Boolean moveAndjudgeTubeExist(Integer tubeIndex) throws AppException { + tubeTransportControler.moveTubeRackTo(stp.getTube0ExistJudgXPos() + tubeIndex * tubeHolderParamMgr.getTubeSpacing(), TargetPosMeasureDirection.NEGATIVE, false); + return isTubeExist(); + } + + + public TubeHolderScanResult scanTubeHodler() throws AppException { + TubeHolderScanResult result = new TubeHolderScanResult(); + + //清空试管架 + if (!tubeXChannelIsEmpty()) { + ejectTubeHolder(); + } + //入料 + logger.info("开始进料"); + Boolean enterSuc = enterTubeHolder(); + if (!enterSuc) { + logger.warn("进料超时,从入料口,弹出试管架"); + ejectTubeHolderInEnterPos(); + throw new AppException(A8kEcode.APPE_INFEED_OVERTIME_FAIL); + } + //扫描试管架类型 + String tubeType = moveTubeRackToScanPosAndScan(); + if (tubeType.isEmpty()) { + logger.warn("扫描试管架类型失败,弹出试管架"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_SCAN_TUBEHOLDER_TYPE_TIMEOUT)); + return null; + } + logger.info("扫描试管架类型成功,{}", tubeType); + //逐个扫描试管 + TubesScanResult[] tubesScanResult = new TubesScanResult[10]; + boolean hasTube = false; + for (int i = 0; i < tubesScanResult.length; i++) { + tubesScanResult[i] = new TubesScanResult(); + Boolean isTubeExist = moveAndjudgeTubeExist(i); + if (isTubeExist) { + hasTube = true; + tubesScanResult[i].isTubeExist = true; + tubesScanResult[i].isHighTube = moveAndJudgeTubeAltit(i); + tubesScanResult[i].tubeCode = moveTubeToScanPosAndScan(i); + } else { + tubesScanResult[i].isTubeExist = false; + } + logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); + } + //处理扫描结果 + if (!hasTube) { + logger.error("试管架中没有试管"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); + return null; + } + result.tubeHolderType = tubeType; + result.tube = tubesScanResult; + return result; + } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/pos/TubePreProcesPosMgr.java b/src/main/java/a8k/service/app/devicedriver/pos/TubePreProcesPosMgr.java new file mode 100644 index 0000000..548eca5 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/pos/TubePreProcesPosMgr.java @@ -0,0 +1,186 @@ +package a8k.service.app.devicedriver.pos; + +import a8k.service.db.LowerDeviceParameterDBService; +import a8k.service.db.utils.PosParameterReader; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class TubePreProcesPosMgr { + static final Logger logger = LoggerFactory.getLogger(TubeScanPosMgr.class); + + public enum POS { + GripperServoOpenPos("抓手张开位置"),// + GripperServoClosePos("抓手闭合位置"),// + GripperServoTakeCapPos("抓手取试管位置"),// + YServoTakeTubePos("取试管位置"),// + YServoShakePos("摇匀位置"),// + YServoZeroYPos("待机位"),// + ZMotorTakeHTubePos("取高试管位置"),// + ZMotorTakeSTubePos("取低试管位置"),// + ZMotorJudgeHTubeCapPos("高试管帽有无判断位"),// + ZMotorJudgeSTubeCapPos("低试管帽有无判断位"),// + ZMotorShakeTubePos("摇匀放置位置"),// + ZMotorTakeCapPos("取试管帽位"),// + ShakeClampMotorClampPos("试管夹紧位"),// + ShakeClampMotorReleasePos("摇匀臂"),// + ; + public final String chName; + + POS(String chName) { + this.chName = chName; + } + } + + ; + + @Resource + LowerDeviceParameterDBService lowerDeviceParameterDBService; + + PosParameterReader posReader = null; + Integer nowParaVersion = 0; + + @PostConstruct + void initialize() { + posReader = lowerDeviceParameterDBService.getReader(this.getClass()); + Integer paraVersion = posReader.getVersion(); + if (!nowParaVersion.equals(paraVersion)) { + logger.info("init param"); + posReader.setVersion(nowParaVersion); + posReader.updatePos(POS.GripperServoOpenPos, 450); + posReader.updatePos(POS.GripperServoClosePos, 310); + posReader.updatePos(POS.GripperServoTakeCapPos, 355); + posReader.updatePos(POS.YServoTakeTubePos, 3080); + posReader.updatePos(POS.YServoShakePos, 2130); + posReader.updatePos(POS.YServoZeroYPos, 300); + posReader.updatePos(POS.ZMotorTakeHTubePos, 739); + posReader.updatePos(POS.ZMotorTakeSTubePos, 983); + posReader.updatePos(POS.ZMotorJudgeHTubeCapPos, 591); + posReader.updatePos(POS.ZMotorJudgeSTubeCapPos, 867); + posReader.updatePos(POS.ZMotorShakeTubePos, 835); + posReader.updatePos(POS.ZMotorTakeCapPos, 835); + posReader.updatePos(POS.ShakeClampMotorClampPos, 10); + posReader.updatePos(POS.ShakeClampMotorReleasePos, 90); + } + } + + + public Integer getParam(POS pos) { + return posReader.getPos(pos, Integer.class); + } + + public Integer getGripperServoOpenPos() { + return getParam(POS.GripperServoOpenPos); + } + + public void setGripperServoOpenPos(Integer value) { + posReader.updatePos(POS.GripperServoOpenPos, value); + } + + public Integer getGripperServoClosePos() { + return getParam(POS.GripperServoClosePos); + } + + public void setGripperServoClosePos(Integer value) { + posReader.updatePos(POS.GripperServoClosePos, value); + } + + public Integer getGripperServoTakeCapPos() { + return getParam(POS.GripperServoTakeCapPos); + } + + public void setGripperServoTakeCapPos(Integer value) { + posReader.updatePos(POS.GripperServoTakeCapPos, value); + } + + public Integer getYServoTakeTubePos() { + return getParam(POS.YServoTakeTubePos); + } + + public void setYServoTakeTubePos(Integer value) { + posReader.updatePos(POS.YServoTakeTubePos, value); + } + + public Integer getYServoShakePos() { + return getParam(POS.YServoShakePos); + } + + public void setYServoShakePos(Integer value) { + posReader.updatePos(POS.YServoShakePos, value); + } + + public Integer getYServoZeroYPos() { + return getParam(POS.YServoZeroYPos); + } + + public void setYServoZeroYPos(Integer value) { + posReader.updatePos(POS.YServoZeroYPos, value); + } + + public Integer getZMotorTakeHTubePos() { + return getParam(POS.ZMotorTakeHTubePos); + } + + public void setZMotorTakeHTubePos(Integer value) { + posReader.updatePos(POS.ZMotorTakeHTubePos, value); + } + + public Integer getZMotorTakeSTubePos() { + return getParam(POS.ZMotorTakeSTubePos); + } + + public void setZMotorTakeSTubePos(Integer value) { + posReader.updatePos(POS.ZMotorTakeSTubePos, value); + } + + public Integer getZMotorJudgeHTubeCapPos() { + return getParam(POS.ZMotorJudgeHTubeCapPos); + } + + public void setZMotorJudgeHTubeCapPos(Integer value) { + posReader.updatePos(POS.ZMotorJudgeHTubeCapPos, value); + } + + public Integer getZMotorJudgeSTubeCapPos() { + return getParam(POS.ZMotorJudgeSTubeCapPos); + } + + public void setZMotorJudgeSTubeCapPos(Integer value) { + posReader.updatePos(POS.ZMotorJudgeSTubeCapPos, value); + } + + public Integer getZMotorShakeTubePos() { + return getParam(POS.ZMotorShakeTubePos); + } + + public void setZMotorShakeTubePos(Integer value) { + posReader.updatePos(POS.ZMotorShakeTubePos, value); + } + + public Integer getZMotorTakeCapPos() { + return getParam(POS.ZMotorTakeCapPos); + } + + public void setZMotorTakeCapPos(Integer value) { + posReader.updatePos(POS.ZMotorTakeCapPos, value); + } + + public Integer getShakeClampMotorClampPos() { + return getParam(POS.ShakeClampMotorClampPos); + } + + public void setShakeClampMotorClampPos(Integer value) { + posReader.updatePos(POS.ShakeClampMotorClampPos, value); + } + + public Integer getShakeClampMotorReleasePos() { + return getParam(POS.ShakeClampMotorReleasePos); + } + + public void setShakeClampMotorReleasePos(Integer value) { + posReader.updatePos(POS.ShakeClampMotorReleasePos, value); + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java b/src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java new file mode 100644 index 0000000..102539f --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java @@ -0,0 +1,120 @@ +package a8k.service.app.devicedriver.pos; + +import a8k.service.db.LowerDeviceParameterDBService; +import a8k.service.db.utils.PosParameterReader; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +@Component +public class TubeScanPosMgr { + static final Logger logger = LoggerFactory.getLogger(TubeScanPosMgr.class); + + public final Integer ScanerClampingSVReleasePos = 100; + public final Integer ScanerClampingSVClampingPos = 1000; + + public enum POS { + TubeHolderEnterXPos, // 入料位置 + TubeHolderExitXPos, // 出料位置 + TubeHolderScanXPos, // 试管架扫描位置 + Tube0ScanXPos, // 0号试管扫描位置 + Tube0AltitJudgXPos, // 0试管高度判断位置 + Tube0ExistJudgXPos, // 0试管存在判断位置 + TubeScanServoTorque,// 试管扫描伺服力矩 + } + + @Resource + LowerDeviceParameterDBService lowerDeviceParameterDBService; + + PosParameterReader posReader = null; + Integer nowParaVersion = 0; + + // + // MotorTubeRackMoveCtrlService + // + + @PostConstruct + void initialize() { + posReader = lowerDeviceParameterDBService.getReader(this.getClass()); + Integer paraVersion = posReader.getVersion(); + if (!nowParaVersion.equals(paraVersion)) { + paramReset(); + } + } + + void paramReset() { + logger.info("init param"); + posReader.setVersion(nowParaVersion); + posReader.updatePos(POS.TubeHolderEnterXPos, -46); + posReader.updatePos(POS.TubeHolderExitXPos, 3975); + posReader.updatePos(POS.TubeHolderScanXPos, 2202); + posReader.updatePos(POS.Tube0ScanXPos, 505); + posReader.updatePos(POS.Tube0AltitJudgXPos, 505); + posReader.updatePos(POS.Tube0ExistJudgXPos, 300); + posReader.updatePos(POS.TubeScanServoTorque, 500); + } + + public Integer getParam(POS pos) { + return posReader.getPos(pos, Integer.class); + } + + public Integer getTubeHolderEnterXPos() { + return getParam(POS.TubeHolderEnterXPos); + } + + public Integer getTubeHolderExitXPos() { + return getParam(POS.TubeHolderExitXPos); + } + + public Integer getTubeHolderScanXPos() { + return getParam(POS.TubeHolderScanXPos); + } + + public Integer getTube0ScanXPos() { + return getParam(POS.Tube0ScanXPos); + } + + public Integer getTube0AltitJudgXPos() { + return getParam(POS.Tube0AltitJudgXPos); + } + + public Integer getTube0ExistJudgXPos() { + return getParam(POS.Tube0ExistJudgXPos); + } + + public Integer getTubeScanServoTorque() { + return getParam(POS.TubeScanServoTorque); + } + + public void setTubeHolderEnterXPos(Integer value) { + posReader.updatePos(POS.TubeHolderEnterXPos, value); + } + + public void setTubeHolderExitXPos(Integer value) { + posReader.updatePos(POS.TubeHolderExitXPos, value); + } + + public void setTubeHolderScanXPos(Integer value) { + posReader.updatePos(POS.TubeHolderScanXPos, value); + } + + public void setTube0ScanXPos(Integer value) { + posReader.updatePos(POS.Tube0ScanXPos, value); + } + + public void setTube0AltitJudgXPos(Integer value) { + posReader.updatePos(POS.Tube0AltitJudgXPos, value); + } + + public void setTube0ExistJudgXPos(Integer value) { + posReader.updatePos(POS.Tube0ExistJudgXPos, value); + } + + + public void setTubeScanServoTorque(Integer value) { + posReader.updatePos(POS.TubeScanServoTorque, value); + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/pos/TubeTransportPosMgr.java b/src/main/java/a8k/service/app/devicedriver/pos/TubeTransportPosMgr.java deleted file mode 100644 index a1325b9..0000000 --- a/src/main/java/a8k/service/app/devicedriver/pos/TubeTransportPosMgr.java +++ /dev/null @@ -1,120 +0,0 @@ -package a8k.service.app.devicedriver.pos; - -import a8k.service.db.LowerDeviceParameterDBService; -import a8k.service.db.utils.PosParameterReader; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - - -@Component -public class TubeTransportPosMgr { - static final Logger logger = LoggerFactory.getLogger(TubeTransportPosMgr.class); - - public final Integer ScanerClampingSVReleasePos = 100; - public final Integer ScanerClampingSVClampingPos = 1000; - - public enum POS { - TubeHolderEnterXPos, // 入料位置 - TubeHolderExitXPos, // 出料位置 - TubeHolderScanXPos, // 试管架扫描位置 - Tube0ScanXPos, // 0号试管扫描位置 - Tube0AltitJudgXPos, // 0试管高度判断位置 - Tube0ExistJudgXPos, // 0试管存在判断位置 - TubeScanServoTorque,// 试管扫描伺服力矩 - } - - @Resource - LowerDeviceParameterDBService lowerDeviceParameterDBService; - - PosParameterReader posReader = null; - Integer nowParaVersion = 0; - - // - // MotorTubeRackMoveCtrlService - // - - @PostConstruct - void initialize() { - posReader = lowerDeviceParameterDBService.getReader(this.getClass()); - Integer paraVersion = posReader.getVersion(); - if (!nowParaVersion.equals(paraVersion)) { - paramReset(); - } - } - - void paramReset() { - logger.info("init param"); - posReader.setVersion(nowParaVersion); - posReader.updatePos(POS.TubeHolderEnterXPos, -46); - posReader.updatePos(POS.TubeHolderExitXPos, 3975); - posReader.updatePos(POS.TubeHolderScanXPos, 2202); - posReader.updatePos(POS.Tube0ScanXPos, 505); - posReader.updatePos(POS.Tube0AltitJudgXPos, 505); - posReader.updatePos(POS.Tube0ExistJudgXPos, 300); - posReader.updatePos(POS.TubeScanServoTorque, 500); - } - - public Integer getParam(POS pos) { - return posReader.getPos(pos, Integer.class); - } - - public Integer getTubeHolderEnterXPos() { - return getParam(POS.TubeHolderEnterXPos); - } - - public Integer getTubeHolderExitXPos() { - return getParam(POS.TubeHolderExitXPos); - } - - public Integer getTubeHolderScanXPos() { - return getParam(POS.TubeHolderScanXPos); - } - - public Integer getTube0ScanXPos() { - return getParam(POS.Tube0ScanXPos); - } - - public Integer getTube0AltitJudgXPos() { - return getParam(POS.Tube0AltitJudgXPos); - } - - public Integer getTube0ExistJudgXPos() { - return getParam(POS.Tube0ExistJudgXPos); - } - - public Integer getTubeScanServoTorque() { - return getParam(POS.TubeScanServoTorque); - } - - public void setTubeHolderEnterXPos(Integer value) { - posReader.updatePos(POS.TubeHolderEnterXPos, value); - } - - public void setTubeHolderExitXPos(Integer value) { - posReader.updatePos(POS.TubeHolderExitXPos, value); - } - - public void setTubeHolderScanXPos(Integer value) { - posReader.updatePos(POS.TubeHolderScanXPos, value); - } - - public void setTube0ScanXPos(Integer value) { - posReader.updatePos(POS.Tube0ScanXPos, value); - } - - public void setTube0AltitJudgXPos(Integer value) { - posReader.updatePos(POS.Tube0AltitJudgXPos, value); - } - - public void setTube0ExistJudgXPos(Integer value) { - posReader.updatePos(POS.Tube0ExistJudgXPos, value); - } - - - public void setTubeScanServoTorque(Integer value) { - posReader.updatePos(POS.TubeScanServoTorque, value); - } -} diff --git a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java index afb05e3..f6919b3 100644 --- a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java +++ b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java @@ -7,8 +7,8 @@ import a8k.extapi_controler.utils.ExtApiTab; import a8k.type.ConsumableGroup; import a8k.type.exception.AppException; import a8k.type.IncubatorPos; -import a8k.service.app.devicedriver.ctrl.SamplesPreProcesControler; -import a8k.service.app.devicedriver.ctrl.TubeHolderScanerControler; +import a8k.service.app.devicedriver.ctrl.TubePreProcesControler; +import a8k.service.app.devicedriver.ctrl.TubeScanerControler; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; @@ -58,10 +58,10 @@ public class TestScript { ReactionPlatesTransmitCtrl reactionPlatesTransmitCtrl; @Resource - SamplesPreProcesControler samplesPreProcesControler; + TubePreProcesControler tubePreProcesControler; @Resource - TubeHolderScanerControler tubeHolderScanerControler; + TubeScanerControler tubeScanerControler; EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControler.class);