In der Welt der Laborautomatisierung, in der Präzision und Kontrolle von größter Bedeutung sind, sind Spritzenpumpen hervorragende Werkzeuge, um präzise Flüssigkeitsmengen mit hoher Genauigkeit und Reproduzierbarkeit zu dosieren. Unter diesen Pumpenzeichnet sichdieSpritzenpumpe NE-1000durch ihre robuste Leistung und Vielseitigkeit aus.
In diesem Blogbeitrag beschreiben wir detailliert die Kommunikationssteuerung der NE-1000-Spritzenpumpe über „RS-232 “, gehen auf deren Funktionen ein und geben Einblicke in die Einrichtung der Kommunikation sowie die Anbindung an Python – inklusive Schritt-für-Schritt-Anleitungen zur Optimierung des Prozesses. Ganz gleich, ob Sie ein erfahrener Forscher oder ein Neuling im Bereich der Pumpensteuerung sind: Dieser Blogbeitrag vermittelt Ihnen das nötige Wissen und die Werkzeuge, um Ihre NE-1000-Pumpe zu steuern.
INHALTSVERZEICHNIS
Warum sollten Sie sich für die Spritzenpumpe NE-1000 entscheiden?
DieSpritzenpumpe NE-1000von New Era Pump Systems wird wegen ihrer Zuverlässigkeit und Flexibilität geschätzt. Sie bietet einen breiten Durchflussbereich (von 0,73 μL/h mit einer 1-mL-Spritze bis zu 2120 mL/h mit einer 60-mL-Spritze) und eine präzise Volumendosierung, wodurch sie sich ideal für verschiedene Anwendungen wie die Medikamentendosierung und kalibrierte Injektionen eignet. Mit ihrem kompakten Design und ihrer benutzerfreundlichen Oberfläche vereinfacht die NE-1000 den Aufbau von Versuchen und gewährleistet gleichzeitig konsistente und genaue Ergebnisse.
Es ist vollständig programmierbar – entweder eigenständig oder über einen beliebigen Computer oder ein Gerät mit einem RS-232 -Anschluss. Es verfügt über einen integrierten Pumpennetzwerk-Treiber mit einem Pumpennetzwerk, das bis zu 100 Pumpen und andere Geräte unterstützt. Ein weiteres Merkmal ist der nichtflüchtige Speicher für alle Betriebsparameter und das Pumpenprogramm, der komplexe Pumpenanwendungen und die Interaktion mit externen Geräten ermöglicht.
Was ist ein Abpumpprogramm?
Ein Pumpenprogramm legt die Abfolge der von der Pumpe ausgeführten Aktionen fest, darunter die Einstellung von Förderraten, Fördermengen und Förderrichtungen sowie die Ausführung von Pausen oder bedingten Anweisungen. Diese zuvor definierte Abfolge von Funktionen gewährleistet einen präzisen und automatischen Pumpenbetrieb, sowohl mit als auch ohne Benutzereingriff.
Ein Pumpenprogramm kann direkt über die Tastatur der Pumpe eingegeben oder mithilfe einer speziellen Software von einem Computer hochgeladen werden: „PumpTerm“,ein Pumpenterminal-Emulator, der die Kommunikation mit jeder Pumpe ermöglicht, die über eine PC-Schnittstelle verfügt, indem Programme und Befehle aus einer Datei hochgeladen werden, oder„SyringePumpPro“,das als Steuerungssoftware für Pumpen dient und die automatische Überwachung aller Pumpenparameter ermöglicht.
Darüber hinaus steht eine Tabellenkalkulation zur Erstellung von Pumpenprogrammen zur Verfügung, die bei der Entwicklung von Pumpenprogrammen sowie bei der Erstellung und Organisation von Pumpenabläufen hilft. Diese können in einer Textdatei gespeichert und zur Ausführung auf die Pumpe hochgeladen werden📄.
PumpTerm und SyringePumpPro sind zwar wertvolle Hilfsmittel zur Steuerung von Spritzenpumpen, aber sie sind nicht die einzigen verfügbaren Optionen. Man kann auch Programmierplattformen wie Python nutzen, die über leistungsfähige Bibliotheken für die serielle Kommunikation verfügen und eine präzise Steuerung sowie Automatisierung der NE-1000-Pumpe ermöglichen.
Bevor wir anhand von Beispielen und Einblicken in die Anwendung untersuchen, wie Python zur präzisen Steuerung der Spritzenpumpe NE-1000 eingesetzt werden kann, werden wir kurz den Befehlssatz „ RS-232 “ erläutern, der für die Kommunikation mit der NE-1000 verwendet wird. Wenn Sie bereits mit dem Kommunikationsprotokoll „ RS-232 “ vertraut sind, können Sie gerne direkt zu den Python-Codeausschnitten springen.
Was benötigen Sie für die Kommunikation mit der NE-1000-Pumpe?
Um über Python mit der Spritzenpumpe NE-1000 zu kommunizieren, benötigen Sie einige wichtige Komponenten:
- Eine NE-1000-Spritzenpumpe mit einer Spritze Ihrer Wahl,
- Ein „RS-232 “-Kabel, das die serielle Kommunikation ermöglicht und den Datenaustausch zwischen der Spritzenpumpe und dem Computer gewährleistet,
- Eine serielle Schnittstelle: Der Computer muss über eine freie serielle Schnittstelle oder einen Adapter von „ USB “ zu „seriell“ verfügen, um das Kabel „ RS-232 “ anschließen zu können,
- Eine Python-Umgebung mit dem PySerial-Paket, das den Zugriff auf die serielle Schnittstelle kapseln,
- Grundlegende Kenntnisse über die Befehlssätze „RS-232 “, die im Benutzerhandbuch der Pumpe ausführlich beschrieben sind.
Wie richte ich den Kommunikationsanschluss ein?
Bevor Sie über Python Befehle an die NE-1000-Pumpe senden können, müssen Sie unbedingt den Kommunikationsanschluss konfigurieren. Befolgen Sie diese Schritte, um eine Verbindung herzustellen🔧:
- Schließen Sie das „ RS-232 “-Kabel an den seriellen Anschluss auf der Rückseite der Spritzenpumpe NE-1000 und an den entsprechenden Anschluss am Computer an.
- Schalten Sie die Pumpe ein.
- Stellen Sie sicher, dass die Einstellungen der seriellen Schnittstelle mit den Spezifikationen Ihrer Spritzenpumpe übereinstimmen:
- 1 Startbit
- 8 Datenbits
- Parität: keine
- 1 Stoppbit
- eine Baudrate von 19.200 Bit/s
- Ermitteln Sie den Namen der seriellen Schnittstelle, die der Verbindung auf Ihrem Computer zugewiesen ist (z. B. COM4 unter Windows oder /dev/ttyUSB0 unter Linux). Diese Information finden Sie in der Regel im Gerätemanager oder mithilfe von Terminalbefehlen.
- Ein Dreieckssymbol (oben links auf dem Pumpenbildschirm) zeigt an, dass die Kommunikation erfolgreich ist; es bleibt so lange sichtbar, bis das Gerät ausgeschaltet wird oder der Menüpunkt „Setup-Konfiguration“ aufgerufen wird.
- Testen Sie die Verbindung, indem Sie einen einfachen Befehl senden, beispielsweise eine Abfrage des Pumpenstatus.
Was ist der Befehlssatz „ RS-232 “?
Die Spritzenpumpe NE-1000 kommuniziert über „ RS-232 “ und speichert Datenänderungen in einem nichtflüchtigen Speicher, mit Ausnahme von Anpassungen der Förderrate während des Betriebs. Jede Programmphase umfasst die Förderrate, das abzugebende Volumen und die Förderrichtung, die über den Befehl „PHN“ ausgewählt werden können.
Der Befehlssatz „ RS-232 “, der zur Steuerung der Pumpe NE-1000 verwendet wird, ist in der folgenden Tabelle zusammengefasst. Befehleohne Parameter dienen als Abfragen, die die angeforderten Daten zurückgeben. Die Antworten spiegeln in der Regel die Befehlsparameter wider. Erfolgreiche Einstellungsbefehle führen zu einer Statusantwort, während fehlgeschlagene Befehle eine Fehlermeldung auslösen.
| Befehl | Definition |
|---|---|
| DIA [float] | Innendurchmesser der Spritze |
| PHN [Phasendaten] | Programmphasennummer |
| FUN [Phasenfunktion] | Programmphasenfunktion |
| RAT | Funktion „RATE“ zum Abpumpen |
| RAT [Float | Rateeinheiten] | Pumpgeschwindigkeit |
| VOL [Float | Volumeneinheiten] | Abzugebendes Volumen |
| DIR [INF \ WDR] | Pumprichtung |
| INC | Inkrementierungsfunktion „INCR“ |
| DEC | Funktion zur Verringerung der Rate, „DECR“ |
| JMP [Phasendaten] | Springe zur Programmphasenfunktion „JP:nn“ |
| LPS | Schleife starten, „LP:ST“ |
| LOP [Zähldaten] | nn-mal zur vorherigen Schleifenanfangsposition zurückkehren, „LP:nn“ |
| LPE | Schleife beenden, „LP:EN“ |
| PAS [Zahlenangaben] | Das Pumpen für „nn“ Sekunden unterbrechen, „PS:nn“ |
| BEP | Kurzer Signalton, „BEEP“ |
| CLD [INF \ WDR] | Abgegebene klare Flüssigkeitsmenge |
| RESET | Pumpe zurücksetzen und Programmspeicher löschen |
| RUN | Das Pumpenprogramm starten |
| STP | Pumpe anhalten, „STOP“ |
Die Durchfluss-Einheiten sind „UM“ für µL/min, „MM“ für mL/min, „UH“ für µL/h und „MH“ für mL/h. Die Volumeneinheiten sind „UL“ für µL und „ML“ für mL. Diese werden entsprechend der aktuellen Einstellung des Spritzendurchmessers festgelegt.
Wenn der Befehl „RUN“ an die Pumpe gesendet wird, wird das Pumpenprogramm an der Stelle fortgesetzt, an der es angehalten wurde, sofern es unterbrochen war. Andernfalls beginnt das Pumpenprogramm bei Phase 1. Bei Ausführung des Befehls „RUN #“ startet das Programm bei der angegebenen Phase (# steht für die Nummer der Phase „PHN“).
Wenn der Befehl „STP“ an die Pumpe gesendet wird und das Pumpenprogramm gerade läuft, wird dieses unterbrochen und die Pumpe angehalten. Befindet sich das Pumpenprogramm bereits im Pausenmodus, hebt der Befehl „STP“ die Pause auf und setzt das Pumpenprogramm auf Phase 1 zurück.Weitere Informationen zum Befehlssatz „ RS-232 “ finden Sie in der Dokumentationzur Spritzenpumpe NE-1000 .
Nachdem Sie den Kommunikationsanschluss konfiguriert haben und über grundlegende Kenntnisse der Befehlssätze „ RS-232 “ verfügen, können Sie nun mit der Entwicklung von Python-Skripten zur Steuerung der Spritzenpumpe NE-1000 beginnen🕹️.
💡 Erweiterte Funktionen der Standard-Firmware für den NE-1000:
- Das X-Firmware-Upgrade mit erweiterten Funktionen, einschließlich linearer/verlaufsbasierter Rampen für sanfte Farbverläufe und zusätzlicher Programmierfunktionen.
- Die erweiterten Funktionen der X2-Firmware und die Speichererweiterung umfassen alle Funktionen der X-Firmware-Version sowie eine Erweiterung des Speichers für Pumpenprogramme von 41 auf 340 Phasen.
Programmierung der Spritzenpumpe NE-1000 mit Python?
Im Folgenden werden Python-Codeausschnitte vorgestellt, die zeigen, wie man den seriellen Port öffnet, Steuerbefehlszeichenfolgen an die Pumpe schreibt und sendet sowie ein Pumpenprogramm auf den NE-1000 schreibt.
Wir werden uns Codeausschnitte ansehen, die veranschaulichen, wie gängige Aufgaben wie das Einfüllen von Flüssigkeiten, das Einstellen von Förderraten und das Ausführen komplexer Förderabläufe durchgeführt werden. Diese Beispiele vermitteln ein praxisnahes Verständnis der Python-basierten Steuerung der Spritzenpumpe NE-1000.
Nachbildung der Funktionen von SyringePumpPro und PumpTerm
In diesem ersten Teil werden wir Python verwenden, um die Funktionen von SyringePumpPro und PumpTerm nachzubilden: das Hochladen eines Pumpprogramms von einem Computer (oder das direkte Schreiben in die Pumpe). In diesem Unterabschnitt wird erläutert, wie ein Python-Skript die Funktionen dieser Softwaretools effektiv emuliert und so die Steuerung und Automatisierung der Spritzenpumpe NE-1000 ermöglicht.
Wir werden die Python-Bibliothek„serial“verwenden, um über eine serielle Schnittstelle eine Verbindung zur Spritzenpumpe NE-1000 herzustellen. Zunächst importieren wir das Modul„serial“, das Werkzeuge für die serielle Kommunikation bereitstellt. Anschließend wird die Funktion„serial.Serial“verwendet, um die serielle Schnittstellenverbindung zu initialisieren, wobei Parameter wie der Name der Schnittstelle („COM2“), die Baudrate (19200) sowie Kommunikationseinstellungen wie Parität, Bytegröße und Stoppbits festgelegt werden.
Die Python-Codeausschnitte werden im Folgenden vorgestellt und näher erläutert👇.
Eine PPL-Datei vom Computer auf die Pumpe übertragen
'''
------------------------------------------------
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()
Die Funktion„send_command“wurde definiert, um das Senden von Befehlen an die Pumpe zu vereinfachen (mit der Option, auch deren Antwort auszulesen). Innerhalb dieser Funktion werden Befehle als kodierte Zeichenfolgen an die Pumpe gesendet, gefolgt von einer kurzen Verzögerung mithilfe von„time.sleep()“, um der Pumpe Zeit für die Verarbeitung des Befehls zu geben.
Zudem ist eine Funktion„read_ppl_file“enthalten, mit der der Inhalt einer PPL-Datei (Pump Programming Language) gelesen werden kann, die Befehlssequenzen enthält, die von der Pumpe ausgeführt werden sollen. Der Dateipfad zur PPL-Datei wird angegeben, und ihr Inhalt wird mithilfe der Funktion„read_ppl_file“ gelesen.
Die Pumpe wird mit dem Befehl„RESET“zurückgesetzt, um einen sauberen Start zu gewährleisten, bevor die in der PPL-Datei enthaltene Befehlsfolge ausgeführt wird. Der Inhalt der PPL-Datei wird in Zeilen aufgeteilt, und jede Zeile wird mithilfe der Funktion„send_command“als Befehl an die Pumpe gesendet. Abschließend wird der Befehl„RUN“gesendet, um den Pumpvorgang zu starten.
Sobald alle Befehle ausgeführt wurden, kann die Verbindung zur seriellen Schnittstelle mit„ser.close()“ geschlossen werden, wodurch eine ordnungsgemäße Freigabe der Ressourcen gewährleistet wird.
Ein Pumpenprogramm auf die Pumpe schreiben
Der vorstehende Code veranschaulicht einen optimierten Ansatz zur Steuerung der Spritzenpumpe NE-1000 mit Python. Es kann jedoch vorkommen, dass man keinen Zugriff auf die Tabellenkalkulation zum Erstellen des Pumpenprogramms hat oder es einfach vorzieht, das Pumpenprogramm direkt im Python-Skript zu schreiben, um direkte und visuelle Änderungen am Programm vornehmen zu können, bevor es an die Pumpe gesendet wird. Dieser Ansatz bietet größere Flexibilität und Unmittelbarkeit bei der Programmierung der Pumpenfunktionen. Der folgende Codeausschnitt veranschaulicht diese Methode, mit der Benutzer das Pumpenprogramm direkt im Python-Skript definieren können, was Anpassungen von Parametern und Abläufen in Echtzeit ermöglicht.
'''
-------------------------------------
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 definieren wir ein Pumping-Programm direkt im Python-Skript. Das Programm (ausführlich beschrieben in den Beispielen für Pumping-Programme weiter unten 👇) enthält eine Abfolge von Befehlen, die in einzelnen Zeilen angeordnet sind. Jede Zeile wird mithilfe der Funktion„send_command“als Befehl an die Pumpe gesendet.
Nachdem das gesamte Pumpenprogramm an die Pumpe gesendet wurde, wird der Befehl„RUN“ausgegeben, um den Pumpvorgang zu starten.
Beispiele für Abpump-Programme
Im Folgenden finden Sie drei Beispiele für Pumpenprogramme, die für die Spritzenpumpe NE-1000 entwickelt wurden und jeweils auf spezifische Versuchsanforderungen zugeschnitten sind.
Beispiel 1: Infusion und Entnahme von Flüssigkeiten
In diesem Beispiel pumpt die Spritzenpumpe NE-1000 eine Flüssigkeit mit einer festgelegten Förderrate und einem festgelegten Volumen ein, hält 10 Sekunden lang an, saugt ein anderes Volumen mit einer anderen Förderrate ab und stoppt dann. Die verschiedenen Phasen des Pumpenprogramms sind in der folgenden Tabelle zusammengefasst, und das entsprechende Programm ist im Code-Ausschnitt dargestellt.
| Phase | Funktion | Wert | Zinssatz | Umfang | Richtung |
|---|---|---|---|---|---|
| 1 | RAT | - | 500 ml/h | 2,0 ml | Aufgießen |
| 2 | PAS | 10 | - | - | - |
| 3 | RAT | - | 200 ml/h | 1,0 ml | Abheben |
| 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
Beispiel 2: Wiederholte Dosierungen mit Rücksaugung
Dieses Pumpenprogramm dosiert 2,0 ml einer Flüssigkeit mit einem Pausenintervall von 20 Sekunden zwischen den einzelnen Dosierungen (insgesamt 4 Dosierungen). Nach jeder Dosierung wird ein kleines Volumen von 0,25 ml zurückgesaugt, um ein Tropfen zu verhindern. Zudem ertönt 3 Sekunden vor Ende jeder Pause ein Signalton, um die bevorstehende Dosierung anzukündigen. Ab der zweiten Abgabe werden 0,25 ml zum abgegebenen Volumen hinzugefügt, um das bei der vorherigen Abgabe zurückgesaugte Volumen auszugleichen.
Die verschiedenen Phasen des Pumpenprogramms sind in der folgenden Tabelle zusammengefasst, und das entsprechende Programm ist im Codeausschnitt dargestellt.
| Phase | Funktion | Wert | Zinssatz | Umfang | Richtung |
|---|---|---|---|---|---|
| 1 | RAT | - | 500 ml/h | 2,0 ml | Aufgießen |
| 2 | RAT | - | 500 ml/h | 0,25 ml | Abheben |
| 3 | LPS | - | - | - | - |
| 4 | PAS | 17 | - | - | - |
| 5 | BEP | - | - | - | - |
| 6 | PAS | 3 | - | - | - |
| 7 | RAT | - | 500 ml/h | 2,25 ml | Aufgießen |
| 8 | RAT | - | 500 ml/h | 0,25 ml | Abheben |
| 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
Beispiel 3: Durchflussanstieg
Dieses Pumpenprogramm erhöht und verringert die Pumpgeschwindigkeit kontinuierlich, wobei sie jeweils nach der Abgabe eines Volumens von 0,5 ml in Schritten von 20 ml/h von einem Anfangswert von 300 ml/h auf 400 ml/h ansteigt. Nach Erreichen der maximalen Förderrate wird diese in ähnlichen Schritten nach jeder Abgabe von 0,5 ml wieder verringert, bis 200 ml/h erreicht sind. Schließlich wird die Förderrate wieder auf den Ausgangswert erhöht, und der Zyklus wiederholt sich.
Die verschiedenen Phasen des Pumpenprogramms sind in der folgenden Tabelle zusammengefasst, und das entsprechende Programm ist im Codeausschnitt dargestellt.
| Phase | Funktion | Wert | Zinssatz | Umfang | Richtung |
|---|---|---|---|---|---|
| 1 | RAT | - | 300 ml/h | 0,5 ml | Aufgießen |
| 2 | LPS | - | - | - | - |
| 3 | INC | - | 20 ml/h | 0,5 ml | Aufgießen |
| 4 | LOP | 5 | - | - | - |
| 5 | LPS | - | - | - | - |
| 6 | DEC | - | 20 ml/h | 0,5 ml | Aufgießen |
| 7 | LOP | 10 | - | - | - |
| 8 | LPS | - | - | - | - |
| 9 | INC | - | 20 ml/h | 0,5 ml | Aufgießen |
| 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
Maßgeschneiderte Python-Bibliothek zur Steuerung der NE-Spritzenpumpe
In diesem zweiten Teil wird eine weitere effektive Methode zur Steuerung der Spritzenpumpe NE-1000 mit Python vorgestellt. Es wurde eine eigene Python-Bibliothek entwickelt, deren benutzerfreundliche Funktionen zum Einstellen von Parametern, Ausführen von Aktionen und Verwalten der Kommunikation genutzt werden können.
Im Folgenden stellen wir die maßgeschneiderte Bibliothek zur Steuerung der Spritzenpumpe NE-1000 vor und erläutern deren Einschränkungen. Wir gehen dabei näher auf drei verschiedene Beispiele für Pumpprogramme ein (die oben vorgestellten Beispiele 1, 2 und 3) und zeigen, wie diese Funktionen genutzt werden können, um präzise Pumpsequenzen auszuführen.
'''
-----------------------------------------------------------------------
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 #####
Diese benutzerdefinierte Bibliothek ermöglicht die Steuerung der Spritzenpumpe NE-1000. Sie stellt über eine serielle Schnittstelle eine Verbindung zur Pumpe her und ermöglicht es dem Benutzer, Parameter wie Spritzendurchmesser, Pumpgeschwindigkeit, Volumen und Richtung einzustellen. Benutzer können Pumpvorgänge wie das Starten, Stoppen und Zurücksetzen der Pumpe auslösen. Zusätzlich wird eine „RATE“-Funktion mithilfe einer Reihe bereits definierter Funktionen implementiert. Mit dieser Bibliothek können Benutzer präzise Pumpsequenzen direkt aus ihrer Python-Umgebung heraus erstellen, wie in den drei folgenden Beispielen gezeigt wird.
Beispiel 1: Infusion und Entnahme von Flüssigkeiten
In diesem Beispiel pumpt die Spritzenpumpe NE-1000 eine Flüssigkeit mit einer festgelegten Förderrate und einem festgelegten Volumen ein, hält 10 Sekunden lang an, saugt ein anderes Volumen mit einer anderen Förderrate an und stoppt dann. JA, Sie haben recht! Dieses Beispiel wurde direkt oben vorgestellt und veranschaulicht, wie die Bibliothek die Ausführung derselben zuvor beschriebenen Pumpsequenz ermöglicht.
#--------------------------------------------------------------------------------------------#
# 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
Dieser Python-Codeausschnitt veranschaulicht die Verwendung der benutzerdefinierten Bibliothek zur Steuerung der Spritzenpumpe NE-1000, um eine bestimmte Pumpsequenz auszuführen. Zunächst wird die Pumpe mit dem angegebenen COM-Port initialisiert und anschließend zurückgesetzt, um die Standardparameter wiederherzustellen. Der Spritzendurchmesser wird entsprechend eingestellt.
Die Pumpsequenz besteht aus drei Hauptschritten:
- Die Pumpe infundiert 4,0 ml Flüssigkeit mit einer Geschwindigkeit von 500 ml/h.
- Nach einer Pause von 10 Sekunden saugt die Pumpe 2,0 ml Flüssigkeit mit einer Förderleistung von 200 ml/h an.
- Schließlich wird die Pumpe abgeschaltet.
Jeder Schritt der Sequenz wird mithilfe der Methode„run_RATE_function“ der Klasse„NewEraSyringePump“ ausgeführt, wobei die Förderrate, das Volumen, die Einheiten und die Richtung angegeben werden. Nach Abschluss der Fördersequenz wird die Pumpeninstanz gelöscht und die serielle Schnittstelle geschlossen.
Dieser Code liefert ein einfaches Beispiel dafür, wie die benutzerdefinierte Bibliothek zur Steuerung der Spritzenpumpe NE-1000 und zur Ausführung präziser Pumpsequenzen verwendet werden kann. Zwei weitere Beispiele finden Sie weiter unten.
Beispiel 2: Wiederholte Dosierungen mit Rücksaugung
Dieses Pumpenprogramm dosiert 2,0 ml einer Flüssigkeit mit einem Pausenintervall von 20 Sekunden zwischen den einzelnen Dosierungen (insgesamt 4 Dosierungen). Nach jeder Dosierung wird ein kleines Volumen von 0,25 ml zurückgesaugt, um ein Tropfen zu verhindern. Zudem ertönt 3 Sekunden vor Ende jeder Pause ein Signalton, um die bevorstehende Dosierung anzukündigen. Ab der zweiten Abgabe werden 0,25 ml zum abgegebenen Volumen hinzugefügt, um das bei der vorherigen Abgabe zurückgesaugte Volumen auszugleichen. Das entsprechende Programm ist im folgenden Codeausschnitt dargestellt.
#--------------------------------------------------------------------------------------------#
# 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
Beispiel 3: Durchflussanstieg
Dieses Pumpenprogramm erhöht und verringert die Pumpgeschwindigkeit kontinuierlich, wobei sie jeweils nach der Abgabe eines Volumens von 0,5 ml in Schritten von 20 ml/h von einem Anfangswert von 300 ml/h auf 400 ml/h ansteigt. Nach Erreichen der maximalen Förderrate wird diese in ähnlichen Schritten nach jeder Abgabe von 0,5 ml wieder verringert, bis 200 ml/h erreicht sind. Schließlich wird die Förderrate wieder auf den Ausgangswert erhöht, und der Zyklus wiederholt sich. Das entsprechende Programm ist im folgenden Codeausschnitt dargestellt.
#--------------------------------------------------------------------------------------------#
# 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
Die maßgeschneiderte Python-Bibliothek ist zwar ein wertvolles Werkzeug zur Steuerung der Spritzenpumpe NE-1000, doch muss man sich der inhärenten Einschränkung bewusst sein, die durch die Zeitverzögerung bei der Kommunikation über „ RS-232 “ entsteht. Diese beobachtete Verzögerung resultiert aus dem Vorgang, bei dem die Pumpe Befehle empfängt und ausführt, was zu einer sehr kurzen Verzögerung zwischen aufeinanderfolgenden Befehlen führt.
Diese Verzögerung, auch wenn sie nur geringfügig ist, kann zu leichten Abweichungen bei den dosierten Volumina führen. Dies macht sich insbesondere dann bemerkbar, wenn innerhalb eines Pumpprogramms schnelle Durchflussratenänderungen erforderlich sind, da gemäß der Dokumentation der Pumpe der Pumpbetrieb während solcher Änderungen unterbrochen werden sollte, um eine neue Durchflussrate zu übermitteln. Dort ist festgelegt, dass die neue Förderrate nur dann im nichtflüchtigen Speicher abgelegt wird, wenn das Pumpenprogramm nicht läuft 🚧. Dies kann in einigen Fällen den Flüssigkeitsfluss stören und die Genauigkeit des Experiments beeinträchtigen.
Trotz der Versuche, dieses Problem durch eine strategische Abfolge der Befehle und Zeitverzögerungen zu mindern, besteht die Herausforderung weiterhin und beeinträchtigt die Fähigkeit der Pumpe, einen kontinuierlichen und präzisen Pumpbetrieb aufrechtzuerhalten, insbesondere bei zeitkritischen mikrofluidischen Experimenten. Auch in Zukunft bleibt die Behebung dieses Verzögerungsproblems eine Priorität, um eine optimale Pumpenleistung und genaue Versuchsergebnisse zu gewährleisten.
Fazit
In diesem Blogbeitrag haben wir die Grundlagen der Kommunikationssteuerung der NE-1000-Spritzenpumpe über „ RS-232 “ mithilfe von Python behandelt und dabei alles von der Konfiguration des Kommunikationsanschlusses bis hin zur Programmierung benutzerdefinierter Pumpsequenzen abgedeckt. Wir hoffen, dass dieser Beitrag als wertvolle Anleitung für Forscher und Ingenieure dient, die Python nutzen möchten, um ihre New Era-Spritzenpumpen mithilfe des Befehlssatzes „ RS-232 “ fernzusteuern.
Freut euch auf weitere Einblicke, Tutorials und praktische Anwendungsbeispiele in unseren kommenden Beiträgen. Bis dahin: Viel Spaß beim Pumpen und Programmieren 💻!
📧 Wenn Sie Fragen oder Anregungen haben, können Sie sich gerne an uns wenden unter support@darwin-microfluidics.com.


