diff --git a/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java b/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java index 738ad77..a78a705 100644 --- a/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java +++ b/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) { diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java index 84c1625..51b74d7 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java +++ b/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); diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java index ef03de1..40e631a 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java +++ b/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 { diff --git a/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java b/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java index afac38e..c447c8a 100644 --- a/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java +++ b/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; diff --git a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java b/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java index d1b767f..017020a 100644 --- a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java +++ b/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); } diff --git a/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java b/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java index 15c69e9..4dedb03 100644 --- a/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java +++ b/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 { diff --git a/src/main/java/a8k/app/hardware/type/A8kEcode.java b/src/main/java/a8k/app/hardware/type/A8kEcode.java index 20459a8..2f73770 100644 --- a/src/main/java/a8k/app/hardware/type/A8kEcode.java +++ b/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卡检验错误 diff --git a/src/main/java/a8k/app/hardware/type/CmdId.java b/src/main/java/a8k/app/hardware/type/CmdId.java index 5b8ad18..6a227cc 100644 --- a/src/main/java/a8k/app/hardware/type/CmdId.java +++ b/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"),// diff --git a/src/main/java/a8k/app/hardware/type/MiniServoRegIndex.java b/src/main/java/a8k/app/hardware/type/MiniServoRegIndex.java index a606740..1c8c33b 100644 --- a/src/main/java/a8k/app/hardware/type/MiniServoRegIndex.java +++ b/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; diff --git a/src/main/java/a8k/app/hardware/type/ModuleStatus.java b/src/main/java/a8k/app/hardware/type/ModuleStatus.java index 46044a6..d1c09b4 100644 --- a/src/main/java/a8k/app/hardware/type/ModuleStatus.java +++ b/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]; } diff --git a/src/main/java/a8k/app/hardware/type/RegIndex.java b/src/main/java/a8k/app/hardware/type/RegIndex.java index f6b25f1..15b2d3d 100644 --- a/src/main/java/a8k/app/hardware/type/RegIndex.java +++ b/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; diff --git a/src/main/java/a8k/app/hardware/type/StepMotorRegIndex.java b/src/main/java/a8k/app/hardware/type/StepMotorRegIndex.java index 9303832..515f93f 100644 --- a/src/main/java/a8k/app/hardware/type/StepMotorRegIndex.java +++ b/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; diff --git a/src/main/java/a8k/app/hardware/type/StepMotorSpeedLevel.java b/src/main/java/a8k/app/hardware/type/StepMotorSpeedLevel.java new file mode 100644 index 0000000..47feb45 --- /dev/null +++ b/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, + ; +} diff --git a/src/main/java/a8k/app/i18n/Internationalization.java b/src/main/java/a8k/app/i18n/Internationalization.java index 42dfc8d..b589f51 100644 --- a/src/main/java/a8k/app/i18n/Internationalization.java +++ b/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 -> "项目卡配置的函数数量与项目配置不匹配"; diff --git a/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java index 58ffa4b..5299bcd 100644 --- a/src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java +++ b/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; } } diff --git a/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java index d4435e9..a8022d7 100644 --- a/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java +++ b/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; diff --git a/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java index f978dda..fa17c1c 100644 --- a/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java +++ b/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); diff --git a/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleCtrlService.java index f2e2834..01a6096 100644 --- a/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleCtrlService.java +++ b/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()); } diff --git a/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleExCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleExCtrlService.java index 8a12477..9996b82 100644 --- a/src/main/java/a8k/app/service/lowerctrl/TubePreProcesModuleExCtrlService.java +++ b/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移动到待机位 diff --git a/src/main/java/a8k/app/service/param/hbotpos/HbotSamplePosParamMgr.java b/src/main/java/a8k/app/service/param/hbotpos/HbotSamplePosParamMgr.java index f39f50e..b088b96 100644 --- a/src/main/java/a8k/app/service/param/hbotpos/HbotSamplePosParamMgr.java +++ b/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); }; } } diff --git a/src/main/java/a8k/app/service/param/pipetteparam/PipetteGunLLFParamMgr.java b/src/main/java/a8k/app/service/param/pipetteparam/PipetteGunLLFParamMgr.java index d6a4cac..b9770b5 100644 --- a/src/main/java/a8k/app/service/param/pipetteparam/PipetteGunLLFParamMgr.java +++ b/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); diff --git a/src/main/java/a8k/app/type/a8k/A8kTubeHolderType.java b/src/main/java/a8k/app/type/a8k/A8kTubeHolderType.java index a3e3426..f8d49ee 100644 --- a/src/main/java/a8k/app/type/a8k/A8kTubeHolderType.java +++ b/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 diff --git a/src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java b/src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java index 3405206..e9c2458 100644 --- a/src/main/java/a8k/app/type/a8k/state/ProjectTaskContext.java +++ b/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; diff --git a/src/main/java/a8k/app/type/param/hbotpos/HbotSamplePos.java b/src/main/java/a8k/app/type/param/hbotpos/HbotSamplePos.java index 21e1b26..a20e47d 100644 --- a/src/main/java/a8k/app/type/param/hbotpos/HbotSamplePos.java +++ b/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; diff --git a/src/main/java/a8k/app/type/param/type/A8kSamplePos.java b/src/main/java/a8k/app/type/param/type/A8kSamplePos.java index 218e16d..6bdb950 100644 --- a/src/main/java/a8k/app/type/param/type/A8kSamplePos.java +++ b/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>"), diff --git a/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java index 304990b..b373093 100644 --- a/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java +++ b/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)); diff --git a/src/main/java/a8k/extui/page/extapp/P01PipetteGunVerification.java b/src/main/java/a8k/extui/page/extapp/P01PipetteGunVerification.java index bb8ed67..f045974 100644 --- a/src/main/java/a8k/extui/page/extapp/P01PipetteGunVerification.java +++ b/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); diff --git a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P25HbotSamplePosCalibrationPage.java b/src/main/java/a8k/extui/page/extsetting/pos_calibration/P25HbotSamplePosCalibrationPage.java index 9032fd3..7785c83 100644 --- a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P25HbotSamplePosCalibrationPage.java +++ b/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); } diff --git a/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java index 11e4b8c..4971af4 100644 --- a/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java +++ b/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); } diff --git a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java index 72097f9..a559de9 100644 --- a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java +++ b/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; diff --git a/src/main/resources/db/zapp_sub_module_reg_initial_value.csv b/src/main/resources/db/zapp_sub_module_reg_initial_value.csv index f5593d5..26e77cc 100644 --- a/src/main/resources/db/zapp_sub_module_reg_initial_value.csv +++ b/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 \ No newline at end of file +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 \ No newline at end of file