Browse Source

update

master
zhaohe 4 months ago
parent
commit
0aa9b46857
  1. 24
      src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java
  2. 24
      src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java
  3. 7
      src/main/java/a8k/app/hardware/channel/A8kCanBusService.java
  4. 1
      src/main/java/a8k/app/hardware/driver/MiniServoDriver.java
  5. 1
      src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java
  6. 32
      src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java
  7. 2
      src/main/java/a8k/app/hardware/type/A8kEcode.java
  8. 5
      src/main/java/a8k/app/hardware/type/CmdId.java
  9. 49
      src/main/java/a8k/app/hardware/type/MiniServoRegIndex.java
  10. 3
      src/main/java/a8k/app/hardware/type/ModuleStatus.java
  11. 55
      src/main/java/a8k/app/hardware/type/RegIndex.java
  12. 15
      src/main/java/a8k/app/hardware/type/StepMotorRegIndex.java
  13. 9
      src/main/java/a8k/app/hardware/type/StepMotorSpeedLevel.java
  14. 1
      src/main/java/a8k/app/i18n/Internationalization.java
  15. 16
      src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java
  16. 10
      src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java
  17. 12
      src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java
  18. 2
      src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleCtrlService.java
  19. 6
      src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleExCtrlService.java
  20. 32
      src/main/java/a8k/app/service/param/hbotpos/HbotSamplePosParamMgr.java
  21. 2
      src/main/java/a8k/app/service/param/pipetteparam/PipetteGunLLFParamMgr.java
  22. 2
      src/main/java/a8k/app/type/a8k/A8kTubeHolderType.java
  23. 8
      src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java
  24. 18
      src/main/java/a8k/app/type/param/hbotpos/HbotSamplePos.java
  25. 2
      src/main/java/a8k/app/type/param/type/A8kSamplePos.java
  26. 32
      src/main/java/a8k/extui/page/driver/MotorCtrlPage.java
  27. 1
      src/main/java/a8k/extui/page/extapp/P01PipetteGunVerification.java
  28. 83
      src/main/java/a8k/extui/page/extsetting/pos_calibration/P25HbotSamplePosCalibrationPage.java
  29. 10
      src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java
  30. 8
      src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java
  31. 122
      src/main/resources/db/zapp_sub_module_reg_initial_value.csv

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

@ -79,6 +79,9 @@ public class A8kSubModuleInitRegConfig {
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_one_circle_pulse);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_one_circle_pulse_denominator);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_default_velocity);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_low_velocity);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_mid_velocity);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_high_velocity);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_ihold);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_irun);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_iholddelay);
@ -105,9 +108,9 @@ public class A8kSubModuleInitRegConfig {
//WaterCoolingTemperatureCtrl
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_target);
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput);
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval);
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_target);
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput);
// addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval);
addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_kp);
addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_ki);
addRegMarker(ModuleType.WaterCoolingTempCtrl, RegIndex.kreg_water_cooling_tmp_controler_pid_kd);
@ -174,6 +177,21 @@ public class A8kSubModuleInitRegConfig {
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_limit_torque);
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_protective_torque);
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_target_pos_tolerance);
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_min_angle); // 最小角度限制
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_max_angle); // 最大角度限制
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_max_temp); // 最高温度上限
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_max_voltage); // 最高输入电压
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_min_voltage); // 最低输入电压
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_max_torque); // 最大扭矩
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_unload_condition); // 卸载条件
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_protect_current); // 保护电流
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_protect_torque); // 保护扭矩 0->100 ,触发后需要写入与组转方向相反的位置指令进行解除
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_protect_time); // 保护时间
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_overload_torque); // 过载扭矩
addRegMarker(ModuleType.MiniServo, RegIndex.kreg_mini_servo_servo_acc); // 加速度
}
private void addRegMarker(ModuleType moduleTYpe, RegIndex regIndex) {

24
src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java

@ -1,10 +1,7 @@
package a8k.app.hardware.channel;
import a8k.OS;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.hardware.type.A8kPacket;
import a8k.app.hardware.type.CmdId;
import a8k.app.hardware.type.MId;
import a8k.app.hardware.type.*;
import a8k.app.type.appevent.A8kCanBusOnConnectEvent;
import a8k.app.type.appevent.A8kHardwareReport;
import a8k.app.type.error.AEHardwareError;
@ -126,7 +123,6 @@ public class A8kCanBusConnection extends WebSocketClient {
synchronized public A8kPacket callcmd(MId moduleId, CmdId cmdId, Integer... param) throws AppException {
var packet = packParamsToPacket(moduleId.toInt(), cmdId.toInt(), ZList.of(param));
return autoReSend(packet, A8kPacket.CMD_OVERTIME);
}
synchronized public A8kPacket callcmd2(MId moduleId, CmdId cmdId, Integer overtime, Integer... params) throws AppException {
@ -138,7 +134,20 @@ public class A8kCanBusConnection extends WebSocketClient {
return priSend(pack, overtime);
}
synchronized public ModuleStatus moduleGetStatus(MId id) throws AppException {
var getStatusPacket = packParamsToPacket(id.toInt(), CmdId.module_get_status.toInt(), ZList.of());
for (int i = 0; i < 10; i++) {
try {
return ModuleStatus.valueOf(priSend(getStatusPacket, 30).getContentI32(0));
} catch (AppException ignored) {
}
restartCanif();
OS.hsleep(10);
}
throw AppException.of(new AEHardwareError(A8kEcode.LOW_ERROR_OVERTIME,
MId.valueOf(getStatusPacket.getModuleId()), CmdId.valueOf(getStatusPacket.getCmdId())));
}
//
// PRIVATE
//
@ -164,13 +173,13 @@ public class A8kCanBusConnection extends WebSocketClient {
}
private A8kPacket autoReSend(A8kPacket pack, int overtime) throws AppException {
if (firstCall) {
firstCall = false;
restartCanif();
}
for (int i = 0; i < 5; i++) {
try {
return this.priSend(pack, overtime);
@ -180,12 +189,13 @@ public class A8kCanBusConnection extends WebSocketClient {
}
}
restartCanif();
OS.hsleep(100);
OS.hsleep(50);
log.error("send cmd {} {} fail, retry {}", pack, pack.toByteString(), i);
}
throw AppException.of(new AEHardwareError(A8kEcode.LOW_ERROR_OVERTIME, MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())));
}
private A8kPacket priSend(A8kPacket pack, int overtime) throws AppException {
try {
return _priSend(pack, overtime);

7
src/main/java/a8k/app/hardware/channel/A8kCanBusService.java

@ -62,8 +62,7 @@ public class A8kCanBusService {
}
public ModuleStatus moduleGetStatus(MId id) throws AppException {
var packet = connection.callcmd(id, CmdId.module_get_status);
return ModuleStatus.valueOf(packet.getContentI32(0));
return connection.moduleGetStatus(id);
}
public void moduleSetReg(MId id, RegIndex regindex, Integer reg) throws AppException {
@ -81,7 +80,7 @@ public class A8kCanBusService {
}
public Integer moduleGetDetailError(MId id) throws AppException {
return connection.callcmd(id, CmdId.module_get_detail_error).getContentI32(0) ;
return connection.callcmd(id, CmdId.module_get_detail_error).getContentI32(0);
}
public Integer moduleReadVersion(MId id) throws AppException {
@ -106,7 +105,7 @@ public class A8kCanBusService {
return result;
}
public void waitForMod(MId mid, Integer acitionOvertime) throws AppException {
public void waitForMod(MId mid, Integer acitionOvertime) throws AppException {
long startedAt = System.currentTimeMillis();
CmdId action = connection.getLastTxCmd(mid);
do {

1
src/main/java/a8k/app/hardware/driver/MiniServoDriver.java

@ -1,5 +1,6 @@
package a8k.app.hardware.driver;
import a8k.OS;
import a8k.app.constant.MiniServoConstant;
import a8k.app.hardware.channel.A8kCanBusService;
import a8k.app.hardware.type.MiniServoRegIndex;

1
src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java

@ -130,6 +130,7 @@ public class PipetteCtrlDriver {
}
public void liquidOperationSetZMotorRunParams(Integer posmin, Integer posmax, Integer vmax) throws AppException {
vmax = vmax * 2;
canBusService.callcmd(MId.PipetteMod, CmdId.liquid_operation_set_zmotor_runparams, posmin,
posmax, vmax);
}

32
src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java

@ -2,11 +2,7 @@ package a8k.app.hardware.driver;
import a8k.app.constant.ActionOvertimeConstant;
import a8k.app.hardware.channel.A8kCanBusService;
import a8k.app.hardware.type.A8kPacket;
import a8k.app.hardware.type.CmdId;
import a8k.app.hardware.type.RegIndex;
import a8k.app.hardware.type.StepMotorMId;
import a8k.app.hardware.type.StepMotorRegIndex;
import a8k.app.hardware.type.*;
import a8k.app.type.exception.AppException;
import a8k.app.utils.ZJsonHelper;
import com.fasterxml.jackson.databind.node.ObjectNode;
@ -105,8 +101,30 @@ public class StepMotorCtrlDriver {
canBus.callcmd(id.mid, CmdId.step_motor_stop, 0);
}
public void stepMotorActiveCfg(StepMotorMId id) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_active_cfg);
// step_motor_move_by(0x021d, "STEP_MOTOR_MOVE_BY"), // (dpos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
// step_motor_move_to(0x021e, "STEP_MOTOR_MOVE_TO"), // (pos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
// step_motor_move_to_zero_point_quick(0x021f, "STEP_MOTOR_MOVE_TO_ZERO_POINT_QUICK"), // (speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
// step_motor_rotate(0x0220, "STEP_MOTOR_ROTATE"), //
public void moveByBlock(StepMotorMId id, Integer dpos, StepMotorSpeedLevel speedLevel) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_move_by, dpos, speedLevel.ordinal());
waitForMod(id, actionOvertimeConstant.get(id, CmdId.step_motor_move_by));
}
public void moveToBlock(StepMotorMId id, Integer pos, StepMotorSpeedLevel speedLevel) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_move_to, pos, speedLevel.ordinal());
waitForMod(id, actionOvertimeConstant.get(id, CmdId.step_motor_move_to));
}
public void moveToZeroQuickBlock(StepMotorMId id, StepMotorSpeedLevel speedLevel) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_move_to_zero_point_quick, speedLevel.ordinal());
waitForMod(id, actionOvertimeConstant.get(id, CmdId.step_motor_move_to_zero_point_quick));
}
public void rotate(StepMotorMId id, Integer direction, StepMotorSpeedLevel speedLevel) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_rotate, direction, speedLevel.ordinal());
}
public Boolean stepMotorReadIoState(StepMotorMId id, Integer ioindex) throws AppException {

2
src/main/java/a8k/app/hardware/type/A8kEcode.java

@ -107,6 +107,8 @@ public enum A8kEcode {
APPE_TUBE_X_CHANNEL_IS_NOT_EMPTY(308), //试管架通道有异物
APPE_PLATE_BOX_NOT_COVER(309), //板夹仓未盖
APPE_DEVICE_NOT_INITED(310), //设备未初始化
APPE_SHAKE_MODULE_CLAMPM_NOT_IN_ZERO_POS(311), //摇匀模组夹紧模块没有在零点位置
//
// ID卡检验错误

5
src/main/java/a8k/app/hardware/type/CmdId.java

@ -57,6 +57,11 @@ public enum CmdId {
step_motor_easy_set_current_pos(0x0215, "STEP_MOTOR_EASY_SET_CURRENT_POS"),//
step_motor_easy_move_to_io(0x0216, "STEP_MOTOR_EASY_MOVE_TO_IO"),//
step_motor_stop(0x0228, "STEP_MOTOR_STOP"),//
step_motor_move_by(0x021d, "STEP_MOTOR_MOVE_BY"), // (dpos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
step_motor_move_to(0x021e, "STEP_MOTOR_MOVE_TO"), // (pos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
step_motor_move_to_zero_point_quick(0x021f, "STEP_MOTOR_MOVE_TO_ZERO_POINT_QUICK"), // (speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high)
step_motor_rotate(0x0220, "STEP_MOTOR_ROTATE"), //
step_motor_active_cfg(0x0229, "STEP_MOTOR_ACTIVE_CFG"),//
step_motor_read_io_state(0x022a, "STEP_MOTOR_READ_IO_STATE"),//
step_motor_easy_move_to_end_point(0x022c, "STEP_MOTOR_EASY_MOVE_TO_END_POINT"),//

49
src/main/java/a8k/app/hardware/type/MiniServoRegIndex.java

@ -1,10 +1,10 @@
package a8k.app.hardware.type;
public enum MiniServoRegIndex {
// kreg_module_version(RegIndex.kreg_module_version), // 模块版本
// kreg_module_type(RegIndex.kreg_module_type), // 模块类型
// kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error
// kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag
// kreg_module_version(RegIndex.kreg_module_version), // 模块版本
// kreg_module_type(RegIndex.kreg_module_type), // 模块类型
// kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error
// kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag
kreg_mini_servo_pos(RegIndex.kreg_mini_servo_pos), // 位置
kreg_mini_servo_limit_velocity(RegIndex.kreg_mini_servo_limit_velocity), // 限制速度
@ -19,6 +19,47 @@ public enum MiniServoRegIndex {
kreg_mini_servo_temperature(RegIndex.kreg_mini_servo_temperature), // 温度 反馈当前舵机内部工作温度,反馈精度为1摄氏度
kreg_mini_servo_loadvalue(RegIndex.kreg_mini_servo_loadvalue), // 负载值 输出驱动电机的当前占空比电压,单位为0.1%,取值0-1000
kreg_mini_servo_target_pos_tolerance(RegIndex.kreg_mini_servo_target_pos_tolerance), // 目标位置容忍度
kreg_mini_servo_firmware_main_version(RegIndex.kreg_mini_servo_firmware_main_version), // 固件主版本号
kreg_mini_servo_firmware_sub_version(RegIndex.kreg_mini_servo_firmware_sub_version), // 固件次版本号
kreg_mini_servo_servo_main_version(RegIndex.kreg_mini_servo_servo_main_version), // 舵机主版本号
kreg_mini_servo_servo_sub_version(RegIndex.kreg_mini_servo_servo_sub_version), // 舵机次版本号
kreg_mini_servo_servo_min_angle(RegIndex.kreg_mini_servo_servo_min_angle), // 最小角度限制
kreg_mini_servo_servo_max_angle(RegIndex.kreg_mini_servo_servo_max_angle), // 最大角度限制
kreg_mini_servo_servo_max_temp(RegIndex.kreg_mini_servo_servo_max_temp), // 最高温度上限
kreg_mini_servo_servo_max_voltage(RegIndex.kreg_mini_servo_servo_max_voltage), // 最高输入电压
kreg_mini_servo_servo_min_voltage(RegIndex.kreg_mini_servo_servo_min_voltage), // 最低输入电压
kreg_mini_servo_servo_max_torque(RegIndex.kreg_mini_servo_servo_max_torque), // 最大扭矩
kreg_mini_servo_servo_unload_condition(RegIndex.kreg_mini_servo_servo_unload_condition), // 卸载条件
kreg_mini_servo_servo_p(RegIndex.kreg_mini_servo_servo_p), // P 比例系
kreg_mini_servo_servo_d(RegIndex.kreg_mini_servo_servo_d), // D 微分系
kreg_mini_servo_servo_i(RegIndex.kreg_mini_servo_servo_i), // I
kreg_mini_servo_servo_min_start(RegIndex.kreg_mini_servo_servo_min_start), // 最小启动
kreg_mini_servo_servo_cw_dead_zone(RegIndex.kreg_mini_servo_servo_cw_dead_zone), // 顺时针不灵敏区
kreg_mini_servo_servo_ccw_dead_zone(RegIndex.kreg_mini_servo_servo_ccw_dead_zone), // 逆时针不灵敏
kreg_mini_servo_servo_protect_current(RegIndex.kreg_mini_servo_servo_protect_current), // 保护电流
kreg_mini_servo_servo_protect_torque(RegIndex.kreg_mini_servo_servo_protect_torque), // 保护扭矩 0->100 ,触发后需要写入与组转方向相反的位置指令进行解除
kreg_mini_servo_servo_protect_time(RegIndex.kreg_mini_servo_servo_protect_time), // 保护时间
kreg_mini_servo_servo_overload_torque(RegIndex.kreg_mini_servo_servo_overload_torque), // 过载扭矩
kreg_mini_servo_servo_speed_p(RegIndex.kreg_mini_servo_servo_speed_p), // 速度闭环P比例参数
kreg_mini_servo_servo_overload_time(RegIndex.kreg_mini_servo_servo_overload_time), // 过流保护时间
kreg_mini_servo_servo_speed_i(RegIndex.kreg_mini_servo_servo_speed_i), // 速度闭环I积分参数
kreg_mini_servo_servo_torque_switch(RegIndex.kreg_mini_servo_servo_torque_switch), // 扭矩开关
kreg_mini_servo_servo_acc(RegIndex.kreg_mini_servo_servo_acc), // 加速度
kreg_mini_servo_servo_target_pos(RegIndex.kreg_mini_servo_servo_target_pos), // 目标位置
kreg_mini_servo_servo_run_time(RegIndex.kreg_mini_servo_servo_run_time), // 运行时间
kreg_mini_servo_servo_run_speed(RegIndex.kreg_mini_servo_servo_run_speed), // 运行速度
kreg_mini_servo_servo_torque_limit(RegIndex.kreg_mini_servo_servo_torque_limit), // 转矩限制
kreg_mini_servo_servo_lock_flag(RegIndex.kreg_mini_servo_servo_lock_flag), // 锁标志
kreg_mini_servo_servo_current_pos(RegIndex.kreg_mini_servo_servo_current_pos), // 当前位置
kreg_mini_servo_servo_current_speed(RegIndex.kreg_mini_servo_servo_current_speed), // 当前速度
kreg_mini_servo_servo_current_load(RegIndex.kreg_mini_servo_servo_current_load), // 当前负载 bit10为方向位 输出驱动电机的当前占空比电压,单位为0.1%,取值0-1000
kreg_mini_servo_servo_current_voltage(RegIndex.kreg_mini_servo_servo_current_voltage), // 当前电压 反馈当前舵机工作电压,反馈精度为0.1V,即120*0.1=12V
kreg_mini_servo_servo_current_temp(RegIndex.kreg_mini_servo_servo_current_temp), // 当前温度 反馈当前舵机内部工作温度,反馈精度为1摄氏度
kreg_mini_servo_servo_status(RegIndex.kreg_mini_servo_servo_status), // 舵机状态
kreg_mini_servo_servo_move_flag(RegIndex.kreg_mini_servo_servo_move_flag), // 移动标志
kreg_mini_servo_servo_current_current(RegIndex.kreg_mini_servo_servo_current_current), // 当前电流 反馈当前工作电流值,单位为6.26.5mA,最大可反馈电流为500*6.5mA=3250mA
;
public final RegIndex regIndex;

3
src/main/java/a8k/app/hardware/type/ModuleStatus.java

@ -1,4 +1,5 @@
package a8k.app.hardware.type;
import org.springframework.util.Assert;
public enum ModuleStatus {
@ -18,7 +19,7 @@ public enum ModuleStatus {
}
public static ModuleStatus valueOf(int value) { // 手写的从int到enum的转换函数
Assert.isTrue((value >= 0 && value <= 2),"(value >= 0 && value < 2)");
Assert.isTrue((value >= 0 && value <= 2), String.format("(value=%s value >= 0 && value < 2)", value));
return values()[value];
}

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

@ -149,6 +149,9 @@ public enum RegIndex {
kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数
kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母
kreg_step_motor_default_velocity(10154), // 默认速度
kreg_step_motor_low_velocity(10155), // 低速
kreg_step_motor_mid_velocity(10156), // 中速
kreg_step_motor_high_velocity(10157), // 高速
kreg_step_motor_ihold(10158), // 步进电机电流配置
kreg_step_motor_irun(10159), // 步进电机电流配置
kreg_step_motor_iholddelay(10160), // 步进电机电流配置
@ -190,12 +193,55 @@ public enum RegIndex {
kreg_mini_servo_target_pos_tolerance(10260), // 目标位置容忍度
kreg_mini_servo_firmware_main_version(10500), // 固件主版本号
kreg_mini_servo_firmware_sub_version(10501), // 固件次版本号
kreg_mini_servo_servo_main_version(10503), // 舵机主版本号
kreg_mini_servo_servo_sub_version(10504), // 舵机次版本号
kreg_mini_servo_servo_min_angle(10509), // 最小角度限制
kreg_mini_servo_servo_max_angle(10511), // 最大角度限制
kreg_mini_servo_servo_max_temp(10513), // 最高温度上限
kreg_mini_servo_servo_max_voltage(10514), // 最高输入电压
kreg_mini_servo_servo_min_voltage(10515), // 最低输入电压
kreg_mini_servo_servo_max_torque(10516), // 最大扭矩
kreg_mini_servo_servo_unload_condition(10519), // 卸载条件
kreg_mini_servo_servo_p(10521), // P 比例系
kreg_mini_servo_servo_d(10522), // D 微分系
kreg_mini_servo_servo_i(10523), // I
kreg_mini_servo_servo_min_start(10524), // 最小启动
kreg_mini_servo_servo_cw_dead_zone(10526), // 顺时针不灵敏区
kreg_mini_servo_servo_ccw_dead_zone(10527), // 逆时针不灵敏
kreg_mini_servo_servo_protect_current(10528), // 保护电流
kreg_mini_servo_servo_protect_torque(10534), // 保护扭矩 0->100 ,触发后需要写入与组转方向相反的位置指令进行解除
kreg_mini_servo_servo_protect_time(10535), // 保护时间
kreg_mini_servo_servo_overload_torque(10536), // 过载扭矩
kreg_mini_servo_servo_speed_p(10537), // 速度闭环P比例参数
kreg_mini_servo_servo_overload_time(10538), // 过流保护时间
kreg_mini_servo_servo_speed_i(10539), // 速度闭环I积分参数
kreg_mini_servo_servo_torque_switch(10540), // 扭矩开关
kreg_mini_servo_servo_acc(10541), // 加速度
kreg_mini_servo_servo_target_pos(10542), // 目标位置
kreg_mini_servo_servo_run_time(10544), // 运行时间
kreg_mini_servo_servo_run_speed(10546), // 运行速度
kreg_mini_servo_servo_torque_limit(10548), // 转矩限制
kreg_mini_servo_servo_lock_flag(10555), // 锁标志
kreg_mini_servo_servo_current_pos(10556), // 当前位置
kreg_mini_servo_servo_current_speed(10558), // 当前速度
kreg_mini_servo_servo_current_load(10560), // 当前负载 bit10为方向位 输出驱动电机的当前占空比电压,单位为0.1%,取值0-1000
kreg_mini_servo_servo_current_voltage(10562), // 当前电压 反馈当前舵机工作电压,反馈精度为0.1V,即120*0.1=12V
kreg_mini_servo_servo_current_temp(10563), // 当前温度 反馈当前舵机内部工作温度,反馈精度为1摄氏度
kreg_mini_servo_servo_status(10565), // 舵机状态
kreg_mini_servo_servo_move_flag(10566), // 移动标志
kreg_mini_servo_servo_current_current(10569), // 当前电流 反馈当前工作电流值,单位为6.26.5mA,最大可反馈电流为500*6.5mA=3250mA
/***********************************************************************************************************************
* ID_CARD_READER *
***********************************************************************************************************************/
kreg_id_card_reader_raw_sector_size(10301), //
kreg_id_card_reader_raw_sector_num(10302), //
kreg_id_card_reader_is_online(10303, false), //
/***********************************************************************************************************************
@ -203,14 +249,23 @@ public enum RegIndex {
***********************************************************************************************************************/
kreg_plate_code_scaner_laster_intensity(10401), //
kreg_plate_code_scaner_scan_gain(10402), //
kreg_plate_code_scaner_scan_velocity(10403), //
kreg_plate_code_scaner_scan_start_pos(10404), //
kreg_plate_code_scaner_final_stop_pos(10405), //
kreg_plate_code_scaner_code_judgment_threshold(10406), //
kreg_plate_code_scaner_item(10407), //
kreg_plate_code_scaner_lot(10408), //
kreg_plate_code_scaner_rawcode(10409), //
kreg_plate_code_scaner_code_legal(10410); //
public final int index;

15
src/main/java/a8k/app/hardware/type/StepMotorRegIndex.java

@ -1,10 +1,10 @@
package a8k.app.hardware.type;
public enum StepMotorRegIndex {
// kreg_module_version(RegIndex.kreg_module_version), // 模块版本
// kreg_module_type(RegIndex.kreg_module_type), // 模块类型
// kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error
// kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag
// kreg_module_version(RegIndex.kreg_module_version), // 模块版本
// kreg_module_type(RegIndex.kreg_module_type), // 模块类型
// kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error
// kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag
/***********************************************************************************************************************
* step_motor *
***********************************************************************************************************************/
@ -12,11 +12,14 @@ public enum StepMotorRegIndex {
kreg_step_motor_is_enable(RegIndex.kreg_step_motor_is_enable), // 是否使能
kreg_step_motor_dpos(RegIndex.kreg_step_motor_dpos), // 执行完上一条指令后的相对位移
kreg_step_motor_has_move_zero(RegIndex.kreg_step_motor_has_move_zero), // 是否已经移动到零点
// kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移
// kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移
kreg_step_motor_shaft(RegIndex.kreg_step_motor_shaft), // x轴是否反转
kreg_step_motor_one_circle_pulse(RegIndex.kreg_step_motor_one_circle_pulse), // x轴一圈脉冲数
kreg_step_motor_one_circle_pulse_denominator(RegIndex.kreg_step_motor_one_circle_pulse_denominator), // 设置一圈脉冲数的分母
kreg_step_motor_default_velocity(RegIndex.kreg_step_motor_default_velocity), // 默认速度
kreg_step_motor_low_velocity(RegIndex.kreg_step_motor_low_velocity),
kreg_step_motor_mid_velocity(RegIndex.kreg_step_motor_mid_velocity),
kreg_step_motor_high_velocity(RegIndex.kreg_step_motor_high_velocity),
kreg_step_motor_ihold(RegIndex.kreg_step_motor_ihold), // 步进电机电流配置
kreg_step_motor_irun(RegIndex.kreg_step_motor_irun), // 步进电机电流配置
kreg_step_motor_iholddelay(RegIndex.kreg_step_motor_iholddelay), // 步进电机电流配置
@ -41,6 +44,8 @@ public enum StepMotorRegIndex {
kreg_step_motor_dzero_pos(RegIndex.kreg_step_motor_dzero_pos), // 驱动器处于调试模式
kret_step_motor_pos_devi_tolerance(RegIndex.kret_step_motor_pos_devi_tolerance), // 位置偏差容忍度
kret_step_motor_io_trigger_append_distance(RegIndex.kret_step_motor_io_trigger_append_distance), // 移动到io时附加的距离
;
public final RegIndex regIndex;

9
src/main/java/a8k/app/hardware/type/StepMotorSpeedLevel.java

@ -0,0 +1,9 @@
package a8k.app.hardware.type;
public enum StepMotorSpeedLevel {
DEFAULT,
LOW,
MID,
HIGH,
;
}

1
src/main/java/a8k/app/i18n/Internationalization.java

@ -39,6 +39,7 @@ public class Internationalization {
case APPE_PLATE_BOX_NOT_COVER -> "板夹仓未盖";
case APPE_DEVICE_NOT_INITED -> "设备未初始化";
case APPE_DEVICE_INIT_CHECK_FAIL -> "设备初始化检查失败";
case APPE_SHAKE_MODULE_CLAMPM_NOT_IN_ZERO_POS -> "摇匀模组夹紧电机初始化时没有在零点位置";
case PROJ_CARD_ERROR_EXPIRYED -> "项目卡过期";
case PROJ_CARD_ERROR_WRONG_FUNCTION_NUM -> "项目卡配置的函数数量与项目配置不匹配";

16
src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java

@ -1,5 +1,6 @@
package a8k.app.service.lowerctrl;
import a8k.app.hardware.type.*;
import a8k.app.type.ui.ZAppPromopt;
import a8k.app.type.ui.ZAppPromoptFormsItem;
import a8k.app.type.ui.MessageLevel;
@ -7,13 +8,9 @@ import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.channel.A8kCanBusService;
import a8k.app.hardware.driver.InputDetectDriver;
import a8k.app.hardware.driver.ModuleEnableCtrlDriver;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.hardware.type.InputIOId;
import a8k.app.hardware.driver.MiniServoDriver;
import a8k.app.hardware.driver.PipetteCtrlDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.MiniServoMId;
import a8k.app.hardware.type.StepMotorMId;
import a8k.app.service.background.AppEventBusService;
import a8k.app.teststate.VirtualDevice;
@ -68,9 +65,9 @@ public class DeviceMoveToZeroCtrlService {
}
public static class State {
public Boolean deviceInited = false;
public Boolean isBusy = false;
public Boolean passed = false;
public Boolean deviceInited = false;
public Boolean isBusy = false;
public Boolean passed = false;
public ZAppPromopt promopt;
}
@ -171,6 +168,9 @@ public class DeviceMoveToZeroCtrlService {
log.info("摇匀模组夹爪Y轴舵机回零");
miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModGripperYSV);
log.info("摇匀模组夹紧电机回零");
if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModClampingM, 0)) {
throw AppException.of(A8kEcode.APPE_SHAKE_MODULE_CLAMPM_NOT_IN_ZERO_POS);
}
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM);
log.info("摇匀模组摇匀电机回零");
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM);
@ -218,7 +218,7 @@ public class DeviceMoveToZeroCtrlService {
for (CheckResult result : results) {
if (!result.pass) {
log.info("设备初始化失败: check {} fail", result.info);
doSomeThingWhenError();
// doSomeThingWhenError();
return results;
}
}

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

@ -247,14 +247,18 @@ public class HbotMoveExCtrlService {
}
public void moveToSamplePos(HbotSamplePos pos) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbotSamplePosParamMgr.getSamplePos(pos));
}
public void moveToSampleStartPos(A8kSamplePos pos) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbotSamplePosParamMgr.getSampleStartPos(pos));
}
public void moveToSampleEndPos(A8kSamplePos pos) throws AppException {
Pos3d startpos = hbotSamplePosParamMgr.getSampleStartPos(pos);
Integer endpos = hbotSamplePosParamMgr.getSampleEndPos(pos);
startpos.z = endpos;
hbotMoveCtrlService.hbotMoveTo(startpos);
}
public void moveToSamplePosXY(A8kSamplePos pos) throws AppException {
var topos = hbotSamplePosParamMgr.getSampleStartPos(pos);
topos.z = 0;

12
src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java

@ -34,7 +34,7 @@ public class LiquidOperationCtrlService {
static public final Integer lldGunPumpVmax = 50;
static public final Integer aspiratePumpVmax = 100;
static public final Integer reactionVolumeUL = 75;
static public final Integer mixVolumeUL = 200;
static public final Integer mixVolumeUL = 200;
@Resource
GStateMgrService gstate;
@ -125,8 +125,8 @@ public class LiquidOperationCtrlService {
// 检查是否有TIP
ZAppChecker.check(pipetteCtrlDriver.isHasTip(), A8kEcode.CODEERROR, "未检测到TIP");
Pos3d largeBottleEndPos = hbotConsumableExParamMgr.getLargeBufferSamplePosEnd(from.group);
Pos3d largeBottlePos = hbotConsumableExParamMgr.getLargeBufferSamplePos(from.group);
Pos3d largeBottleEndPos = hbotConsumableExParamMgr.getLargeBufferSamplePosEnd(from.group);
Pos3d largeBottlePos = hbotConsumableExParamMgr.getLargeBufferSamplePos(from.group);
Integer liquidLevel = 0;
@ -214,7 +214,7 @@ public class LiquidOperationCtrlService {
// 取样
Pos3d sampleStartPos = hbotSamplePosParamMgr.getSampleStartPos(from);
Pos3d sampleEndPos = hbotSamplePosParamMgr.getSampleEndPos(from);
Integer sampleEndZPos = hbotSamplePosParamMgr.getSampleEndPos(from);
Integer liquidLevel = 0;
// 移动到取样位
hbotMoveExCtrlService.moveToXY(sampleStartPos);
@ -222,7 +222,7 @@ public class LiquidOperationCtrlService {
//lld
//清空tip中的液体和空气同时预先吸入部分空气以便后续清空由于lld吸入的液体提高lld的准确性
lddprepare();
ldd(sampleStartPos.z, sampleEndPos.z, 20);
ldd(sampleStartPos.z, sampleEndZPos, 20);
if (!pipetteCtrlDriver.lldIsDetectLiquid() && gstate.isInMode(DeviceRunMode.RealMode)) {
throw AppException.of(A8kEcode.APPE_TAKE_SAMPLE_FAIL);
}
@ -238,7 +238,7 @@ public class LiquidOperationCtrlService {
//取样
pipetteCtrlDriver.zMotorMoveToBlock(liquidLevel);
aspirate(sampleEndPos.z, aspiratePumpVmax, pipetteGunLLFParamMgr.getSampleLLFVel(from), ul * 1.0);
aspirate(sampleEndZPos, aspiratePumpVmax, pipetteGunLLFParamMgr.getSampleLLFVel(from), ul * 1.0);
pipetteCtrlDriver.zMotorMoveToBlock(0);

2
src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleCtrlService.java

@ -1,5 +1,6 @@
package a8k.app.service.lowerctrl;
import a8k.OS;
import a8k.app.hardware.driver.MiniServoDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.MiniServoMId;
@ -53,6 +54,7 @@ public class TubePreProcesModuleCtrlService {
}
public void YSVMoveToShakePos() throws AppException {
// miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, tubePreProcesPosParamMgr.getYServoShakePos() - 100); //该动作是为了消除齿轮间隙
miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, tubePreProcesPosParamMgr.getYServoShakePos());
}

6
src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleExCtrlService.java

@ -3,11 +3,8 @@ package a8k.app.service.lowerctrl;
import a8k.app.constant.MiniServoConstant;
import a8k.app.hardware.driver.MiniServoDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.MiniServoMId;
import a8k.app.hardware.type.StepMotorMId;
import a8k.app.hardware.type.*;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.hardware.type.MId;
import a8k.app.service.param.pos.TubePreProcesPosParamMgr;
import a8k.app.utils.ZEQ;
import lombok.RequiredArgsConstructor;
@ -123,6 +120,7 @@ public class TubePreProcesModuleExCtrlService {
tubePreProcesModuleCtrlService.zMotorMoveToShakeTubePos(15);//1.5mm
//闭合夹爪
tubePreProcesModuleCtrlService.gripperSVClampTube();
stepMotorCtrlDriver.moveByBlock(StepMotorMId.ShakeModGripperZM, -50, StepMotorSpeedLevel.LOW);
//Z上移动到零位
tubePreProcesModuleCtrlService.zMotorMoveToZeroQuick();
//Y移动到待机位

32
src/main/java/a8k/app/service/param/hbotpos/HbotSamplePosParamMgr.java

@ -14,13 +14,11 @@ import org.springframework.stereotype.Component;
*/
@Component
public class HbotSamplePosParamMgr extends ParamMgr {
static final Logger logger = LoggerFactory.getLogger(HbotSamplePosParamMgr.class);
@PostConstruct
void initialize() {
for (HbotSamplePos pos : HbotSamplePos.values()) {
initParam(pos, pos.chName,pos.type);
initParam(pos, pos.chName, pos.type);
}
//校验参数类型
@ -34,17 +32,25 @@ public class HbotSamplePosParamMgr extends ParamMgr {
return getParam(pos, Pos3d.class);
}
public Integer getZPos(HbotSamplePos pos) {
return getParam(pos, Integer.class);
}
public void setSamplePos(HbotSamplePos pos, Pos3d pos3d) {
setParam(pos, pos3d);
}
public void setZPos(HbotSamplePos pos, Integer z) {
setParam(pos, z);
}
public Pos3d getSampleStartPos(A8kSamplePos samplePos) {
return switch (samplePos) {
case EmergencyTubePos -> getSamplePos(HbotSamplePos.EmergencyTubeSamplePos);
case BloodHTubePos -> getSamplePos(HbotSamplePos.BloodHTubeSamplePos);
case BloodSTubePos -> getSamplePos(HbotSamplePos.BloodSTubeSamplePos);
case MiniTubePos -> getSamplePos(HbotSamplePos.MiniTubeSamplePos);
// case MiniTubePos -> getSamplePos(HbotSamplePos.MiniTubeSamplePos);
case MiniBloodPos -> getSamplePos(HbotSamplePos.MiniBloodSamplePos);
case Bulltube1P5Pos -> getSamplePos(HbotSamplePos.Bulltube1P5SamplePos);
case Bulltube0P5Pos -> getSamplePos(HbotSamplePos.Bulltube0P5SamplePos);
@ -52,16 +58,16 @@ public class HbotSamplePosParamMgr extends ParamMgr {
};
}
public Pos3d getSampleEndPos(A8kSamplePos samplePos) {
public Integer getSampleEndPos(A8kSamplePos samplePos) {
return switch (samplePos) {
case EmergencyTubePos -> getSamplePos(HbotSamplePos.EmergencyTubeSampleEndPos);
case BloodHTubePos -> getSamplePos(HbotSamplePos.BloodHTubeSampleEndPos);
case BloodSTubePos -> getSamplePos(HbotSamplePos.BloodSTubeSampleEndPos);
case MiniTubePos -> getSamplePos(HbotSamplePos.MinitubeSampleEndPos);
case MiniBloodPos -> getSamplePos(HbotSamplePos.MiniBloodSampleEndPos);
case Bulltube1P5Pos -> getSamplePos(HbotSamplePos.Bulltube1P5SampleEndPos);
case Bulltube0P5Pos -> getSamplePos(HbotSamplePos.Bulltube0P5SampleEndPos);
case StoolTestTubePos -> getSamplePos(HbotSamplePos.StoolTestTubeSampleEndPos);
case EmergencyTubePos -> getZPos(HbotSamplePos.EmergencyTubeSampleEndPos);
case BloodHTubePos -> getZPos(HbotSamplePos.BloodHTubeSampleEndPos);
case BloodSTubePos -> getZPos(HbotSamplePos.BloodSTubeSampleEndPos);
// case MiniTubePos -> getZPos(HbotSamplePos.MinitubeSampleEndPos);
case MiniBloodPos -> getZPos(HbotSamplePos.MiniBloodSampleEndPos);
case Bulltube1P5Pos -> getZPos(HbotSamplePos.Bulltube1P5SampleEndPos);
case Bulltube0P5Pos -> getZPos(HbotSamplePos.Bulltube0P5SampleEndPos);
case StoolTestTubePos -> getZPos(HbotSamplePos.StoolTestTubeSampleEndPos);
};
}
}

2
src/main/java/a8k/app/service/param/pipetteparam/PipetteGunLLFParamMgr.java

@ -42,7 +42,7 @@ public class PipetteGunLLFParamMgr extends ParamMgr {
return switch (pos) {
case EmergencyTubePos -> getLlfVel(PipetteGunLLFParam.EMERGENCY_TUBE_LLF_VEL);
case BloodHTubePos, BloodSTubePos -> getLlfVel(PipetteGunLLFParam.BLOOD_TUBE_LLF_VEL);
case MiniTubePos -> getLlfVel(PipetteGunLLFParam.MINI_TUBE_LLF_VEL);
// case MiniTubePos -> getLlfVel(PipetteGunLLFParam.MINI_TUBE_LLF_VEL);
case MiniBloodPos -> getLlfVel(PipetteGunLLFParam.MINI_BLOOD_LLF_VEL);
case Bulltube1P5Pos -> getLlfVel(PipetteGunLLFParam.BULLET_TUBE_1P5_LLF_VEL);
case Bulltube0P5Pos -> getLlfVel(PipetteGunLLFParam.BULLET_TUBE_0P5_LLF_VEL);

2
src/main/java/a8k/app/type/a8k/A8kTubeHolderType.java

@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
public enum A8kTubeHolderType {
BloodTube("0000"), //全血试管
MiniTube("1111"), //迷你试管
// MiniTube("1111"), //迷你试管
MiniBlood("2222"), //阳普管
BulletTube1P5("5555"),//子弹头试管1.5mL
BulletTube0P5("4444"), //子弹头试管0.5mL

8
src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java

@ -280,9 +280,11 @@ public class ProjectTaskContext {
} else {
samplePos = A8kSamplePos.BloodSTubePos;
}
} else if (tubeHolderType.equals(A8kTubeHolderType.MiniTube)) {
samplePos = A8kSamplePos.MiniTubePos;
} else if (tubeHolderType.equals(A8kTubeHolderType.MiniBlood)) {
}
// else if (tubeHolderType.equals(A8kTubeHolderType.MiniTube)) {
// samplePos = A8kSamplePos.MiniTubePos;
// }
else if (tubeHolderType.equals(A8kTubeHolderType.MiniBlood)) {
samplePos = A8kSamplePos.MiniBloodPos;
} else if (tubeHolderType.equals(A8kTubeHolderType.BulletTube1P5)) {
samplePos = A8kSamplePos.Bulltube1P5Pos;

18
src/main/java/a8k/app/type/param/hbotpos/HbotSamplePos.java

@ -4,28 +4,28 @@ import a8k.app.type.a8k.Pos3d;
public enum HbotSamplePos {
EmergencyTubeSamplePos("<急诊位>取样位置", Pos3d.class),
EmergencyTubeSampleEndPos("<急诊位>取样结束位置", Pos3d.class),
EmergencyTubeSampleEndPos("<急诊位>取样结束位置", Integer.class),
BloodHTubeSamplePos("<全血高试管>取样位置", Pos3d.class),
BloodHTubeSampleEndPos("<全血高试管>取样结束位置", Pos3d.class),
BloodHTubeSampleEndPos("<全血高试管>取样结束位置", Integer.class),
BloodSTubeSamplePos("<全血低试管>取样位置", Pos3d.class),
BloodSTubeSampleEndPos("<全血低试管>取样结束位置", Pos3d.class),
BloodSTubeSampleEndPos("<全血低试管>取样结束位置", Integer.class),
MiniTubeSamplePos("<迷你试管>取样位置", Pos3d.class),
MinitubeSampleEndPos("<迷你试管>取样结束位置", Pos3d.class),
// MiniTubeSamplePos("<迷你试管>取样位置", Pos3d.class),
// MinitubeSampleEndPos("<迷你试管>取样结束位置", Integer.class),
MiniBloodSamplePos("<阳普管>取样位置", Pos3d.class),
MiniBloodSampleEndPos("<阳普管>取样结束位置", Pos3d.class),
MiniBloodSampleEndPos("<阳普管>取样结束位置", Integer.class),
Bulltube1P5SamplePos("<子弹头试管1.5mL>取样位置", Pos3d.class),
Bulltube1P5SampleEndPos("<子弹头试管1.5mL>取样结束位置", Pos3d.class),
Bulltube1P5SampleEndPos("<子弹头试管1.5mL>取样结束位置", Integer.class),
Bulltube0P5SamplePos("<子弹头试管0.5mL>取样位置", Pos3d.class),
Bulltube0P5SampleEndPos("<子弹头试管0.5mL>取样结束位置", Pos3d.class),
Bulltube0P5SampleEndPos("<子弹头试管0.5mL>取样结束位置", Integer.class),
StoolTestTubeSamplePos("<粪便试管>取样位置", Pos3d.class),
StoolTestTubeSampleEndPos("<粪便试管>取样结束位置", Pos3d.class),
StoolTestTubeSampleEndPos("<粪便试管>取样结束位置", Integer.class),
;
public final String chName;
public final Class<?> type;

2
src/main/java/a8k/app/type/param/type/A8kSamplePos.java

@ -4,7 +4,7 @@ public enum A8kSamplePos {
EmergencyTubePos("<急诊位>"),
BloodHTubePos("<全血高试管>"),
BloodSTubePos("<全血低试管>"),
MiniTubePos("<迷你试管>"),
// MiniTubePos("<迷你试管>"),
MiniBloodPos("<阳普管>"),
Bulltube1P5Pos("<子弹头试管1.5mL>"),
Bulltube0P5Pos("<子弹头试管0.5mL>"),

32
src/main/java/a8k/extui/page/driver/MotorCtrlPage.java

@ -1,5 +1,6 @@
package a8k.extui.page.driver;
import a8k.app.hardware.type.StepMotorSpeedLevel;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.StepMotorMId;
@ -21,8 +22,9 @@ public class MotorCtrlPage {
@Resource
ExtApiPageMgr extApiPageMgr;
StepMotorMId id = StepMotorMId.FeedingModXM;
Integer dpos = 10;
StepMotorMId id = StepMotorMId.FeedingModXM;
Integer dpos = 10;
StepMotorSpeedLevel speedLevel = StepMotorSpeedLevel.DEFAULT;
public void setStepMotorIdRefreshPage(StepMotorMId id) {
@ -33,6 +35,10 @@ public class MotorCtrlPage {
this.dpos = dpos;
}
public void setStepMotorSpeedLevel(StepMotorSpeedLevel speedLevel) {
this.speedLevel = speedLevel;
}
//
public void enableMotor() throws AppException {
@ -54,27 +60,28 @@ public class MotorCtrlPage {
public void stepMotorEasyMoveForward() throws AppException {
log.info("stepMotorEasyMoveForward: {} {}", id, dpos);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, dpos);
stepMotorCtrlDriver.moveByBlock(id, dpos, speedLevel);
}
public void stepMotorEasyMoveBackward() throws AppException {
log.info("stepMotorEasyMoveBackward: {} {}", id, -dpos);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, -dpos);
stepMotorCtrlDriver.moveByBlock(id, -dpos, speedLevel);
}
public void stepMotorEasyMoveTo(Integer pos) throws AppException {
log.info("stepMotorEasyMoveTo: {} {}", id, pos);
stepMotorCtrlDriver.stepMotorEasyMoveToBlock(id, pos);
stepMotorCtrlDriver.moveToBlock(id, pos, speedLevel);
}
public void rotateForward() throws AppException {
stepMotorCtrlDriver.stepMotorEasyRotate(id, 1);
stepMotorCtrlDriver.rotate(id, 1, speedLevel);
}
public void rotateBackward() throws AppException {
stepMotorCtrlDriver.stepMotorEasyRotate(id, -1);
stepMotorCtrlDriver.rotate(id, -1, speedLevel);
}
public Integer readEncPos() throws AppException {
return stepMotorCtrlDriver.stepMotorReadEncPos(id);
}
@ -131,6 +138,12 @@ public class MotorCtrlPage {
stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_default_velocity, v);
}
public void setSpeed(Integer low, Integer mid, Integer high) throws AppException {
stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_low_velocity, low);
stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_mid_velocity, mid);
stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_high_velocity, high);
}
public void setMres(Integer mres) throws AppException {
stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_mres, mres);
}
@ -162,6 +175,7 @@ public class MotorCtrlPage {
var page = extApiPageMgr.newPage(this);
page.newGroup("上下文");
page.addFunction("设置电机ID", this::setStepMotorIdRefreshPage).setParamVal("id", () -> id);
page.addFunction("设置速度等级", this::setStepMotorSpeedLevel).setParamVal("speedLevel", () -> speedLevel);
page.newGroup("基础操作");
page.addFunction("使能电机", this::enableMotor);
@ -191,6 +205,10 @@ public class MotorCtrlPage {
page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_a1));
page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_amax));
page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_default_velocity));
page.addFunction("设置速度", this::setSpeed)
.setParamVal("low", () -> readReg(StepMotorRegIndex.kreg_step_motor_low_velocity))
.setParamVal("mid", () -> readReg(StepMotorRegIndex.kreg_step_motor_mid_velocity))
.setParamVal("high", () -> readReg(StepMotorRegIndex.kreg_step_motor_high_velocity));
page.addFunction("设置一圈脉冲数", this::setOneCirclePulse)
.setParamVal("pulse", () -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse)).setParamVal("denominator",
() -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator));

1
src/main/java/a8k/extui/page/extapp/P01PipetteGunVerification.java

@ -131,6 +131,7 @@ public class P01PipetteGunVerification {
pipetteCtrlDriver.liquidOperationSetGunRunParams(14, 14, 0, 900, 30);
pipetteCtrlDriver.liquidOperationSetZMotorRunParams(0, 500, 60);
pipetteCtrlDriver.liquidOperationFreshParams();
hbotMoveExCtrlService.moveToLargeBSSamplePos(ConsumableGroup.CG1);
pipetteCtrlDriver.pipetteLld(LldType.kplld, 0, 30);
if (pipetteCtrlDriver.lldIsDetectLiquid()) {
liquidPos = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos);

83
src/main/java/a8k/extui/page/extsetting/pos_calibration/P25HbotSamplePosCalibrationPage.java

@ -19,64 +19,57 @@ public class P25HbotSamplePosCalibrationPage {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.EmergencyTubeSamplePos, new Pos3d(x, y, z));
}
public void setEmergencyTubeSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.EmergencyTubeSampleEndPos, new Pos3d(x, y, z));
public void setEmergencyTubeSampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.EmergencyTubeSampleEndPos, z);
}
public void setBloodHTubeSamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.BloodHTubeSamplePos, new Pos3d(x, y, z));
}
public void setBloodHTubeSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.BloodHTubeSampleEndPos, new Pos3d(x, y, z));
public void setBloodHTubeSampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.BloodHTubeSampleEndPos, z);
}
public void setBloodSTubeSamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.BloodSTubeSamplePos, new Pos3d(x, y, z));
}
public void setBloodSTubeSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.BloodSTubeSampleEndPos, new Pos3d(x, y, z));
public void setBloodSTubeSampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.BloodSTubeSampleEndPos, z);
}
public void setMiniTubeSamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.MiniTubeSamplePos, new Pos3d(x, y, z));
}
public void setMinitubeSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.MinitubeSampleEndPos, new Pos3d(x, y, z));
}
public void setMiniBloodSamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.MiniBloodSamplePos, new Pos3d(x, y, z));
}
public void setMiniBloodSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.MiniBloodSampleEndPos, new Pos3d(x, y, z));
public void setMiniBloodSampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.MiniBloodSampleEndPos, z);
}
public void setBulltube1P5SamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.Bulltube1P5SamplePos, new Pos3d(x, y, z));
}
public void setBulltube1P5SampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.Bulltube1P5SampleEndPos, new Pos3d(x, y, z));
public void setBulltube1P5SampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.Bulltube1P5SampleEndPos, z);
}
public void setBulltube0P5SamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.Bulltube0P5SamplePos, new Pos3d(x, y, z));
}
public void setBulltube0P5SampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.Bulltube0P5SampleEndPos, new Pos3d(x, y, z));
public void setBulltube0P5SampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.Bulltube0P5SampleEndPos, z);
}
public void setStoolTestTubeSamplePos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.StoolTestTubeSamplePos, new Pos3d(x, y, z));
}
public void setStoolTestTubeSampleEndPos(Integer x, Integer y, Integer z) {
hbotSamplePosParamMgr.setSamplePos(HbotSamplePos.StoolTestTubeSampleEndPos, new Pos3d(x, y, z));
public void setStoolTestTubeSampleEndPos(Integer z) {
hbotSamplePosParamMgr.setZPos(HbotSamplePos.StoolTestTubeSampleEndPos, z);
}
@ -93,9 +86,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.EmergencyTubeSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.EmergencyTubeSamplePos).z);
page.addFunction("取样结束位置", this::setEmergencyTubeSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.EmergencyTubeSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.EmergencyTubeSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.EmergencyTubeSampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.EmergencyTubeSampleEndPos));
page.newGroup("全血高试管");
page.addFunction("取样位置", this::setBloodHTubeSamplePos)
@ -103,9 +94,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodHTubeSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodHTubeSamplePos).z);
page.addFunction("取样结束位置", this::setBloodHTubeSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodHTubeSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodHTubeSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodHTubeSampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.BloodHTubeSampleEndPos));
page.newGroup("全血低试管");
page.addFunction("取样位置", this::setBloodSTubeSamplePos)
@ -113,19 +102,17 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodSTubeSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodSTubeSamplePos).z);
page.addFunction("取样结束位置", this::setBloodSTubeSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodSTubeSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodSTubeSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.BloodSTubeSampleEndPos).z);
page.newGroup("迷你试管");
page.addFunction("取样位置", this::setMiniTubeSamplePos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).z);
page.addFunction("取样结束位置", this::setMinitubeSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.BloodSTubeSampleEndPos));
// page.newGroup("迷你试管");
// page.addFunction("取样位置", this::setMiniTubeSamplePos)
// .setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).x)
// .setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).y)
// .setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniTubeSamplePos).z);
// page.addFunction("取样结束位置", this::setMinitubeSampleEndPos)
// .setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).x)
// .setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).y)
// .setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MinitubeSampleEndPos).z);
page.newGroup("阳普管");
page.addFunction("取样位置", this::setMiniBloodSamplePos)
@ -133,9 +120,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniBloodSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniBloodSamplePos).z);
page.addFunction("取样结束位置", this::setMiniBloodSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniBloodSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniBloodSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.MiniBloodSampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.MiniBloodSampleEndPos));
page.newGroup("子弹头试管1.5mL");
page.addFunction("取样位置", this::setBulltube1P5SamplePos)
@ -143,9 +128,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube1P5SamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube1P5SamplePos).z);
page.addFunction("取样结束位置", this::setBulltube1P5SampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube1P5SampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube1P5SampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube1P5SampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.Bulltube1P5SampleEndPos));
page.newGroup("子弹头试管0.5mL");
page.addFunction("取样位置", this::setBulltube0P5SamplePos)
@ -153,9 +136,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube0P5SamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube0P5SamplePos).z);
page.addFunction("取样结束位置", this::setBulltube0P5SampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube0P5SampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube0P5SampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.Bulltube0P5SampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.Bulltube0P5SampleEndPos));
page.newGroup("粪便试管");
page.addFunction("取样位置", this::setStoolTestTubeSamplePos)
@ -163,9 +144,7 @@ public class P25HbotSamplePosCalibrationPage {
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.StoolTestTubeSamplePos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.StoolTestTubeSamplePos).z);
page.addFunction("取样结束位置", this::setStoolTestTubeSampleEndPos)
.setParamVal("x", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.StoolTestTubeSampleEndPos).x)
.setParamVal("y", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.StoolTestTubeSampleEndPos).y)
.setParamVal("z", () -> hbotSamplePosParamMgr.getSamplePos(HbotSamplePos.StoolTestTubeSampleEndPos).z);
.setParamVal("z", () -> hbotSamplePosParamMgr.getZPos(HbotSamplePos.StoolTestTubeSampleEndPos));
extApiPageMgr.addPage(page);
}

