diff --git a/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java b/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java index dda69eb..d3a1288 100644 --- a/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java +++ b/src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java @@ -5,7 +5,7 @@ import com.iflytop.uf.UfActiveRecordField; public class MotorTubeRackMoveCtrlServiceParameter { @UfActiveRecordField - Integer moveToZeroOvertime;// 回零超时时间 + public Integer moveToZeroOvertime;// 回零超时时间 @UfActiveRecordField public Integer actionOvertime;// 执行动作的超时时间,该超时时间适用于当前模块在当前产品中所有动作的最大时间。 diff --git a/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java new file mode 100644 index 0000000..af4685e --- /dev/null +++ b/src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java @@ -0,0 +1,253 @@ +package a8k.service.hardware; +import a8k.a8k_can_protocol.CmdId; +import a8k.a8k_can_protocol.Errorcode; +import a8k.a8k_can_protocol.ModuleId; +import a8k.a8k_can_protocol.RegIndex; +import a8k.appbean.HardwareException; +import a8k.base_hardware.A8kCanBusService; +import a8k.service.db.dao.A8kTubeInfoDao; +import a8k.service.db.dao.MotorTubeRackMoveCtrlServiceParameterDao; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public class MotorTubeRackMoveCtrlService { + /** + * + * 主要用来控制试管架的平移动作控制 + * + * 通用编写注意事项: + * 1.坐标从数据库中拿一些关键点的坐标进行运算 + * 2.直接调用A8kCanBusService的方法。 + * 3.利用光电,和编码器检查设备是否运行到位 + * + * 当前模块编写注意事项 + * 1. 电机移动前先将试管扫码夹紧复位 + * 2. 扫码时试管夹紧夹紧 + */ + + // MotorTubeRackMotor_tubeScanPos + // MotorTubeRackMotor_tubeHeighJudgmentPos + // MotorTubeRackMotor_tubePreProcessPos + // MotorTubeRackMotor_tubeExistJudgmentPos + // + // MotorTubeRackMotor_tubeRackEnterPos + // MotorTubeRackMotor_tubeRackExitPos + // MotorTubeRackMotor_tubeRackScanCodePos + // MotorTubeScanClampModule_clampPos + // MotorTubeScanClampModule_releasePos + + + @Autowired + A8kTubeInfoDao tubeInfoDao; + + @Resource + private A8kCanBusService a8kCanBusService; + @Resource + MotorTubeRackMoveCtrlServiceParameterDao serviceParameterDao; + + + + // + // 电机基础控制 + // + + public void moveToZeroWhenDeviceSetup() throws HardwareException, InterruptedException { + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to_zero, new Integer[]{}, 30*1000); + } + + + public void moveToZero() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + var beforePosResponse = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_read_pos, new Integer[]{0}); + var beforePos = beforePosResponse.getContentI32(0); + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to_zero, new Integer[]{}, params.moveToZeroOvertime); + var afterPosResponse = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_read_pos, new Integer[]{0}); + var afterPos = afterPosResponse.getContentI32(0); + var distance = beforePos - afterPos; + + var response = this.a8kCanBusService.callcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kmodule_get_reg, new Integer[]{RegIndex.kreg_step_motor_dpos}); + var dval = response.getContentI32(0); + if ( Math.abs(dval - distance) > params.horizontalMotorLostStepThresholdVal ) { + throw new HardwareException(ModuleId.MotorTubeRackMoveModule, Errorcode.kstep_motor_lost_step); + } + + //先通过move_to 指令移动到零点 + //再通过 move_to_zero 进行归零(设置超时时间),超时时间,来源MotorParameterDao + //最后读取 寄存器dval,判断move_to_zero移动了多少距离,如果dval过大,则抛出电机丢步异常。 + //1.记录运行前电机所在位置 + //2.使用move_to_zero移动到零点 + //3.读取电机运行完成后所在的位置 + //4.比较dpos和上面两个位置的差值 相差多少,如果超过2mm,即超过20则认为发生过阻转。 + + } + + + // + // 试管架移动 + // + + /** + * 移动试管架到入口位置 + */ + public void moveTubeRackToEnterPos() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeRackEnterPos}, params.actionOvertime); + } + + /** + * 移动试管架到出口位置 + */ + public void moveTubeRackToExitPos() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeExistJudgmentPos}, params.actionOvertime); + } + + /** + * 移动试管架到试管架扫码位置 + */ + public void moveTubeRackToScanPos() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{params.tubeRackScanCodePos}, params.actionOvertime); + } + + /** + * 移动试管架到试管架扫码并扫码 + */ + public String moveTubeRackToScanPosAndScan() throws HardwareException, InterruptedException { + this.moveTubeRackToScanPos(); + this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_start_scan, new Integer[]{}); + Thread.sleep(500); + var response = this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_read_scaner_result, new Integer[]{}); + this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_stop_scan, new Integer[]{}); + var contentBytes = response.getCmdContent(); + return new String(contentBytes); + } + + // + // 试管移动 + // + + + /** + * 移动试管到扫码位置 + * @param tubeType + * @param tubeIndex + */ + public void moveTubeToScanPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); + var scanPos = params.tubeScanPos + tubeIndex * tubeInfo.tubeSpacing; + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{scanPos}, params.actionOvertime); + } + + /** + * 移动试管到扫码位置,并扫码 + * @param tubeType + * @param tubeIndex + */ + public String moveTubeToScanPosAndScan(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { + this.moveTubeToScanPos(tubeType, tubeIndex); + + this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_start_scan, new Integer[]{}); + Thread.sleep(500); + var response = this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_read_scaner_result, new Integer[]{}); + this.a8kCanBusService.callcmd(ModuleId.TubeRackScannerModule, CmdId.kcode_scaner_stop_scan, new Integer[]{}); + var contentBytes = response.getCmdContent(); + return new String(contentBytes); + } + + /** + * 移动试管到试管高低判断位置 + * @param tubeType + * @param tubeIndex + */ + public void moveTubeToHeighJudgmentPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); + var detectPos = params.tubeHeighJudgmentPos + tubeIndex * tubeInfo.tubeSpacing; + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{detectPos}, params.actionOvertime); + } + + /** + * 移动试管到试管预处理的位置 + * @param tubeType + * @param tubeIndex + */ + public void moveTubeToPreProcessPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); + var pos = params.tubePreProcessPos + tubeIndex * tubeInfo.tubeSpacing; + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{pos}, params.actionOvertime); + } + + // + // 状态检测 + // + + /** + * 移动试管到试管有无判断位置 + * @param tubeType + * @param tubeIndex + */ + public void moveTubeToExistJudgmentPos(String tubeType, Integer tubeIndex) throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + var tubeInfo = this.tubeInfoDao.getTubeInfo(tubeType); + var pos = params.tubeRackExitPos + tubeIndex * tubeInfo.tubeSpacing; + this.a8kCanBusService.callblockcmd(ModuleId.MotorTubeRackMoveModule, CmdId.kstep_motor_easy_move_to, new Integer[]{pos}, params.actionOvertime); + } + + public boolean isTubeRackInEnterPos() throws HardwareException { + var response = this.a8kCanBusService.callcmd(ModuleId.FeederBoard, CmdId.kxymotor_read_inio, new Integer[]{3}); + return response.getContentI32(0) == 1; + } + + public boolean isTubeRackInExitPos() throws HardwareException { + var response = this.a8kCanBusService.callcmd(ModuleId.FeederBoard, CmdId.kxymotor_read_inio, new Integer[]{5}); + return response.getContentI32(0) == 1; + } + + /** + * 获取移动通道的光电状态 + * @param photoelectricIndex 0:里光电,1:外光电 + * @return true, 光电触发 false,光电没有触发 + */ + public boolean getMoveChannelPhotoelectricState(int photoelectricIndex) throws HardwareException { + var index = 0 == photoelectricIndex ? 2 : 1; + var response = this.a8kCanBusService.callcmd(ModuleId.FeederBoard, CmdId.kxymotor_read_inio, new Integer[]{index}); + return response.getContentI32(0) == 1; + } + + // + // 其他辅助组件 + // + + + /** + * 扫描夹紧机构夹紧 + */ + public void scanClampModuleCompress() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeRackTubePushModule, + CmdId.kmini_servo_move_to, + new Integer[]{params.scanCodeClampPos}, + params.actionOvertime + ); + } + + /** + * 扫描夹紧机构复位 + */ + public void scanClampModuleReset() throws HardwareException, InterruptedException { + var params = this.serviceParameterDao.getParameter(); + this.a8kCanBusService.callblockcmd( + ModuleId.ServoTubeRackTubePushModule, + CmdId.kmini_servo_move_to, + new Integer[]{params.scanCodeReleasePos}, + params.actionOvertime + ); + } + + +}