Die Reglo ICC (Independent Channel Control) Peristaltikpumpe von Masterflex Ismatec ist ein hochpräzises Gerät, das für unvergleichliche Kontrolle und Genauigkeit bei der Dosierung und Förderung von Flüssigkeiten entwickelt wurde. Es zeichnet sich durch die Möglichkeit aus, Richtung und Geschwindigkeit von bis zu vier Kanälen unabhängig voneinander zu steuern, wobei jeder Kanal über eigene Programme für Start, Stopp, Kalibrierung und mehr verfügt.
Mit einem Durchflussbereich von 0,001 bis 35 ml/min pro Kanal und individuell einstellbaren Pulsationswerten bietet diese Pumpe die nötige Flexibilität für eine Vielzahl von Anwendungen. Die intuitive digitale Benutzeroberfläche und die „ RS-232 “-Computeranbindung ermöglichen die Erstellung komplexer Pumpsequenzen sowie die gleichzeitige Steuerung mehrerer Pumpen.
In diesem Blogbeitrag werden wir uns damit befassen, wie man die Reglo ICC-Peristaltikpumpe mithilfe des seriellen Befehlsprotokolls von Reglo ICC über zwei Programmierplattformen steuert: Python und Matlab.
INHALTSVERZEICHNIS
Warum sollten Sie sich für die Reglo ICC-Schlauchpumpe entscheiden?
Die Reglo ICC-Peristaltikpumpe ist vielseitig einsetzbar und benutzerfreundlich und gilt als erste Wahl für die Förderung von Flüssigkeiten sowohl in Laboren als auch in der Industrie. Hier sind einige der wichtigsten Vorteile:
- Unabhängige Kanalsteuerungvon bis zu vier Kanälen, wobei jeder Kanal gleichzeitig mit einem eigenen Programm, eigenen Durchflussmengen und eigenen Durchflussrichtungen betrieben werden kann.
- Hohe Genauigkeit und Reproduzierbarkeitgewährleisten eine präzise und gleichbleibende Flüssigkeitsdosierung, indem Unterschiede zwischen den einzelnen Röhrchen minimiert werden.
- Einstellbare Pulsation und Durchflussbereich mit 6, 8 oder 12 Rollen zur Einstellung der Pulsation und des Durchflussbereichs (mehr Rollen führen zu einer geringeren Pulsation und niedrigeren Durchflussraten).
- Vielseitige Steuerungsmöglichkeitenüber die digitale Schnittstelle oder eine „ RS-232 “-Verbindung (bis zu acht Pumpen in Reihe schaltbar).
- Umfassende Betriebsmodi, darunter die kontinuierliche Dosierung mit einer festgelegten Rate, die Dosierung eines bestimmten Volumens über einen festgelegten Zeitraum, die Kalibrierung der einzelnen Kanäle und vieles mehr.
Was benötigen Sie für die Kommunikation mit der Reglo-ICC-Pumpe?
Für die Kommunikation mit der Reglo ICC-Peristaltikpumpe benötigen Sie einige wichtige Komponenten:
- Eine Reglo-ICC -Pumpe mit einem Pumpenkopf und einer tube Ihrer Wahl,
- Ein Mini-USB-/USB -Kabel oder ein DB9-Stecker (verbunden mit einem RS-232 -Steuermodul), der die serielle Kommunikation ermöglicht und den Datenaustausch zwischen der Spritzenpumpe und dem Computer gewährleistet,
- Eine Programmierplattform (im vorliegenden Fall Python und MATLAB) oder ein Terminalemulator,
- Grundlegende Kenntnisse des seriellen Reglo-ICC-Befehlsprotokolls, das im Folgenden 👇 erläutert und in der Bedienungsanleitung der Pumpe ausführlich beschrieben wird.
Wie richte ich den Kommunikationsanschluss ein?
Bevor Sie mit dem Senden und Empfangen von Daten von der Pumpe beginnen können, müssen Sie den Kommunikationsanschluss korrekt einrichten. Gehen Sie dazu wie folgt vor:
- Schließen Sie das Mini-USB-/USB -Kabel oder den DB9-Stecker an den seriellen Anschluss auf der Rückseite der Pumpe und an den entsprechenden Anschluss am Computer an.
- Schalten Sie die Pumpe ein.
- Ermitteln Sie den Namen des seriellen Anschlusses, der 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.
- 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 9600 Bit/s.
- Der Fernsteuerungsmodus auf dem Display der Pumpe bestätigt eine erfolgreiche Verbindung und zeigt an, dass die Pumpe über eine „ USB “ 2.0-, Mini-B- oder „ RS-232 “-Verbindung von einem Computer aus ferngesteuert wird.
Das serielle Befehlsprotokoll „Reglo ICC“
Das Reglo-ICC-Befehlsprotokoll bietet eine Vielzahl von Befehlen für contrôle externe, die zur präzisen Steuerung in verschiedene Kategorien unterteilt sind. Dazu gehören Kommunikationsmanagement, Betriebsmodi und -einstellungen, Steuerbefehle, Konfigurationen, Kalibrierung und vieles mehr.
Es gibt zwei Arten von Nachrichten: Antwortnachrichten, die von der Pumpe an den PC gesendet werden, und Anforderungsnachrichten, die vom PC an die Pumpe gesendet werden. Alle Nachrichten bestehen aus einer Folge druckbarer ASCII-Zeichen. Jede Nachricht endet mit einem Wagenrücklauf oder einem Wagenrücklauf und einem Zeilenvorschub.
Das Reglo-ICC-Befehlsprotokoll zur Steuerung der Reglo-ICC-Peristaltikpumpe ist im Folgenden zusammengefasst. Weitere Einzelheiten finden Sie in der Bedienungsanleitung der Pumpe.
Datentypformate
| Datentyp | Breite | Einheit | Reichweite | Format |
|---|---|---|---|---|
| Richtung | 1 | - | - | J = im Uhrzeigersinn K = gegen den Uhrzeigersinn |
| Diskreter Typ 1 | 1 bis 4 | - | 0 bis 9999 | 1 bis 4 Zeichen im Dezimalsystem. Nicht verwendete Ziffern werden nicht zurückgegeben. |
| Diskret Typ 2 | 4 | - | 0 bis 9999 | 4 Zeichen im Dezimalsystem. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite werden durch Nullen ersetzt. |
| Diskreter Typ 3 | 6 | - | 0 bis 999.999 | 6 Zeichen im Dezimalsystem. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite sind Nullen. |
| Diskreter Typ 4 | 10 | - | 0 bis 4294967295 | 10 Zeichen im Dezimalsystem. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite werden durch Nullen ersetzt. |
| Diskreter Typ 5 | 3 | - | 0 bis 999 | 3 Zeichen im Dezimalsystem. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite sind Nullen. |
| Diskreter Typ 6 | 5 | - | 0 bis 99999 | 5 Zeichen im Dezimalsystem. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite werden durch Nullen ersetzt. |
| Fraktionierter Typ 1 | Variable | - | - | XXXX.DD Variable Breite des ganzzahligen Teils (XXXX). Dezimalpunkt und zwei Stellen rechts davon (.DD) sind immer vorhanden. |
| Bandtyp 1 | 7 | ml | - | mmmmEse ⇒ m.mmm × 10^se: mmmm — 4-stellige Mantisse Dezimalpunkt wird nach dem ersten Zeichen abgeleitet. E — Zeichen „E“ s — Vorzeichen für den Exponenten: + oder - e — einstelliger Exponent |
| Zeitart 1 | 1 bis 8 | 0.1s | 0 bis 35.964.000 (0 bis 999 Stunden) | 1 bis 8 Zeichen, die die Uhrzeit darstellen. Nicht verwendete Ziffern werden nicht zurückgegeben. |
| Zeitart 2 | 8 | 0.1s | 0 bis 35.964.000 (0 bis 999 Stunden) | 8 Zeichen, die die Uhrzeit darstellen. Rechtsbündiger Wert. Nicht verwendete Ziffern auf der linken Seite sind Nullen. |
Antwortnachrichten
Eine Antwortnachricht ist eine Nachricht, die von der Pumpe an den PC gesendet wird, als Reaktion auf eine vom PC gesendete Anforderungsnachricht. Sie kann in Form einer Status- oder einer Datenantwort vorliegen.
Eine Statusantwort besteht aus einem einzelnen ASCII-Zeichen, das angibt, ob der Befehl erfolgreich ausgeführt wurde oder nicht. Die verschiedenen ASCII-Zeichen, die den Ausführungsstatus des angeforderten Befehls anzeigen, sind in der folgenden Tabelle aufgeführt.
| ASCII-Zeichen | Definition | In Hex | Im Dezimalsystem |
|---|---|---|---|
| * | Befehl erfolgreich ausgeführt | 0x2a | 42 |
| # | Befehl wurde nicht erfolgreich ausgeführt | 0x23 | 35 |
| + | positive Antwort, die bei einigen Befehlen verwendet wird | 0x2b | 43 |
| - | Negative Antwort, die bei einigen Befehlen verwendet wird | 0x2d | 45 |
Wenn der PC Parameterwerte abfragt, wird von der Pumpe eine Datenantwort empfangen. Diese besteht aus einem oder mehreren Datenparameterwerten, die durch Leerzeichen voneinander getrennt sind. Jeder Datenparameter in der Antwortnachricht ist ein von der Pumpe zurückgegebenes Datenwert in einem Format, das durch die Anforderungsnachricht definiert ist.
| Datenparameter 1 | [SP] | Datenparameter 2 | [SP] | … | Datenparameter n | [CR] | [LF] |
Anforderungsmeldungen
Anforderungsnachrichten sind Nachrichten, die vom PC an die Pumpe gesendet werden. Auf diese sollte die Pumpe mit einer Antwortnachricht reagieren.
Ein Gerätesteuerbefehl (wie unten dargestellt) besteht aus einer Zeichenfolge druckbarer ASCII-Zeichen und wird mit einem Wagenrücklauf [CR] oder einem Wagenrücklauf [CR] und einem Zeilenvorschub [LF] abgeschlossen. Er ist an eine bestimmte Pumpe/einen bestimmten Kanal gerichtet, um bestimmte Parameter abzurufen oder einzustellen.
| Adresse (1–4) | Befehlscode | Datenparameter 1 | [VB] | Datenparameter 2 | [VB] | … | Datenparameter n | [CR] | [LF] |
Bei einem Bus mit „in Reihe geschalteten“ Pumpen liegt die Adresse zwischen 1 und 8 (maximale Anzahl der gleichzeitig gesteuerten Pumpen). Wird nur eine Pumpe gesteuert, liegt die Adresse zwischen 1 und 4, entsprechend der Anzahl der unabhängig voneinander gesteuerten Kanäle, wie im obigen Steuerbefehl dargestellt.
Die Befehlszeichenfolge besteht in der Regel aus einem oder zwei Zeichen, die den Befehlstyp angeben. Die Datenparameter sind optionale Werte, die bei der Festlegung eines Parameterwerts angegeben werden können. Und schließlich werden die Datenparameter durch das Zeichen „vertikaler Strich“ voneinander getrennt.
An die Pumpe können verschiedene Befehle gesendet werden, die sich auf die Kommunikationsverwaltung, die Pumpen drive, Betriebsmodi und Einstellungen, die Kalibrierung und vieles mehr beziehen. Einige dieser direkt an die Pumpe gerichteten Befehle sind in der folgenden Tabelle aufgeführt. Weitere Befehle sind in der Bedienungsanleitung aufgeführt und dort näher beschrieben.
| Befehl | Funktion | Set/Get | Pumpenreaktion |
|---|---|---|---|
| H | Pumpe starten | Set | * - : Kanaleinstellung nicht korrekt |
| I | Pumpe anhalten | Set | * |
| xI | Pumpvorgang unterbrechen (STOP im Drehzahl- oder Durchflussmodus) | Set | * |
| J | Drehrichtung auf „im Uhrzeigersinn“ einstellen | Set | * |
| K | Drehrichtung auf „gegen den Uhrzeigersinn“ einstellen | Set | * |
| xD | Drehrichtung abrufen | Holen Sie sich | J: im Uhrzeigersinn K: gegen den Uhrzeigersinn |
| xM | Pumpen-/Kanal-Strommodus abrufen | Holen Sie sich | L: Drehzahl M: Durchflussmenge O: Volumen bei Durchflussmenge G: Volumen über die Zeit Q: Volumen + Pause N: Zeit P: Zeit + Pause |
| L | Pumpe/Kanal auf den Drehzahlmodus einstellen | Set | * |
| M | Pumpe/Kanal auf den Durchflussmodus einstellen | Set | * |
| O | Pumpe/Kanal auf den Modus „Volumen bei festgelegter Rate“ einstellen | Set | * |
| G | Pumpe/Kanal auf den Modus „Volumen über Zeit“ einstellen | Set | * - : Kanaleinstellung nicht korrekt |
| S | Durchflussmengen-Einstellung im RPM-Modus (0,01 RPM). Diskreter Typ 3. | Set | * |
| S | Aktuelle Drehzahleinstellung in U/min abrufen | Holen Sie sich | Fraktionierter Typ 1 |
| f | Stellen Sie die Durchflussrate im Volumen-/Zeitmodus (ml/min) ein. Volumentyp 2 (ähnlich wie Typ 1, jedoch ohne das Zeichen „E“). | Set | Bandtyp 1 |
| f | Aktuelle Volumen-/Zeit-Durchflussrate abrufen (ml/min) | Holen Sie sich | Bandtyp 1 |
| xP | Pumpzeit und Pausenzeit ermitteln | Holen Sie sich | Zeitart 1 |
| xY | Kalibrierung für einen Kanal starten | Set | * |
| xZ | Kalibrierung abbrechen | Set | * |
In den definierten Anforderungsnachrichten werden verschiedene Symbole zur Darstellung von ASCII-Zeichen verwendet. Einige davon sind in der folgenden Tabelle aufgeführt.
| Symbol | Definition | In Hex | Im Dezimalsystem |
|---|---|---|---|
| [CR] | Zeilenumbruch | 0x0d | 13 |
| [LF] | Zeilenvorschub | 0x0a | 10 |
| [SP] | Leerzeichen | 0x20 | 32 |
| [VB] | senkrechter Strich | 0x7c | 124 |
| @ | Zeichen „@“ | 0x40 | 64 |
Beispiele für Befehle
Um mit der Pumpe zu kommunizieren, sollte man die verschiedenen Befehle kennen, die die Pumpe akzeptiert, und die erforderlichen Befehlsfolgen für den Steuercomputer vorbereiten.
In der folgenden Tabelle werden einige Beispiele für direkt adressierte Befehle aufgeführt und erläutert.
| Befehl | Definition | Pumpenreaktion | Definition |
|---|---|---|---|
| 1H[CR] | Kanal 1 starten | * | Befehl erfolgreich ausgeführt |
| 4I[CR] | Kanal 4 ausschalten | * | Befehl erfolgreich ausgeführt |
| 2xD[CR] | Richtung von Kanal 2 ermitteln | K[CR][LF] | Die Drehrichtung ist gegen den Uhrzeigersinn. |
| 3J[CR] | Stelle die Drehrichtung von Kanal 3 auf „im Uhrzeigersinn“ ein | * | Befehl erfolgreich ausgeführt |
| 1xM[CR] | Betriebsmodus von Kanal 1 abrufen | L[CR][LF] | Der aktuelle Modus ist „RPM“ |
| 3G[CR] | Stellen Sie den Betriebsmodus von Kanal 3 auf „Lautstärke über die Zeit“ ein | * | Befehl erfolgreich ausgeführt |
| 1S[CR] | drive -Geschwindigkeit von Kanal 1 abrufen | 22,50[CR][LF] | Antwort in Form von „fraktioniertem Typ 1“. Die Drehzahl des drive beträgt 22,5 U/min. |
| 1S004500[CR] | Stellen Sie die Drehzahl „ drive “ von Kanal 1 auf 45 U/min ein. Die Drehzahleinstellung hat eine Auflösung von 0,01 U/min (45 wird als 4500 zugewiesen) in Form eines „diskreten Typs 3“ mit einer Breite von 6 Zeichen, wobei ungenutzte Ziffern auf der linken Seite durch Nullen ersetzt werden (=> 004500). | * | Befehl erfolgreich ausgeführt |
| 3f[CR] | Pumpfrequenz von Kanal 3 abrufen | 1275E+1[CR][LF] | Reaktion in Form eines „Volumentyps 1“ (mmmmEse => m.mmmx10se):
|
| 3f1500-3[CR] | Stellen Sie die Förderrate von Kanal 3 auf 1,5 μL/min ein. Einstellung der Förderrate im Format „Volumen Typ 2“ (mmmmse => m.mmmx10se). 1,5 µl/min = 1,500 × 10-3 ml/min, daher:
| 1500E-3[CR][LF] | Antwort in Form von „Volumen Typ 1“. |
Wie lässt sich die Reglo-ICC-Pumpe mit IsmaTerm steuern?
IsmaTerm ist eine Software, mit der sich die Reglo-ICC-Pumpe steuern lässt. Es handelt sich um eine Terminalemulationssoftware, die über eine serielle Schnittstelle v RS-232 mit der Pumpe kommuniziert. Mit IsmaTerm lassen sich die Pumpe starten und stoppen, die Pumpenparameter einstellen und abrufen sowie der Pumpenbetrieb programmieren. Die Software ist mit Windows-Betriebssystemen kompatibel und kann über diesen Link heruntergeladen werden.
Um mit der Pumpe zu kommunizieren, starten Sie die IsmaTerm-Software, wählen Sie den der Pumpe entsprechenden COM-Anschluss aus und geben Sie die Einstellungen für den Anschluss ein, um dessen Eigenschaften anzupassen (wie in der folgenden Abbildung dargestellt). Die Standard-Baudrate beträgt 9600 Bit/s, mit 8 Datenbits, 1 Stoppbit und ohne Parität.
Im IsmaTerm-Fenster können Befehle zur Steuerung der Pumpe eingegeben und deren Reaktionen angezeigt werden. Bei diesen Befehlen wird zwischen Groß- und Kleinschreibung unterschieden, und ihnen muss ein Zeilenumbruch (Enter-Taste) folgen.
Das unten abgebildete IsmaTerm-Fenster zeigt einige an die Pumpe gesendete und von ihr empfangene Meldungen, mit denen die Pumpe gestartet bzw. gestoppt und Pumpenparameter eingestellt bzw. abgerufen werden können. In diesem Beispiel wird nur Kanal 3 gesteuert. Jeder an die Pumpe gesendete Befehl erhält eine Antwort von ihr (die entsprechenden Meldungen sind in der Abbildung unten dargestellt).
Die soeben im IsmaTerm-Fenster vorgestellten Befehle werden in der folgenden Tabelle kurz erläutert.
| Befehl | Definition | Pumpenreaktion | Definition |
|---|---|---|---|
| 3H | Kanal 3 starten | * | Befehl erfolgreich ausgeführt |
| 3xD | Route abrufen | K{13}{10} | Drehrichtung: gegen den Uhrzeigersinn {13} — Wagenrücklauf [CR] {10} — Zeilenvorschub [LF] |
| 3J | Stellen Sie die Drehrichtung des Kanals auf „im Uhrzeigersinn“ ein | * | Befehl erfolgreich ausgeführt |
| 3xM | Betriebsmodus von Kanal 3 abrufen | L{13}{10} | Der aktuelle Modus ist „RPM“ |
| 3S | Ermitteln Sie die Einstellgeschwindigkeit in U/min | 10,00{13}{10} | Fraktionstyp 1. Drehzahl von 10 U/min. |
| 3S002400 | Stellen Sie die Drehzahl auf 24 U/min ein. | * | Befehl erfolgreich ausgeführt |
| 3I | Kanal 3 ausschalten | * | Befehl erfolgreich ausgeführt |
Ein an die Pumpe übermittelter Steuerbefehl ergibt sich manchmal erst nach einigen Berechnungen und Umrechnungen. Daher ist es wichtig, alle erforderlichen Befehle vorzubereiten, bevor mit der „ contrôle externe “ der Pumpe begonnen wird.
Zudem ist es einfacher, diese Steuerbefehle mithilfe von Programmierplattformen wie Python und Matlab zu erstellen und über eine Reihe von (bereits vorbereiteten) Codes an die Pumpe zu übermitteln, als immer wieder einzeln Befehle zu schreiben und über ein Terminalprogramm an die Pumpe zu senden. Diese Plattformen ermöglichen nicht nur eine einfachere Kommunikation mit der Pumpe, sondern auch eine einfachere externe Kommunikation mit einem Pumpenverbund und erlauben das Erstellen eines Pumpenprogramms mit Schleifen, Pausen usw.
Im Folgenden werden Codeausschnitte für die serielle Kommunikation mit Python und MATLAB als Schnellstart bereitgestellt und erläutert, die als kurze Einführung in die Kommunikation mit der Reglo-ICC-Pumpe über diese beiden Programmierplattformen dienen.
Wie lässt sich die Reglo-ICC-Pumpe mit Python steuern?
Die Reglo-ICC-Pumpe lässt sich per Fernsteuerung mit Python steuern und bietet so mehr Flexibilität und Komfort bei der Ausführung komplexer Pumpenprogramme mit Schleifen, Pausen und variierenden Drehzahlen bzw. Durchflussraten. Dieser Ansatz ist besonders nützlich bei der Integration mehrerer Geräte, da er die Automatisierung von Abläufen ermöglicht, an denen alle angeschlossenen Geräte beteiligt sind.
In diesem Abschnitt zeigen wir zunächst, wie man die serielle Schnittstelle öffnet und mit Python einfache Befehle an die Pumpe sendet. Anschließend stellen wir eine spezielle, maßgeschneiderte Python-Bibliothek vor, die das Reglo-ICC-Befehlsprotokoll nutzt und es ermöglicht, die serielle Schnittstelle zu öffnen und Steuerbefehlszeichenfolgen an die Reglo-ICC-Pumpe zu senden. Wir werden Beispiele behandeln, die zeigen, wie man die Pumpe startet und stoppt, die Drehzahl einstellt, die Fördermenge einstellt usw., und bieten damit eine praktische Anleitung zur Verwendung von Python für die Steuerung der Reglo-ICC-Pumpe.
'''
------------------------------------------------
Writing/Reading Simple Commands to/from the Pump
------------------------------------------------
'''
import serial # Python module for serial communication
# Open the serial port with the data format corresponding to the Reglo ICC pump
ser = serial.Serial('COM5', 9600, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=None, xonxoff=0, rtscts=0) # modify your COM#
### Start channel 3 of the pump
# Method 1
cmd = str(3) + 'H' + chr(13) # concatenate strings :
# 3 represents channel 3
# 'H' to start the channel
# 13 for the carriage return [CR]
ser.write(cmd.encode()) # write the concatenated string to ser
# Method 2
ser.write(f'{3}H{chr(13)}'.encode()) # write string literals to ser
read_data = ser.read(ser.in_waiting).decode()
# read all the available bytes from the serial port connection as a char vector
# The pump returns '*' after a successful execution of the command
### Read the rotation direction of channel 3
ser.write(f'{3}xD{chr(13)}'.encode()) # 'xD' to get the rotation direction
read_data = ser.read(ser.in_waiting).decode()
# The pump returns : K[CR][LF] --> counter-clockwise
### Change the rotation direction of channel 3 to clockwise
ser.write((str(3) + 'J' + chr(13)).encode()) # 'J' to set the direction to clockwise
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
### Change the setting speed to 24 RPM
ser.write((str(3) + 'S002400' + chr(13)).encode())
# Setting speed has a resolution of 0.01 RPM so 24 RPM is assigned as 2400
# Discrete type 3 data has a width of 6 characters with unused digits to the left being zeros --> 002400
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
### Stop channel 3 of the pump
ser.write((str(3) + 'I' + chr(13)).encode()) # 'I' to stop the channel
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
Im Folgenden wird die benutzerdefinierte Python-Bibliothek vorgestellt, die das Reglo-ICC-Befehlsprotokoll nutzt. Diese Bibliothek ermöglicht die Erstellung komplexer Pumpenprogramme, einschließlich Funktionen wie Pausen, Schleifen, bedingte Logik und mehr, und erleichtert so die Steuerung eines Pumpenverbunds.
'''
------------------------------------------
Reglo ICC Peristaltic Pump Control Library
------------------------------------------
'''
import serial
import time
#---------------------------------------------------------------------------------#
# LIBRARY MANAGING THE COMMUNICATION WITH A REGLO ICC WITH 3 INDEPENDENT CHANNELS #
#---------------------------------------------------------------------------------#
class RegloICC:
# Initialize the pump
def __init__(self, COM):
self.COM = COM
# Open the serial port with the data format corresponding to the RegloICC pump
self.sp = serial.Serial(self.COM, 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
self.direction = [0, 0, 0] # 0 = clockwise, 1 = counter-clockwise
self.mode = [0, 0, 0] # 0 = RPM, 1 = Flow Rate, 2 = Volume (over time), one can add here all other modes
self.speed = [0, 0, 0] # rotation speed for each channel in RPM mode
# Change the size of 'direction', 'mode' and 'speed' according to the total number of channels to control.
# In the case herein, 3 channels are being independently controlled
# Delete the pump
def __del__(self):
self.sp.close()
# Start the corresponding channel
def start_channel(self, channel):
command = f'{channel}H\r'.encode() # 'H' to start the channel
# \r for the carriage return [CR] required to tell the pump that the command is finished
self.sp.write(command) # write the command to the pump
time.sleep(0.1) # give the pump time to process the command after sending it before reading the response
return self.sp.read(self.sp.in_waiting).decode() # read the pump response
# Stop the corresponding channel
def stop_channel(self, channel):
command = f'{channel}I\r'.encode() # 'I' to stop the channel
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Set the rotation direction for a single channel
def set_direction(self, channel, direction):
if direction == 1:
command = f'{channel}K\r'.encode() # counter-clockwise
else:
command = f'{channel}J\r'.encode() # clockwise
self.sp.write(command)
self.direction[channel - 1] = direction # pyhton count starts from 0
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Get the rotation direction of a single channel
def get_direction(self, channel):
command = f'{channel}xD\r'.encode() # 'xD' to get the rotation direction
self.sp.write(command)
time.sleep(0.1)
# read the rotation direction from the corresponding channel
return self.sp.read(self.sp.in_waiting).decode()
# Set the speed for a single channel in RPM when in RPM mode
def set_speed(self, channel, speed): # in RPM, with speed less then 100
speed = max(min(speed, 100), 0) # speed between 0 and 100 RPM
speed_string = f'{int(speed):03d}{int((speed - int(speed)) * 100)}' # format speed explained below
command = f'{channel}S0{speed_string}\r'.encode()
self.sp.write(command) # set the speed for the corresponding channel
self.speed[channel - 1] = speed
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
#--------------------------------------------------------------------------------#
# SPEED_STRING EXAMPLE #
## Speed value : #
# speed = 123.456 #
# #
## Convert the integer part to a string with at least three digits : #
# integer_part = f'{int(speed):03d}'; ## --> Result: '123' #
# #
## Convert the decimal part to a string with two digits : #
# decimal_part = f'{int((speed - int(speed)) * 100)}'; ## --> Result: '45' #
# #
## Concatenate the two parts : #
# speed_string = f'{int(speed):03d}{int((speed - int(speed)) * 100)}'; #
## --> Result: '12345' representing 123.45 in fixed-point notation #
# #
## When the two strings are concatenated, the result is a string that represents #
## the original speed value in a fixed-point notation with three digits before #
## the decimal point and two digits after, without the decimal separator. #
#--------------------------------------------------------------------------------#
# Read out speed of a single channel in RPM when in RPM mode
def get_speed(self, channel):
command = f'{channel}S\r'.encode() # 'S' to get the setting speed in RPM
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Set the operational mode for a single channel (you can add all other modes)
def set_mode(self, channel, mode):
if mode == 0:
command = f'{channel}L\r'.encode() # RPM mode
elif mode == 1:
command = f'{channel}M\r'.encode() # Flow rate mode
else:
command = f'{channel}G\r'.encode() # Volume (over time) mode
self.sp.write(command)
self.mode[channel - 1] = mode
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Get the operational mode of a single channel
def get_mode(self, channel):
command = f'{channel}xM\r'.encode() # 'xM' to get the operational mode
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
#----------------------------------------------------------------------------#
# EXAMPLES ON HOW TO USE THE DEFINED CLASS TO CONTROL THE Reglo ICC PUMP #
#----------------------------------------------------------------------------#
### Initialize the pump with the specified COM port
pump = RegloICC('COM5') # Replace 'COM5' with your actual COM port
### Start channel 3
pump.start_channel(3)
### Get the rotation direction of channel 3
print(pump.get_direction(3))
### Set the rotation direction of channel 3 to clockwise
pump.set_direction(3, 0)
### Get the current operational mode of channel 3
print(pump.get_mode(3))
### Set the operational mode of channel 3 to RPM
pump.set_mode(3, 0)
### Get the current speed setting of channel 3
print(pump.get_speed(3))
### Set the setting speed of channel 3 to 24 RPM
pump.set_speed(3, 24)
### Stop channel 3
pump.stop_channel(3)
### Delete the pump object
del pump
Wie lässt sich die Reglo-ICC-Pumpe mit MATLAB steuern?
In diesem Abschnitt werden Matlab-Codeausschnitte vorgestellt, die zeigen, wie man die serielle Schnittstelle öffnet, Daten schreibt und Steuerbefehlszeichenfolgen an die Pumpe sendet. Anschließend wird eine Schnellstart-Adapterklasse definiert, die speziell für die Verarbeitung von Reglo-ICC-Befehlen vorgesehen ist.
Wir werden uns Codezeilen ansehen, die veranschaulichen, wie man gängige Aufgaben wie das Starten und Stoppen der Pumpe, das Einstellen der Drehzahl, das Abrufen der Drehrichtung usw. ausführt.
%-------------------------------------------------
% Writing/Reading Simple Commands to/from the Pump
%-------------------------------------------------
%% Open the serial port with the data format corresponding to the Reglo ICC pump
sp = serialport('COM5',9600,'Parity','None','DataBits',8,'StopBits',1); % open the serial port
%% Start channel 3 of the pump (method 1)
cmd = strcat(num2str(3),'H',13); % concatenate strings :
% 3 represents channel 3,
% 'H' to start the channel
% 13 for the carriage return [CR]
write(sp,cmd,"uint8"); % write the concatenated string to sp
%% Start channel 3 of the pump (method 2)
fprintf(sp,'%s',strcat(num2str(3),'H',13)); % formats the concatenated string according to '%s' (character vector or string array) and writes it to sp
read_data = read(sp,sp.NumBytesAvailable,"char");
% read all the available bytes from the serial port connection as a char vector
%% Read the rotation direction of channel 3
cmd = strcat(num2str(3),'xD',13); % 'xD' to get the rotation direction
write(sp,cmd,"uint8");
read_data = read(sp,sp.NumBytesAvailable,"char");
%% The pump returns : K[CR][LF]. Change the rotation direction of channel 3 to clockwise
write(sp,strcat(num2str(3),'J',13),"uint8"); % 'J' to set the direction to clockwise
read_data = read(sp,sp.NumBytesAvailable,"char");
%% Change the setting speed to 24 RPM
write(sp,strcat(num2str(3),'S002400',13),"uint8");
% Setting speed has a resolution of 0.01 RPM so 24 RPM is assigned as 2400
% Discrete type 3 data has a width of 6 characters with unused digits to the left being zeros --> 002400
read_data = read(sp,sp.NumBytesAvailable,"char");
%% Stop channel 3 of the pump
write(sp,strcat(num2str(3),'I',13),"uint8"); % 'I' to stop the channel
read_data = read(sp,sp.NumBytesAvailable,"char");
%-----------------------------------------
% Reglo ICC Peristaltic Pump Adapter Class
%-----------------------------------------
%--------------------------------------------------------------------------------------%
% CUSTOM CLASS MANAGING THE COMMUNICATION WITH A REGLO ICC WITH 3 INDEPENDENT CHANNELS %
%--------------------------------------------------------------------------------------%
classdef RegloICC
%%% Define the class properties
properties
% Change the size of 'direction', 'mode' and 'speed' according to the total number of
% channels to control. In the case herein, 3 channels are being independently controlled
sp = []; % serial port
COM = ''; % input parameter: COM port to use for the pump
direction = [0 0 0]; % direction of rotation of each channel: 0 = clockwise, 1 = counter-clockwise
mode = [0 0 0]; % operational mode of each channel: 0 = RPM, 1 = Flow Rate, 2 = Volume (over time), one can add here all other modes (check Table 3)
speed = zeros(3,1); % rotation speed for each channel in case of RPM mode
end
%%% Define the class methods
methods
% Initialize the pump
function obj = RegloICC(COM)
obj.COM = COM;
obj.sp = serialport(obj.COM,9600,'Parity','None','DataBits',8,'StopBits',1); % open the serial port with the data format corresponding to the RegloICC pump
end
% Delete the pump
function obj = delete(obj)
delete(obj.sp);
obj.sp = [];
end
% Start the corresponding channel
function start_channel(obj,channel)
write(obj.sp,strcat(num2str(channel),'H',13),"uint8"); % 'H' to start the channel
% 13 for the carriage return [CR] required to tell the pump that the command is finished
pause(0.1); % give the pump time to process the command before reading the response
while obj.sp.NumBytesAvailable > 0 % clear the buffer
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
% Stop the corresponding channel
function stop_channel(obj,channel)
write(obj.sp,strcat(num2str(channel),'I',13),"uint8"); % 'I' to stop the channel
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
% Set the rotation direction for a single channel
function obj = set_direction(obj,channel,direction)
if direction == 1
write(obj.sp,strcat(num2str(channel),'K',13),"uint8"); % counter-clockwise rotation
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
else
write(obj.sp,strcat(num2str(channel),'J',13),"uint8"); % clockwise rotation
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
obj.direction(channel) = direction;
end
% Get the rotation direction of a single channel
function getDirection = get_direction(obj,channel)
write(obj.sp,strcat(num2str(channel),'xD',13),"uint8"); % 'xD' to get the rotation direction
pause(0.1);
getDirection = read(obj.sp,obj.sp.NumBytesAvailable,"char"); % read the rotation direction from the corresponding channel
end
% Set the speed for a single channel in RPM when in RPM mode
function obj = set_speed(obj,channel,speed) % in RPM, with speed 100
disp('Speed higher than maximum (100 RPM), reduced to maximum.');
end
speed = max(min(speed,100),0); % speed between 0 and 100 rpm
speedstring = strcat(sprintf('%03d',floor(speed)), num2str(floor((speed-floor(speed))*100))); % format speed explained below
obj.speed(channel) = speed; % set the speed for the corresponding channel
write(obj.sp,strcat(num2str(channel),'S0',speedstring,13),"uint8"); % write the speed to the corresponding channel
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
%----------------------------------------------------------------------------------%
% SPEEDSTRING EXAMPLE %
%% Speed value : %
% speed = 123.456 %
% %
%% Convert the integer part to a string with at least three digits : %
% integer_part = sprintf('%03d', floor(speed)); %% --> Result: '123' %
% %
%% Convert the decimal part to a string with two digits : %
% decimal_part = num2str(floor((speed - floor(speed)) * 100)); %% --> Result: '45' %
% %
%% Concatenate the two parts : %
% speedstring = strcat(integer_part, decimal_part); %
%% --> Result: '12345' representing 123.45 in fixed-point notation %
% %
%% When the two strings are concatenated, the result is a string that represents %
%% the original speed value in a fixed-point notation with three digits before %
%% the decimal point and two digits after, without the decimal separator. %
%----------------------------------------------------------------------------------%
% Read out speed of a single channel in RPM when in RPM mode
function getRPM = get_speed(obj,channel)
write(obj.sp,strcat(num2str(channel),'S',13),"uint8"); % 'S' to get the setting speed in RPM
pause(0.1);
getRPM = read(obj.sp,obj.sp.NumBytesAvailable,"char");
end
% Set the operational mode for a single channel (you can add all other modes)
function obj = set_mode(obj,channel,mode)
if mode == 0
write(obj.sp,strcat(num2str(channel),'L',13),"uint8"); % RPM mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
elseif mode == 1
write(obj.sp,strcat(num2str(channel),'M',13),"uint8"); % Flow rate mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
else
write(obj.sp,strcat(num2str(channel),'G',13),"uint8"); % Volume (over time) mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
obj.mode(channel) = mode;
end
% Get the operational mode of a single channel
function getMd = get_mode(obj,channel)
write(obj.sp,strcat(num2str(channel),'xM',13),"uint8"); % 'xM' to get the operational mode
pause(0.1);
getMd = read(obj.sp,obj.sp.NumBytesAvailable,"char");
end
end
end
%-------------------------------------------------------------------%
% Examples on how to use the defined class to control the Reglo ICC %
%-------------------------------------------------------------------%
%%% To start the communication and open the serial port %%%
% pump = RegloICC('COM5') % Replace 'COM5' with your actual COM port
%%% Start channel 3 %%%
% pump.start_channel(3)
%%% Get the rotation direction of channel 3 %%%
% pump.get_direction(3)
%%% Set the rotation direction of channel 3 to clockwise %%%
% pump.set_direction(3,0)
%%% Get the current operational mode of channel 3 %%%
% pump.get_mode(3)
%%% Set the operational mode of channel 3 to RPM %%%
% pump.set_mode(3,0)
%%% Get the current speed setting of channel 3 %%%
% pump.get_speed(3)
%%% Set the setting speed of channel 3 to 24 RPM %%%
% pump.set_speed(3,24)
%%% Stop channel 3 %%%
% pump.stop_channel(3)
%%% Delete pump %%%
% pump = delete(pump)
Fazit
In diesem Blogbeitrag haben wir die Reglo ICC (Independent Channel Control)-Peristaltikpumpe vorgestellt und die Grundlagen ihrer Programmierung ( contrôle externe ) mithilfe der beiden Programmierplattformen Python und MATLAB unter Verwendung des Reglo ICC-Kommandosatzes erläutert. Wir hoffen, dass dieser Beitrag Forschern und Ingenieuren, die die Reglo ICC-Peristaltikpumpe in ihrer Mikrofluidik-Forschung und bei ihren Experimenten einsetzen möchten, als wertvolle Orientierungshilfe dient.
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.


