Skip to content

Commit 98ef632

Browse files
authored
add a4s sealer (#304)
1 parent 77843d9 commit 98ef632

File tree

9 files changed

+533
-4
lines changed

9 files changed

+533
-4
lines changed

docs/user_guide/01_material-handling/_material-handling.rst

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@ This includes machines for temperature and motion control (as neither machines p
1010

1111
.. toctree::
1212
:maxdepth: 1
13-
:hidden:
1413

1514
arms/_arm
1615
centrifuge/_centrifuge
1716
heating_shaking/heating_shaking
1817
fans/fans
1918
temperature
19+
sealers/sealers
2020
tilting
2121
incubators/cytomat
22-
23-
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"id": "34531f2c",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"%load_ext autoreload\n",
11+
"%autoreload 2"
12+
]
13+
},
14+
{
15+
"cell_type": "markdown",
16+
"id": "18708b66",
17+
"metadata": {},
18+
"source": [
19+
"# Azenta Automated Roll Heat Sealer (formerly a4S)\n",
20+
"\n",
21+
"https://www.azenta.com/products/automated-roll-heat-sealer-formerly-a4s"
22+
]
23+
},
24+
{
25+
"cell_type": "code",
26+
"execution_count": 4,
27+
"id": "363b8144",
28+
"metadata": {},
29+
"outputs": [
30+
{
31+
"data": {
32+
"text/plain": [
33+
"pylabrobot.sealing.sealer.Sealer"
34+
]
35+
},
36+
"execution_count": 4,
37+
"metadata": {},
38+
"output_type": "execute_result"
39+
}
40+
],
41+
"source": [
42+
"from pylabrobot.sealing import a4s\n",
43+
"\n",
44+
"s = a4s(port=\"/dev/tty.usbserial-0001\")\n",
45+
"type(s)"
46+
]
47+
},
48+
{
49+
"cell_type": "code",
50+
"execution_count": 3,
51+
"id": "30720acb",
52+
"metadata": {},
53+
"outputs": [],
54+
"source": [
55+
"await s.setup()"
56+
]
57+
},
58+
{
59+
"cell_type": "markdown",
60+
"id": "7d2e9ed2",
61+
"metadata": {},
62+
"source": [
63+
"seal will open and close the lid automatically"
64+
]
65+
},
66+
{
67+
"cell_type": "code",
68+
"execution_count": 4,
69+
"id": "c0834a6e",
70+
"metadata": {},
71+
"outputs": [
72+
{
73+
"data": {
74+
"text/plain": [
75+
"A4SBackend.Status(current_temperature=179.2, system_status=<SystemStatus.finish: 4>, heater_block_status=<HeaterBlockStatus.ready: 1>, error_code=0, warning_code=0, sensor_status=A4SBackend.Status.SensorStatus(shuttle_middle_sensor=False, shuttle_open_sensor=True, shuttle_close_sensor=False, clean_door_sensor=True, seal_roll_sensor=False, heater_motor_up_sensor=True, heater_motor_down_sensor=False), remaining_time=0)"
76+
]
77+
},
78+
"execution_count": 4,
79+
"metadata": {},
80+
"output_type": "execute_result"
81+
}
82+
],
83+
"source": [
84+
"await s.seal(\n",
85+
" temperature=180,\n",
86+
" duration=5,\n",
87+
")"
88+
]
89+
},
90+
{
91+
"cell_type": "markdown",
92+
"id": "c4be6218",
93+
"metadata": {},
94+
"source": [
95+
"## Manually open and closing"
96+
]
97+
},
98+
{
99+
"cell_type": "code",
100+
"execution_count": 5,
101+
"id": "e23acc3d",
102+
"metadata": {},
103+
"outputs": [],
104+
"source": [
105+
"await s.close()"
106+
]
107+
},
108+
{
109+
"cell_type": "code",
110+
"execution_count": 6,
111+
"id": "c8656ef6",
112+
"metadata": {},
113+
"outputs": [],
114+
"source": [
115+
"await s.open()"
116+
]
117+
},
118+
{
119+
"cell_type": "markdown",
120+
"id": "9c4d21b7",
121+
"metadata": {},
122+
"source": [
123+
"## Manually working with temperature\n",
124+
"\n",
125+
"You can pre-set the temperature of the sealer by using the `set_temperature` method. The temperature is set in degrees Celsius."
126+
]
127+
},
128+
{
129+
"cell_type": "code",
130+
"execution_count": 13,
131+
"id": "97dbe69e",
132+
"metadata": {},
133+
"outputs": [],
134+
"source": [
135+
"await s.set_temperature(170)"
136+
]
137+
},
138+
{
139+
"cell_type": "code",
140+
"execution_count": 14,
141+
"id": "bb2de16b",
142+
"metadata": {},
143+
"outputs": [
144+
{
145+
"data": {
146+
"text/plain": [
147+
"170.1"
148+
]
149+
},
150+
"execution_count": 14,
151+
"metadata": {},
152+
"output_type": "execute_result"
153+
}
154+
],
155+
"source": [
156+
"await s.get_temperature()"
157+
]
158+
},
159+
{
160+
"cell_type": "markdown",
161+
"id": "16b96be7",
162+
"metadata": {},
163+
"source": [
164+
"## Machine status"
165+
]
166+
},
167+
{
168+
"cell_type": "code",
169+
"execution_count": 15,
170+
"id": "e13e407b",
171+
"metadata": {},
172+
"outputs": [
173+
{
174+
"name": "stdout",
175+
"output_type": "stream",
176+
"text": [
177+
"current_temperature: 170.0\n",
178+
"system_status: SystemStatus.idle\n",
179+
"heater_block_status: HeaterBlockStatus.ready\n",
180+
"error_code: 0\n",
181+
"warning_code: 0\n",
182+
"sensor_status: \n",
183+
" shuttle_middle_sensor: False\n",
184+
" shuttle_open_sensor: True\n",
185+
" shuttle_close_sensor: False\n",
186+
" clean_door_sensor: True\n",
187+
" seal_roll_sensor: False\n",
188+
" heater_motor_up_sensor: True\n",
189+
" heater_motor_down_sensor: False\n",
190+
"remaining_time: 0\n"
191+
]
192+
}
193+
],
194+
"source": [
195+
"status = await s.backend.get_status()\n",
196+
"print(\"current_temperature: \", status.current_temperature)\n",
197+
"print(\"system_status: \", status.system_status)\n",
198+
"print(\"heater_block_status: \", status.heater_block_status)\n",
199+
"print(\"error_code: \", status.error_code)\n",
200+
"print(\"warning_code: \", status.warning_code)\n",
201+
"print(\"sensor_status: \")\n",
202+
"print(\" shuttle_middle_sensor: \", status.sensor_status.shuttle_middle_sensor)\n",
203+
"print(\" shuttle_open_sensor: \", status.sensor_status.shuttle_open_sensor)\n",
204+
"print(\" shuttle_close_sensor: \", status.sensor_status.shuttle_close_sensor)\n",
205+
"print(\" clean_door_sensor: \", status.sensor_status.clean_door_sensor)\n",
206+
"print(\" seal_roll_sensor: \", status.sensor_status.seal_roll_sensor)\n",
207+
"print(\" heater_motor_up_sensor: \", status.sensor_status.heater_motor_up_sensor)\n",
208+
"print(\" heater_motor_down_sensor: \", status.sensor_status.heater_motor_down_sensor)\n",
209+
"print(\"remaining_time: \", status.remaining_time)"
210+
]
211+
}
212+
],
213+
"metadata": {
214+
"kernelspec": {
215+
"display_name": "env",
216+
"language": "python",
217+
"name": "python3"
218+
},
219+
"language_info": {
220+
"codemirror_mode": {
221+
"name": "ipython",
222+
"version": 3
223+
},
224+
"file_extension": ".py",
225+
"mimetype": "text/x-python",
226+
"name": "python",
227+
"nbconvert_exporter": "python",
228+
"pygments_lexer": "ipython3",
229+
"version": "3.10.15"
230+
}
231+
},
232+
"nbformat": 4,
233+
"nbformat_minor": 5
234+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Sealers
2+
3+
Plate sealers are used to seal plates with adhesive films or foils.
4+
5+
PLR supports the following sealers:
6+
7+
```{toctree}
8+
:maxdepth: 1
9+
10+
Automated Roll Heat Sealer (formerly a4S) <a4s>
11+
```

docs/user_guide/machines.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Below is a list of machines that are currently supported in PyLabRobot, and mach
9999

100100
| Device | Status |
101101
|--------|-------------|
102-
| A4S Sealer | WIP [#304](https://github.com/PyLabRobot/pylabrobot/pull/304) |
102+
| A4S Sealer | Supported |
103103

104104
## Flow cytometers
105105

pylabrobot/sealing/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .a4s import a4s
2+
from .a4s_backend import A4SBackend
3+
from .sealer import Sealer

pylabrobot/sealing/a4s.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from pylabrobot.sealing.a4s_backend import A4SBackend
2+
from pylabrobot.sealing.sealer import Sealer
3+
4+
5+
def a4s(port: str) -> Sealer:
6+
# https://web.azenta.com/hubfs/azenta-files/resources/tech-drawings/TD-automated-roll-heat-sealer.pdf
7+
# 222 x 500 x 276 mm
8+
return Sealer(
9+
backend=A4SBackend(port=port),
10+
)

0 commit comments

Comments
 (0)