I just looked into this: it is a bit more complicated, if no hamilton_liquid_class is specified in dispense on a Hamilton STAR machine, PLR will try to get a water-based liquid class as stated in the STAR_Backend.py:
I discussed this with @rickwierenga, and I see now how this is a “necessary evil” because if someone doesn’t know how ‘air displacement technology’ pipettes (like the STAR’s, OT-2’s, …) work, it gives them a chance to get the correct behaviour for standard pipetting actions.
BUT
We never know whether an actual hamilton_liquid_class has been found (this liquid class retrieval happens in the background without us having any idea about what it ends up doing).
If it doesn’t find a liquid class that fulfils the criteria it will default to machine firmware default values, which you can also find in the STAR_Backend.py:
@need_iswap_parked
async def dispense_pip(
self,
tip_pattern: List[bool],
dispensing_mode: List[int] = [0],
x_positions: List[int] = [0],
y_positions: List[int] = [0],
minimum_height: List[int] = [3600],
lld_search_height: List[int] = [0],
liquid_surface_no_lld: List[int] = [3600],
pull_out_distance_transport_air: List[int] = [50],
immersion_depth: List[int] = [0],
immersion_depth_direction: List[int] = [0],
surface_following_distance: List[int] = [0],
second_section_height: List[int] = [0],
second_section_ratio: List[int] = [0],
minimum_traverse_height_at_beginning_of_a_command: int = 3600,
min_z_endpos: int = 3600, #
dispense_volumes: List[int] = [0],
dispense_speed: List[int] = [500],
cut_off_speed: List[int] = [250],
stop_back_volume: List[int] = [0],
transport_air_volume: List[int] = [0],
blow_out_air_volume: List[int] = [200],
lld_mode: List[int] = [1],
side_touch_off_distance: int = 1,
dispense_position_above_z_touch_off: List[int] = [5],
gamma_lld_sensitivity: List[int] = [1],
dp_lld_sensitivity: List[int] = [1],
swap_speed: List[int] = [100],
settling_time: List[int] = [5],
mix_volume: List[int] = [0],
mix_cycles: List[int] = [0],
mix_position_from_liquid_surface: List[int] = [250],
mix_speed: List[int] = [500],
mix_surface_following_distance: List[int] = [0],
limit_curve_index: List[int] = [0],
tadm_algorithm: bool = False,
recording_mode: int = 0,
):
"""dispense pip
Dispensing of liquid using PIP.
LLD restrictions!
- "dP and Dual LLD" are used in aspiration only. During dispensation all pressure-based
LLD is set to OFF.
- "side touch off" turns LLD & "Z touch off" to OFF , is not available for simultaneous
Asp/Disp. command
Args:
dispensing_mode: Type of dispensing mode 0 = Partial volume in jet mode
1 = Blow out in jet mode 2 = Partial volume at surface
3 = Blow out at surface 4 = Empty tip at fix position.
tip_pattern: Tip pattern (channels involved). Default True.
x_positions: x positions [0.1mm]. Must be between 0 and 25000. Default 0.
y_positions: y positions [0.1mm]. Must be between 0 and 6500. Default 0.
minimum_height: Minimum height (maximum immersion depth) [0.1 mm]. Must be between 0 and
3600. Default 3600.
lld_search_height: LLD search height [0.1 mm]. Must be between 0 and 3600. Default 0.
liquid_surface_no_lld: Liquid surface at function without LLD [0.1mm]. Must be between 0 and
3600. Default 3600.
pull_out_distance_transport_air: pull out distance to take transport air in function without
LLD [0.1mm]. Must be between 0 and 3600. Default 50.
immersion_depth: Immersion depth [0.1mm]. Must be between 0 and 3600. Default 0.
immersion_depth_direction: Direction of immersion depth (0 = go deeper, 1 = go up out of
liquid). Must be between 0 and 1. Default 0.
surface_following_distance: Surface following distance during aspiration [0.1mm]. Must be
between 0 and 3600. Default 0.
second_section_height: Tube 2nd section height measured from "zx" [0.1mm]. Must be between
0 and 3600. Default 0.
second_section_ratio: Tube 2nd section ratio (see Fig. 2 in fw guide). Must be between 0 and
10000. Default 0.
minimum_traverse_height_at_beginning_of_a_command: Minimum traverse height at beginning of a
command 0.1mm] (refers to all channels independent of tip pattern parameter 'tm'). Must be
between 0 and 3600. Default 3600.
min_z_endpos: Minimum z-Position at end of a command [0.1 mm] (refers to all channels
independent of tip pattern parameter 'tm'). Must be between 0 and 3600. Default 3600.
dispense_volumes: Dispense volume [0.1ul]. Must be between 0 and 12500. Default 0.
dispense_speed: Dispense speed [0.1ul/s]. Must be between 4 and 5000. Default 500.
cut_off_speed: Cut-off speed [0.1ul/s]. Must be between 4 and 5000. Default 250.
stop_back_volume: Stop back volume [0.1ul]. Must be between 0 and 180. Default 0.
transport_air_volume: Transport air volume [0.1ul]. Must be between 0 and 500. Default 0.
blow_out_air_volume: Blow-out air volume [0.1ul]. Must be between 0 and 9999. Default 200.
lld_mode: LLD mode (0 = off, 1 = gamma, 2 = dP, 3 = dual, 4 = Z touch off). Must be between 0
and 4. Default 1.
side_touch_off_distance: side touch off distance [0.1 mm] (0 = OFF). Must be between 0 and 45.
Default 1.
dispense_position_above_z_touch_off: dispense position above Z touch off [0.1 s] (0 = OFF)
Turns LLD & Z touch off to OFF if ON!. Must be between 0 and 100. Default 5.
gamma_lld_sensitivity: gamma LLD sensitivity (1= high, 4=low). Must be between 1 and 4.
Default 1.
dp_lld_sensitivity: delta p LLD sensitivity (1= high, 4=low). Must be between 1 and 4.
Default 1.
swap_speed: Swap speed (on leaving liquid) [0.1mm/s]. Must be between 3 and 1600.
Default 100.
settling_time: Settling time [0.1s]. Must be between 0 and 99. Default 5.
mix_volume: Mix volume [0.1ul]. Must be between 0 and 12500. Default 0.
mix_cycles: Number of mix cycles. Must be between 0 and 99. Default 0.
mix_position_from_liquid_surface: Mix position in Z- direction from liquid surface (LLD or
absolute terms) [0.1mm]. Must be between 0 and 900. Default 250.
mix_speed: Speed of mixing [0.1ul/s]. Must be between 4 and 5000. Default 500.
mix_surface_following_distance: Surface following distance during mixing [0.1mm]. Must be
between 0 and 3600. Default 0.
limit_curve_index: limit curve index. Must be between 0 and 999. Default 0.
tadm_algorithm: TADM algorithm. Default False.
recording_mode: Recording mode 0 : no 1 : TADM errors only 2 : all TADM measurement. Must
be between 0 and 2. Default 0.
"""
I’m not sure whether there is some default vs non-default argument setting going on in the background that generates an incorrect argument composition which somehow triggers an TimeoutError.
It would be best to see the firmware logs a complete sequence of aspirate + dispenses in which the one of the dispenses triggers this error.
Then comparing the dispenses that worked with the ones that didn’t should give us the next clue.