10
src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java

@ -5,6 +5,7 @@ package a8k.extui.page.test.verification;
import a8k.app.type.exception.AppException;
import a8k.app.type.param.hbotpos.HbotSamplePos;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.type.param.type.A8kSamplePos;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -15,10 +16,14 @@ public class P33HbotSamplePosVerificationPage {
@Resource
HbotMoveExCtrlService hbotMoveExCtrlService;
public void moveToSamplePos(HbotSamplePos samplePos) throws AppException {
hbotMoveExCtrlService.moveToSamplePos(samplePos);
public void moveToSamplePos(A8kSamplePos a8kSamplePos) throws AppException {
hbotMoveExCtrlService.moveToSampleStartPos(a8kSamplePos);
}
public void moveToSampleEndPos(A8kSamplePos a8kSamplePos) throws AppException {
hbotMoveExCtrlService.moveToSampleEndPos(a8kSamplePos);
}
@Resource
ExtApiPageMgr extApiPageMgr;
@ -26,6 +31,7 @@ public class P33HbotSamplePosVerificationPage {
public void init() {
var page = extApiPageMgr.newPage(this);
page.addFunction("移动到样本位置", this::moveToSamplePos);
page.addFunction("移动到样本结束位置", this::moveToSampleEndPos);
extApiPageMgr.addPage(page);
}

8
src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java

@ -264,9 +264,11 @@ public class P51FullFlowVerificationPage {
} else {
samplePos = A8kSamplePos.BloodSTubePos;
}
} else if (tubeHolderType.equals(A8kTubeHolderType.MiniTube)) {
samplePos = A8kSamplePos.MiniTubePos;
} else if (tubeHolderType.equals(A8kTubeHolderType.MiniBlood)) {
}
// else if (tubeHolderType.equals(A8kTubeHolderType.MiniTube)) {
// samplePos = A8kSamplePos.MiniTubePos;
// }
else if (tubeHolderType.equals(A8kTubeHolderType.MiniBlood)) {
samplePos = A8kSamplePos.MiniBloodPos;
} else if (tubeHolderType.equals(A8kTubeHolderType.BulletTube1P5)) {
samplePos = A8kSamplePos.Bulltube1P5Pos;

122
src/main/resources/db/zapp_sub_module_reg_initial_value.csv

@ -113,24 +113,24 @@ id,mid,regIndex,regInitVal
112,ShakeModGripperZM,kreg_step_motor_shaft,0
113,ShakeModGripperZM,kreg_step_motor_one_circle_pulse,20
114,ShakeModGripperZM,kreg_step_motor_one_circle_pulse_denominator,1
115,ShakeModGripperZM,kreg_step_motor_default_velocity,700
115,ShakeModGripperZM,kreg_step_motor_default_velocity,1800
116,ShakeModGripperZM,kreg_step_motor_ihold,7
117,ShakeModGripperZM,kreg_step_motor_irun,10
117,ShakeModGripperZM,kreg_step_motor_irun,12
118,ShakeModGripperZM,kreg_step_motor_iholddelay,10
119,ShakeModGripperZM,kreg_step_motor_iglobalscaler,0
120,ShakeModGripperZM,kreg_step_motor_mres,0
120,ShakeModGripperZM,kreg_step_motor_mres,3
121,ShakeModGripperZM,kreg_step_motor_run_to_zero_speed,700
122,ShakeModGripperZM,kreg_step_motor_look_zero_edge_speed,200
123,ShakeModGripperZM,kreg_step_motor_max_d,0
124,ShakeModGripperZM,kreg_step_motor_min_d,0
125,ShakeModGripperZM,kreg_step_motor_in_debug_mode,0
126,ShakeModGripperZM,kreg_step_motor_vstart,50
127,ShakeModGripperZM,kreg_step_motor_a1,100
128,ShakeModGripperZM,kreg_step_motor_amax,300
129,ShakeModGripperZM,kreg_step_motor_v1,100
130,ShakeModGripperZM,kreg_step_motor_dmax,300
131,ShakeModGripperZM,kreg_step_motor_d1,100
132,ShakeModGripperZM,kreg_step_motor_vstop,50
126,ShakeModGripperZM,kreg_step_motor_vstart,200
127,ShakeModGripperZM,kreg_step_motor_a1,200
128,ShakeModGripperZM,kreg_step_motor_amax,500
129,ShakeModGripperZM,kreg_step_motor_v1,500
130,ShakeModGripperZM,kreg_step_motor_dmax,500
131,ShakeModGripperZM,kreg_step_motor_d1,200
132,ShakeModGripperZM,kreg_step_motor_vstop,200
133,ShakeModGripperZM,kreg_step_motor_tzerowait,0
134,ShakeModGripperZM,kreg_step_motor_enc_resolution,0
135,ShakeModGripperZM,kreg_step_motor_enable_enc,0
@ -166,8 +166,8 @@ id,mid,regIndex,regInitVal
165,ShakeModShakeM,kret_step_motor_io_trigger_append_distance,10
166,ShakeModGripperYSV,kreg_mini_servo_pos,115
167,ShakeModGripperYSV,kreg_mini_servo_limit_velocity,10000
168,ShakeModGripperYSV,kreg_mini_servo_limit_torque,500
169,ShakeModGripperYSV,kreg_mini_servo_protective_torque,800
168,ShakeModGripperYSV,kreg_mini_servo_limit_torque,400
169,ShakeModGripperYSV,kreg_mini_servo_protective_torque,900
170,ShakeModGripperYSV,kreg_mini_servo_target_pos_tolerance,15
171,ShakeModGripperSV,kreg_mini_servo_pos,1503
172,ShakeModGripperSV,kreg_mini_servo_limit_velocity,10000
@ -189,6 +189,9 @@ id,mid,regIndex,regInitVal
188,ShakeModLiftingSV,kreg_mini_servo_limit_torque,100
189,ShakeModLiftingSV,kreg_mini_servo_protective_torque,800
190,ShakeModLiftingSV,kreg_mini_servo_target_pos_tolerance,30
191,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_target,250
192,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_nowoutput,0
193,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_feedbackval,267
194,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_kp,6000
195,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_ki,100
196,PlatesBoxTCM,kreg_water_cooling_tmp_controler_pid_kd,0
@ -410,4 +413,97 @@ id,mid,regIndex,regInitVal
418,OptMod,kreg_a8k_opt_scan_tzerowait,0
419,PipetteMod,kreg_pipette_zm_pos_devi_tolerance,0
420,PipetteMod,kreg_pipette_zm_io_trigger_append_distance,0
421,PipetteMod,kreg_pipette_zm_mres,2
421,PipetteMod,kreg_pipette_zm_mres,2
422,PlatesBoxYM,kreg_step_motor_low_velocity,0
423,PlatesBoxYM,kreg_step_motor_mid_velocity,0
424,PlatesBoxYM,kreg_step_motor_high_velocity,0
425,PlatesBoxPusherM,kreg_step_motor_low_velocity,0
426,PlatesBoxPusherM,kreg_step_motor_mid_velocity,0
427,PlatesBoxPusherM,kreg_step_motor_high_velocity,0
428,ShakeModClampingM,kreg_step_motor_low_velocity,0
429,ShakeModClampingM,kreg_step_motor_mid_velocity,0
430,ShakeModClampingM,kreg_step_motor_high_velocity,0
431,ShakeModGripperZM,kreg_step_motor_low_velocity,400
432,ShakeModGripperZM,kreg_step_motor_mid_velocity,1800
433,ShakeModGripperZM,kreg_step_motor_high_velocity,1800
434,ShakeModShakeM,kreg_step_motor_low_velocity,0
435,ShakeModShakeM,kreg_step_motor_mid_velocity,0
436,ShakeModShakeM,kreg_step_motor_high_velocity,0
437,FeedingModInfeedM,kreg_step_motor_low_velocity,0
438,FeedingModInfeedM,kreg_step_motor_mid_velocity,0
439,FeedingModInfeedM,kreg_step_motor_high_velocity,0
440,FeedingModXM,kreg_step_motor_low_velocity,0
441,FeedingModXM,kreg_step_motor_mid_velocity,0
442,FeedingModXM,kreg_step_motor_high_velocity,0
443,FeedingModOutfeedM,kreg_step_motor_low_velocity,0
444,FeedingModOutfeedM,kreg_step_motor_mid_velocity,0
445,FeedingModOutfeedM,kreg_step_motor_high_velocity,0
446,IncubatorRotateCtrlM,kreg_step_motor_low_velocity,0
447,IncubatorRotateCtrlM,kreg_step_motor_mid_velocity,0
448,IncubatorRotateCtrlM,kreg_step_motor_high_velocity,0
449,OptModScannerM,kreg_step_motor_low_velocity,0
450,OptModScannerM,kreg_step_motor_mid_velocity,0
451,OptModScannerM,kreg_step_motor_high_velocity,0
452,OptModPullM,kreg_step_motor_low_velocity,0
453,OptModPullM,kreg_step_motor_mid_velocity,0
454,OptModPullM,kreg_step_motor_high_velocity,0
455,ShakeModGripperYSV,kreg_mini_servo_servo_min_angle,0
456,ShakeModGripperYSV,kreg_mini_servo_servo_max_angle,4095
457,ShakeModGripperYSV,kreg_mini_servo_servo_max_temp,70
458,ShakeModGripperYSV,kreg_mini_servo_servo_max_voltage,90
459,ShakeModGripperYSV,kreg_mini_servo_servo_min_voltage,35
460,ShakeModGripperYSV,kreg_mini_servo_servo_max_torque,1000
461,ShakeModGripperYSV,kreg_mini_servo_servo_unload_condition,44
462,ShakeModGripperYSV,kreg_mini_servo_servo_protect_current,500
463,ShakeModGripperYSV,kreg_mini_servo_servo_protect_torque,20
464,ShakeModGripperYSV,kreg_mini_servo_servo_protect_time,200
465,ShakeModGripperYSV,kreg_mini_servo_servo_overload_torque,80
466,ShakeModGripperYSV,kreg_mini_servo_servo_acc,0
467,ShakeModGripperSV,kreg_mini_servo_servo_min_angle,0
468,ShakeModGripperSV,kreg_mini_servo_servo_max_angle,4095
469,ShakeModGripperSV,kreg_mini_servo_servo_max_temp,70
470,ShakeModGripperSV,kreg_mini_servo_servo_max_voltage,90
471,ShakeModGripperSV,kreg_mini_servo_servo_min_voltage,40
472,ShakeModGripperSV,kreg_mini_servo_servo_max_torque,1000
473,ShakeModGripperSV,kreg_mini_servo_servo_unload_condition,44
474,ShakeModGripperSV,kreg_mini_servo_servo_protect_current,500
475,ShakeModGripperSV,kreg_mini_servo_servo_protect_torque,20
476,ShakeModGripperSV,kreg_mini_servo_servo_protect_time,200
477,ShakeModGripperSV,kreg_mini_servo_servo_overload_torque,80
478,ShakeModGripperSV,kreg_mini_servo_servo_acc,0
479,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_min_angle,0
480,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_max_angle,4095
481,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_max_temp,70
482,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_max_voltage,90
483,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_min_voltage,40
484,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_max_torque,1000
485,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_unload_condition,44
486,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_protect_current,500
487,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_protect_torque,20
488,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_protect_time,200
489,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_overload_torque,80
490,ShakeModTubeScanerClampingSV,kreg_mini_servo_servo_acc,0
491,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_min_angle,20
492,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_max_angle,1003
493,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_max_temp,70
494,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_max_voltage,90
495,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_min_voltage,45
496,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_max_torque,1000
497,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_unload_condition,32
498,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_protect_current,256
499,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_protect_torque,0
500,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_protect_time,0
501,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_overload_torque,0
502,ShakeModTubeScanerRotateSV,kreg_mini_servo_servo_acc,0
503,ShakeModLiftingSV,kreg_mini_servo_servo_min_angle,20
504,ShakeModLiftingSV,kreg_mini_servo_servo_max_angle,1003
505,ShakeModLiftingSV,kreg_mini_servo_servo_max_temp,70
506,ShakeModLiftingSV,kreg_mini_servo_servo_max_voltage,90
507,ShakeModLiftingSV,kreg_mini_servo_servo_min_voltage,45
508,ShakeModLiftingSV,kreg_mini_servo_servo_max_torque,1000
509,ShakeModLiftingSV,kreg_mini_servo_servo_unload_condition,32
510,ShakeModLiftingSV,kreg_mini_servo_servo_protect_current,256
511,ShakeModLiftingSV,kreg_mini_servo_servo_protect_torque,0
512,ShakeModLiftingSV,kreg_mini_servo_servo_protect_time,0
513,ShakeModLiftingSV,kreg_mini_servo_servo_overload_torque,0
514,ShakeModLiftingSV,kreg_mini_servo_servo_acc,0
Loading…
Cancel
Save