sige 1 year ago
parent
commit
9031fef9f2
  1. 17
      src/main/java/a8k/service/db/dao/MotorParameterDao.java
  2. 6
      src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java
  3. 256
      src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java

17
src/main/java/a8k/service/db/dao/MotorParameterDao.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;
}
}

6
src/main/java/a8k/service/db/entity/MotorTubeRackMoveCtrlServiceParameter.java

@ -35,13 +35,13 @@ public class MotorTubeRackMoveCtrlServiceParameter {
Integer horizontalMotorOffset; //水平移动电机位置偏移 Integer horizontalMotorOffset; //水平移动电机位置偏移
@UfActiveRecordField @UfActiveRecordField
Integer horizontalMotorLostStepThresholdVal; //水平电机丢步判断
public Integer horizontalMotorLostStepThresholdVal; //水平电机丢步判断
@UfActiveRecordField @UfActiveRecordField
Integer scanCodeClampPos; //试管扫码夹紧位置
public Integer scanCodeClampPos; //试管扫码夹紧位置
@UfActiveRecordField @UfActiveRecordField
Integer scanCodeReleasePos;//试管扫码释放位置
public Integer scanCodeReleasePos;//试管扫码释放位置
public static String getTableName() { public static String getTableName() {

256
src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java

@ -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
);
}
}
Loading…
Cancel
Save