Hi Rick, thanks again for looking into this!
Im not sure how to run the full firmware log correctly. i initally got an attribution error when trying to run it as described in the link you provided. I managed to locate it under pylabrobot.pylabrobot.io. The start and stop_capture() did work, however only the version was writen. i think only lines 34-39 in the “capture.py” was executed. this was the output to the JSON file:
{
“version”: “0.1.6”,
“commands”:
}
I have made a script to try and debug this aspiration. All variables remain the same, i only change the integer in the “use_channels” argument. ill provide the script and the print logs thereoff below. To summeriye, channel 0-12 work fine, printlogs look similar, channel 13 gives a timeout response error, channel 14,15 gives an parameter our of range error.
=== script ===
import asyncio
import pylabrobot.pylabrobot.io as plr
from pylabrobot.resources import (
TIP_CAR_480_A00,
PLT_CAR_L5AC_A00,
Cor_96_wellplate_360ul_Fb,
HTF,
)
from pylabrobot.liquid_handling import LiquidHandler
from pylabrobot.liquid_handling.backends import STARBackend
from pylabrobot.resources.hamilton import HamiltonSTARDeck
async def main():
deck = HamiltonSTARDeck(num_rails=54, size_x=1215, size_y=465, size_z=195)
backend = STARBackend()
lh = LiquidHandler(backend=backend, deck=deck)
await lh.setup()
# print debug info and commands sent
orig_aspirate = backend.aspirate
async def debug_aspirate(*args, **kwargs):
ops = kwargs["ops"]
use_channels = kwargs["use_channels"]
x_positions, y_positions, channels_involved = backend._ops_to_fw_positions(ops, use_channels)
print("\n DEBUG ASPIRATE")
print(f" use_channels: {use_channels}")
print(f" tip_pattern: {channels_involved}")
print(f" x_positions (mm): {x_positions}")
print(f" y_positions (mm): {y_positions}")
print(f" volumes (tenths): {[round(op.volume * 10) for op in ops]}")
# Try catching exceptions
try:
return await orig_aspirate(*args, **kwargs)
except Exception as e:
print(f" ERROR during aspirate with channels {use_channels}: {e}")
raise
backend.aspirate = debug_aspirate
# Setup carriers and resources
tip_car = TIP_CAR_480_A00("tip_car")
tip_car[0] = HTF("tips_01")
lh.deck.assign_child_resource(tip_car, rails=42)
plt_car = PLT_CAR_L5AC_A00("plate_car")
plt_car[0] = Cor_96_wellplate_360ul_Fb("plate_01")
lh.deck.assign_child_resource(plt_car, rails=7)
print(lh.summary())
test_channels = [0]
# Test all channels 0 through 15 individually to isolate failure
for test_channel in test_channels:
print(f"\n=== Testing channel {test_channel} ===")
tiprack = lh.deck.get_resource("tips_01")
try:
validation_file = "16_channel_validation.json"
plr.start_capture(validation_file)
await lh.pick_up_tips(tiprack["A1"], use_channels=[test_channel])
plate = lh.deck.get_resource("plate_01")
await lh.aspirate(
plate["A4"],
use_channels=[test_channel],
vols=[10]
)
await lh.dispense(
plate["A5"],
vols=[10],
use_channels=[test_channel],
)
await lh.return_tips()
print(f" Channel {test_channel} aspirate/dispense succeeded")
plr.stop_capture()
except Exception as e:
print(f" Channel {test_channel} failed with error:\n{e}")
await lh.stop()
print("\n Script completed.")
if __name__ == "__main__":
asyncio.run(main())
=== printlog (channel 0) ===
Rail Resource Type Coordinates (mm)
(-6) ├── trash_core96 Trash (-58.200, 106.000, 229.000)
│
(7) ├── plate_car PlateCarrier (235.000, 063.000, 100.000)
│ ├── plate_01 Plate (239.000, 071.500, 183.120)
│ ├──
│ ├──
│ ├──
│ ├──
│
(25) ├── trash Trash (655.000, 190.600, 137.100)
│
(42) ├── tip_car TipCarrier (1022.500, 063.000, 100.000)
│ ├── tips_01 TipRack (1028.700, 073.000, 214.950)
│ ├──
│ ├──
│ ├──
│ ├──
│
(53) ├── waste_block Resource (1270.000, 115.000, 100.000)
│ ├── teaching_tip_rack TipRack (1275.900, 461.100, 100.000)
None
=== Testing channel 1 ===
DEBUG ASPIRATE
use_channels: [1]
tip_pattern: [False, True, False]
x_positions (mm): [0, 2803, 0]
y_positions (mm): [0, 1457, 0]
volumes (tenths): [100]
Channel 1 aspirate/dispense succeeded
Validation file written to 16_channel_validation.json
Script completed.
=== printlog (channel 13) ===
Rail Resource Type Coordinates (mm)
(-6) ├── trash_core96 Trash (-58.200, 106.000, 229.000)
│
(7) ├── plate_car PlateCarrier (235.000, 063.000, 100.000)
│ ├── plate_01 Plate (239.000, 071.500, 183.120)
│ ├──
│ ├──
│ ├──
│ ├──
│
(25) ├── trash Trash (655.000, 190.600, 137.100)
│
(42) ├── tip_car TipCarrier (1022.500, 063.000, 100.000)
│ ├── tips_01 TipRack (1028.700, 073.000, 214.950)
│ ├──
│ ├──
│ ├──
│ ├──
│
(53) ├── waste_block Resource (1270.000, 115.000, 100.000)
│ ├── teaching_tip_rack TipRack (1275.900, 461.100, 100.000)
None
=== Testing channel 13 ===
DEBUG ASPIRATE
use_channels: [13]
tip_pattern: [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False]
x_positions (mm): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2803, 0]
y_positions (mm): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457, 0]
volumes (tenths): [100]
Timeout while waiting for response to command C0ASid0009at0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&tm0 0 0 0 0 0 0 0 0 0 0 0 0 1 0&xp00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 02803 00000&yp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1457 0000&th2450te2450lp2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000&ch000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&zl1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&po0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100&zu0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032&zr06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180&zx1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&ip0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&it0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&fp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&av00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127&as2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500&ta000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ba0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&oa000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&lm0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ll1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lv1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&zo000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ld00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&de0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020&wt10 10 10 10 10 10 10 10 10 10 10 10 10 10 10&mv00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&mc00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&mp000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ms1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200&mh0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&gi000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&gj0gk0lk0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ik0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&sd0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&se0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&sz0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300&io0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&il00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&in0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&.
ERROR during aspirate with channels [13]: Timeout while waiting for response to command C0ASid0009at0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&tm0 0 0 0 0 0 0 0 0 0 0 0 0 1 0&xp00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 02803 00000&yp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1457 0000&th2450te2450lp2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000&ch000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&zl1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&po0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100&zu0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032&zr06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180&zx1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&ip0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&it0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&fp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&av00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127&as2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500&ta000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ba0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&oa000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&lm0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ll1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lv1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&zo000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ld00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&de0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020&wt10 10 10 10 10 10 10 10 10 10 10 10 10 10 10&mv00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&mc00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&mp000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ms1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200&mh0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&gi000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&gj0gk0lk0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ik0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&sd0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&se0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&sz0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300&io0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&il00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&in0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&.
Channel 13 failed with error:
Timeout while waiting for response to command C0ASid0009at0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&tm0 0 0 0 0 0 0 0 0 0 0 0 0 1 0&xp00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 02803 00000&yp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1457 0000&th2450te2450lp2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000&ch000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&zl1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&po0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100&zu0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032 0032&zr06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180 06180&zx1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866 1866&ip0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&it0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&fp0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&av00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127 00127&as2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500 2500&ta000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ba0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&oa000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&lm0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ll1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&lv1 1 1 1 1 1 1 1 1 1 1 1 1 1 1&zo000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ld00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&de0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020&wt10 10 10 10 10 10 10 10 10 10 10 10 10 10 10&mv00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&mc00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&mp000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&ms1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200 1200&mh0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&gi000 000 000 000 000 000 000 000 000 000 000 000 000 000 000&gj0gk0lk0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&ik0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&sd0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&se0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500 0500&sz0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300&io0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&il00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000&in0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&.
Script completed.
=== printlog (channel 14) ===
Rail Resource Type Coordinates (mm)
(-6) ├── trash_core96 Trash (-58.200, 106.000, 229.000)
│
(7) ├── plate_car PlateCarrier (235.000, 063.000, 100.000)
│ ├── plate_01 Plate (239.000, 071.500, 183.120)
│ ├──
│ ├──
│ ├──
│ ├──
│
(25) ├── trash Trash (655.000, 190.600, 137.100)
│
(42) ├── tip_car TipCarrier (1022.500, 063.000, 100.000)
│ ├── tips_01 TipRack (1028.700, 073.000, 214.950)
│ ├──
│ ├──
│ ├──
│ ├──
│
(53) ├── waste_block Resource (1270.000, 115.000, 100.000)
│ ├── teaching_tip_rack TipRack (1275.900, 461.100, 100.000)
None
=== Testing channel 14 ===
DEBUG ASPIRATE
use_channels: [14]
tip_pattern: [False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False]
x_positions (mm): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2803, 0]
y_positions (mm): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457, 0]
volumes (tenths): [100]
ERROR during aspirate with channels [14]: {‘Master’: CommandSyntaxError(‘Parameter out of range’)}, C0ASid0010er01/32
Channel 14 failed with error:
{‘Master’: CommandSyntaxError(‘Parameter out of range’)}, C0ASid0010er01/32
Script completed.