In de wereld van laboratoriumautomatisering, waar precisie en controle van het grootste belang zijn, vormen spuitpompen uitstekende hulpmiddelen om nauwkeurige vloeistofvolumes af te geven met een hoge mate van nauwkeurigheid en reproduceerbaarheid. Van al deze pompenonderscheidtdeNE-1000-spuitpompzich door zijn robuuste prestaties en veelzijdigheid.
In deze blogpost gaan we dieper in op de communicatieregeling viaRS-232 van de NE-1000-spuitpomp, verkennen we de mogelijkheden ervan en geven we inzicht in het instellen van de communicatie en het koppelen met Python, met stapsgewijze instructies om het proces te stroomlijnen. Of je nu een ervaren onderzoeker bent of een beginner op het gebied van pompregeling, deze blogpost reikt je de kennis en hulpmiddelen aan om je NE-1000-pomp volledig onder de knie te krijgen.
INHOUDSOPGAVE
Waarom zou je kiezen voor de NE-1000-spuitpomp?
DeNE-1000-spuitpompvan New Era Pump Systems wordt gewaardeerd om zijn betrouwbaarheid en flexibiliteit. Hij biedt een breed bereik aan stroomsnelheden (van 0,73 μL/uur met een spuit van 1 mL tot 2120 mL/uur met een spuit van 60 mL) en een nauwkeurige volumetoediening, waardoor hij ideaal is voor diverse toepassingen, zoals het toedienen van medicijnen en gekalibreerde injecties. Met zijn compacte ontwerp en gebruiksvriendelijke interface vereenvoudigt de NE-1000 experimentele opstellingen en garandeert hij tegelijkertijd consistente en nauwkeurige resultaten.
Het apparaat is volledig programmeerbaar, zowel zelfstandig als via elke computer of elk apparaat met een RS-232 -communicatiepoort. Het beschikt over een ingebouwde pompnetwerkdriver met een pompnetwerk dat tot 100 pompen en andere apparaten ondersteunt. Het onderscheidt zich bovendien door zijn niet-vluchtige geheugen voor alle bedrijfsparameters en het pompprogramma, waardoor complexe pomptoepassingen en interacties met externe apparaten mogelijk zijn.
Wat is een pompschema?
Een pompprogramma bepaalt de volgorde van de handelingen die door de pomp worden uitgevoerd, waaronder het instellen van pompsnelheden, volumes en richtingen, en het uitvoeren van pauzes of voorwaardelijke instructies. Deze vooraf gedefinieerde reeks functies zorgt voor een nauwkeurige en automatische werking van de pomp, zowel met als zonder tussenkomst van de gebruiker.
Een pompprogramma kan rechtstreeks via het toetsenbord van de pomp worden ingevoerd, of vanaf een computer worden geüpload met behulp van speciale software: PumpTerm,een pompterminalemulator die de communicatie met elke pomp met een pc-interface vergemakkelijkt door programma’s en opdrachten vanuit een bestand te uploaden, ofSyringePumpPro,dat fungeert als besturingssoftware voor pompen en automatische bewaking van alle pompparameters mogelijk maakt.
Daarnaast is er een spreadsheet voor het genereren van pompprogramma’s beschikbaar om te helpen bij het ontwikkelen van pompprogramma’s en bij het opstellen en ordenen van pompsequenties, die in een tekstbestand kunnen worden opgeslagen en naar de pomp kunnen worden geüpload om te worden uitgevoerd📄.
Hoewel PumpTerm en SyringePumpPro waardevolle hulpmiddelen zijn voor het aansturen van spuitpompen, zijn dit niet de enige beschikbare opties. Men kan gebruikmaken van programmeerplatforms zoals Python, dat beschikt over robuuste bibliotheken voor seriële communicatie waarmee de NE-1000-pomp nauwkeurig kan worden aangestuurd en geautomatiseerd.
Voordat we ingaan op hoe Python kan worden ingezet voor een nauwkeurige aansturing van de NE-1000-spuitpomp – met voorbeelden en inzichten in de toepassing ervan – zullen we kort ingaan op de reeks RS-232 -opdrachten die worden gebruikt om met de NE-1000 te communiceren. Als je al bekend bent met het RS-232 -communicatieprotocol, kun je gerust direct doorgaan naar de Python-codefragmenten.
Wat heb je nodig om met de NE-1000-pomp te communiceren?
Om via Python met de NE-1000-spuitpomp te communiceren, heb je een aantal belangrijke onderdelen nodig:
- Een NE-1000-spuitpomp met een spuit naar keuze,
- Een RS-232 -kabeldie seriële communicatie mogelijk maakt en gegevensoverdracht tussen de spuitpomp en de computer mogelijk maakt,
- Een seriële poort: De computer moet beschikken over een vrije seriële poort of een adapter voor het omzetten van een „ USB ”-signaal naar een serieel signaal om verbinding te maken met de RS-232 -kabel,
- Een Python-omgeving met het PySerial -pakket, dat de toegang tot de seriële poort abstraheert,
- Een basiskennis van de reeks opdrachten „RS-232 “, zoals beschreven in de gebruikershandleiding van de pomp.
Hoe configureert u de communicatiepoort?
Voordat je via Python opdrachten naar de NE-1000-pomp kunt sturen, moet je eerst de communicatiepoort configureren. Volg deze stappen om een verbinding tot stand te brengen🔧:
- Sluit de kabel ‘ RS-232 ’ aan op de seriële poort aan de achterzijde van de NE-1000-spuitpomp en op de bijbehorende poort op de computer.
- Schakel de pomp in.
- Zorg ervoor dat de instellingen van de seriële poort overeenkomen met de specificaties van uw spuitpomp:
- 1 startbit
- 8 databits
- Pariteit: geen
- 1 stopbit
- een baudrate van 19.200 bits/s
- Identificeer de naam van de seriële poort die aan de verbinding op uw computer is toegewezen (bijv. COM4 voor Windows of /dev/ttyUSB0 voor Linux). Deze informatie vindt u meestal in apparaatbeheer of door terminalcommando's te gebruiken.
- Een driehoekig pictogram (linksboven op het pompscherm) geeft aan dat de communicatie is gelukt; dit blijft zichtbaar totdat het apparaat wordt uitgeschakeld of totdat ‘Setup Configuration’ wordt geopend.
- Test de verbinding door een eenvoudig commando te verzenden, zoals het opvragen van de pompstatus.
Wat is de instructieset van de „ RS-232 “?
De NE-1000-spuitpomp communiceert via RS-232 en slaat wijzigingen in de gegevens op in een niet-vluchtig geheugen, met uitzondering van aanpassingen van de pompsnelheid tijdens het gebruik. Elke programmafase omvat de pompsnelheid, het af te geven volume en de pomprichting, die met het ‘PHN’-commando kunnen worden geselecteerd.
De reeks ‘ RS-232 ’-commando’s die wordt gebruikt om de NE-1000-pomp aan te sturen, is samengevat in de onderstaande tabel. Commando’szonder parameters dienen als opvragingen die de gevraagde gegevens retourneren. De antwoorden komen doorgaans overeen met de parameters van het commando. Succesvolle instellingscommando’s leiden tot een statusmelding, terwijl mislukte commando’s een foutmelding genereren.
| Commando | Definitie |
|---|---|
| DIA [float] | Binnendiameter van de spuit |
| PHN [fasegegevens] | Programmafasenummer |
| FUN [fasefunctie] | Functie van de programmafase |
| RAT | De functie 'RATE' (pompsnelheid) |
| RAT [drijvend | koerseenheden] | Pompsnelheid |
| VOL [float | volume-eenheden] | Af te geven hoeveelheid |
| DIR [INF \ WDR] | Pomprichting |
| INC | Functie voor het verhogen van de waarde, 'INCR' |
| DEC | Functie voor afnamepercentage, 'DECR' |
| JMP [fasegegevens] | Ga naar de programmafasefunctie 'JP:nn' |
| LPS | Start lus, 'LP:ST' |
| LOP [tellende gegevens] | 'nn' keer terug naar het begin van de vorige lus, 'LP:nn' |
| LPE | Einde lus, 'LP:EN' |
| PAS [cijfergegevens] | Het pompen ‘nn’ seconden onderbreken, ‘PS:nn’ |
| BEP | Korte pieptoon, 'PIEP' |
| CLD [INF \ WDR] | Afgegeven helder volume |
| RESET | Pomp resetten en het programmageheugen wissen |
| RUN | Start het pompprogramma |
| STP | Pomp stoppen, 'STOP' |
De eenheden voor de doorstromingssnelheid zijn ‘UM’ voor µL/min, ‘MM’ voor mL/min, ‘UH’ voor µL/uur en ‘MH’ voor mL/uur. De volume-eenheden zijn ‘UL’ voor µL en ‘ML’ voor mL. Deze worden ingesteld op basis van de huidige instelling voor de spuitdiameter.
Wanneer het ‘RUN’-commando naar de pomp wordt verzonden, wordt het pompprogramma hervat op het punt waar het was gestopt, mocht het zijn gepauzeerd. Anders begint het pompprogramma bij fase 1. Bij uitvoering van het ‘RUN #’-commando begint het programma bij de opgegeven fase (# is het ‘PHN’-nummer van de fase).
Wanneer het ‘STP’-commando naar de pomp wordt verzonden en het pompprogramma actief is, wordt dit programma gepauzeerd en wordt de pomp gestopt. Als het pompprogramma al gepauzeerd is, heft het ‘STP’-commando de pauze op en wordt het pompprogramma teruggezet naar fase 1.Raadpleeg de documentatievan de NE-1000-spuitpomp voor meer informatie over de ‘ RS-232 ’-commando’s .
Nu de communicatiepoort is geconfigureerd en je een basiskennis hebt van de RS-232 -opdrachten, ben je klaar om Python-scripts te gaan ontwikkelen om de NE-1000-spuitpomp🕹️ aan te sturen.
💡 Verbeterde functies in de standaardfirmware van de NE-1000:
- De X Firmware Advanced Features Upgrade met lineaire/gradiënt-opbouw voor vloeiende kleurverlopen en extra programmeerfuncties.
- De geavanceerde functies en geheugenuitbreiding van de X2-firmware, inclusief alle functies van de X-firmwareversie, met een uitbreiding van het geheugen voor pompkrachtprogramma’s van 41 naar 340 fasen.
NE-1000-spuitpomp programmeren met Python?
Hieronder worden Python-codefragmenten getoond die laten zien hoe je de seriële poort opent, besturingsopdrachten naar de pomp schrijft en verstuurt, en een pompprogramma naar de NE-1000 schrijft.
We zullen codefragmenten doornemen die laten zien hoe je veelvoorkomende taken uitvoert, zoals het toedienen van vloeistoffen, het instellen van pompsnelheden en het uitvoeren van complexe pompsequenties. Deze voorbeelden geven je een praktisch inzicht in de Python-gebaseerde besturing van de NE-1000-spuitpomp.
De functionaliteit van SyringePumpPro en PumpTerm nabootsen
In dit eerste deel zullen we Python gebruiken om de functionaliteit van SyringePumpPro en PumpTerm na te bootsen: het uploaden van een pompprogramma vanaf een computer (of het rechtstreeks naar de pomp schrijven). In deze paragraaf wordt uitgelegd hoe een Python-script de mogelijkheden van deze softwaretools effectief nabootst, waardoor de NE-1000-spuitpomp kan worden aangestuurd en geautomatiseerd.
We zullen de Python-bibliotheek„serial“gebruiken om via een seriële poortverbinding communicatie tot stand te brengen met de NE-1000-spuitpomp. Eerst importeren we de module„serial“, die hulpmiddelen biedt voor seriële communicatie. Vervolgens wordt de functie‘serial.Serial’gebruikt om de seriële poortverbinding te initialiseren, waarbij parameters zoals de poortnaam (‘COM2’), de baudrate (19200) en communicatie-instellingen zoals pariteit, bytegrootte en stopbits worden opgegeven.
Hieronder vind je de Python-codefragmenten, met uitleg👇.
Een PPL-bestand vanaf een computer naar de pomp uploaden
'''
------------------------------------------------
Uploading a PPL File from a Computer to the Pump
------------------------------------------------
'''
import serial # serial library to establish communication with the pump
import time
# Open the serial port
ser = serial.Serial('COM2', 19200, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=None, xonxoff=0, rtscts=0) # make sure to modify the port name 'COM2' with the corresponding port on your computer
# Define a function to send commands (with an option to read responses from the pump)
def send_command(command):
ser.write((command + '\r\n').encode()) # send commands as encoded strings
time.sleep(0.1) # brief delay allowing time for the pump to process the command
# Define a function to read the content of a PPL file
def read_ppl_file(file_path):
with open(file_path, 'r') as file:
return file.read()
# PPL file path; make sure you modify it by writing your file path
ppl_file_path = 'C:/Users/DarwinMicrofluidics/Desktop/NE1000/Test.ppl'
# Read the content of the PPL file
ppl_content = read_ppl_file(ppl_file_path)
# Reset pump
send_command("RESET")
# Split PPL content into lines and send each line as a command
for line in ppl_content.split('\n'):
line = line.strip() # remove leading/trailing whitespaces
if line: # skip empty lines
send_command(line) # send the command line to the pump
# Run the pumping program
send_command("RUN")
# Once the program executed, close the serial port (optional)
ser.close()
De functie„send_command”is gedefinieerd om het verzenden van commando’s naar de pomp te stroomlijnen (met de mogelijkheid om ook het antwoord van de pomp uit te lezen). Binnen deze functie worden commando’s als gecodeerde tekenreeksen naar de pomp verzonden, gevolgd door een korte vertraging met behulp van„time.sleep()”, zodat de pomp de tijd krijgt om het commando te verwerken.
Daarnaast is er een functie“read_ppl_file”opgenomen om de inhoud van een Pump Programming Language (PPL)-bestand te lezen, dat reeksen opdrachten bevat die door de pomp moeten worden uitgevoerd. Het bestandspad naar het PPL-bestand wordt opgegeven en de inhoud ervan wordt met behulp van de functie“read_ppl_file” gelezen.
De pomp wordt gereset met het commando“RESET”, waardoor een schone start wordt gegarandeerd voordat de reeks commando’s uit het PPL-bestand wordt uitgevoerd. De inhoud van het PPL-bestand wordt opgesplitst in regels, en elke regel wordt via de functie“send_command”als commando naar de pomp verzonden. Ten slotte wordt het commando“RUN”verzonden om het pompproces te starten.
Zodra alle opdrachten zijn uitgevoerd, kan de verbinding met de seriële poort worden verbroken met“ser.close()”, waardoor ervoor wordt gezorgd dat de benodigde bronnen correct worden vrijgegeven.
Een pompprogramma naar de pomp schrijven
De vorige code laat een gestroomlijnde aanpak zien voor het aansturen van de NE-1000-spuitpomp met Python. Het kan echter voorkomen dat men geen toegang heeft tot de spreadsheet voor het genereren van pompprogramma’s, of dat men er gewoon de voorkeur aan geeft het pompprogramma rechtstreeks in het Python-script te schrijven om direct en visueel wijzigingen in het programma aan te brengen voordat het naar de pomp wordt verzonden. Deze aanpak biedt meer flexibiliteit en directheid bij het programmeren van de acties van de pomp. Het volgende codefragment illustreert deze methode, waarmee gebruikers het pompprogramma rechtstreeks in het Python-script kunnen definiëren, waardoor realtime aanpassingen van parameters en sequenties mogelijk zijn.
'''
-------------------------------------
Writing a Pumping Program to the Pump
-------------------------------------
'''
import serial # serial library to establish communication with the pump
import time
# Open the serial port
ser = serial.Serial('COM2', 19200, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=None, xonxoff=0, rtscts=0) # make sure to modify the port name 'COM2' with the corresponding port on your computer
# Define a function to send commands (with an option to read responses from the pump)
def send_command(command):
ser.write((command + '\r\n').encode()) # send commands as encoded strings
time.sleep(0.1) # brief delay allowing time for the pump to process the command
# Define your pumping program
Pumping_Program = """
DIA 26.59
PHN 1
FUN RAT
RAT 500 MH
VOL 2.0
DIR INF
PHN 2
FUN PAS 10
PHN 3
FUN RAT
RAT 200 MH
VOL 1.0
DIR WDR
PHN 4
FUN STP
"""
# Reset pump
send_command("RESET")
# Split the content of the program into lines and send each line as a command
for line in Pumping_Program.split('\n'):
line = line.strip() # remove leading/trailing whitespaces
if line: # skip empty lines
send_command(line) # send the command line to the pump
# Run the pumping program
send_command("RUN")
# Once the program executed, close the serial port (optional)
ser.close()
Hier definiëren we een Pumping_Program rechtstreeks in het Python-script. Het programma (uitgebreid beschreven in de voorbeelden van Pumping-programma’s hieronder 👇) bevat een reeks opdrachten, geordend in afzonderlijke regels. Elke regel wordt via de functie“send_command”als opdracht naar de pomp verzonden.
Nadat het volledige pompprogramma naar de pomp is verzonden, wordt het commando„RUN“gegeven om het pompproces te starten.
Voorbeelden van pompschema’s
Hieronder volgen drie voorbeelden van pompprogramma’s die zijn ontworpen voor de NE-1000-spuitpomp, elk afgestemd op specifieke experimentele vereisten.
Voorbeeld 1: Vloeistoffen toedienen en afnemen
In dit voorbeeld pompt de NE-1000-spuitpomp een vloeistof met een opgegeven snelheid en volume toe, pauzeert vervolgens 10 seconden, zuigt een ander volume met een andere snelheid op en stopt daarna. De verschillende fasen van het pompprogramma zijn samengevat in de onderstaande tabel en het bijbehorende programma wordt weergegeven in het codefragment.
| Fase | Functie | Waarde | Tarief | Volume | Richting |
|---|---|---|---|---|---|
| 1 | RAT | - | 500 ml/uur | 2,0 ml | Laten trekken |
| 2 | PAS | 10 | - | - | - |
| 3 | RAT | - | 200 ml/uur | 1,0 ml | Opnemen |
| 4 | STP | - | - | - | - |
Example1 = """
DIA 26.59
PHN 1
FUN RAT
RAT 500 MH
VOL 2.0
DIR INF
PHN 2
FUN PAS 10
PHN 3
FUN RAT
RAT 200 MH
VOL 1.0
DIR WDR
PHN 4
FUN STP
"""
# start by setting the syringe diameter
# no need to set the volume units when setting the volume in a RATE function
Voorbeeld 2: Herhaalde afgifte met terugzuiging
Dit pompprogramma doseert 2,0 ml vloeistof met een pauze van 20 seconden tussen elke dosering (in totaal 4 doseringen). Na elke dosering wordt een klein volume van 0,25 ml teruggezogen om druppelen te voorkomen. Bovendien klinkt er 3 seconden voor het einde van elke pauze een pieptoon om de komende dosering aan te kondigen. Vanaf de tweede afgifte wordt 0,25 ml aan het afgegeven volume toegevoegd om het teruggezogen volume van de vorige afgifte te compenseren.
De verschillende fasen van het pompprogramma zijn samengevat in de onderstaande tabel en het bijbehorende programma wordt weergegeven in het codefragment.
| Fase | Functie | Waarde | Tarief | Volume | Richting |
|---|---|---|---|---|---|
| 1 | RAT | - | 500 ml/uur | 2,0 ml | Laten trekken |
| 2 | RAT | - | 500 ml/uur | 0,25 ml | Opnemen |
| 3 | LPS | - | - | - | - |
| 4 | PAS | 17 | - | - | - |
| 5 | BEP | - | - | - | - |
| 6 | PAS | 3 | - | - | - |
| 7 | RAT | - | 500 ml/uur | 2,25 ml | Laten trekken |
| 8 | RAT | - | 500 ml/uur | 0,25 ml | Opnemen |
| 9 | LOP | 3 | - | - | - |
Example2 = """
DIA 26.59
PHN 1
FUN RAT
RAT 500 MH
VOL 2.0
DIR INF
PHN 2
FUN RAT
RAT 500 MH
VOL 0.25
DIR WDR
PHN 3
FUN LPS
PHN 4
FUN PAS 17
PHN 5
FUN BEP
PHN 6
FUN PAS 3
PHN 7
FUN RAT
RAT 500 MH
VOL 2.25
DIR INF
PHN 8
FUN RAT
RAT 500 MH
VOL 0.25
DIR WDR
PHN 9
FUN LOP 3
"""
# an initial dispense of 2 mL followed by 3 dispenses of 2.25 mL
# send_command("STP") at any moment to pause/stop the pumping program
Voorbeeld 3: Het geleidelijk verhogen van het debiet
Dit pompprogramma verhoogt en verlaagt de pompsnelheid continu, waarbij de snelheid telkens na het afgeven van een volume van 0,5 ml met stappen van 20 ml/uur toeneemt van een beginwaarde van 300 ml/uur tot 400 ml/uur. Nadat de maximale snelheid is bereikt, wordt de pompsnelheid in vergelijkbare stappen verlaagd, telkens nadat 0,5 ml is afgegeven, totdat 200 ml/uur is bereikt. Ten slotte wordt de snelheid weer verhoogd tot de beginwaarde, waarna de cyclus zich herhaalt.
De verschillende fasen van het pompprogramma zijn samengevat in de onderstaande tabel en het bijbehorende programma wordt weergegeven in het codefragment.
| Fase | Functie | Waarde | Tarief | Volume | Richting |
|---|---|---|---|---|---|
| 1 | RAT | - | 300 ml/uur | 0,5 ml | Laten trekken |
| 2 | LPS | - | - | - | - |
| 3 | INC | - | 20 ml/uur | 0,5 ml | Laten trekken |
| 4 | LOP | 5 | - | - | - |
| 5 | LPS | - | - | - | - |
| 6 | DEC | - | 20 ml/uur | 0,5 ml | Laten trekken |
| 7 | LOP | 10 | - | - | - |
| 8 | LPS | - | - | - | - |
| 9 | INC | - | 20 ml/uur | 0,5 ml | Laten trekken |
| 10 | LOP | 5 | - | - | - |
| 11 | JMP | 2 | - | - | - |
Example3 = """
DIA 26.59
PHN 1
FUN RAT
RAT 300 MH
VOL 0.5
DIR INF
PHN 2
FUN LPS
PHN 3
FUN INC
RAT 20
VOL 0.5
DIR INF
PHN 4
FUN LOP 5
PHN 5
FUN LPS
PHN 6
FUN DEC
RAT 20
VOL 0.5
DIR INF
PHN 7
FUN LOP 10
PHN 8
FUN LPS
PHN 9
FUN INC
RAT 20
VOL 0.5
DIR INF
PHN 10
FUN LOP 5
PHN 11
FUN JMP 2
"""
# send_command("STP") at any moment to pause/stop the pumping program
# no need to set the rate units when setting the rate step in a INC and DEC functions
Aangepaste Python-bibliotheek voor de besturing van een NE-spuitpomp
In dit tweede deel wordt een andere effectieve manier geïntroduceerd om de NE-1000-spuitpomp via Python aan te sturen. Er is een op maat gemaakte Python-bibliotheek ontwikkeld waarin gebruiksvriendelijke functies kunnen worden ingezet om parameters in te stellen, acties uit te voeren en de communicatie te beheren.
Hieronder presenteren we de op maat gemaakte bibliotheek die wordt gebruikt voor het aansturen van de NE-1000-spuitpomp en lichten we de beperkingen ervan toe. We gaan dieper in op drie verschillende voorbeelden van pompprogramma’s (voorbeelden 1, 2 en 3 die zojuist hierboven zijn gepresenteerd) en laten zien hoe deze functies kunnen worden ingezet om nauwkeurige pompsequenties uit te voeren.
'''
-----------------------------------------------------------------------
NE-1000 Syringe Pump Control Library Using RS232 Communication Protocol
-----------------------------------------------------------------------
'''
class NewEraSyringePump:
# Open the serial port
def __init__(self, port):
self.ser = serial.Serial(port, 19200, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=None, xonxoff=0, rtscts=0) # data format corresponding to the NE-1000
time.sleep(0.075) # time for the pump to initialize
# Write a command to the syringe pump
def send_command(self, command):
self.ser.write(command.encode() + b'\r\n') # convert the command string into bytes, append a carriage return and line feed, and send the resulting byte sequence to the serial port
time.sleep(0.075) # a brief delay to ensure that the pump has enough time to process the command before proceeding to the next operation
# Start the pump
def start_pump(self):
self.send_command("RUN") # RUN to run the pump
# Stop the pump
def stop_pump(self):
self.send_command("STP") # STP to stop the pump
# Set the syringe diameter
def set_diameter(self, diameter):
command = f"DIA {diameter}" # DIA for syringe inside diameter (float)
self.send_command(command) # set the syringe diameter using the "send_command" function
#-----------------------------------------------------------------------------------------#
# The three functions below (set_rate, set_volume and set_direction) are only defined to be used within the run_RATE_function defined afterwards
#-----------------------------------------------------------------------------------------#
# Set the pumping rate
def set_rate(self, rate, r_units):
command = f"RAT {rate} {r_units}" # RAT for pumping rate
# Rate units: 'MH' for mL/hr - 'MM' for mL/min - 'UH' for µL/hr - 'UM' for µL/min
self.send_command(command)
# Set the volume
def set_volume(self, volume, units):
command = f"VOL {volume} {units}" # VOL for volume
# Volume units: 'ML' for mL - 'UL' for µL
self.send_command(command)
# Set the pumping direction
def set_direction(self, direction):
if direction == 0:
command = "DIR INF" # DIR for pumping direction - INF for infuse
elif direction == 1:
command = "DIR WDR" # WDR for withdraw
elif direction == 2:
command = "DIR REV" # REV for reverse direction
self.send_command(command)
#-----------------------------------------------------------------------------------------#
# Define the "RATE" Function
def run_RATE_function(self, rate, rate_units, volume, units, direction):
self.set_rate(rate, rate_units) # Set the pumping rate
self.set_volume(volume, units) # Set the pumping volume
self.set_direction(direction) # Set the pumping direction
self.start_pump() # Start the pumping rate function
# Calculate pumping duration based on rate and volume units:
if rate_units == "MH" and units == "ML":
pumping_duration = volume * 3600 / rate # mL/hr and mL
elif rate_units == "UH" and units == "UL":
pumping_duration = volume * 3600 / rate # µL/hr and µL
elif rate_units == "MH" and units == "UL":
pumping_duration = volume * 3.6 / rate # mL/hr and µL
elif rate_units == "UH" and units == "ML":
pumping_duration = volume * 3.6 * 10**6 / rate # µL/hr and mL
elif rate_units == "MM" and units == "ML":
pumping_duration = volume * 60 / rate # mL/min and mL
elif rate_units == "UM" and units == "UL":
pumping_duration = volume * 60 / rate # µL/min and µL
elif rate_units == "MM" and units == "UL":
pumping_duration = volume * 0.06 / rate # mL/min and µL
elif rate_units == "UM" and units == "ML":
pumping_duration = volume * 6 * 10**4 / rate # µL/min and mL
else:
raise ValueError("Unsupported units combination: rate_units={}, units={}".format(rate_units, units))
time.sleep(pumping_duration) # Delay to ensure the pump dispenses the required volume at the given pumping rate
self.stop_pump() # Stop the pump
# Reset the pump
def reset_pump(self):
self.send_command("RESET") # RESET to reset the pump
# Pump beep
def beep(self):
self.send_command("BEP") # BEP for the pump beep
# Delete the pump
def __del__(self):
self.ser.close() # close the serial communication port
##### BELOW are the commands that should be executed #####
Met deze op maat gemaakte bibliotheek kan de NE-1000-spuitpomp worden aangestuurd. De bibliotheek brengt via een seriële poort verbinding tot stand met de pomp en stelt gebruikers in staat om parameters in te stellen, zoals de diameter van de spuit, de pompsnelheid, het volume en de pomprichting. Gebruikers kunnen pompacties uitvoeren, zoals het starten, stoppen en resetten van de pomp. Daarnaast is er een „RATE“-functie gedefinieerd met behulp van een reeks reeds gedefinieerde functies. Met behulp van deze bibliotheek kunnen gebruikers rechtstreeks vanuit hun Python-omgeving nauwkeurige pompsequenties samenstellen, zoals in de drie onderstaande voorbeelden wordt gedemonstreerd.
Voorbeeld 1: Vloeistoffen toedienen en afnemen
In dit voorbeeld pompt de NE-1000-spuitpomp een vloeistof met een opgegeven snelheid en volume in, pauzeert vervolgens 10 seconden, zuigt een ander volume met een andere snelheid op en stopt daarna. JA, je hebt gelijk! Dit voorbeeld is net hierboven gegeven en laat zien hoe je met de bibliotheek dezelfde pompsequentie kunt uitvoeren die eerder is beschreven.
#--------------------------------------------------------------------------------------------#
# Example 1: Infuse 4.0 mL at 500 mL/hr, pause the pumping for 10s and then withdraw 2.0 mL at 200 mL/hr. Finally, stop the pump.
#--------------------------------------------------------------------------------------------#
# Initialize the pump with the specified COM port
pump = NewEraSyringePump('COM2') # Replace 'COM2' with the actual COM port used for your connection
# Reset pump
pump.reset_pump() # Reset the pump parameters
# Set syringe diameter
pump.set_diameter(26.59) # Change this value according to the syringe you're using
### BEGIN PUMPING SEQUENCE ###
# First RATE function
pump.run_RATE_function(500, "MH", 4, "ML", 0) # Infuse 4.0 mL at 500 mL/hr
# Pause pumping
pause_time = 10
time.sleep(float(pause_time)) # Pause the pumping for 10 seconds
# Second RATE function
pump.run_RATE_function(200, "MH", 2, "ML", 1) # Withdraw 2.0 mL at 200 mL/hr
### END PUMPING SEQUENCE ###
# Delete pump and close the serial communication port
del pump
Dit Python-codefragment laat zien hoe de aangepaste bibliotheek wordt gebruikt om de NE-1000-spuitpomp aan te sturen en zo een specifieke pompsequentie uit te voeren. Eerst wordt de pomp geïnitialiseerd met de opgegeven COM-poort, waarna deze wordt gereset om ervoor te zorgen dat de standaardinstellingen worden hersteld. De diameter van de spuit wordt dienovereenkomstig ingesteld.
De pompsequentie bestaat uit drie hoofdstappen:
- De pomp toedient 4,0 ml vloeistof met een snelheid van 500 ml/uur.
- Na een pauze van 10 seconden zuigt de pomp 2,0 ml vloeistof op met een snelheid van 200 ml/uur.
- Eindelijk is de pomp gestopt.
Elke stap van de reeks wordt uitgevoerd met behulp van de methode„run_RATE_function“ van de klasse„NewEraSyringePump“, waarbij de pompsnelheid, het volume, de eenheden en de richting worden opgegeven. Nadat de pompreeks is voltooid, wordt het pompexemplaar verwijderd en wordt de seriële communicatiepoort gesloten.
Deze code geeft een eenvoudig voorbeeld van hoe de aangepaste bibliotheek kan worden gebruikt om de NE-1000-spuitpomp aan te sturen en nauwkeurige pompsequenties uit te voeren. Hieronder volgen nog twee voorbeelden.
Voorbeeld 2: Herhaalde afgifte met terugzuiging
Dit pompprogramma doseert 2,0 ml vloeistof met een pauze van 20 seconden tussen elke dosering (in totaal 4 doseringen). Na elke dosering wordt een klein volume van 0,25 ml teruggezogen om druppelen te voorkomen. Bovendien klinkt er 3 seconden voor het einde van elke pauze een pieptoon om de komende dosering aan te kondigen. Vanaf de tweede afgifte wordt 0,25 ml aan het afgegeven volume toegevoegd om het teruggezogen volume van de vorige afgifte te compenseren. Het bijbehorende programma wordt weergegeven in het onderstaande codefragment.
#--------------------------------------------------------------------------------------------#
# Example 2: Dispense 2.0 mL at 500 mL/hr with a pause of 20 seconds between dispenses. In addition, after each dispense, a volume of 0.25 mL is sucked back at the same flow rate to prevent dripping. 3 seconds before the end of the pause interval, a beep is sounded to alert the operator to prepare for the next dispense. Starting with the second dispense, 0.25 mL is added to the volume dispensed to compensate for the sucked back volume of the previous dispense. 3 dispenses are executed after the initial dispense.
#--------------------------------------------------------------------------------------------#
# Initialize the pump with the specified COM port
pump = NewEraSyringePump('COM2') # Replace 'COM2' with the actual COM port used for the connection
# Reset pump
pump.reset_pump() # Reset the pump parameters
# Set syringe diameter
pump.set_diameter(26.59) # Change this value according to the syringe you're using
### BEGIN PUMPING PROGRAM ###
dispensed_volume = 2.0 # Initial dispensed volume
nb_dispenses = 3 # Number of dispenses executed after the initial dispense
suck_back_volume = 0.25 # Volume sucked back after each dispense
pause_time = 20 # Pause time of 20 seconds
# Initial dispense and suck back
pump.run_RATE_function(500, "MH", dispense_volume, "ML", 0) # RATE function to dispense, 0 to infuse
pump.run_RATE_function(500, "MH", suck_back_volume, "ML", 1) # RATE function to suck back, 1 to withdraw
# Execute 3 more dispenses after the initial dispense
for dispense_count in range(nb_dispenses):
# Wait for the specified pause time
time.sleep(pause_time - 3) # Wait for 20s - 3s
# Beep to alert the operator 3 seconds before the end of the pause
pump.beep() # Pump beep
time.sleep(3) # Wait for the remaining 3 seconds
# Run the RATE function for dispensing while adding 0.25 mL to the volume dispensed to compensate for the sucked back volume of the previous dispense
pump.run_RATE_function(500, "MH", dispense_volume + suck_back_volume, "ML", 0)
# Run the pumping rate function for suck back
pump.run_RATE_function(500, "MH", suck_back_volume, "ML", 1)
### END PUMPING PROGRAM ###
# Delete pump
del pump
Voorbeeld 3: Het geleidelijk verhogen van het debiet
Dit pompprogramma verhoogt en verlaagt de pompsnelheid continu, waarbij de snelheid telkens na het afgeven van een volume van 0,5 ml met stappen van 20 ml/uur toeneemt van een beginwaarde van 300 ml/uur tot 400 ml/uur. Nadat de maximale snelheid is bereikt, wordt de pompsnelheid in vergelijkbare stappen verlaagd, telkens nadat 0,5 ml is afgegeven, totdat 200 ml/uur is bereikt. Ten slotte wordt de snelheid weer verhoogd naar de beginwaarde, waarna de cyclus zich herhaalt. Het bijbehorende programma wordt weergegeven in het onderstaande codefragment.
#--------------------------------------------------------------------------------------------#
# Example 3: Continuously ramp up and down the pumping rate.
# Starting at 300 mL/hr, the pumping rate will increment to 400 mL/hr in 20 mL/hr steps after every 0.5 mL has been dispensed.
# Then the pumping rate will decrement to 200 mL/hr in 20 mL/hr steps after every 0.5 mL has been dispensed.
# Finally, the pumping rate is incremented back to 300 mL/hr in 20 mL/hr steps after every 0.5 mL has been dispensed, then the process is repeated.
#--------------------------------------------------------------------------------------------#
# Initialize the pump with the specified COM port
pump = NewEraSyringePump('COM2') # Replace 'COM2' with the actual COM port used for the connection
# Reset pump
pump.reset_pump() # Reset the pump parameters
# Set syringe diameter
pump.set_diameter(26.59) # Change this value according to the syringe you're using
### BEGIN PUMPING PROGRAM ###
# Define initial variables
current_rate = 300 # Initial flow rate
increment = 20 # 20 mL/hr steps
dispensed_volume = 0.5 # volume to be dispensed before each rate ramp change
# Define the boundaries
lower_boundary = 200 # the minimum flow rate
upper_boundary = 400 # the maximum flow rate
# Continuously ramp up and down the pumping rate
while True:
# Ramp up the pumping rate
while current_rate upper_boundary:
current_rate = upper_boundary
# Ramp down the pumping rate
while current_rate > lower_boundary:
# Run pumping rate function for the defined volume and rate
pump.run_RATE_function(current_rate, "MH", dispense_volume, "ML", 0)
# Decrement the pumping rate
current_rate -= increment
# Check if the rate is below the lower boundary
if current_rate
Hoewel de op maat gemaakte Python-bibliotheek een waardevol hulpmiddel vormt voor het aansturen van de NE-1000-spuitpomp, is het van essentieel belang om rekening te houden met de inherente beperking die voortvloeit uit de vertraging bij de communicatie via RS-232 . Deze waargenomen vertraging is het gevolg van het proces waarbij de pomp opdrachten ontvangt en uitvoert, wat resulteert in een zeer korte vertraging tussen opeenvolgende opdrachten.
Deze vertraging, hoe klein ook, kan leiden tot lichte afwijkingen in de afgegeven volumes. Dit is vooral merkbaar wanneer er binnen een pompprogramma snelle debietwijzigingen nodig zijn, aangezien de pomp tijdens dergelijke debietwijzigingen moet worden gestopt om een nieuw debiet door te geven, zoals aangegeven in de documentatie van de pomp. Daarin staat vermeld dat de nieuwe snelheid alleen in het niet-vluchtige geheugen wordt opgeslagen als het pompprogramma niet actief is 🚧. Dit kan in sommige gevallen de vloeistofstroom verstoren en de nauwkeurigheid van het experiment beïnvloeden.
Ondanks pogingen om dit probleem te verhelpen door middel van een strategische volgorde van commando’s en tijdvertragingen, blijft de uitdaging bestaan, wat van invloed is op het vermogen van de pomp om een continue en nauwkeurige pompwerking te handhaven, met name bij tijdgevoelige microfluïdische experimenten. Ook in de toekomst blijft het aanpakken van dit vertragingsprobleem een prioriteit om optimale pompprestaties en nauwkeurige experimentele resultaten te waarborgen.
Conclusie
In deze blogpost hebben we de basisprincipes van de communicatiebesturing van de NE-1000-spuitpomp via de opdracht ` RS-232 ` met behulp van Python behandeld, waarbij we alles hebben besproken, van het configureren van de communicatiepoort tot het programmeren van aangepaste pompsequenties. We hopen dat deze post een waardevolle gids is voor onderzoekers en ingenieurs die Python willen gebruiken om hun New Era-spuitpompen op afstand te bedienen met behulp van de opdrachtset ` RS-232 `.
Blijf op de hoogte voor meer inzichten, tutorials en praktijktoepassingen in onze toekomstige berichten. Veel succes met pompen en programmeren 💻!
📧 Als u vragen of opmerkingen heeft, neem dan gerust contact met ons op via support@darwin-microfluidics.com.


