3 changed files with 3 additions and 276 deletions
-
17src/main/java/a8k/service/db/dao/MotorParameterDao.java
-
6src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java
-
256src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java
@ -1,17 +0,0 @@ |
|||||
package a8k.service.db.dao; |
|
||||
|
|
||||
import a8k.service.db.entity.ModuleParameter; |
|
||||
|
|
||||
import com.iflytop.uf.UfActiveRecord; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
import java.util.Map; |
|
||||
|
|
||||
@Component |
|
||||
public class MotorParameterDao { |
|
||||
public ModuleParameter getMotorParameter(int mid) { |
|
||||
var param = UfActiveRecord.findOne(ModuleParameter.class, Map.of("mid", mid)); |
|
||||
assert param != null; |
|
||||
return param; |
|
||||
} |
|
||||
} |
|
@ -1,256 +0,0 @@ |
|||||
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.A8kDirectCtrlPosDao; |
|
||||
import a8k.service.db.dao.A8kTubeInfoDao; |
|
||||
import a8k.service.db.dao.MotorTubeRackMoveCtrlServiceParameterDao; |
|
||||
import a8k.service.db.dao.MotorParameterDao; |
|
||||
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; |
|
||||
|
|
||||
@Autowired |
|
||||
MotorParameterDao motorParameterDao; |
|
||||
@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 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[]{}, motorParams.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) > motorParams.loseStepWarningJudgeDistance ) { |
|
||||
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[]{0}, |
|
||||
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[]{0}, |
|
||||
params.actionOvertime |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue