Skip to content

Sequential/stacking ('Stacking Access') storage abstraction backed by ResourceStack #1113

Description

@c-reiter

Context

The storage user guide already defines two retrieval patterns — Stacking Access (Sequential) vs Random Access — and explicitly puts the Agilent BenchCel 4R, Labware MiniHub, and Lab Services PlateCarousel in the sequential column (docs/user_guide/01_material-handling/storage/storage.rst).

In code, though, that distinction doesn't exist yet: Incubator is the only storage frontend, and it is fundamentally random-access — it takes racks: List[PlateCarrier] of addressable PlateHolder sites and exposes find_random_site / find_smallest_site_for_plate / take_in_plate(site). Every backend (CytomatBackend, LiCONiC, Heraeus, and now BenchCel4RBackend) subclasses IncubatorBackend.

The mismatch (surfaced while adding the BenchCel, #1109)

A BenchCel stacker is a single-ended LIFO stack of nesting plates — the firmware only addresses whole stackers (downstack/upstack at one end); there is no slot addressing. To fit the Incubator model, #1109 currently fakes each stacker as a 20-site PlateCarrier where only the stacker identity is ever used and the sites are cosmetic. The frontend therefore advertises random-access operations (find_random_site, placing into an arbitrary site) that the hardware cannot honor.

Opportunity

ResourceStack(direction="z") already models exactly this: single-ended LIFO access (it only lets you unassign the top item), and — since #1110 (Plate.stacking_z_height) and #1112 — it nests plates by their stacking pitch, which is precisely a stacker's geometry. #1109 also now maps Plate.stacking_z_height → BenchCel StackingThickness.

Proposal / question for discussion

Would you be open to a sequential/stacking storage abstraction (e.g. a Stacker frontend, or a shared storage base) backed by ResourceStack, exposing downstack/upstack (LIFO) semantics instead of random-access site selection? It would model the documented "Stacking Access" category directly and would also fit the MiniHub / PlateCarousel.

Open design questions I'd love your steer on, @rickwierenga:

  • A new parallel frontend (Stacker) vs. generalizing the existing storage frontend to support both access patterns.
  • Whether to introduce a StorageBackend base above IncubatorBackend, or keep backends as-is.
  • How loading/transfer should be modelled for sequential devices (the BenchCel has no fixed loading position — it uses teachpoints).

Happy to prototype whichever direction you prefer. Not blocking #1109 — that ships with the current Incubator-based model and a doc note describing this limitation.

Refs: #1109 (BenchCel), #1110 (Plate.stacking_z_height), #1112 (ResourceStack nesting).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions