Browse Source

update

tags/v0
zhaohe 4 months ago
parent
commit
9b2369c957
  1. 3
      src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java
  2. 5
      src/main/java/a8k/app/constant/GearBacklashConstant.java
  3. 29
      src/main/java/a8k/app/hardware/type/PipetteRegIndex.java
  4. 4
      src/main/java/a8k/app/hardware/type/RegIndex.java
  5. 4
      src/main/java/a8k/app/service/lowerctrl/HbotMoveCtrlService.java
  6. 17
      src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java
  7. 6
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  8. 41
      src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java
  9. 7
      src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java
  10. 188
      src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java
  11. 9
      src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java

3
src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java

@ -150,6 +150,9 @@ public class A8kSubModuleInitRegConfig {
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_enc_resolution);
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_enable_enc);
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_dzero);
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_pos_devi_tolerance);
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_io_trigger_append_distance);
addRegMarker(ModuleType.PipetteGunCtrl, RegIndex.kreg_pipette_zm_mres);
addRegMarker(ModuleType.A8kOptical, RegIndex.kreg_a8k_opt_t_pos_offset);
addRegMarker(ModuleType.A8kOptical, RegIndex.kreg_a8k_opt_f_pos_offset);

5
src/main/java/a8k/app/constant/GearBacklashConstant.java

@ -0,0 +1,5 @@
package a8k.app.constant;
public class GearBacklashConstant {
public static Integer HBOT_GEAR_BACKLASH = 100;//1mm
}

29
src/main/java/a8k/app/hardware/type/PipetteRegIndex.java

@ -12,18 +12,18 @@ public enum PipetteRegIndex {
kreg_pipette_capactitance_val(RegIndex.kreg_pipette_capactitance_val), // 移液枪电容值
kreg_pipette_tip_state(RegIndex.kreg_pipette_tip_state), // 移动液枪tip状态
// kreg_pipette_limit_ul(RegIndex.kreg_pipette_limit_ul), //
// kreg_pipette_pump_acc(RegIndex.kreg_pipette_pump_acc), //
// kreg_pipette_pump_dec(RegIndex.kreg_pipette_pump_dec), //
// kreg_pipette_pump_vstart(RegIndex.kreg_pipette_pump_vstart), //
// kreg_pipette_pump_vstop(RegIndex.kreg_pipette_pump_vstop), //
// kreg_pipette_pump_vmax(RegIndex.kreg_pipette_pump_vmax), //
// kreg_pipette_aspirate_distribut_pump_vel(RegIndex.kreg_pipette_aspirate_distribut_pump_vel), //
// kreg_pipette_lld_pump_vel(RegIndex.kreg_pipette_lld_pump_vel), //
// kreg_pipette_lld_motor_vel_rpm(RegIndex.kreg_pipette_lld_motor_vel_rpm), //
// kreg_pipette_lld_detect_period_ms(RegIndex.kreg_pipette_lld_detect_period_ms), //
// kreg_pipette_lld_prepare_pos(RegIndex.kreg_pipette_lld_prepare_pos), //
// kreg_pipette_lld_prepare_distribut_pos(RegIndex.kreg_pipette_lld_prepare_distribut_pos), //
// kreg_pipette_limit_ul(RegIndex.kreg_pipette_limit_ul), //
// kreg_pipette_pump_acc(RegIndex.kreg_pipette_pump_acc), //
// kreg_pipette_pump_dec(RegIndex.kreg_pipette_pump_dec), //
// kreg_pipette_pump_vstart(RegIndex.kreg_pipette_pump_vstart), //
// kreg_pipette_pump_vstop(RegIndex.kreg_pipette_pump_vstop), //
// kreg_pipette_pump_vmax(RegIndex.kreg_pipette_pump_vmax), //
// kreg_pipette_aspirate_distribut_pump_vel(RegIndex.kreg_pipette_aspirate_distribut_pump_vel), //
// kreg_pipette_lld_pump_vel(RegIndex.kreg_pipette_lld_pump_vel), //
// kreg_pipette_lld_motor_vel_rpm(RegIndex.kreg_pipette_lld_motor_vel_rpm), //
// kreg_pipette_lld_detect_period_ms(RegIndex.kreg_pipette_lld_detect_period_ms), //
// kreg_pipette_lld_prepare_pos(RegIndex.kreg_pipette_lld_prepare_pos), //
// kreg_pipette_lld_prepare_distribut_pos(RegIndex.kreg_pipette_lld_prepare_distribut_pos), //
kreg_pipette_zm_pos(RegIndex.kreg_pipette_zm_pos),
kreg_pipette_zm_is_enable(RegIndex.kreg_pipette_zm_is_enable),
@ -54,7 +54,10 @@ public enum PipetteRegIndex {
kreg_pipette_zm_enable_enc(RegIndex.kreg_pipette_zm_enable_enc),
kreg_pipette_zm_dzero(RegIndex.kreg_pipette_zm_dzero),
kreg_pipette_zm_pos_devi_tolerance(RegIndex.kreg_pipette_zm_pos_devi_tolerance),
kreg_pipette_zm_io_trigger_append_distance(RegIndex.kreg_pipette_zm_io_trigger_append_distance);
kreg_pipette_zm_io_trigger_append_distance(RegIndex.kreg_pipette_zm_io_trigger_append_distance),
kreg_pipette_zm_mres(RegIndex.kreg_pipette_zm_mres),
kreg_pipette_zm_encpos(RegIndex.kreg_pipette_zm_encpos),
;
public final RegIndex regIndex;

4
src/main/java/a8k/app/hardware/type/RegIndex.java

@ -71,7 +71,9 @@ public enum RegIndex {
kreg_pipette_zm_dzero(4129),
kreg_pipette_zm_pos_devi_tolerance(4130),
kreg_pipette_zm_io_trigger_append_distance(4131),
kreg_pipette_zm_has_move_zero(4132), // 是否回零
kreg_pipette_zm_mres(4133), // 电机细分
kreg_pipette_zm_encpos(4134), // 编码器位置,readonly
/**
* 光学模组
*

4
src/main/java/a8k/app/service/lowerctrl/HbotMoveCtrlService.java

@ -1,5 +1,6 @@
package a8k.app.service.lowerctrl;
import a8k.app.constant.GearBacklashConstant;
import a8k.app.type.a8k.Pos2d;
import a8k.app.type.a8k.Pos3d;
import a8k.app.hardware.driver.InputDetectDriver;
@ -73,8 +74,7 @@ public class HbotMoveCtrlService {
// HBot移动
hbotDriver.enable(1);
// hbotDrive
// r.moveToBlock(targetPos.x - 20, targetPos.y - 20);
hbotDriver.moveToBlock(targetPos.x - GearBacklashConstant.HBOT_GEAR_BACKLASH, targetPos.y);
hbotDriver.moveToBlock(targetPos.x, targetPos.y);
// hbotDriver.moveToBlock(targetPos.x, targetPos.y);

17
src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java

@ -61,6 +61,23 @@ public class HbotMoveExCtrlService {
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
}
public void zAxisMoveToBlock(Integer z) throws AppException {
pipetteCtrlDriver.zMotorMoveToBlock(z);
}
public void zAxisMotorMoveToZeroPointQuickBlock() throws AppException {
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
}
public void zAxisMoveToZeroPointBlock() throws AppException {
pipetteCtrlDriver.zMotorMoveZeroBlock();
}
public void initializePipette() throws AppException {
log.info("initializePipette");
pipetteCtrlDriver.pipetteInitDeviceBlock();
}
//检查当前位置TIP是否存在
// 通过取tip然后再原地放回来来判断

6
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -92,7 +92,7 @@ public class ExtApiPageGroupCfgMgr {
new Menu(ProjInfoMgrPage.class, "项目信息管理"),
new Menu(ReactionRecordMgrDebugPage.class, "反应记录")
)),
new Menu(A8kSubModuleParameterInitDebugPage.class,"子模块初始化参数"),
new Menu(A8kSubModuleParameterInitDebugPage.class, "子模块初始化参数"),
new Menu("坐标设置", ZList.of(
new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"),
new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"),
@ -120,11 +120,13 @@ public class ExtApiPageGroupCfgMgr {
pushMenu(new Menu("子模块管理", ZList.of(
new Menu(LowLevelBoardVersionPreviewPage.class, "子模块版本查看"),
new Menu(PipetteCtrlDriverPage.getPageClass(), "移液抢驱动"),
new Menu(PipetteMotorCtrlPage.class, "移液抢电机驱动控制"),
new Menu(MotorCtrlPage.class, "电机驱动"),
new Menu(MiniServoCtrlPage.class, "伺服电机驱动"),
new Menu(InputIOStateScannerPage.class, "输入IO状态查看"),
new Menu(CodeScanerDriverCtrlPage.class, "条码扫描仪")
)));
)));
pushMenu(new Menu("高级应用", ZList.of(

41
src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java

@ -1,5 +1,6 @@
package a8k.extui.page.measurement;
import a8k.app.constant.GearBacklashConstant;
import a8k.app.type.a8k.Pos2d;
import a8k.app.type.a8k.Pos3d;
import a8k.app.type.exception.AppException;
@ -11,21 +12,19 @@ import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class HbotPosMeasurePage {
@Resource
ExtApiPageMgr extApiPageMgr;
@Resource
HbotDriver hbotDriver;
@Resource
HbotMoveCtrlService hbotMoveCtrlService;
@Resource
PipetteCtrlDriver pipetteCtrlDriver;
private final ExtApiPageMgr extApiPageMgr;
private final HbotDriver hbotDriver;
private final PipetteCtrlDriver pipetteCtrlDriver;
@ExtApiStatu(group = "Hbot当前坐标")
public Pos3d readPos() throws AppException {
@ -55,12 +54,14 @@ public class HbotPosMeasurePage {
Pos2d pos = hbotDriver.readPos();
pos.x += dx;
pos.y += dy;
hbotDriver.moveToBlock(pos.x - GearBacklashConstant.HBOT_GEAR_BACKLASH, pos.y);
hbotDriver.moveToBlock(pos.x, pos.y);
}
public void moveTo(Integer x, Integer y) throws AppException {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y);
hbotDriver.moveToBlock(x, y);
}
@ -114,8 +115,6 @@ public class HbotPosMeasurePage {
}
public Pos3d measurementCurrentPos() throws AppException {
pipetteCtrlDriver.zMotorMeasureDistance();
Pos3d pos = new Pos3d();
@ -129,22 +128,11 @@ public class HbotPosMeasurePage {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
pipetteCtrlDriver.zMotorMoveToBlock(0);
hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y);
hbotDriver.moveToBlock(x, y);
pipetteCtrlDriver.zMotorMoveToBlock(z);
}
public void measurementMoveTo0(Integer x, Integer y, Integer z) throws AppException {
measurementMoveTo(x, y, z);
}
public void measurementMoveTo1(Integer x, Integer y, Integer z) throws AppException {
measurementMoveTo(x, y, z);
}
public void measurementMoveTo2(Integer x, Integer y, Integer z) throws AppException {
measurementMoveTo(x, y, z);
}
@PostConstruct
public void init() {
@ -168,10 +156,9 @@ public class HbotPosMeasurePage {
page.addFunction("移动到", this::zMotorMoveTo).setParamVal("z", 0);
page.newGroup("移动到");
page.addFunction("移动到", this::measurementMoveTo0);
page.addFunction("移动到", this::measurementMoveTo1);
page.addFunction("移动到", this::measurementMoveTo2);
page.addFunction("移动到", this::measurementMoveTo);
page.addFunction("移动到", this::measurementMoveTo);
page.addFunction("移动到", this::measurementMoveTo);
extApiPageMgr.addPage(page);
}

7
src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java

@ -23,14 +23,7 @@ public class PipetteCtrlDriverPage {
@PostConstruct
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(pipetteCtrlDriver);
page.addFunction("z轴电机使能", pipetteCtrlDriver::zMotorEnable);
page.addFunction("模块停止", pipetteCtrlDriver::moduleStop);
page.addFunction("z轴电机归零", pipetteCtrlDriver::zMotorMoveZeroBlock);
page.addFunction("z轴电机快速归零", pipetteCtrlDriver::zMotorMoveToZeroPointQuickBlock);
page.addFunction("z轴电机相对移动", pipetteCtrlDriver::zMotorMoveByBlock);
page.addFunction("z轴电机绝对移动", pipetteCtrlDriver::zMotorMoveToBlock);
page.addFunction("z轴电机测量距离", pipetteCtrlDriver::zMotorMeasureDistance);
page.addFunction("z轴电机读取测量距离结果", pipetteCtrlDriver::zMotorReadMeasureDistanceResult);
page.addFunction("移动液枪初始化设备", pipetteCtrlDriver::pipetteInitDeviceBlock);
page.addFunction("放置吸头", pipetteCtrlDriver::putTipBlock);
page.addFunction("LLD.获取传感器采样数据", pipetteCtrlDriver::getSensorSampleData);

188
src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java

@ -0,0 +1,188 @@
package a8k.extui.page.test.driver;
import a8k.app.hardware.driver.PipetteCtrlDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.PipetteRegIndex;
import a8k.app.hardware.type.StepMotorMId;
import a8k.app.hardware.type.PipetteRegIndex;
import a8k.app.type.exception.AppException;
import a8k.app.utils.ZJsonNode;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
@Slf4j
public class PipetteMotorCtrlPage {
private final PipetteCtrlDriver pipetteCtrlDriver;
private final ExtApiPageMgr extApiPageMgr;
Integer dpos = 10;
public void setStepMotorDpos(Integer dpos) {
this.dpos = dpos;
}
//
public void enableMotor() throws AppException {
pipetteCtrlDriver.zMotorEnable(1);
}
public void disableMotor() throws AppException {
pipetteCtrlDriver.zMotorEnable(0);
}
public void stepMotorEasyMoveToZero() throws AppException {
pipetteCtrlDriver.zMotorMoveZeroBlock();
}
public void stepMotorStop() throws AppException {
pipetteCtrlDriver.moduleStop();
}
public void stepMotorEasyMoveForward() throws AppException {
pipetteCtrlDriver.zMotorMoveByBlock(dpos);
}
public void stepMotorEasyMoveBackward() throws AppException {
pipetteCtrlDriver.zMotorMoveByBlock(-dpos);
}
public void stepMotorEasyMoveTo(Integer pos) throws AppException {
log.info("stepMotorEasyMoveTo: {}", pos);
pipetteCtrlDriver.zMotorMoveToBlock(pos);
}
public Integer readPos() throws AppException {
return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos);
}
public Integer readEncPos() throws AppException {
return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_encpos);
}
public Object readAllRegs() throws AppException {
ZJsonNode node = new ZJsonNode();
for (PipetteRegIndex reg : PipetteRegIndex.values()) {
try {
Integer val = pipetteCtrlDriver.getReg(reg);
node.get(reg.name()).set(val);
} catch (AppException e) {
node.get(reg.name()).set(e.getError().code);
}
}
return node.get();
}
public void setReg(PipetteRegIndex reg, Integer val) throws AppException {
pipetteCtrlDriver.setReg(reg, val);
}
public void setMres(Integer mres) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_mres, mres);
}
public void setStartAndStopVel(Integer v) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstart, v);
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstop, v);
}
public void setV1(Integer v) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_v1, v);
}
public void setA1AndD1(Integer acc) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_a1, acc);
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_d1, acc);
}
public void setAmaxAndDmax(Integer acc) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_amax, acc);
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_dmax, acc);
}
public void setDefaultVel(Integer v) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_default_velocity, v);
}
public void setIRUN(Integer irun) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_irun, irun);
}
public void setIHOLD(Integer ihold) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_ihold, ihold);
}
public void setOneCirclePulse(Integer pulse, Integer denominator) throws AppException {
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse, pulse);
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator, denominator);
}
public Integer readReg(PipetteRegIndex reg) {
try {
return pipetteCtrlDriver.getReg(reg);
} catch (AppException e) {
return 0;
}
}
@PostConstruct
void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础操作");
page.addFunction("使能电机", this::enableMotor);
page.addFunction("失能电机", this::disableMotor);
page.addFunction("归零", this::stepMotorEasyMoveToZero);
page.addFunction("停止", this::stepMotorStop);
page.newGroup("相对移动");
page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos);
page.addFunction("正向移动", this::stepMotorEasyMoveForward);
page.addFunction("反向移动", this::stepMotorEasyMoveBackward);
page.newGroup("绝对移动");
page.addFunction("绝对移动", this::stepMotorEasyMoveTo);
page.newGroup("寄存器配置");
page.addFunction("设备MRES", this::setMres).setParamVal("mres", () -> readReg(PipetteRegIndex.kreg_pipette_zm_mres));
page.addFunction("设置IRUN", this::setIRUN).setParamVal("irun", () -> readReg(PipetteRegIndex.kreg_pipette_zm_irun));
page.addFunction("设置IHOLD", this::setIHOLD).setParamVal("ihold", () -> readReg(PipetteRegIndex.kreg_pipette_zm_ihold));
page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_vstart));
page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_v1));
page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_a1));
page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_amax));
page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_default_velocity));
page.addFunction("设置一圈脉冲数", this::setOneCirclePulse)
.setParamVal("pulse", () -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse)).setParamVal("denominator",
() -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator));
page.addFunction("设置寄存器", this::setReg);
page.addFunction("读取所有寄存器", this::readAllRegs);
page.newGroup("状态");
page.addFunction("读取位置", this::readPos);
page.addFunction("读取编码器位置", this::readEncPos);
extApiPageMgr.addPage(page);
}
}

9
src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java

@ -20,9 +20,16 @@ public class P32HbotPosVerificationPage {
}
public void takeAndDropTip(TipGroupPos tipGroupPos, Integer index) throws AppException {
hbotMoveExCtrlService.testTakeTip(tipGroupPos, index);
try {
hbotMoveExCtrlService.testTakeTip(tipGroupPos, index);
} catch (AppException e) {
hbotMoveExCtrlService.initializePipette();
hbotMoveExCtrlService.zAxisMoveToZeroPointBlock();
throw e;
}
}
public void dropTip() throws AppException {
hbotMoveExCtrlService.dropTip();
}

Loading…
Cancel
Save