Browse Source

update

tags/v0
zhaohe 1 year ago
parent
commit
dd4f7c5d76
  1. 8
      README.md
  2. 2
      src/main/java/a8k/a8k_can_protocol/A8kEcode.java
  3. 3
      src/main/java/a8k/a8k_can_protocol/RegIndex.java
  4. 7
      src/main/java/a8k/appbean/HardwareException.java
  5. 33
      src/main/java/a8k/base_hardware/A8kCanBusService.java
  6. 15
      src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java
  7. 34
      src/main/java/a8k/service/hardware/HardwareCtrlModule.java
  8. 117
      src/main/java/a8k/service/hardware/MotorTubeRackMoveCtrlService.java
  9. 3
      src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java
  10. 980
      src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java
  11. BIN
      zhaohe_app.db

8
README.md

@ -16,7 +16,13 @@
舵机位置约定:
1.抓手夹紧位置为1800
抓手
1.夹紧位置为0
2.最大张开位置为300
3.垂直位置70
水平位置
初始位置为0
2.水平移动舵机初始化位置为200(处于设备最后端)

2
src/main/java/a8k/a8k_can_protocol/A8kEcode.java

@ -23,6 +23,8 @@ public enum A8kEcode {
ActionOvertime(17, "动作执行超时"),//
CodeException(18, "代码异常"),//
ShakeModGripperZMNotInZeroPos(19, "抓手升降电机没有在零位"),//
MNotInZeroPos(20, "电机没有在零点"),//
TubeXChannelIsNotEmpty(21, "试管架平移通道不为空"),//
//
// FOR HARDWARE

3
src/main/java/a8k/a8k_can_protocol/RegIndex.java

@ -149,7 +149,7 @@ public enum RegIndex {
kreg_mini_servo_limit_velocity(10251), // 限制速度
kreg_mini_servo_limit_torque(10252), // 限制扭矩
kreg_mini_servo_protective_torque(10253), // 保护扭矩
kreg_mini_servo_is_move(10254), // 是否在运动
/***********************************************************************************************************************
* ID_CARD_READER *
***********************************************************************************************************************/
@ -180,5 +180,4 @@ public enum RegIndex {
}
}

7
src/main/java/a8k/appbean/HardwareException.java

@ -29,6 +29,13 @@ public class HardwareException extends Exception {
this.cmdId = cmd;
}
public HardwareException(A8kEcode ecode) {
super(String.format("Error code %s", ecode));
this.errorCode = ecode;
this.moduleId = null;
this.cmdId = null;
}
public MId getModuleId() {
return moduleId;
}

33
src/main/java/a8k/base_hardware/A8kCanBusService.java

@ -203,11 +203,11 @@ public class A8kCanBusService {
}
public void moduleSetReg(MId id, RegIndex regindex, int reg) throws HardwareException {
callcmd(id.toInt(), CmdId.module_set_reg.toInt(), regindex.ordinal(), reg);
callcmd(id.toInt(), CmdId.module_set_reg.toInt(), regindex.index, reg);
}
public int moduleGetReg(MId id, RegIndex regindex) throws HardwareException {
var packet = callcmd(id.toInt(), CmdId.module_get_reg.toInt(), regindex.ordinal());
var packet = callcmd(id.toInt(), CmdId.module_get_reg.toInt(), regindex.index);
return packet.getContentI32(0);
}
@ -318,8 +318,8 @@ public class A8kCanBusService {
callcmd(id.toInt(), CmdId.step_motor_active_cfg.toInt());
}
public Boolean stepMotorReadIoState(MId id) throws HardwareException {
var packet = callcmd(id.toInt(), CmdId.step_motor_read_io_state.toInt());
public Boolean stepMotorReadIoState(MId id, int ioindex) throws HardwareException {
var packet = callcmd(id.toInt(), CmdId.step_motor_read_io_state.toInt(), ioindex);
return packet.getContentI32(0) != 0;
}
@ -373,6 +373,21 @@ public class A8kCanBusService {
callcmd(id.toInt(), CmdId.mini_servo_rotate_with_torque.toInt(), torque);
}
public void miniServoWaitIsNotMove(MId id, int acitionOvertime) throws HardwareException, InterruptedException {
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 new HardwareException(id, A8kEcode.Overtime);
}
Thread.sleep(100);
} while (true);
}
public Boolean getIOState(IOId ioid) throws HardwareException {
if (ioid.mtype == ModuleType.kboard) {
return callcmd(ioid.mid.toInt(), CmdId.extboard_read_inio.toInt(), ioid.ioIndex).getContentI32(0) != 0;
@ -415,6 +430,11 @@ public class A8kCanBusService {
}
public void waitForMods(MId[] mids, Integer acitionOvertime) throws InterruptedException, HardwareException {
for (MId mid : mids) {
waitForMod(mid, acitionOvertime);
}
}
public void waitForMod(MId mid, Integer acitionOvertime) throws InterruptedException, HardwareException {
long startedAt = System.currentTimeMillis();
@ -503,7 +523,7 @@ public class A8kCanBusService {
// 调用sendCmd,
// 如果捕获到超时异常则重发最多重发三次
// 如果是其他异常则直接抛出异常
for (int i = 0; i < 3; i++) {
for (int i = 0; i < 5; i++) {
try {
return this.sendCmd(pack, A8kPacket.CMD_OVERTIME);
} catch (HardwareException e) {
@ -511,8 +531,9 @@ public class A8kCanBusService {
throw e;
}
}
}
return null;
throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime);
}
public void callblockcmd(Integer moduleId, Integer cmdId, Integer[] params, int acitionOvertime) throws HardwareException, InterruptedException {

15
src/main/java/a8k/service/ctrl_service/DeviceInitializationCtrlService.java

@ -8,6 +8,7 @@ import a8k.appbean.ecode.AppRet;
import a8k.base_hardware.A8kCanBusService;
import a8k.service.db.dao.SamplesPreProcessModuleCtrlParamsService;
import a8k.service.hardware.CommonHardwareOpeartion;
import a8k.service.hardware.SamplesPreProcessModuleCtrlService;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -30,7 +31,7 @@ public class DeviceInitializationCtrlService {
CommonHardwareOpeartion commonHardOpera;
@Resource
SamplesPreProcessModuleCtrlParamsService samplesPreProcessModuleCtrlParams;
SamplesPreProcessModuleCtrlService samplesPreProcessModuleCtrlService;
@PostMapping("/api/DeviceInitializationCtrlService/initializeDevice")
@ -116,7 +117,7 @@ public class DeviceInitializationCtrlService {
if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) {
logger.warn("THChInterPPS or THChOuterPPS is trigger");
// throw new HardwareException(MId.A8kIdCardReaderBoard, A8kEcode.PlateStuckDetectorSensorTrigger);
return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger);
return AppRet.fail(A8kEcode.TubeXChannelIsNotEmpty);
}
//板夹仓盖子是否盖上
@ -163,11 +164,13 @@ public class DeviceInitializationCtrlService {
//摇匀模组初始化
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, 1800);
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, 10);
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, actionOvertime);
canBus.miniServoMoveTo(MId.ShakeModGripperSV, 1800);
canBus.miniServoMoveTo(MId.ShakeModGripperSV, 10);
canBus.waitForMod(MId.ShakeModGripperSV, actionOvertime);
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, 200);
canBus.miniServoMoveTo(MId.ShakeModGripperYSV, 10);
canBus.waitForMod(MId.ShakeModGripperYSV, actionOvertime);
canBus.stepMotorEasyMoveToZero(MId.ShakeModClampingM);
@ -177,6 +180,8 @@ public class DeviceInitializationCtrlService {
canBus.stepMotorEasyMoveToZero(MId.ShakeModShakeM);
canBus.waitForMod(MId.ShakeModShakeM, actionOvertime);
canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM,90);
//canBus.miniServoMoveTo(MId.ShakeModTubeScanerRotateSV, 1800);
//板夹仓初始化

34
src/main/java/a8k/service/hardware/HardwareCtrlModule.java

@ -0,0 +1,34 @@
package a8k.service.hardware;
import a8k.appbean.HardwareException;
import a8k.appbean.ecode.AppRet;
public interface HardwareCtrlModule {
/**
* 模块使能
* @param enable 1:使能 0:禁用
* @throws HardwareException 硬件异常
*/
public void modGroupEnable(Boolean enable) throws HardwareException, InterruptedException;
/**
* 模块停止
* @throws HardwareException 硬件异常
*/
public void modGroupStop() throws HardwareException;
/**
* 电机归零
* @throws HardwareException 硬件异常
* @throws InterruptedException 打断异常
*/
public void modGroupMoveToZero() throws HardwareException, InterruptedException;
/**
* 电机快速归零
* @throws HardwareException 硬件异常
* @throws InterruptedException 打断异常
*/
public void modGroupMoveToZeroQuick() throws HardwareException, InterruptedException;
}

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

@ -12,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MotorTubeRackMoveCtrlService {
public class MotorTubeRackMoveCtrlService implements HardwareCtrlModule {
/**
*
* 主要用来控制试管架的平移动作控制
@ -40,45 +40,7 @@ public class MotorTubeRackMoveCtrlService {
private CommonHardwareOpeartion comHardwareOpear;
/*=========================================================================================
* 基础方法
*========================================================================================*/
/**
* 移动试管架到指定位置
* @param pos 指定位置
* @throws HardwareException 硬件异常
* @throws InterruptedException 打断异常
*/
public AppRet<Object> moveTubeRackTo(int pos) throws HardwareException, InterruptedException {
if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM)) {
return AppRet.fail(A8kEcode.ShakeModGripperZMNotInZeroPos);
}
scanClampModRelease();
canBus.stepMotorEasyMoveTo(MId.FeedingModXM, pos);
canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime());
return AppRet.success();
}
/**
* 扫描夹紧机构夹紧
*/
public void scanClampModClamp() throws HardwareException, InterruptedException {
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeClampPos());
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime());
}
/**
* 扫描夹紧机构复位
*/
public void scanClampModRelease() throws HardwareException, InterruptedException {
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos());
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime());
}
/*=========================================================================================
* 公共方法
* Overrid
*========================================================================================*/
/**
@ -86,68 +48,95 @@ public class MotorTubeRackMoveCtrlService {
* @param enable 1:使能 0:禁用
* @throws HardwareException 硬件异常
*/
public AppRet<Object> modGroupEnable(Boolean enable) throws HardwareException {
@Override
public void modGroupEnable(Boolean enable) throws HardwareException {
comHardwareOpear.enableAllMotor(enable);
return AppRet.success();
}
/**
* 模块停止
* @throws HardwareException 硬件异常
*/
@Override
public void modGroupStop() throws HardwareException {
comHardwareOpear.forceStopAllMOtor();
}
public AppRet<Object> modGroupMoveToZero() throws HardwareException, InterruptedException {
if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM)) {
return AppRet.fail(A8kEcode.ShakeModGripperZMNotInZeroPos);
@Override
public void modGroupMoveToZero() throws HardwareException, InterruptedException {
if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) {
throw new HardwareException(A8kEcode.ShakeModGripperZMNotInZeroPos);
}
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos());
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime());
canBus.stepMotorEasyMoveToZero(MId.FeedingModXM);
canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime());
return AppRet.success();
}
@Override
public void modGroupMoveToZeroQuick() throws HardwareException, InterruptedException {
moveTubeRackTo(0);
canBus.stepMotorEasyMoveToZero(MId.FeedingModXM);
canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime());
}
/*=========================================================================================
* 基础方法
*========================================================================================*/
/**
* 电机归零电机运行时归零特点是通过归零判断设备是否丢步
* 移动试管架到指定位置
* @param pos 指定位置
* @throws HardwareException 硬件异常
* @throws InterruptedException 打断异常
*/
public AppRet<Object> modGroupMoveToZeroQuick() throws HardwareException, InterruptedException {
var ret = moveTubeRackTo(0);
if (!ret.isSuccess()) {
return AppRet.fail(ret);
public void moveTubeRackTo(int pos) throws HardwareException, InterruptedException {
if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) {
throw new HardwareException(A8kEcode.ShakeModGripperZMNotInZeroPos);
}
scanClampModRelease();
moveTubeRackTo(0);
canBus.stepMotorEasyMoveToZero(MId.FeedingModXM);
canBus.stepMotorEasyMoveTo(MId.FeedingModXM, pos);
canBus.waitForMod(MId.FeedingModXM, paramDao.getActionOvertime());
}
return AppRet.success();
/**
* 扫描夹紧机构夹紧
*/
public void scanClampModClamp() throws HardwareException, InterruptedException {
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeClampPos());
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime());
}
/**
* 扫描夹紧机构复位
*/
public void scanClampModRelease() throws HardwareException, InterruptedException {
canBus.miniServoMoveTo(MId.ShakeModTubeScanerClampingSV, paramDao.getScanCodeReleasePos());
canBus.waitForMod(MId.ShakeModTubeScanerClampingSV, paramDao.getActionOvertime());
}
/**
* 移动试管架到入口位置
*/
public AppRet<Object> tubeRackMoveToEnterPos() throws HardwareException, InterruptedException {
return moveTubeRackTo(paramDao.getTubeRackEnterPos());
public void tubeRackMoveToEnterPos() throws HardwareException, InterruptedException {
moveTubeRackTo(paramDao.getTubeRackEnterPos());
}
/**
* 移动试管架到出口位置
*/
public AppRet<Object> moveTubeRackToExitPos() throws HardwareException, InterruptedException {
return moveTubeRackTo(paramDao.getTubeRackExitPos());
public void moveTubeRackToExitPos() throws HardwareException, InterruptedException {
moveTubeRackTo(paramDao.getTubeRackExitPos());
}
/**
* 移动试管架到试管架扫码位置
*/
public AppRet<Object> moveTubeRackToScanPos() throws HardwareException, InterruptedException {
return moveTubeRackTo(paramDao.getTubeRackScanCodePos());
public void moveTubeRackToScanPos() throws HardwareException, InterruptedException {
moveTubeRackTo(paramDao.getTubeRackScanCodePos());
}
/**
@ -155,10 +144,8 @@ public class MotorTubeRackMoveCtrlService {
*/
public AppRet<String> moveTubeRackToScanPosAndScan() throws HardwareException, InterruptedException {
String result;
var ret = moveTubeRackToScanPos();
if (!ret.isSuccess()) {
return AppRet.fail(ret);
}
moveTubeRackToScanPos();
scanClampModClamp();
canBus.codeScanerStartScan(MId.FeedingModScannerMod);
result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000);

3
src/main/java/a8k/service/hardware/ReactionPlatesTransmitCtrlService.java

@ -40,8 +40,7 @@ public class ReactionPlatesTransmitCtrlService {
//试管平移通道是否有障碍
if (canBus.getIOState(IOId.THChInterPPS) || canBus.getIOState(IOId.THChOuterPPS)) {
logger.warn("THChInterPPS or THChOuterPPS is trigger");
// throw new HardwareException(MId.A8kIdCardReaderBoard, A8kEcode.PlateStuckDetectorSensorTrigger);
return AppRet.fail(A8kEcode.PlateStuckDetectorSensorTrigger);
return AppRet.fail(A8kEcode.TubeXChannelIsNotEmpty);
}
//板夹仓卡板检测
if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) {

980
src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java
File diff suppressed because it is too large
View File

BIN
zhaohe_app.db

Loading…
Cancel
Save