|
|
@ -150,6 +150,7 @@ int32_t PipetteModule::pipette_get_zmbcfg(zm_bcfg_index_t index, int32_t *val) { |
|
|
|
return err::kparam_out_of_range; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PipetteModule::pipette_set_pmbcfg(pm_bcfg_index_t index, int32_t val) { |
|
|
@ -188,7 +189,7 @@ int32_t PipetteModule::pipette_set_platinfo(int32_t cpyid, platinfo_index_t inde |
|
|
|
SET_CFG(kplatinfo_tip_picking_search_range, platinfo->tip_picking_search_range, val); |
|
|
|
SET_CFG(kplatinfo_tip_picking_append_distance, platinfo->tip_picking_append_distance, val); |
|
|
|
SET_CFG(kplatinfo_tip_deposit_pos, platinfo->tip_deposit_pos, val); |
|
|
|
SET_CFG(kplatinfo_transform_pos, platinfo->transform_pos, val); |
|
|
|
SET_CFG(kplatinfo_transform_pos, platinfo->_transform_pos, val); |
|
|
|
SET_CFG(kplatinfo_tip_type, platinfo->tip_type, val); |
|
|
|
SET_CFG(kplatinfo_tip_length, platinfo->tip_length, val); |
|
|
|
SET_CFG(kplatinfo_mark, platinfo->mark, val); |
|
|
@ -212,7 +213,7 @@ int32_t PipetteModule::pipette_get_platinfo(int32_t cpyid, platinfo_index_t inde |
|
|
|
GET_CFG(kplatinfo_tip_picking_search_range, platinfo->tip_picking_search_range, val); |
|
|
|
GET_CFG(kplatinfo_tip_picking_append_distance, platinfo->tip_picking_append_distance, val); |
|
|
|
GET_CFG(kplatinfo_tip_deposit_pos, platinfo->tip_deposit_pos, val); |
|
|
|
GET_CFG(kplatinfo_transform_pos, platinfo->transform_pos, val); |
|
|
|
GET_CFG(kplatinfo_transform_pos, platinfo->_transform_pos, val); |
|
|
|
GET_CFG(kplatinfo_tip_type, platinfo->tip_type, val); |
|
|
|
GET_CFG(kplatinfo_tip_length, platinfo->tip_length, val); |
|
|
|
GET_CFG(kplatinfo_mark, platinfo->mark, val); |
|
|
@ -245,6 +246,11 @@ int32_t PipetteModule::pipette_set_zmvcfg(int32_t cpyid, zm_vcfg_index_t index, |
|
|
|
return err::kparam_out_of_range; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (cpyid == m_state.zm_now_vcfg_index) { |
|
|
|
m_state.zm_now_vcfg_index = -1; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PipetteModule::pipette_get_zmvcfg(int32_t cpyid, zm_vcfg_index_t index, int32_t *val) { |
|
|
@ -289,6 +295,11 @@ int32_t PipetteModule::pipette_set_pmvcfg(int32_t cpyid, pm_vcfg_index_t index, |
|
|
|
return err::kparam_out_of_range; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (cpyid == m_state.pm_now_vcfg_index) { |
|
|
|
m_state.pm_now_vcfg_index = -1; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PipetteModule::pipette_get_pmvcfg(int32_t cpyid, pm_vcfg_index_t index, int32_t *val) { |
|
|
@ -376,14 +387,14 @@ int32_t PipetteModule::pipette_set_liquid_info(int32_t cpyid, liquid_info_index_ |
|
|
|
|
|
|
|
liquid_info_t *cfg = &m_liquid_info[cpyid]; |
|
|
|
switch (index) { |
|
|
|
SET_CFG(kliquid_info_plld_pm_vindex, cfg->plld_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_plld_pm_vcpyid, cfg->plld_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_plld_threshold, cfg->plld_threshold, val); |
|
|
|
SET_CFG(kliquid_info_plld_zm_vel, cfg->plld_zm_vel, val); |
|
|
|
SET_CFG(kliquid_info_empty_tip_pm_vindex, cfg->empty_tip_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_empty_tip_pm_vcpyid, cfg->empty_tip_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_blowout_air_volume, cfg->blowout_air_volume, val); |
|
|
|
SET_CFG(kliquid_info_blowout_air_pm_vindex, cfg->blowout_air_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_blowout_air_pm_vcpyid, cfg->blowout_air_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_over_aspirated_volume, cfg->over_aspirated_volume, val); |
|
|
|
SET_CFG(kliquid_info_over_aspirated_pm_vindex, cfg->over_aspirated_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_over_aspirated_pm_vcpyid, cfg->over_aspirated_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_aspiration_pm_vindex_low, cfg->aspiration_pm_vindex_low, val); |
|
|
|
SET_CFG(kliquid_info_aspiration_pm_vindex_high, cfg->aspiration_pm_vindex_high, val); |
|
|
|
SET_CFG(kliquid_info_aspiration_volume_break_val, cfg->aspiration_volume_break_val, val); |
|
|
@ -391,8 +402,8 @@ int32_t PipetteModule::pipette_set_liquid_info(int32_t cpyid, liquid_info_index_ |
|
|
|
SET_CFG(kliquid_info_volume_calibration_coefficient_k, cfg->volume_calibration_coefficient_k, val); |
|
|
|
SET_CFG(kliquid_info_settling_time, cfg->settling_time, val); |
|
|
|
SET_CFG(kliquid_info_transport_volume, cfg->transport_volume, val); |
|
|
|
SET_CFG(kliquid_info_transport_volume_pm_vindex, cfg->transport_volume_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_mix_pm_vindex, cfg->mix_pm_vindex, val); |
|
|
|
SET_CFG(kliquid_info_transport_volume_pm_vcpyid, cfg->transport_volume_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_mix_pm_vindex, cfg->mix_pm_vcpyid, val); |
|
|
|
SET_CFG(kliquid_info_mark, cfg->mark, val); |
|
|
|
|
|
|
|
default: { |
|
|
@ -410,14 +421,14 @@ int32_t PipetteModule::pipette_get_liquid_info(int32_t cpyid, liquid_info_index_ |
|
|
|
|
|
|
|
liquid_info_t *cfg = &m_liquid_info[cpyid]; |
|
|
|
switch (index) { |
|
|
|
GET_CFG(kliquid_info_plld_pm_vindex, cfg->plld_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_plld_pm_vcpyid, cfg->plld_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_plld_threshold, cfg->plld_threshold, val); |
|
|
|
GET_CFG(kliquid_info_plld_zm_vel, cfg->plld_zm_vel, val); |
|
|
|
GET_CFG(kliquid_info_empty_tip_pm_vindex, cfg->empty_tip_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_empty_tip_pm_vcpyid, cfg->empty_tip_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_blowout_air_volume, cfg->blowout_air_volume, val); |
|
|
|
GET_CFG(kliquid_info_blowout_air_pm_vindex, cfg->blowout_air_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_blowout_air_pm_vcpyid, cfg->blowout_air_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_over_aspirated_volume, cfg->over_aspirated_volume, val); |
|
|
|
GET_CFG(kliquid_info_over_aspirated_pm_vindex, cfg->over_aspirated_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_over_aspirated_pm_vcpyid, cfg->over_aspirated_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_aspiration_pm_vindex_low, cfg->aspiration_pm_vindex_low, val); |
|
|
|
GET_CFG(kliquid_info_aspiration_pm_vindex_high, cfg->aspiration_pm_vindex_high, val); |
|
|
|
GET_CFG(kliquid_info_aspiration_volume_break_val, cfg->aspiration_volume_break_val, val); |
|
|
@ -425,8 +436,8 @@ int32_t PipetteModule::pipette_get_liquid_info(int32_t cpyid, liquid_info_index_ |
|
|
|
GET_CFG(kliquid_info_volume_calibration_coefficient_k, cfg->volume_calibration_coefficient_k, val); |
|
|
|
GET_CFG(kliquid_info_settling_time, cfg->settling_time, val); |
|
|
|
GET_CFG(kliquid_info_transport_volume, cfg->transport_volume, val); |
|
|
|
GET_CFG(kliquid_info_transport_volume_pm_vindex, cfg->transport_volume_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_mix_pm_vindex, cfg->mix_pm_vindex, val); |
|
|
|
GET_CFG(kliquid_info_transport_volume_pm_vcpyid, cfg->transport_volume_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_mix_pm_vindex, cfg->mix_pm_vcpyid, val); |
|
|
|
GET_CFG(kliquid_info_mark, cfg->mark, val); |
|
|
|
default: { |
|
|
|
ZLOGE(TAG, "pipette_get_liquid_info index %d out of range", index); |
|
|
@ -666,33 +677,7 @@ int32_t PipetteModule::pipette_zmotor_move_to(int32_t tox) { |
|
|
|
* @return int32_t |
|
|
|
*/ |
|
|
|
int32_t PipetteModule::pipette_zmotor_move_to_zero_point_quick() { |
|
|
|
thread_start_work(__FUNCTION__, [this]() { |
|
|
|
// 期望偏差
|
|
|
|
int32_t expectation_dpos = -zmbcfg.io_trigger_append_distance + 0 + zmbcfg.dzero - zm_get_now_pos(); |
|
|
|
int32_t startpos = zm_get_now_pos(); |
|
|
|
if (!zm0p_is_trigger()) { |
|
|
|
// 快速移动到零点
|
|
|
|
// moveTo(0 + zmbcfg.dzero, zmbcfg.default_velocity);
|
|
|
|
zm_move_to(0 + zmbcfg.dzero, kzm_v_default, 0); |
|
|
|
zm_waitfor_zm0p_trigger_and_stop_motor(NULL); |
|
|
|
} else { |
|
|
|
// 快速移动到零点
|
|
|
|
zm_move_to(0 + zmbcfg.dzero, kzm_v_default, 0); |
|
|
|
zm_waitfor_zm0p_not_trigger_and_stop_motor(NULL); |
|
|
|
} |
|
|
|
// 移动到零点
|
|
|
|
do_zm_move_0p(); |
|
|
|
|
|
|
|
// 校验偏差
|
|
|
|
int32_t dpos = zm_get_now_pos() - startpos; |
|
|
|
// 设置零点
|
|
|
|
zm_set_now_pos(0 + zmbcfg.dzero - zmbcfg.io_trigger_append_distance); |
|
|
|
m_state.zm_has_move_zero = 1; |
|
|
|
|
|
|
|
if (zmbcfg.pos_devi_tolerance != 0 && (abs(expectation_dpos - dpos) > zmbcfg.pos_devi_tolerance)) { |
|
|
|
throw zapp_exception(err::kstep_motor_lost_step); |
|
|
|
} |
|
|
|
}); |
|
|
|
thread_start_work(__FUNCTION__, [this]() { zm_move_to_zero_quick_block(); }); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@ -720,7 +705,7 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
* -> 直到tip状态被触发停止移动 |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = &m_now_platinfo; |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
zm_move_to_block(platform_info->tip_picking_pos, kzm_v_default, 0); |
|
|
|
zm_move_by(platform_info->tip_picking_search_range, kzm_v_picking_tip, 0); |
|
|
|
bool takeTip = false; |
|
|
@ -738,7 +723,7 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
if (takeTip && platform_info->tip_picking_append_distance > 0) //
|
|
|
|
zm_move_by_block(platform_info->tip_picking_append_distance, kzm_v_picking_tip, 0); |
|
|
|
|
|
|
|
zm_move_to_block(platform_info->transform_pos, kzm_v_default, 0); |
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
ZLOGI(TAG, "pipette_pump_take_tip takeTip %s", takeTip ? "suc" : "fail"); |
|
|
|
}); |
|
|
|
return 0; |
|
|
@ -752,7 +737,7 @@ int32_t PipetteModule::pipette_pump_putbak_tip() { |
|
|
|
* -> 丢tip |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = &m_now_platinfo; |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
int32_t putbakpos = platform_info->tip_picking_pos - 100; |
|
|
|
if (putbakpos < 0) putbakpos = 0; |
|
|
|
zm_move_to_block(putbakpos, kzm_v_default, 0); |
|
|
@ -762,7 +747,7 @@ int32_t PipetteModule::pipette_pump_putbak_tip() { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_init()); |
|
|
|
pump_waitfor_stop(); |
|
|
|
|
|
|
|
zm_move_to_block(platform_info->transform_pos, kzm_v_default, 0); |
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
}); |
|
|
|
|
|
|
|
return 0; |
|
|
@ -777,15 +762,17 @@ int32_t PipetteModule::pipette_pump_deposit_tip() { |
|
|
|
* -> 丢tip |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = &m_now_platinfo; |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
zm_move_to_block(platform_info->tip_deposit_pos, kzm_v_default, 0); |
|
|
|
|
|
|
|
pump_apply_vcfg(kpm_v_max); //
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_put_tip());
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_init()); |
|
|
|
while (pump_read_tip_state() != 0) { |
|
|
|
thread_delay(1); |
|
|
|
} |
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
pump_waitfor_stop(); |
|
|
|
|
|
|
|
zm_move_to_block(platform_info->transform_pos, kzm_v_default, 0); |
|
|
|
}); |
|
|
|
|
|
|
|
return 0; |
|
|
@ -795,11 +782,12 @@ int32_t PipetteModule::pipette_pump_pierce_through(int32_t container_info_index, |
|
|
|
// check param
|
|
|
|
check_container_info_cpyid(container_info_index); |
|
|
|
|
|
|
|
platinfo_t *platform_info = &m_now_platinfo; |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
container_info_t *container_info = get_container_info_smart(container_info_index, &m_now_container_info); |
|
|
|
|
|
|
|
zm_move_to_block(container_info->pierce_depth + container_pos, kzm_v_default, 0); |
|
|
|
zm_move_to_block(platform_info->transform_pos, kzm_v_default, 0); |
|
|
|
|
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
}); |
|
|
|
return 0; |
|
|
|
} |
|
|
@ -866,7 +854,7 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
thread_start_work(__FUNCTION__, [this]() { |
|
|
|
ZLOGI(TAG, "pipette_pump_aspirate"); |
|
|
|
if (pump_read_tip_state() == 0) { |
|
|
|
throw zapp_exception(err::kpipette_error_no_tip_when_lld); |
|
|
|
throw zapp_exception(err::kpipette_error_TipDrop); |
|
|
|
} |
|
|
|
aspiration_param_t *acfg = &m_aspiration_param; |
|
|
|
check_pipette_pump_aspirate_params(); |
|
|
@ -875,7 +863,11 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_enable_temp_compensation(0)); // 关闭温度补偿
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_back_clearance(0)); // 设置背隙为0
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_io1_mode(0)); // lld输入高
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_io2_mode(0)); // 通用输入
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_set_io2_mode(0)); // 通用输入
|
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
liquid_info_t *liquidinfo = get_liquid_info_smart(acfg->liquid_cfg_index, &aspirate_run_cxt.liquid_info); |
|
|
|
container_info_t *container_cfg = get_container_info_smart(acfg->container_info_index, &aspirate_run_cxt.container_info); |
|
|
|
|
|
|
|
ZLOGI(TAG, "-------------------------- aspiration param --------------------------"); |
|
|
|
ZLOGI(TAG, "- x100nl :%d", acfg->volumeX100nl); |
|
|
@ -892,23 +884,81 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
ZLOGI(TAG, "- mix_times :%d", acfg->mix_times); |
|
|
|
ZLOGI(TAG, "-"); |
|
|
|
|
|
|
|
// aspirate_run_cxt
|
|
|
|
platinfo_t *platform_info = &m_now_platinfo; |
|
|
|
liquid_info_t *liquidinfo = get_liquid_info_smart(acfg->liquid_cfg_index, &aspirate_run_cxt.liquid_info); |
|
|
|
container_info_t *container_cfg = get_container_info_smart(acfg->container_info_index, &aspirate_run_cxt.container_info); |
|
|
|
ZLOGI(TAG, "-------------------------- platform_info --------------------------"); |
|
|
|
ZLOGI(TAG, "- tip_type :%d", platform_info->tip_type); |
|
|
|
ZLOGI(TAG, "- tip_length :%d", platform_info->tip_length); |
|
|
|
ZLOGI(TAG, "-"); |
|
|
|
|
|
|
|
ZLOGI(TAG, "-------------------------- liquid_info --------------------------"); |
|
|
|
ZLOGI(TAG, "- plld_pm_vindex :%d", liquidinfo->plld_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- plld_threshold :%d", liquidinfo->plld_threshold); |
|
|
|
ZLOGI(TAG, "- plld_zm_vel :%d", liquidinfo->plld_zm_vel); |
|
|
|
ZLOGI(TAG, "- empty_tip_pm_vindex :%d", liquidinfo->empty_tip_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- blowout_air_volume :%d", liquidinfo->blowout_air_volume); |
|
|
|
ZLOGI(TAG, "- blowout_air_pm_vindex :%d", liquidinfo->blowout_air_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- over_aspirated_volume :%d", liquidinfo->over_aspirated_volume); |
|
|
|
ZLOGI(TAG, "- over_aspirated_pm_vindex :%d", liquidinfo->over_aspirated_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- aspiration_pm_vindex_low :%d", liquidinfo->aspiration_pm_vindex_low); |
|
|
|
ZLOGI(TAG, "- aspiration_pm_vindex_high :%d", liquidinfo->aspiration_pm_vindex_high); |
|
|
|
ZLOGI(TAG, "- aspiration_volume_break_val :%d", liquidinfo->aspiration_volume_break_val); |
|
|
|
ZLOGI(TAG, "- volume_calibration_coefficient_b :%d", liquidinfo->volume_calibration_coefficient_b); |
|
|
|
ZLOGI(TAG, "- volume_calibration_coefficient_k :%d", liquidinfo->volume_calibration_coefficient_k); |
|
|
|
ZLOGI(TAG, "- settling_time :%d", liquidinfo->settling_time); |
|
|
|
ZLOGI(TAG, "- transport_volume :%d", liquidinfo->transport_volume); |
|
|
|
ZLOGI(TAG, "- transport_volume_pm_vindex :%d", liquidinfo->transport_volume_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- mix_pm_vindex :%d", liquidinfo->mix_pm_vcpyid); |
|
|
|
ZLOGI(TAG, "- mark :%d", liquidinfo->mark); |
|
|
|
ZLOGI(TAG, "-"); |
|
|
|
|
|
|
|
ZLOGI(TAG, "-------------------------- container_info --------------------------"); |
|
|
|
ZLOGI(TAG, "- container_type :%d", container_cfg->container_type); |
|
|
|
ZLOGI(TAG, "- container_neck_pos :%d", container_cfg->_container_neck_pos); |
|
|
|
ZLOGI(TAG, "- container_depth :%d", container_cfg->container_depth); |
|
|
|
ZLOGI(TAG, "- container_round :%d", container_cfg->container_round); |
|
|
|
ZLOGI(TAG, "- container_bottom_section_height :%d", container_cfg->container_bottom_section_height); |
|
|
|
ZLOGI(TAG, "- immersion_depth :%d", container_cfg->immersion_depth); |
|
|
|
ZLOGI(TAG, "- leaving_height :%d", container_cfg->leaving_height); |
|
|
|
ZLOGI(TAG, "- jet_height :%d", container_cfg->jet_height); |
|
|
|
ZLOGI(TAG, "- lld_start_search_depth :%d", container_cfg->lld_start_search_depth); |
|
|
|
ZLOGI(TAG, "- fix_aspiration_depth :%d", container_cfg->fix_aspiration_depth); |
|
|
|
ZLOGI(TAG, "- llf_vconvert_coneff :%d", container_cfg->llf_vconvert_coneff); |
|
|
|
ZLOGI(TAG, "- pierce_depth :%d", container_cfg->pierce_depth); |
|
|
|
ZLOGI(TAG, "- mark :%d", container_cfg->mark); |
|
|
|
ZLOGI(TAG, "-"); |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* LLD * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_tip_size((smtp2::TipSize_t)platform_info->tip_type)); // 250ul,
|
|
|
|
|
|
|
|
if (acfg->lld_enable) { |
|
|
|
// 液面探测
|
|
|
|
_do_lld(platform_info, container_cfg, liquidinfo, acfg); |
|
|
|
// 这里需要低速离开液面,防止携带液滴
|
|
|
|
ZLOGI(TAG, "move to swap position in v_swap"); |
|
|
|
zm_move_to_block(m_state.water_level - container_cfg->leaving_height, kzm_v_swap, 0); //
|
|
|
|
// 清空tip
|
|
|
|
ZLOGI(TAG, "clean tip."); |
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vcpyid); |
|
|
|
} else { |
|
|
|
// 没有使用lld,使用固定深度
|
|
|
|
m_state.water_level = acfg->container_pos + container_cfg->fix_aspiration_depth; |
|
|
|
ZLOGI(TAG, "lld isn't enable,use fix depth %d", m_state.water_level); |
|
|
|
zm_move_to_block(m_state.water_level - 150, kzm_v_default, 0); //
|
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vindex); // 清空tip
|
|
|
|
// 由于tip原本在液面之上,这里快速移动到swap位置,
|
|
|
|
ZLOGI(TAG, "move to swap position in v_default"); |
|
|
|
zm_move_to_block(m_state.water_level - container_cfg->leaving_height, kzm_v_default, 0); //
|
|
|
|
ZLOGI(TAG, "clean tip."); |
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vcpyid); //
|
|
|
|
} |
|
|
|
|
|
|
|
if (acfg->volumeX100nl != 0) { |
|
|
|
_do_sapirate(platform_info, container_cfg, liquidinfo, acfg); |
|
|
|
} else { |
|
|
|
ZLOGI(TAG, "aspiration volume == 0,skip aspirate", acfg->volumeX100nl); |
|
|
|
} |
|
|
|
_do_sapirate(platform_info, container_cfg, liquidinfo, acfg); |
|
|
|
|
|
|
|
// z轴移动transform_pos
|
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
}); |
|
|
|
return 0; |
|
|
|
} |
|
|
@ -916,12 +966,12 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
void PipetteModule::_do_lld(platinfo_t *platform_info, container_info_t *container_cfg, liquid_info_t *liquidinfo, aspiration_param_t *acfg) { |
|
|
|
int32_t ecode = 0; |
|
|
|
|
|
|
|
ZLOGI(TAG, "start lld, lld_type %d lld_pm_vindex %d plld_threshold %d", acfg->lld_type, liquidinfo->plld_pm_vindex, liquidinfo->plld_threshold); |
|
|
|
ZLOGI(TAG, "start lld, lld_type %d lld_pm_vindex %d plld_threshold %d", acfg->lld_type, liquidinfo->plld_pm_vcpyid, liquidinfo->plld_threshold); |
|
|
|
|
|
|
|
// 移动到转移位置
|
|
|
|
zm_move_to_block(0, kzm_v_default, 0); |
|
|
|
// 清空tip
|
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vindex); |
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vcpyid); |
|
|
|
|
|
|
|
// 移动到瓶口
|
|
|
|
zm_move_to_block(acfg->container_pos + 50 /*5mm*/, //
|
|
|
@ -929,7 +979,7 @@ void PipetteModule::_do_lld(platinfo_t *platform_info, container_info_t *contain |
|
|
|
pump_move_to_x100nl_block(0, kpm_v_default); // 回转一下,消除齿轮间隙
|
|
|
|
|
|
|
|
// 启动lld
|
|
|
|
pump_apply_vcfg(liquidinfo->plld_pm_vindex); // 设备lld时,泵的速率
|
|
|
|
pump_apply_vcfg(liquidinfo->plld_pm_vcpyid); // 设备lld时,泵的速率
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_tip_size(smtp2::TS200UL)); // 250ul,保护lld不超限
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_io1_mode(1)); // lld输入高
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_aspirate_plld(liquidinfo->plld_threshold)); |
|
|
@ -986,57 +1036,61 @@ void PipetteModule::_do_lld(platinfo_t *platform_info, container_info_t *contain |
|
|
|
} |
|
|
|
m_state.detected_liquid = 1; |
|
|
|
m_state.water_level = water_level; |
|
|
|
|
|
|
|
// 移动到液面上15mm
|
|
|
|
zm_move_to_block(m_state.water_level - 150, kzm_v_default, 0); // ? 这里是否考虑使用低速,离开液面
|
|
|
|
|
|
|
|
// 清空tip
|
|
|
|
pump_move_to_x100nl_block(0, liquidinfo->empty_tip_pm_vindex); |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::_do_sapirate(platinfo_t *platform_info, container_info_t *container_cfg, liquid_info_t *liquidinfo, aspiration_param_t *acfg) { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_tip_size(smtp2::TS200UL)); // 250ul,
|
|
|
|
|
|
|
|
// 吸入过量的空气
|
|
|
|
pump_move_to_x100nl_block(liquidinfo->blowout_air_volume, liquidinfo->blowout_air_pm_vindex); |
|
|
|
if (liquidinfo->blowout_air_volume > 0) { |
|
|
|
ZLOGI(TAG, "--> aspirate blowout_air_volume volume=%d, pm_vcpyid=%d", liquidinfo->blowout_air_volume); |
|
|
|
pump_move_to_x100nl_block(liquidinfo->blowout_air_volume, liquidinfo->blowout_air_pm_vcpyid); |
|
|
|
} else { |
|
|
|
ZLOGI(TAG, "--> aspirate blowout_air_volume volume=0,skip"); |
|
|
|
} |
|
|
|
|
|
|
|
// Z轴移动到液面之下
|
|
|
|
ZLOGI(TAG, "--> move below the liquid surface"); |
|
|
|
zm_move_to_block(m_state.water_level + container_cfg->immersion_depth, kzm_v_swap, 0); |
|
|
|
|
|
|
|
// 吸入润湿TIP的溶液
|
|
|
|
if (liquidinfo->over_aspirated_volume > 0) { |
|
|
|
pump_move_by_x100nl_block(liquidinfo->over_aspirated_volume, liquidinfo->over_aspirated_pm_vindex); |
|
|
|
pump_move_by_x100nl_block(-liquidinfo->over_aspirated_volume, liquidinfo->over_aspirated_pm_vindex); |
|
|
|
ZLOGI(TAG, "--> aspirate over_aspirated_volume volume=%d, pm_vcpyid=%d", liquidinfo->over_aspirated_volume, liquidinfo->over_aspirated_pm_vcpyid); |
|
|
|
pump_move_by_x100nl_block(liquidinfo->over_aspirated_volume, liquidinfo->over_aspirated_pm_vcpyid); |
|
|
|
pump_move_by_x100nl_block(-liquidinfo->over_aspirated_volume, liquidinfo->over_aspirated_pm_vcpyid); |
|
|
|
} |
|
|
|
|
|
|
|
// 吸入前混匀
|
|
|
|
if (acfg->mix_volume > 0) { |
|
|
|
ZLOGI(TAG, "--> aspirate mix_volume volume=%d, pm_vcpyid=%d", acfg->mix_volume, liquidinfo->mix_pm_vcpyid); |
|
|
|
int32_t mix_start_pos = zm_get_now_pos(); |
|
|
|
for (size_t i = 0; i < acfg->mix_times; i++) { |
|
|
|
if (acfg->mix_llf_enable > 0) { |
|
|
|
zm_move_to(acfg->container_pos + container_cfg->container_depth, // 瓶底
|
|
|
|
kzm_v_llf, // 基础速度配置
|
|
|
|
compute_zm_llf_vel(liquidinfo->mix_pm_vindex, container_cfg)); // 计算llf速度
|
|
|
|
compute_zm_llf_vel(liquidinfo->mix_pm_vcpyid, container_cfg)); // 计算llf速度
|
|
|
|
} |
|
|
|
pump_move_by_x100nl_block(acfg->mix_volume, liquidinfo->mix_pm_vindex); |
|
|
|
pump_move_by_x100nl_block(acfg->mix_volume, liquidinfo->mix_pm_vcpyid); |
|
|
|
if (acfg->mix_llf_enable > 0) zm_stop(); |
|
|
|
|
|
|
|
if (acfg->mix_llf_enable > 0) { |
|
|
|
zm_move_to(mix_start_pos, kzm_v_llf, compute_zm_llf_vel(liquidinfo->mix_pm_vindex, container_cfg)); |
|
|
|
zm_move_to(mix_start_pos, kzm_v_llf, compute_zm_llf_vel(liquidinfo->mix_pm_vcpyid, container_cfg)); |
|
|
|
} |
|
|
|
pump_move_by_x100nl_block(-acfg->mix_volume, liquidinfo->mix_pm_vindex); |
|
|
|
pump_move_by_x100nl_block(-acfg->mix_volume, liquidinfo->mix_pm_vcpyid); |
|
|
|
if (acfg->mix_llf_enable > 0) zm_stop(); |
|
|
|
} |
|
|
|
} else { |
|
|
|
ZLOGI(TAG, "--> aspirate mix_volume volume=0,skip"); |
|
|
|
} |
|
|
|
|
|
|
|
// !吸入液体(TODO:存储吸液压力曲线)!
|
|
|
|
{ |
|
|
|
ZLOGI(TAG, "--> aspirate volume=%d", acfg->volumeX100nl); |
|
|
|
int32_t aspiration_pm_index = liquidinfo->aspiration_pm_vindex_low; |
|
|
|
if (acfg->volumeX100nl > liquidinfo->aspiration_volume_break_val) { |
|
|
|
aspiration_pm_index = liquidinfo->aspiration_pm_vindex_high; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t x100nl = acfg->volumeX100nl * liquidinfo->volume_calibration_coefficient_k * 0.0001 + liquidinfo->volume_calibration_coefficient_b * 0.0001; |
|
|
|
int32_t x100nl = acfg->volumeX100nl * liquidinfo->volume_calibration_coefficient_k * 0.001 + //
|
|
|
|
liquidinfo->volume_calibration_coefficient_b * 0.001; |
|
|
|
|
|
|
|
if (acfg->llf_enable > 0) { |
|
|
|
zm_move_to( //
|
|
|
@ -1050,18 +1104,18 @@ void PipetteModule::_do_sapirate(platinfo_t *platform_info, container_info_t *co |
|
|
|
} |
|
|
|
|
|
|
|
// 等待一定时间
|
|
|
|
ZLOGI(TAG, "--> delay some time...(%d)", liquidinfo->settling_time); |
|
|
|
thread_delay(liquidinfo->settling_time); |
|
|
|
|
|
|
|
// 离开液面
|
|
|
|
zm_move_to_block(m_state.water_level - 150, kzm_v_swap, 0); //
|
|
|
|
ZLOGI(TAG, "--> leave liquid surface"); |
|
|
|
zm_move_to_block(m_state.water_level - container_cfg->leaving_height, kzm_v_swap, 0); //
|
|
|
|
|
|
|
|
// 吸入过量的空气
|
|
|
|
if (liquidinfo->transport_volume > 0) { |
|
|
|
pump_move_by_x100nl_block(liquidinfo->transport_volume, liquidinfo->transport_volume_pm_vindex); |
|
|
|
ZLOGI(TAG, "--> aspirate transport_volume volume=%d, pm_vcpyid=%d", liquidinfo->transport_volume, liquidinfo->transport_volume_pm_vcpyid); |
|
|
|
pump_move_by_x100nl_block(liquidinfo->transport_volume, liquidinfo->transport_volume_pm_vcpyid); |
|
|
|
} |
|
|
|
|
|
|
|
// z轴移动transform_pos
|
|
|
|
zm_move_to_block(0, kzm_v_default, 0); |
|
|
|
} |
|
|
|
|
|
|
|
int32_t PipetteModule::pipette_pump_distribu() { return 0; } |
|
|
@ -1105,14 +1159,14 @@ void PipetteModule::do_zm_move_0p() { |
|
|
|
// leave from zero
|
|
|
|
if (zm0p_is_trigger()) { |
|
|
|
ZLOGI(TAG, "leave from zero"); |
|
|
|
zm_move_by(50 /*10mm */, kzm_v_look_zero_edge, 0); |
|
|
|
zm_move_by(500 /*50mm */, kzm_v_look_zero_edge, 0); |
|
|
|
zm_waitfor_zm0p_not_trigger_and_stop_motor(&is_trigger); |
|
|
|
if (!is_trigger) throw zapp_exception(err::kstep_motor_not_found_point_edge); |
|
|
|
} |
|
|
|
|
|
|
|
if (!zm0p_is_trigger()) { |
|
|
|
ZLOGI(TAG, "move to zero edge again"); |
|
|
|
zm_move_by(-50 /*10mm */, kzm_v_look_zero_edge, 0); |
|
|
|
zm_move_by(-100 /*10mm */, kzm_v_look_zero_edge, 0); |
|
|
|
zm_waitfor_zm0p_trigger_and_stop_motor(&is_trigger); |
|
|
|
if (!is_trigger) throw zapp_exception(err::kstep_motor_not_found_point_edge); |
|
|
|
} |
|
|
@ -1129,6 +1183,34 @@ void PipetteModule::zm_set_now_pos(int32_t x) { |
|
|
|
m_zm->setXACTUAL(x); |
|
|
|
m_zm->set_enc_val(x); |
|
|
|
} |
|
|
|
void PipetteModule::zm_move_to_zero_quick_block() { |
|
|
|
// 期望偏差
|
|
|
|
int32_t expectation_dpos = -zmbcfg.io_trigger_append_distance + 0 + zmbcfg.dzero - zm_get_now_pos(); |
|
|
|
int32_t startpos = zm_get_now_pos(); |
|
|
|
if (!zm0p_is_trigger()) { |
|
|
|
// 快速移动到零点
|
|
|
|
// moveTo(0 + zmbcfg.dzero, zmbcfg.default_velocity);
|
|
|
|
zm_move_to(0 + zmbcfg.dzero, kzm_v_default, 0); |
|
|
|
zm_waitfor_zm0p_trigger_and_stop_motor(NULL); |
|
|
|
} else { |
|
|
|
// 快速移动到零点
|
|
|
|
zm_move_to(0 + zmbcfg.dzero, kzm_v_default, 0); |
|
|
|
zm_waitfor_zm0p_not_trigger_and_stop_motor(NULL); |
|
|
|
} |
|
|
|
// 移动到零点
|
|
|
|
do_zm_move_0p(); |
|
|
|
|
|
|
|
// 校验偏差
|
|
|
|
int32_t dpos = zm_get_now_pos() - startpos; |
|
|
|
// 设置零点
|
|
|
|
zm_set_now_pos(0 + zmbcfg.dzero - zmbcfg.io_trigger_append_distance); |
|
|
|
m_state.zm_has_move_zero = 1; |
|
|
|
|
|
|
|
if (zmbcfg.pos_devi_tolerance != 0 && (abs(expectation_dpos - dpos) > zmbcfg.pos_devi_tolerance)) { |
|
|
|
throw zapp_exception(err::kstep_motor_lost_step); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::zm_move_to(int32_t x, int32_t vbaseindex, int32_t vel) { |
|
|
|
/**
|
|
|
|
* @brief 以电机的参考位置为基准,向下为正向,向上为负向 |
|
|
@ -1174,6 +1256,7 @@ void PipetteModule::zm_update_dzero(int32_t dzero) { |
|
|
|
bool PipetteModule::zm0p_is_trigger() { return m_zm0p->getState(); } |
|
|
|
|
|
|
|
void PipetteModule::zm_apply_vcfg(int32_t vbasecfgindex, int32_t vel) { |
|
|
|
ZLOGI(TAG, "zm_apply_vcfg %s", get_zm_vcpyid_name((zm_vcpyid_t)vbasecfgindex)); |
|
|
|
/**
|
|
|
|
* @brief 当配置项的值为负数时,使用默认配置项的值 |
|
|
|
*/ |
|
|
@ -1188,6 +1271,12 @@ void PipetteModule::zm_apply_vcfg(int32_t vbasecfgindex, int32_t vel) { |
|
|
|
if (cfg.vstop > cfg.vmax) { |
|
|
|
cfg.vstop = cfg.vmax; |
|
|
|
} |
|
|
|
if (cfg.vstart > cfg.vmax) { |
|
|
|
cfg.vstart = cfg.vmax; |
|
|
|
} |
|
|
|
if (cfg.v1 > cfg.vmax) { |
|
|
|
cfg.v1 = cfg.vmax; |
|
|
|
} |
|
|
|
|
|
|
|
m_zm->set_vstart(cfg.vstart); |
|
|
|
m_zm->set_a1(cfg.a1); |
|
|
@ -1198,14 +1287,7 @@ void PipetteModule::zm_apply_vcfg(int32_t vbasecfgindex, int32_t vel) { |
|
|
|
m_zm->set_vstop(cfg.vstop); |
|
|
|
m_zm->set_vmax(cfg.vmax); |
|
|
|
|
|
|
|
ZLOGI(TAG, "set vstart %d", cfg.vstart); |
|
|
|
ZLOGI(TAG, "set a1 %d", cfg.a1); |
|
|
|
ZLOGI(TAG, "set amax %d", cfg.amax); |
|
|
|
ZLOGI(TAG, "set v1 %d", cfg.v1); |
|
|
|
ZLOGI(TAG, "set dmax %d", cfg.dmax); |
|
|
|
ZLOGI(TAG, "set d1 %d", cfg.d1); |
|
|
|
ZLOGI(TAG, "set vstop %d", cfg.vstop); |
|
|
|
ZLOGI(TAG, "set vmax %d", cfg.vmax); |
|
|
|
ZLOGI(TAG, "zm set vstart %d,a1 %d,amax %d,v1 %d,dmax %d,d1 %d,vstop %d,vmax %d", cfg.vstart, cfg.a1, cfg.amax, cfg.v1, cfg.dmax, cfg.d1, cfg.vstop, cfg.vmax); |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::zm_sync_base_cfg() { |
|
|
@ -1284,42 +1366,51 @@ void PipetteModule::pump_waitfor_lld_is_ready(int32_t *zpos) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::pump_get_vcfg(int32_t vcfgindex, smtp2::VelCfg *cfg) { |
|
|
|
pm_vcfg_t cfg2 = {0}; |
|
|
|
get_cfg_smart(vcfgindex, &cfg2); |
|
|
|
cfg->acc = cfg2.acc; |
|
|
|
cfg->dec = cfg2.dec; |
|
|
|
cfg->vstart = cfg2.vstart; |
|
|
|
cfg->vstop = cfg2.vstop; |
|
|
|
cfg->vmax = cfg2.vmax; |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::pump_apply_vcfg(int32_t vcfgindex, bool force) { |
|
|
|
ZLOGI(TAG, "pump_apply_vcfg %s", get_pm_vcpyid_name((pm_vcpyid_t)vcfgindex)); |
|
|
|
if (!force && m_state.pm_now_vcfg_index == vcfgindex) { |
|
|
|
// 如果当前配置和目标配置相同,则不需要重新设置
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
pm_vcfg_t cfg = {0}; |
|
|
|
smtp2::VelCfg vcfg; |
|
|
|
|
|
|
|
get_cfg_smart(vcfgindex, &cfg); |
|
|
|
vcfg.acc = cfg.acc; |
|
|
|
vcfg.dec = cfg.dec; |
|
|
|
vcfg.vstart = cfg.vstart; |
|
|
|
vcfg.vstop = cfg.vstop; |
|
|
|
vcfg.vmax = cfg.vmax; |
|
|
|
pump_get_vcfg(vcfgindex, &vcfg); |
|
|
|
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_vcfg(&vcfg)); |
|
|
|
m_state.pm_now_vcfg_index = vcfgindex; |
|
|
|
} |
|
|
|
void PipetteModule::pump_move_to_x100nl(int32_t x100nl, int32_t vcfgindex) { |
|
|
|
pump_apply_vcfg(vcfgindex); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_nl(x100nl * 100)); |
|
|
|
smtp2::VelCfg vcfg; |
|
|
|
pump_get_vcfg(vcfgindex, &vcfg); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_nl(&vcfg, x100nl * 100)); |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::pump_move_by_x100nl(int32_t x100nl, int32_t vcfgindex) { |
|
|
|
pump_apply_vcfg(vcfgindex); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_nl(x100nl * 100)); |
|
|
|
ZLOGI(TAG, "pump_move_by_x100nl %d, in %s", x100nl, get_pm_vcpyid_name((pm_vcpyid_t)vcfgindex)); |
|
|
|
smtp2::VelCfg vcfg; |
|
|
|
pump_get_vcfg(vcfgindex, &vcfg); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_by_nl(&vcfg, x100nl * 100)); |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::pump_move_to_x100nl_block(int32_t x100nl, int32_t vcfgindex) { |
|
|
|
pump_move_to_x100nl(vcfgindex, x100nl); |
|
|
|
pump_move_to_x100nl(x100nl, vcfgindex); |
|
|
|
pump_waitfor_stop(); |
|
|
|
ZLOGI(TAG, "pump now pos %d nl", pump_read_pos_nl()); |
|
|
|
} |
|
|
|
void PipetteModule::pump_move_by_x100nl_block(int32_t x100nl, int32_t vcfgindex) { |
|
|
|
pump_move_by_x100nl(vcfgindex, x100nl); |
|
|
|
pump_move_by_x100nl(x100nl, vcfgindex); |
|
|
|
pump_waitfor_stop(); |
|
|
|
ZLOGI(TAG, "pump now pos %d nl", pump_read_pos_nl()); |
|
|
|
} |
|
|
|
|
|
|
|
void PipetteModule::pump_read_pos_nl(int32_t *val) { |
|
|
@ -1329,6 +1420,11 @@ void PipetteModule::pump_read_pos_nl(int32_t *val) { |
|
|
|
// pump_read_pos_nl(val);
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_get_nl(val)); |
|
|
|
} |
|
|
|
int32_t PipetteModule::pump_read_pos_nl() { |
|
|
|
int32_t val = 0; |
|
|
|
DO_IN_THREAD(m_smtp2.pump_get_nl(&val)); |
|
|
|
return val; |
|
|
|
} |
|
|
|
int32_t PipetteModule::pump_read_capactitance() { |
|
|
|
int32_t val = 0; |
|
|
|
DO_IN_THREAD(m_smtp2.pump_get_capacitance(&val)); |
|
|
@ -1685,14 +1781,14 @@ void PipetteModule::parameter_init() { |
|
|
|
memset_int32_t((int32_t *)&m_liquid_info[0], -1, sizeof(m_liquid_info) / 4); |
|
|
|
memset_int32_t((int32_t *)&m_liquid_info[0], 0, sizeof(m_liquid_info[0]) / 4); |
|
|
|
|
|
|
|
m_liquid_info[0].plld_pm_vindex = kpm_v_lld; |
|
|
|
m_liquid_info[0].plld_pm_vcpyid = kpm_v_lld; |
|
|
|
m_liquid_info[0].plld_threshold = 30; |
|
|
|
m_liquid_info[0].plld_zm_vel = 50; |
|
|
|
m_liquid_info[0].empty_tip_pm_vindex = kpm_v_max; |
|
|
|
m_liquid_info[0].empty_tip_pm_vcpyid = kpm_v_max; |
|
|
|
m_liquid_info[0].blowout_air_volume = 0; |
|
|
|
m_liquid_info[0].blowout_air_pm_vindex = kpm_v_quick; |
|
|
|
m_liquid_info[0].blowout_air_pm_vcpyid = kpm_v_quick; |
|
|
|
m_liquid_info[0].over_aspirated_volume = 100; // 100(x100nl) == 10ul
|
|
|
|
m_liquid_info[0].over_aspirated_pm_vindex = kpm_v_slow_lv2; |
|
|
|
m_liquid_info[0].over_aspirated_pm_vcpyid = kpm_v_slow_lv2; |
|
|
|
m_liquid_info[0].aspiration_pm_vindex_low = kpm_v_slow_lv1; |
|
|
|
m_liquid_info[0].aspiration_pm_vindex_high = kpm_v_slow_lv3; |
|
|
|
m_liquid_info[0].aspiration_volume_break_val = 500; // 500(x100nl) == 50ul
|
|
|
@ -1700,7 +1796,7 @@ void PipetteModule::parameter_init() { |
|
|
|
m_liquid_info[0].volume_calibration_coefficient_k = 1.0f; |
|
|
|
m_liquid_info[0].settling_time = 1000; // ms
|
|
|
|
m_liquid_info[0].transport_volume = 50; // 50(x100nl) == 5ul
|
|
|
|
m_liquid_info[0].transport_volume_pm_vindex = kpm_v_slow_lv2; |
|
|
|
m_liquid_info[0].mix_pm_vindex = kpm_v_max; |
|
|
|
m_liquid_info[0].transport_volume_pm_vcpyid = kpm_v_slow_lv2; |
|
|
|
m_liquid_info[0].mix_pm_vcpyid = kpm_v_max; |
|
|
|
m_liquid_info[0].mark = 9973; |
|
|
|
} |