Die Reglo ICC (Independent Channel Control) Schlauchpumpe von Masterflex Ismatec ist ein Präzisionsinstrument, das für eine beispiellose Steuerung und Genauigkeit bei der Dosierung und Förderung von Flüssigkeiten entwickelt wurde. Sie zeichnet sich durch die Fähigkeit aus, Richtung und Geschwindigkeit von bis zu vier Kanälen unabhängig voneinander zu regeln, wobei jeder Kanal über eigene Programme für Start, Stopp, Kalibrierung und mehr verfügt.
Mit einem Arbeitsbereich der Flussrate von 0,001 bis 35 ml/min pro Kanal und anpassbaren Pulsationsstufen bietet diese Pumpe die nötige Flexibilität für verschiedenste Anwendungen. Die intuitive digitale Benutzeroberfläche und die RS-232-Computerschnittstelle ermöglichen die Erstellung komplexer Pumpsequenzen und die gleichzeitige Steuerung mehrerer Pumpen.
In diesem Blogbeitrag untersuchen wir, wie sich die Schlauchpumpe Reglo ICC über das serielle Befehlsprotokoll der Reglo ICC mit zwei Programmierplattformen steuern lässt: Python und Matlab.
INHALTSVERZEICHNIS
Warum die Schlauchpumpe Reglo ICC wählen?
Die Schlauchpumpe Reglo ICC ist vielseitig und benutzerfreundlich und hebt sich als erstklassige Wahl für Flüssigkeitshandhabungsanforderungen sowohl im Labor als auch im industriellen Umfeld hervor. Hier sind einige wesentliche Vorteile:
- Unabhängige Kanalsteuerung von bis zu vier Kanälen, jeweils mit eigenem Programm, Flussraten und Richtungen gleichzeitig.
- Hohe Genauigkeit und Reproduzierbarkeit gewährleisten eine präzise und konsistente Flüssigkeitsdosierung durch die Minimierung von tube-zu-tube-Unterschieden.
- Einstellbare Pulsation und Flussrate mit 6, 8 oder 12 Rollen zur Anpassung von Pulsation und Flussrate (mehr Rollen führen zu geringerer Pulsatilität und niedrigeren Flussraten).
- Vielseitige Steuerungsoptionen über die digitale Schnittstelle oder die RS-232-Verbindung (bis zu acht in Reihe geschaltete Pumpen).
- Umfangreiche Betriebsmodi einschließlich kontinuierlicher Dosierung mit einer festgelegten Rate, Dosierung eines Volumens über einen bestimmten Zeitraum, Kalibrierung jedes Kanals und mehr.
Was wird für die Kommunikation mit der Reglo ICC Pumpe benötigt?
Für die Kommunikation mit der Schlauchpumpe Reglo ICC benötigen Sie einige Kernkomponenten:
- Eine Reglo ICC Pumpe mit einem Pumpenkopf und einem tube Ihrer Wahl,
- Ein Mini-USB/USB-Kabel oder einen DB9-Stecker (verbunden mit einem RS-232-Steuermodul), der die serielle Kommunikation ermöglicht und den Datentransfer zwischen der Spritzenpumpe und dem Computer erlaubt,
- Eine Programmierplattform (in diesem Fall Python und Matlab) oder einen Terminal-Emulator,
- Ein grundlegendes Verständnis des seriellen Befehlsprotokolls der Reglo ICC, das unten 👇 erläutert und im Benutzerhandbuch der Pumpe detailliert beschrieben wird.
Wie richtet man den Kommunikationsport ein?
Bevor Sie Daten an die Pumpe senden und von ihr empfangen können, müssen Sie den Kommunikationsport korrekt einrichten. Hier sind die zu befolgenden Schritte:
- Schließen Sie das Mini-USB/USB-Kabel oder den DB9-Stecker an den seriellen Anschluss an der Rückseite der Pumpe und an den entsprechenden Anschluss am Computer an.
- Schalten Sie die Pumpe ein.
- Identifizieren Sie den Namen des seriellen Ports, der der Verbindung auf Ihrem Computer zugewiesen wurde (z. B. COM4 unter Windows oder /dev/ttyUSB0 unter Linux). Sie finden diese Informationen normalerweise im Geräte-Manager oder durch die Verwendung von Terminal-Befehlen.
- Stellen Sie sicher, dass die Einstellungen des seriellen Ports den Spezifikationen Ihrer Spritzenpumpe entsprechen:
- 1 Startbit,
- 8 Datenbits,
- Parität: keine,
- 1 Stoppbit,
- eine Baudrate von 9600 Bit/s.
- Der Modus für den Fernbetrieb auf dem Bildschirm 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 ferngesteuert wird.
Das serielle Befehlsprotokoll des Reglo ICC
Das Reglo ICC-Befehlsprotokoll bietet eine Reihe von Befehlen für die contrôle externe, die zur präzisen Handhabung in verschiedene Typen unterteilt sind. Dazu gehören Kommunikationsmanagement, Betriebsarten und Einstellungen, Steuerungsanweisungen, Konfigurationseinstellungen, Kalibrierung und mehr.
Es gibt zwei Arten von Nachrichten: Antwortnachrichten, die von der Pumpe an den PC gesendet werden, und Anfragenachrichten, die vom PC an die Pumpe gesendet werden. Alle Nachrichten bestehen aus einer Zeichenfolge druckbarer ASCII-Zeichen. Jede Nachricht wird mit einem Wagenrücklauf (Carriage Return) oder einem Wagenrücklauf und einem Zeilenvorschub (Line Feed) abgeschlossen.
Das zur Steuerung der Reglo ICC Schlauchpumpe verwendete Reglo ICC-Befehlsprotokoll ist nachfolgend zusammengefasst. Weitere Details finden sich im Benutzerhandbuch der Pumpe.
Datentypen-Formate
| Datentyp | Breite | Einheit | Bereich | Format |
|---|---|---|---|---|
| Richtung | 1 | - | - | J = im Uhrzeigersinn K = gegen den Uhrzeigersinn |
| Diskreter Typ 1 | 1 bis 4 | - | 0 bis 9999 | 1 bis 4 Zeichen zur Basis 10. Nicht verwendete Ziffern werden nicht ausgegeben. |
| Diskreter Typ 2 | 4 | - | 0 bis 9999 | 4 Zeichen zur Basis 10. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
| Diskreter Typ 3 | 6 | - | 0 bis 999999 | 6 Zeichen zur Basis 10. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
| Diskreter Typ 4 | 10 | - | 0 bis 4294967295 | 10 Zeichen zur Basis 10. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
| Diskreter Typ 5 | 3 | - | 0 bis 999 | 3 Zeichen zur Basis 10. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
| Diskreter Typ 6 | 5 | - | 0 bis 99999 | 5 Zeichen zur Basis 10. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
| Dezimalbruchtyp 1 | Variabel | - | - | XXXX.DD Variable Breite des ganzzahligen Teils (XXXX). Dezimalpunkt und zwei Ziffern rechts (.DD) sind stets vorhanden. |
| Volumentyp 1 | 7 | mL | - | mmmmEse ⇒ m.mmm × 10^se: mmmm — 4-stellige Mantisse Dezimalpunkt wird nach dem ersten Zeichen impliziert. E — 'E'-Zeichen s — Vorzeichen des Exponenten: + oder - e — einstelliger Exponent |
| Zeit-Typ 1 | 1 bis 8 | 0.1s | 0 bis 35964000 (0 bis 999 Std.) | 1 bis 8 Zeichen zur Darstellung der Zeit. Nicht verwendete Ziffern werden nicht zurückgegeben. |
| Zeit-Typ 2 | 8 | 0.1s | 0 bis 35964000 (0 bis 999 Std.) | 8 Zeichen zur Darstellung der Zeit. Rechtsbündiger Wert. Nicht verwendete Ziffern links sind Nullen. |
Antwortnachrichten
Eine Antwortnachricht ist eine Nachricht, die von der Pumpe als Reaktion auf eine vom PC gesendete Anforderungsnachricht an den PC gesendet wird. Sie kann in Form einer Status- oder Datenantwort erfolgen.
Eine Statusantwort-Nachricht ist ein einzelnes ASCII-Zeichen, das anzeigt, ob der Befehl erfolgreich ausgeführt wurde oder nicht. Die verschiedenen ASCII-Zeichen, die den Ausführungsstatus des angeforderten Befehls angeben, sind in der folgenden Tabelle dargestellt.
| ASCII-Zeichen | Definition | Hexadezimal | Dezimal |
|---|---|---|---|
| * | Befehl erfolgreich ausgeführt | 0x2a | 42 |
| # | Befehl nicht erfolgreich ausgeführt | 0x23 | 35 |
| + | positive Antwort für einige Befehle verwendet | 0x2b | 43 |
| - | negative Antwort für einige Befehle verwendet | 0x2d | 45 |
Eine Datenantwort wird von der Pumpe empfangen, wenn Parameterwerte vom PC angefordert werden. Sie setzt sich aus einem oder mehreren durch Leerzeichen getrennten Datenparameterwerten zusammen. Jeder Datenparameter in der Antwortnachricht ist ein von der Pumpe zurückgegebener Datenwert in einem durch die Anforderungsnachricht definierten Format.
| Datenparameter 1 | [SP] | Datenparameter 2 | [SP] | … | Datenparameter n | [CR] | [LF] |
Anforderungsnachrichten
Die Anforderungsnachrichten sind Nachrichten, die vom PC an die Pumpe gesendet werden. Diese sollten von der Pumpe mit einer Antwortnachricht beantwortet werden.
Ein Gerätesteuerungsbefehl (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 bzw. einen bestimmten Kanal gerichtet, um bestimmte Parameter abzufragen oder zu setzen.
| Adresse (1-4) | Befehlscode | Datenparameter 1 | [VB] | Datenparameter 2 | [VB] | … | Datenparameter n | [CR] | [LF] |
Bei einer Bus-Verbindung von Pumpen in Reihenschaltung ("Daisy-Chaining") liegt die Adresse zwischen 1 und 8 (maximale Anzahl der gleichzeitig angesteuerten Pumpen). Wird nur eine Pumpe angesteuert, liegt die Adresse zwischen 1 und 4, entsprechend der Anzahl der unabhängig voneinander gesteuerten Kanäle, wie im vorstehenden Steuerbefehl dargestellt.
Der Befehlsstring besteht in der Regel aus ein oder zwei Zeichen, die den Befehlstyp angeben. Die Datenparameter sind optionale Werte, die beim Festlegen eines Parameterwerts übergeben werden können. Schließlich trennt das Pipe-Zeichen (senkrechter Strich) die Datenparameter voneinander.
An die Pumpe können verschiedene Befehle bezüglich Kommunikationsmanagement, Pumpen-drive, Betriebsarten und -einstellungen, Kalibrierung und mehr gesendet werden. Einige dieser direkt adressierten Befehle sind in der folgenden Tabelle aufgeführt. Weitere Befehle sind in der Bedienungsanleitung zu finden und detailliert beschrieben.
| Befehl | Funktion | Set/Get (Setzen/Abrufen) | Pumpenantwort |
|---|---|---|---|
| H | Pumpe starten | Set | * - : Kanaleinstellung nicht korrekt |
| I | Pumpe stoppen | Set | * |
| xI | Pumpvorgang pausieren (STOP im U/min- oder Flussratenmodus) | Set | * |
| J | Rotationsrichtung auf im Uhrzeigersinn einstellen | Set | * |
| K | Rotationsrichtung auf gegen den Uhrzeigersinn einstellen | Set | * |
| xD | Rotationsrichtung abrufen | Get | J : im Uhrzeigersinn K : gegen den Uhrzeigersinn |
| xM | Aktuellen Modus der Pumpe/des Kanals abrufen | Get | L : U/min M : Flussrate O : Volumen mit Rate G : Volumen über Zeit Q : Volumen+Pause N : Zeit P : Zeit+Pause |
| L | Pumpe/Kanal auf U/min-Modus einstellen | Set | * |
| M | Pumpe/Kanal auf Flussratenmodus einstellen | Set | * |
| O | Pumpe/Kanal auf Modus „Volumen bei fester Rate“ einstellen | Set | * |
| G | Pumpe/Kanal auf Modus „Volumen über Zeit“ einstellen | Set | * - : Kanaleinstellung nicht korrekt |
| S | Einstellung der Flussrate im U/min-Modus (0,01 U/min). Diskreter Typ 3. | Set | * |
| S | Aktuelle Geschwindigkeitseinstellung in U/min abrufen | Get | Dezimalbruchtyp 1 |
| f | U/min-Flussrate im Volumen/Zeit-Modus (ml/min) einstellen. Volumentyp 2 (ähnlich wie Typ 1, jedoch ohne das Zeichen „E“). | Set | Volumentyp 1 |
| f | Aktuelle Volumen/Zeit-Flussrate (ml/min) abrufen | Get | Volumentyp 1 |
| xP | Pausenzeit der Pumpe abrufen | Get | Zeit-Typ 1 |
| xY | Kalibrierung auf einem Kanal starten | Set | * |
| xZ | Kalibrierung abbrechen | Set | * |
In den definierten Anfragenachrichten werden verschiedene Symbole zur Darstellung von ASCII-Zeichen verwendet. Einige davon sind in der folgenden Tabelle dargestellt.
| Symbol | Definition | Hexadezimal | Dezimal |
|---|---|---|---|
| [CR] | Wagenrücklauf (Carriage Return) | 0x0d | 13 |
| [LF] | Zeilenvorschub (Line Feed) | 0x0a | 10 |
| [SP] | Leerzeichen | 0x20 | 32 |
| [VB] | senkrechter Strich | 0x7c | 124 |
| @ | „@“-Zeichen | 0x40 | 64 |
Beispiele für Befehle
Um mit der Pumpe zu kommunizieren, muss man die verschiedenen von der Pumpe unterstützten Befehle verstehen und die erforderlichen Steuerbefehlssequenzen für den Computer vorbereiten.
In der folgenden Tabelle werden einige Beispiele für direkt adressierte Befehle vorgestellt und erläutert.
| Befehl | Definition | Pumpenantwort | Definition |
|---|---|---|---|
| 1H[CR] | Kanal 1 starten | * | Befehl erfolgreich ausgeführt |
| 4I[CR] | Kanal 4 stoppen | * | Befehl erfolgreich ausgeführt |
| 2xD[CR] | Richtung von Kanal 2 abrufen | K[CR][LF] | Drehrichtung ist gegen den Uhrzeigersinn |
| 3J[CR] | Drehrichtung von Kanal 3 auf im Uhrzeigersinn einstellen | * | Befehl erfolgreich ausgeführt |
| 1xM[CR] | Betriebsmodus von Kanal 1 abrufen | L[CR][LF] | Aktueller Modus ist U/min |
| 3G[CR] | Betriebsmodus von Kanal 3 auf Volumen über Zeit einstellen | * | Befehl erfolgreich ausgeführt |
| 1S[CR] | drive-Geschwindigkeit von Kanal 1 abrufen | 22.50[CR][LF] | Antwort im Format „fractional type 1“. Die drive-Geschwindigkeit beträgt 22,5 U/min |
| 1S004500[CR] | Stellen Sie die drive-Geschwindigkeit von Kanal 1 auf 45 RPM ein. Die Geschwindigkeitseinstellung hat eine Auflösung von 0,01 RPM (45 zugewiesen als 4500) im Format eines „diskreten Typs 3“ mit einer Breite von 6 Zeichen, wobei nicht verwendete Ziffern links Nullen sind (=> 004500). | * | Befehl erfolgreich ausgeführt |
| 3f[CR] | Die Förderrate von Kanal 3 abrufen | 1275E+1[CR][LF] | Antwort im Format eines „Volumentyps 1“ (mmmmEse => m.mmm x10se):
|
| 3f1500-3[CR] | Stellen Sie die Förderrate von Kanal 3 auf 1,5 µL/min ein. Förderrate-Einstellung im Format des „Volumentyps 2“ (mmmmse => m.mmm x10se). 1,5 µL/min = 1,500x10-3 mL/min, daher:
| 1500E-3[CR][LF] | Antwort im Format des „Volumentyps 1“. |
Wie steuert man die Reglo ICC Pumpe mit IsmaTerm?
IsmaTerm ist eine Software, mit der sich die Reglo ICC Pumpe steuern lässt. Es handelt sich dabei um eine Terminalemulationssoftware, die über eine RS-232-Schnittstelle mit der Pumpe kommuniziert. IsmaTerm kann verwendet werden, um die Pumpe zu starten und zu stoppen, Pumpenparameter abzufragen und einzustellen sowie den Pumpenbetrieb zu programmieren. Sie 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 Anschlusseinstellungen ein, um dessen Eigenschaften zu ändern (wie in der Abbildung unten dargestellt). Die Standard-Baudrate beträgt 9600 Bit/s, mit 8 Datenbits, 1 Stoppbit und keiner Parität.
Im IsmaTerm-Fenster können Befehle eingegeben werden, um die Pumpe zu steuern und deren Antworten anzuzeigen. Diese Befehle unterscheiden zwischen Groß- und Kleinschreibung und müssen mit einem Wagenrücklauf (Enter-Taste) abgeschlossen werden.
Das unten dargestellte IsmaTerm-Fenster zeigt einige an die Pumpe gesendete und von ihr empfangene Nachrichten, wodurch die Pumpe gestartet/gestoppt und Pumpenparameter eingestellt/abgerufen werden können. In diesem Beispiel wird nur Kanal 3 gesteuert. Jeder an die Pumpe gesendete Befehl erhält eine Antwort von ihr (beabsichtigte Nachrichten in der Abbildung unten).
Die soeben im IsmaTerm-Fenster präsentierten Befehle werden in der folgenden Tabelle kurz erläutert.
| Befehl | Definition | Pumpenantwort | Definition |
|---|---|---|---|
| 3H | Kanal 3 starten | * | Befehl erfolgreich ausgeführt |
| 3xD | Die Drehrichtung abrufen | K{13}{10} | Drehrichtung ist gegen den Uhrzeigersinn {13} — Wagenrücklauf [CR] {10} — Zeilenvorschub [LF] |
| 3J | Die Drehrichtung des Kanals auf im Uhrzeigersinn einstellen | * | Befehl erfolgreich ausgeführt |
| 3xM | Den Betriebsmodus von Kanal 3 abrufen | L{13}{10} | Aktueller Modus ist U/min |
| 3S | Die eingestellte Drehzahl in U/min abrufen | 10.00{13}{10} | Bruchteiltyp 1. Drehzahl von 10 U/min. |
| 3S002400 | Die Drehzahl auf 24 U/min einstellen | * | Befehl erfolgreich ausgeführt |
| 3I | Kanal 3 stoppen | * | Befehl erfolgreich ausgeführt |
Ein an die Pumpe übermittelter Steuerbefehl wird bisweilen nach einigen Berechnungen und Konvertierungen ermittelt. Daher ist es wichtig, alle benötigten Befehle vorzubereiten, bevor das contrôle externe der Pumpe gestartet wird.
Darüber hinaus ist es einfacher, diese Steuerbefehle über eine Reihe von (bereits vorbereiteten) Codes mithilfe von Programmierplattformen wie Python und Matlab zu schreiben und an die Pumpe zu übermitteln, als von Zeit zu Zeit einen Befehl über ein Terminalprogramm an die Pumpe zu schreiben und zu senden. Diese Plattformen ermöglichen nicht nur eine einfachere Kommunikation mit der Pumpe, sondern auch eine einfachere externe Kommunikation mit einem Pumpenbus und erlauben das Schreiben eines Pumpenprogramms mit Schleifen, Pausen usw.
Im Folgenden werden Codeausschnitte für die serielle Schnellstart-Kommunikation unter Verwendung von Python und Matlab bereitgestellt und erläutert, die als kleine Einführung in die Kommunikation mit der Reglo ICC-Pumpe über diese beiden Programmierplattformen dienen.
Wie steuert man die Reglo ICC-Pumpe mit Python?
Die Reglo ICC-Pumpe kann über Python fernabgesteuert werden, was eine größere Flexibilität und Bequemlichkeit beim Ausführen komplexer Pumpenprogramme mit Schleifen, Pausen und variierenden Drehzahlen/Durchflussraten bietet. Dieser Ansatz ist besonders nützlich bei der Integration mehrerer Geräte, da er die Automatisierung von Sequenzen ermöglicht, an denen die gesamte angeschlossene Ausrüstung beteiligt ist.
In diesem Abschnitt zeigen wir zunächst, wie man die serielle Schnittstelle öffnet und einfache Befehle mit Python an die Pumpe sendet. Anschließend wird eine dedizierte, benutzerdefinierte Python-Bibliothek vorgestellt, 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 behandeln Beispiele, die zeigen, wie man die Pumpe startet und stoppt, die Drehzahl einstellt, die Rate einstellt usw., und bieten so einen praktischen Leitfaden für die Verwendung von Python zur 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
Nachfolgend 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, bedingter Logik und mehr, und erleichtert die contrôle externe 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 steuert man die Reglo ICC Pumpe mit Matlab?
In diesem Abschnitt werden Matlab-Codeausschnitte vorgestellt, die zeigen, wie die serielle Schnittstelle geöffnet und Steuerbefehlsstrings an die Pumpe geschrieben und gesendet werden. Anschließend wird eine Quick-Start-Adapterklasse definiert, die speziell für die Verarbeitung von Reglo-ICC-Befehlen entwickelt wurde.
Wir gehen Codezeilen durch, die demonstrieren, wie gängige Aufgaben wie das Starten/Stoppen der Pumpe, das Einstellen der Drehzahl, das Abrufen der Drehrichtung usw. durchgeführt werden.
%-------------------------------------------------
% 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 Schlauchpumpe Reglo ICC (Independent Channel Control) vorgestellt und die Grundlagen ihrer contrôle externe über zwei Programmierplattformen, Python und Matlab, unter Verwendung des Reglo-ICC-Kommunikationsbefehlssatzes untersucht. Wir hoffen, dass dieser Beitrag Forschern und Ingenieuren als wertvoller Leitfaden dient, die die Schlauchpumpe Reglo ICC in ihrer mikrofluidischen Forschung und ihren Experimenten einsetzen möchten.
Bleiben Sie dran für weitere Einblicke, Tutorials und praktische Anwendungen in unseren zukünftigen Beiträgen. Bis dahin viel Erfolg beim Pumpen und Programmieren 💻!
📧 Bei Fragen oder Feedback können Sie uns gerne kontaktieren unter support@darwin-microfluidics.com.


