
SkySlide — Automated DNA Sample Shuttle
/skyslide
Two vertical lifts and an overhead carrier that move DNA sample plates from one lab's workcells to another's, up near the ceiling and out of everyone's way, with nobody carrying them.
- Role
- Project lead and technical lead
- Scope
- Mechanical design, PLC motion control, power, optical sensing, site infrastructure
- Axes
- 7 linear axes, 2 lift towers, 1 overhead carrier
Tools & skills
- Controls
- PLC state machines in Structured Text, collision interlocks, sensor checkpoints
- Software
- Python server talking to the PLC, Django web app
- Mechanical
- Onshape assembly, T-slot framing, seismic wall plates
- Validation
- FMEA, operational qualification, burn-in, integration testing

The problem
Every sample went through two automated workcells, one before amplification and one after, in two different labs. Each cell ran on its own. Between them, a person picked up the plate and walked it over.
That walk limited how many plates the cells could get through and how long they could run without someone there. A plate also has a time limit: in the full method, it has to reach the post-amp cell within 30 minutes of finishing the first step.
Replacing the walk needed two things. The motion had to be predictable enough to run all night with no one watching. And when something did go wrong, the system had to recover cleanly and be easy for a technician to service.
What made it hard
Three things. First, I had very little PLC experience when I started, and this system has seven linear axes. Second, the route had to go through a real building: wire mesh in the floor, studs behind the drywall, and fire sprinklers overhead. Third, those seven axes share space at the handoffs, so any two of them can crash into each other if they move at the wrong time.
How a plate gets across
Every transfer is the same sequence of handoffs:
- The pre-amp cell’s slide carries the plate out to the handoff point under the first lift.
- The first lift rises and picks the plate up off the slide.
- The overhead carrier moves in underneath it.
- The lift lowers and sets the plate down on the carrier.
- The carrier rides across the lab to the second lift.
- The second lift rises and takes the plate off the carrier, and the carrier moves out of the way.
- The lift lowers and sets the plate on the post-amp cell’s slide, which delivers it to the cell’s robot.

Planning the controls
With little controls background, I didn't try to solve everything in one program. I split the work into layers, so each one stays small enough to test by itself:
- One state machine per axis, which only knows how to move its own axis safely.
- A multi-axis state machine that coordinates the axes through a handoff.
- An orchestrator on the PLC that runs whole transfers from start to finish.
- A Python server that talks to the PLC, with a Django web app on top of it.
I also chose controllers and motion parts the team already knew. That kept the new risk in the system design, where I could manage it, instead of in unfamiliar hardware.
Fitting it into the building
Before drawing the frame, I measured the space in person. A floor scan found the wire mesh where the anchors couldn't go. A stud finder found the framing behind the drywall so the wall plates could bolt into something solid. I also checked what the code requires around the sprinklers.
I ran a failure mode and effects analysis (FMEA) comparing an elevated route with a floor-level one. It covered dropped plates, nests stopping in the wrong spot, spills, carts hitting the structure, and earthquakes, and listed a fix for each: presence sensors at the handoffs, position checks on the nests, guards around the frame, and seismic bracing. The overhead route is the one we built, and the plates tying the frame to the wall are that bracing.
Keeping seven axes from colliding
The riskiest moment is a reset. After a fault, axes can be stopped anywhere, and sending all seven home at once could drive one into another. I wanted a single button that always brings the system home safely, no matter where things stopped.
To build it, I measured the full travel of each axis and marked where it overlaps with its neighbors. Each overlap became a simple yes-or-no interlock: this axis may move only if the axis next to it is clear. On reset, the PLC loops over all seven interlocks and homes whichever axes are free right now. It repeats until everything is home, so the homing order is worked out live rather than fixed in advance.
Sensors check the plate at every handoff point. Each check returns the same small record, so every step of the sequence can tell whether a plate is there, whether it is seated square, and if not, why:
TYPE ST_PlateCheckResult :
STRUCT
Present : BOOL;
Aligned : BOOL;
IsError : BOOL;
Msg : STRING(120);
Code : USINT;
END_STRUCT
END_TYPEProving it works
Qualification ran in two stages. In the operational qualification, I tested every command the lab software uses one at a time: prepare a transfer, run it, and send everything home. Then I caused faults on purpose, such as blocking a slide so it couldn't reach position, and confirmed the system recovered with the home command. A burn-in finished it off: ten full transfers from pre-amp to post-amp for each nest.
Integration testing came next, with the workcells in the loop. The lab's scheduler ran full production methods end to end in automatic mode. The plate left the pre-amp cell, crossed on SkySlide, and arrived at the post-amp cell inside the 30-minute window. Both runs finished without an issue.
- 7
- linear axes, coordinated without collision
- 100%
- successful unattended runs
- 34% → 80%
- facility-wide automation usage
Demo
A camera rides along with a plate: up the first lift, across the passthrough, and down the far side.