Browse Source

重构代码,将miniServo相关方法提取出来

tags/v0
zhaohe 10 months ago
parent
commit
fc13702014
  1. 9
      src/main/java/a8k/extapi_controler/pagecontrol/ExtApiTabConfig.java
  2. 82
      src/main/java/a8k/hardware/A8kCanBusService.java
  3. 2
      src/main/java/a8k/hardware/type/regindex/RegIndex.java
  4. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java
  5. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  6. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  7. 10
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java
  8. 4
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java
  9. 91
      src/main/java/a8k/service/app/devicedriver/basectrl/MiniServoControler.java
  10. 31
      src/main/java/a8k/service/app/devicedriver/basectrl/TubeTransportControler.java
  11. 18
      src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoMid.java
  12. 23
      src/main/java/a8k/service/app/devicedriver/basectrl/type/MiniServoRegIndex.java
  13. 4
      src/main/java/a8k/service/app/devicedriver/calibration/PositionCalibration.java
  14. 56
      src/main/java/a8k/service/app/devicedriver/calibration/TubePreProcesPosCalibration.java
  15. 49
      src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java
  16. 10
      src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java
  17. 10
      src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java
  18. 62
      src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java
  19. 20
      src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java
  20. 186
      src/main/java/a8k/service/app/devicedriver/pos/TubePreProcesPosMgr.java
  21. 4
      src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java
  22. 8
      src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java

9
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),

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

2
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 *
***********************************************************************************************************************/

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

8
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

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

10
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

4
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java

@ -7,7 +7,7 @@ import a8k.service.app.appstate.GStateService;
import a8k.service.app.appstate.type.MainFlowCtrlState;
import a8k.service.app.appstate.resource.A8kPublicResourceType;
import a8k.service.app.appstate.type.state.TubeHolderState;
import a8k.service.app.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;

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

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

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

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

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

56
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);
}
//标定和校准
}

49
src/main/java/a8k/service/app/devicedriver/calibration/TubeTransportPosCalibration.java → src/main/java/a8k/service/app/devicedriver/calibration/TubeScanPosCalibration.java

@ -5,28 +5,32 @@ 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.ctrl.TubeHolderScanerControler;
import a8k.service.app.devicedriver.pos.TubeTransportPosMgr;
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.TubeTransportPosCalibration)
@ExtApiTab(cfg = ExtApiTabConfig.TubeScanPosCalibration)
@Component
public class TubeTransportPosCalibration {
public class TubeScanPosCalibration {
@Resource
TubeTransportPosMgr tubeTransportPosMgr;
TubeScanPosMgr tubeScanPosMgr;
@Resource
A8kCanBusService canBus;
A8kCanBusService canBus;
@Resource
TubeHolderScanerControler tubeHolderScanerControler;
TubeScanerControler tubeScanerControler;
@Resource
TubeTransportControler tubeTransportControler;
TubeTransportControler tubeTransportControler;
@Resource
MiniServoControler miniServoControler;
private Integer readFeedingModXMPos() throws AppException {
canBus.stepMotorEnable(MId.FeedingModXM, 1);
@ -35,8 +39,8 @@ public class TubeTransportPosCalibration {
}
@ExtApiFn(name = "获取所有坐标", group = "基础", order = 1)
public TubeTransportPosMgr getPoss() throws AppException {
return tubeTransportPosMgr;
public TubeScanPosMgr getPoss() throws AppException {
return tubeScanPosMgr;
}
// 测试工具
@ -52,7 +56,7 @@ public class TubeTransportPosCalibration {
canBus.stepMotorEnable(MId.FeedingModInfeedM, 1);
canBus.stepMotorEnable(MId.FeedingModOutfeedM, 1);
canBus.stepMotorEnable(MId.FeedingModXM, 1);
canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 1);
miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 1);
}
@ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13)
@ -60,62 +64,63 @@ public class TubeTransportPosCalibration {
canBus.stepMotorEnable(MId.FeedingModInfeedM, 0);
canBus.stepMotorEnable(MId.FeedingModOutfeedM, 0);
canBus.stepMotorEnable(MId.FeedingModXM, 0);
canBus.miniServoEnable(MId.ShakeModTubeScanerClampingSV, 0);
miniServoControler.miniServoEnable(MiniServoMid.ShakeModTubeScanerClampingSV, 0);
}
@ExtApiFn(name = "<平移电机>设置当前位置为<入料位置>", group = "标定", order = 21)
public void setTubeHolderEnterXPos() throws AppException {
tubeTransportPosMgr.setTubeHolderEnterXPos(readFeedingModXMPos());
tubeScanPosMgr.setTubeHolderEnterXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<平移电机>设置当前位置为<出料位置>", group = "标定", order = 22)
public void setTubeHolderExitXPos() throws AppException {
tubeTransportPosMgr.setTubeHolderExitXPos(readFeedingModXMPos());
tubeScanPosMgr.setTubeHolderExitXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<平移电机>设置当前位置为<试管架扫描位置>", group = "标定", order = 23)
public void setTubeHolderScanXPos() throws AppException {
tubeTransportPosMgr.setTubeHolderScanXPos(readFeedingModXMPos());
tubeScanPosMgr.setTubeHolderScanXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<平移电机>设置当前位置为<0号试管扫描位置>", group = "标定", order = 24)
public void setTube0ScanXPos() throws AppException {
tubeTransportPosMgr.setTube0ScanXPos(readFeedingModXMPos());
tubeScanPosMgr.setTube0ScanXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<平移电机>设置当前位置为<0试管高度判断位置>", group = "标定", order = 25)
public void setTube0AltitJudgXPos() throws AppException {
tubeTransportPosMgr.setTube0AltitJudgXPos(readFeedingModXMPos());
tubeScanPosMgr.setTube0AltitJudgXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<平移电机>设置当前位置为<0试管存在判断位置>", group = "标定", order = 26)
public void setTube0ExistJudgXPos() throws AppException {
tubeTransportPosMgr.setTube0ExistJudgXPos(readFeedingModXMPos());
tubeScanPosMgr.setTube0ExistJudgXPos(readFeedingModXMPos());
}
@ExtApiFn(name = "<夹紧舵机>设置当前位置为夹紧位置", group = "标定", order = 26)
public void setTubeScanClampPos() throws AppException {
canBus.miniServoSetCurPos(MId.ShakeModTubeScanerClampingSV, tubeTransportPosMgr.ScanerClampingSVClampingPos);
miniServoControler.miniServoSetCurPos(MiniServoMid.ShakeModTubeScanerClampingSV, tubeScanPosMgr.ScanerClampingSVClampingPos);
}
@ExtApiFn(name = "夹紧试管架", group = "校验", order = 31)
public void scanClampModClamp() throws AppException {
tubeTransportControler.scanClampModClamp();
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();
return tubeScanerControler.scanTubeHodler();
}
@ExtApiFn(name = "设置<试管扫描伺服力矩(100-1000)>", group = "其他", order = 41)
public void setTubeScanServoTorque(Integer torque) throws AppException {
tubeTransportPosMgr.setTubeScanServoTorque(torque);
tubeScanPosMgr.setTubeScanServoTorque(torque);
}
}

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

10
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<Checkpoint> 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));

62
src/main/java/a8k/service/app/devicedriver/ctrl/SamplesPreProcesControler.java → src/main/java/a8k/service/app/devicedriver/ctrl/TubePreProcesControler.java

@ -3,6 +3,8 @@ 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;
@ -18,9 +20,9 @@ import org.springframework.stereotype.Component;
@Component
@ExtApiTab(cfg = ExtApiTabConfig.SamplesPreProcesCtrl)
public class SamplesPreProcesControler {
static Logger logger = LoggerFactory.getLogger(SamplesPreProcesControler.class);
@ExtApiTab(cfg = ExtApiTabConfig.TubePreProcesControler)
public class TubePreProcesControler {
static Logger logger = LoggerFactory.getLogger(TubePreProcesControler.class);
static class ORDER {
@ -43,13 +45,15 @@ public class SamplesPreProcesControler {
@Resource
DebugParam dp;
@Resource
MiniServoControler miniServoControler;
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++
// PRIVATE
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++
private void modGroupMoveToZero() throws AppException {
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperClosePos(), timep.getActionOvertime());
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime());
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());
@ -100,9 +104,9 @@ public class SamplesPreProcesControler {
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());
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());
}
/**
@ -122,12 +126,12 @@ public class SamplesPreProcesControler {
}
//Y轴在零点附近
if (!ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperYSV), pp.getGripperZeroYPos(), 30)) {
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(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) {
if (!ZEQ.IntEq(miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperSV), pp.getGripperClosePos(), 30)) {
throw new AppException(A8kEcode.CODEERROR_MOTOR_NOT_IN_ZERO_POS, MId.ShakeModGripperSV);
}
@ -143,31 +147,31 @@ public class SamplesPreProcesControler {
Integer gripperShakeZPos = pp.getGripperShakeTubeZPos();
//固定试管架
canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 900, timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.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());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime());
//打开夹爪
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
// //Z轴下移动到试管帽有无检测位
// canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperJudgeCapZPos, timep.getActionOvertime());
// 闭合夹爪检测试管帽是否存在
// canBus.miniServoRotateWithTorque(MId.ShakeModGripperSV, -400);
// miniServoControler.miniServoRotateWithTorque(MiniServoMid.ShakeModGripperSV, -400);
// Thread.sleep(timep.getTubeCapJudgeDelayTime());
// if (ZEQ.IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), pp.getGripperClosePos(), 30)) {
// if (ZEQ.IntEq(miniServoControler.miniServoReadPos(MiniServoMid.ShakeModGripperSV), pp.getGripperClosePos(), 30)) {
// logger.info("试管帽不存在");
// tubeCapExist = false;
// }
if (dp.getDebugMode() || tubeCapExist) {
//打开夹爪
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
//Z轴下移动到取试管位置
canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos, timep.getActionOvertime());
//夹爪夹紧
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime());
canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, gripperTakeTubeZPos - 100, timep.getActionOvertime());
tryClampTube();
@ -175,20 +179,20 @@ public class SamplesPreProcesControler {
canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime());
//夹爪夹紧
//Y轴移动到摇匀位
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos() - 50, timep.getActionOvertime()); //该动作是为了消除齿轮间隙
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime());
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());
//松开夹爪放置试管
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), 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轴移动到零位
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime());
} else {
modGroupMoveToZeroQuick();
}
@ -207,20 +211,20 @@ public class SamplesPreProcesControler {
@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());
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());
//闭合夹爪
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos(), timep.getActionOvertime());
//Z上移动到零位
canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime());
// tryClampTube();
// canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperTakeCapPos()-30, timep.getActionOvertime());
// miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperTakeCapPos()-30, timep.getActionOvertime());
//Y移动到待机位
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperZeroYPos(), timep.getActionOvertime());
}
/**
@ -229,7 +233,7 @@ public class SamplesPreProcesControler {
@ExtApiFn(name = "盖试管帽并放回试管架", group = "单步", order = ORDER.pushBackTubeCapAndTakeBakTube)
public void pushBackTubeCapAndTakeBakTube() throws AppException {
//移动Y轴到取试管帽位置
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperShakeYPos(), timep.getActionOvertime());
//移动Z轴盖帽
canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeCapZPos() + 20, timep.getActionOvertime());
//打开试管夹
@ -241,11 +245,11 @@ public class SamplesPreProcesControler {
//移动Y轴到方式管的位置
canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperYSV, pp.getGripperTakeTubeYPos(), timep.getActionOvertime());
//移动Z轴到取试管位置
canBus.stepMotorEasyMoveToBlock(MId.ShakeModGripperZM, pp.getGripperTakeHTubeZPos() - 20, timep.getActionOvertime());
//打开夹爪
canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
miniServoControler.miniServoMoveToBlock(MiniServoMid.ShakeModGripperSV, pp.getGripperOpenPos(), timep.getActionOvertime());
//Z轴上移动到零位
canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.ShakeModGripperZM, timep.getActionOvertime());
//设备快速归零

20
src/main/java/a8k/service/app/devicedriver/ctrl/TubeHolderScanerControler.java → src/main/java/a8k/service/app/devicedriver/ctrl/TubeScanerControler.java

@ -5,8 +5,10 @@ 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.pos.TubeTransportPosMgr;
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;
@ -24,9 +26,9 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@ExtApiTab(cfg = ExtApiTabConfig.TubeHolderScanerControler)
public class TubeHolderScanerControler {
static Logger logger = LoggerFactory.getLogger(TubeHolderScanerControler.class);
@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;
@ -43,15 +45,17 @@ public class TubeHolderScanerControler {
@Resource
AppEventBusService ebus;
@Resource
A8kCanBusService canBus;
A8kCanBusService canBus;
@Resource
TubeTransportPosMgr stp;
TubeScanPosMgr stp;
@Resource
TubeHolderParamMgr tubeHolderParamMgr;
TubeHolderParamMgr tubeHolderParamMgr;
@Resource
CodeScaner codeScaner;
@Resource
TubeTransportControler tubeTransportControler;
@Resource
MiniServoControler miniServoControler;
private Boolean isTubeExist() throws AppException {
@ -207,7 +211,7 @@ public class TubeHolderScanerControler {
tubeTransportControler.scanClampModClamp();
canBus.codeScanerStartScan(MId.FeedingModScannerMod);
canBus.miniServoRotateWithTorque(MId.ShakeModTubeScanerClampingSV, stp.getTubeScanServoTorque());
miniServoControler.miniServoRotateWithTorque(MiniServoMid.ShakeModTubeScanerClampingSV, stp.getTubeScanServoTorque());
return codeScaner.feedingModScannerModCodeScannerScanCode(scanOvertime);
} finally {
canBus.moduleStop(MId.ShakeModTubeScanerClampingSV);

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

4
src/main/java/a8k/service/app/devicedriver/pos/TubeTransportPosMgr.java → src/main/java/a8k/service/app/devicedriver/pos/TubeScanPosMgr.java

@ -10,8 +10,8 @@ import org.springframework.stereotype.Component;
@Component
public class TubeTransportPosMgr {
static final Logger logger = LoggerFactory.getLogger(TubeTransportPosMgr.class);
public class TubeScanPosMgr {
static final Logger logger = LoggerFactory.getLogger(TubeScanPosMgr.class);
public final Integer ScanerClampingSVReleasePos = 100;
public final Integer ScanerClampingSVClampingPos = 1000;

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

Loading…
Cancel
Save