Die LabV Pumpenserie von Innofluid (früher bekannt als Shenchen Baoding) ist eine fortschrittliche Serie von Schlauchpumpen zur Durchflussmessung mit einem 4,3-Zoll-Farbtouchscreen für eine intuitive Steuerung. Sie zeigt Durchflussdaten, Einstellungen und Systeminformationen gleichzeitig an, wobei Animationen den Arbeitszustand verdeutlichen. Ausgestattet mit intelligenter Kalibrierung, Online-Feinjustierung und drei Messmodi – festes Volumen, feste Zeit und Volumen sowie Timer-Start/Stopp – ist sie äußerst vielseitig. Kompatibel mit verschiedenen Pumpenköpfen und mit mehreren contrôle externe ausgestattet, ist die LabV Serie ideal für den Laboreinsatz, die Geräteintegration und die industrielle Produktion.
In diesem Blogbeitrag zeigen wir, wie Sie die LabV Pumpen über das MODBUS RTU-Protokoll mit einer gängigen Programmierplattform steuern: Python.
Es ist erwähnenswert, dass es zwar geringfügige Unterschiede bei der Registerkonfiguration und den Befehlen zwischen verschiedenen Lab-Pumpenserien (wie LabF, LabN, LabK usw.) geben kann, diese jedoch alle dasselbe MODBUS RTU-Kommunikationsprotokoll verwenden. Daher sind die in diesem Artikel dargelegten Erkenntnisse für Anwender jeglicher Innofluid Lab-Pumpenserie relevant und anwendbar.
Warum eine Schlauchpumpe der LabV-Serie wählen?
Die LabV Schlauchpumpe ist eine erstklassige Wahl für Fluidik-Anwendungen in Labor- und Industrieumgebungen. Ausgestattet mit einem neuen Servomotor für verbesserte Präzision und Langlebigkeit sowie einer 4,3" LCD-Touchscreen-Schnittstelle bietet diese Pumpe eine intuitive Steuerung für präzises Dosieren und feste Volumina. Gefertigt aus laborüblichem ABS gewährleistet sie sowohl eine einfache Handhabung als auch eine robuste Leistung.
Mit Durchflussraten von 0,0053 µL/min bis 775 mL/min und der Flexibilität, bis zu 8 Kanäle zu unterstützen, deckt sie ein breites Anwendungsspektrum ab. Darüber hinaus machen sie ihre industrielle Konstruktion, das dynamische Display und die intelligente Kalibrierungsfunktion zu einem zuverlässigen Asset für diverse Fluidtransfer-Aufgaben.
Ob für die Forschung, den Geräteunterstützung oder die industrielle Produktion – die LabV-Serie von Schlauchpumpen ist eine hervorragende Lösung für Herausforderungen im Fluidik-Handling.
Was wird für die Kommunikation mit einer LabV Pumpe benötigt?
Für die Kommunikation mit einer LabV Pumpe über das MODBUS RTU-Protokoll benötigen Sie Folgendes:
- Eine LabV Pumpe (hier wird eine LabV1-III Intelligent Flow Rate Peristaltic Pump verwendet) mit einem Pumpenkopf und einem tube Ihrer Wahl
- Ein Serienkabel zur Verbindung mit Ihrem Computer oder Gerät
- Eine RS485- oder RS232-Verdrahtung am contrôle externe-Anschluss an der Rückseite der Pumpe
- Eine Programmierplattform (in diesem Fall Python)
- Ein grundlegendes Verständnis des MODBUS RTU-Kommunikationsprotokolls, das unten 👇 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 Kabel für die RS232- oder RS485-Kommunikation an den contrôle externe-Anschluss an der Rückseite der Pumpe an.
- Schalten Sie die Pumpe ein
- Wählen Sie in der Kommunikationseinstellungs-Schnittstelle auf dem Pumpenbildschirm RS232 oder RS485 als Kommunikationsschnittstelle aus (Details zur RS232- und RS485-Verdrahtung finden Sie in den folgenden Tabellen)
- Unabhängig davon, ob Sie sich für RS232 oder RS485 entscheiden, verwendet das Kommunikationsprotokoll den Standard MODBUS RTU.
- Stellen Sie die Baudrate ein
- Klicken Sie auf die Schaltfläche Slave No., um die Adresse der Schlauchpumpe einzustellen (Bereich: 1–32)
- Kommunikationsfreigabe auf ON stellen
- Kehren Sie zur Hauptoberfläche zurück, da die Pumpe Steuerungsbefehle über die Kommunikation nur in der Hauptoberfläche empfängt; in anderen Einstellungsmenüs ist die Kommunikationssteuerung nicht aktiv.
| Details zur RS232-Verdrahtung | |
|---|---|
| Terminal | Beschreibung |
| GND | Masseanschluss für die Kommunikation. |
| TXD | Sendeterminal des Masters, Empfangssignalterminal der Schlauchpumpe. |
| RXD | Sendeterminal der Schlauchpumpe, Empfangssignalterminal des Masters. |
| RS485-Verdrahtungsdetails | |
|---|---|
| Terminal | Beschreibung |
| GD1 | RS485-Signalmasse. |
| A+ | RS485 A+-Terminal anschließen. |
| B- | RS485 B- Klemme anschließen. |
Das MODBUS RTU Kommunikationsprotokoll der LabV-Serie
Die Schlauchpumpen der LabV-Serie bieten einen umfassenden Befehlssatz zur präzisen Steuerung und Überwachung über das MODBUS RTU-Protokoll. Dieser Befehlssatz umfasst verschiedene kategorisierte Direktiven zur einfachen Handhabung der Pumpenfunktionen, einschließlich Motordrehzahleinstellungen, Flussratenkonfigurationen, Pumpenkopfauswahl und Kalibrierungsroutinen. Jeder durch eindeutige Parameter identifizierte Befehl gewährleistet eine präzise Kontrolle über den Betrieb der Pumpe.
Detaillierte Erläuterungen und weitere Informationen zum MODBUS RTU-Protokoll für die Steuerung der LabV-Pumpen werden im Folgenden bereitgestellt und sind auch in der Dokumentation des Kommunikationsprotokolls zu finden.
MODBUS RTU Standard-Kommunikationsformat
Das Nachrichtenformat entspricht der Darstellung in der nachstehenden Tabelle.
| Feld | Größe | Beschreibung |
|---|---|---|
| Slave-Adresse | 1 Byte | Adresse der Pumpe. Der Nummernkreis liegt zwischen 1 und 32, wobei 0 für Broadcast verwendet wird. |
| Funktionscode | 1 Byte | Befehl für das Slave-Gerät. 03H: Holding-Register lesen 06H: Einzelnes Register schreiben 10H: Mehrere Register schreiben 02H: Diskrete Eingänge lesen (Datenbits lesen) 05H: Einzelnes Bit in Register schreiben |
| Datenbereich | 0 – 252 Bytes | Zu übertragende Daten (variable Länge) |
| CRC-Prüfung | 2 Bytes | Zyklische Redundanzprüfung zur Fehlererkennung CRC low (1 Byte): Niederwertiges Byte der CRC CRC high (1 Byte): Höherwertiges Byte der CRC |
CRC-Prüfung mit CRC-16 in Python
CRC (Cyclic Redundancy Check) ist eine essenzielle Technik zur Erkennung von Übertragungsfehlern. Im Folgenden zeigen wir anhand von Python, wie CRC-16 implementiert wird – jene Variante, die im amerikanischen binären synchronen System verwendet wird. Beim CRC-16 verwendet der Fehlererkennungsalgorithmus ein Polynom G(X) = X16 + X15 + X2 + 1 zur Generierung der Prüfsumme. Dieses Polynom definiert die mathematischen Operationen, die während des CRC-Berechnungsprozesses an den Bits der Nachricht durchgeführt werden. Eine Übersicht des Algorithmus ist nachfolgend detailliert aufgeführt:
- Initialisieren Sie ein 16-Bit-Register mit dem Hexadezimalwert FFFF (nur Einsen), das als CRC-Register bezeichnet wird.
- Führen Sie eine XOR-Verknüpfung der ersten 8 Bytes der Nachricht mit dem niederwertigen Byte des CRC-Registers durch. Speichern Sie das Ergebnis wieder im CRC-Register.
- Verschieben Sie das CRC-Register um ein Bit nach rechts, wobei das höchstwertige Bit (MSB) auf Null gesetzt wird.
- Überprüfen Sie das niederwertigste Bit (LSB) des CRC-Registers:
- Wenn das LSB 0 ist, wiederholen Sie Schritt 3 (Schiebeoperation).
- Wenn das LSB 1 ist, führen Sie eine XOR-Verknüpfung des CRC-Registers mit dem Polynomwert 0xA001 (1010 0000 0000 0001) durch.
- Wiederholen Sie die Schritte 3 bis 4 für insgesamt 8 Verschiebungen, um jedes Byte zu verarbeiten.
- Wiederholen Sie die Schritte 2 bis 5 für jedes Byte in der Nachricht, bis alle Bytes verarbeitet wurden.
- Der finale Inhalt des CRC-Registers entspricht dem CRC-Wert.
Kommunikationseinstellungen
Jedes Datenbyte besitzt eine Struktur aus 1 Startbit, 8 Datenbits, 1 Paritätsbit und 1 Stoppbit. Die Bits werden in der Reihenfolge vom least significant bit (LSB) zum most significant bit (MSB) übertragen. Zu den möglichen Kommunikations-Baudraten gehören 1200, 2400, 4800 und 9600 Baud.
Bei Ganzzahlen (2 Bytes) sind die Daten so angeordnet, dass das zweite Byte zuerst und das erste Byte danach folgt. Der Hexadezimalwert 2378H wird beispielsweise als 23H 78H gesendet. Bei langen Ganzzahlen und Gleitkommazahlen (4 Bytes) ist das vierte Byte zuerst angeordnet, gefolgt vom dritten, zweiten und ersten Byte.
MODBUS-Nachrichten-RTU-Frame-Format
Das RTU-Frame-Format der MODBUS-Nachricht entspricht der Beschreibung in der folgenden Tabelle.
| Feld | Größe | Beschreibung |
|---|---|---|
| Start | ≥ 3,5 Zeichen | Signaleisiert den Beginn der Übertragung |
| Adresse | 8 Bits | Adresse des Slave-Geräts |
| Funktionscode | 8 Bits | Befehl für das Slave-Gerät |
| Daten | N x 8 Bits | Zu übertragende Daten (variable Länge, N Bytes) |
| CRC-Prüfcode | 16 Bits | Zyklische Redundanzprüfung zur Fehlererkennung |
| Ende | ≥ 3,5 Zeichen | Signalisiert das Ende der Übertragung |
🚨 Stellen Sie sicher, że der Nachrichtenrahmen kontinuierlich ohne Leerzeiten zwischen den Zeichen von mehr als 1,5 Zeichenzeiten übertragen wird. Unvollständige Nachrichtenrahmen, die durch übermäßige Leerzeiten gekennzeichnet sind, sollten vom empfangenden Knoten verworfen werden.
Fehlerreaktion
Wenn ein Host eine Datenanforderung sendet und der Slave unzulässige Daten empfängt, sollte dies eine Fehlerreaktion auslösen. Wenn der vom Host gesendete Adresscode falsch ist, d. h. keinem Adresscode unter den Slaves entspricht, oder wenn die vom Slave empfangene Daten die CRC-Prüfung nicht bestehen, wird kein Fehlercode zurückgegeben. In solchen Fällen sollte der Host einen übergeordneten Reaktionsprozess einleiten.
Im Funktionscodebereich ist der Funktionscode für die Fehlerreaktion als der normale Funktionscode plus 80H definiert.
Im Datenbereich ist der zurückzugebende Fehlercode in der nachstehenden Tabelle definiert.
| Code | Name | Bedeutung |
|---|---|---|
| 01H | Ungültiger Funktionscode | Der von der Schlauchpumpe empfangene Funktionscode ist nicht zulässig, mit Ausnahme von 03H, 06H oder 10H. |
| 02H | Ungültige Datenadresse | Die von der Schlauchpumpe empfangene Registeradresse ist nicht zulässig. |
| 03H | Ungültiger Datenwert | Die geschriebenen Daten entsprechen nicht dem von der Schlauchpumpe erwarteten Betriebsbereich. |
| 06H | Slave (Schlauchpumpe) beschäftigt | Die Schlauchpumpe ist derzeit beschäftigt und kann den Befehl aufgrund eines konfligierenden Zustands nicht ausführen. |
🚨Die Schlauchpumpe akzeptiert MODBUS-Befehle nur über das Main Interface; andere Schnittstellen empfangen keine Nachrichten.
Adresse und Inhalt des Holding-Registers
Nachfolgend finden Sie die Tabellen zur Einstellung der Basis- bzw. Kalibrierungsparameter.
Einstellung der Basisparameter
| Adresse (Dezimal) | Name | Bereich | Datentyp |
|---|---|---|---|
| 1000 | Pumpenkopf | Bezog sich auf Diagramm 1 | unsigned short int (2 Byte) |
| 1001 | tube-Größe | Bezog sich auf Diagramm 1 | unsigned short int (2 Byte) |
| 1002 | Motordrehzahl | 0,1–600 U/min | float (4 Byte) |
| 1004 | Flussrate | 0,1–99999 mL | float (4 Byte) |
| 1007 | Rückabsaugwinkel | 0–360° | unsigned short int (2 Byte) |
| 1008 | Start-/Stopp-Steuerung | 1: Start, 0: Stopp | unsigned short int (2 Byte) |
| 1009 | Richtungsteuerung | 1: Im Uhrzeigersinn, 0: Gegen den Uhrzeigersinn | unsigned short int (2 Byte) |
| 1010 | Betrieb mit voller Geschwindigkeit | 1: Start mit voller Geschwindigkeit, 0: Stopp mit voller Geschwindigkeit | unsigned short int (2 Byte) |
| 1015 | Fördervolumen einstellen | 0-99999 mL | float (4 Byte) |
| 1018 | Arbeitszeit | 0,1-9999 s | float (4 Byte) |
| 1020 | Arbeitsmodus | 0: Transferieren, 1: Feste Volumenmessung, 2: Feste Zeit und Volumen | unsigned short int (2 Byte) |
| 1021 | Pausenzeit | 0,1-9999 s | float (4 Byte) |
| 1023 | Kopienanzahl | 0-9999 mal, 0 bedeutet unendlich | unsigned short int (2 Byte) |
💡 Wichtige Hinweise:
- Die Register 1015 und 1018 sind ungültig, wenn der Arbeitsmodus auf Transferieren eingestellt ist.
- Register 1018 ist ungültig, wenn der Arbeitsmodus auf Feste Volumenmessung eingestellt ist.
- Die Register 1002 und 1004 sind ungültig, wenn der Arbeitsmodus auf Feste Zeit und Volumen eingestellt ist.
- Stellen Sie sicher, dass die Registerdaten gemäß der bereitgestellten Tabelle eingestellt werden, und vermeiden Sie es, mehrere Registerkonfigurationen in einem einzigen Befehl zu senden.
Einstellung der Kalibrierungsparameter
| Adresse (Dezimal) | Name | Bereich | Datentyp |
|---|---|---|---|
| 2001 | Testzeit | 0,5-9999 s | unsigned short int (2 Byte) |
| 2002 | Test Start/Stopp | 1: Start, 0: Stopp | unsigned short int (2 Byte) |
| 2003 | Ist-Volumen | 0-9999 mL | float (4 Byte) |
| 2005 | Standardeinstellungen wiederherstellen | 1: Kalibrierung wiederherstellen | unsigned short int (2 Byte) |
| 2006 | Feineinstellung | 1: Erhöhen, 0: Verringern | unsigned short int (2 Byte) |
Übersichtstabelle für Pumpenköpfe und tube
| Pumpenkopfbezeichnung | Pumpenkopftyp | tube-Größe | tube-Spezifikation |
|---|---|---|---|
| EasyPumpI | 0 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| EasyPumpII | 1 | 15 | 15# |
| 24 | 24# | ||
| 35 | 35# | ||
| 36 | 36# | ||
| EasyPumpIII | 2 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| EasyPumpIV | 3 | 15 | 15# |
| 24 | 24# | ||
| 35 | 35# | ||
| 36 | 36# | ||
| EasyPumpV | 4 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| EasyPumpVI | 5 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 2*EasyPumpI | 6 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| 2*EasyPumpII | 7 | 15 | 15# |
| 24 | 24# | ||
| 35 | 35# | ||
| 36 | 36# | ||
| 2*EasyPumpIII | 8 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| YZ1515x | 12 | 13 | 13# |
| 14 | 14# | ||
| 19 | 19# | ||
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| YZ2515x | 13 | 15 | 15# |
| 24 | 24# | ||
| DZ25-3L | 18 | 15 | 15# |
| 24 | 24# | ||
| 35 | 35# | ||
| 36 | 36# | ||
| UC15 | 20 | 19 | 19# |
| 16 | 16# | ||
| 25 | 25# | ||
| 17 | 17# | ||
| 18 | 18# | ||
| UC25 | 21 | 24 | 24# |
| 35 | 35# | ||
| 36 | 36# | ||
| SN15 | 22 | 14 | 14# |
| 16 | 16# | ||
| SN25 | 23 | 24 | 24# |
💡 Wichtiger Hinweis:
- Die obige Tabelle ist nicht erschöpfend und enthält nur eine Auswahl an Pumpenköpfen und tube-Größen. Die vollständige Liste finden Sie in der Dokumentation.
Beispiele für Befehlszeilen
Beispiel 1: Pumpe starten
- Adresse: 01 gibt die Geräteadresse an, an die der Befehl gesendet wird.
- Funktionscode: 06, wird verwendet, um einen einzelnen Wert in ein Register zu schreiben.
- Registeradresse: 03F0, Registeradresse entsprechend dem Steuerregister zum Starten der Pumpe (1008 im Hexadezimalformat).
- Daten: 0001, in das Register geschrieben, um die Pumpe zu starten (1: Start, 0: Stopp).
- CRC: 487D, Wert zur Sicherstellung der Datenintegrität.
Daraus ergibt sich folgender Befehlsstring zum Starten der Pumpe: 01 06 03 F0 00 01 48 7D.
Beispiel 2: Pumpendrehzahl auf 20 rpm einstellen
- Adresse: 01 gibt die Geräteadresse an, an die der Befehl gesendet wird.
- Funktionscode: 10, wird verwendet, um Werte in mehrere Register zu schreiben.
- Registeradresse: 03EA, Registeradresse entsprechend dem Drehzahleinstellregister (1002 im Hexadezimalformat).
- Anzahl der Register: 0002, es werden zwei Register beschrieben.
- Byte-Anzahl: 04, Anzahl der zu schreibenden Datenbytes.
- Daten: 41A00007, repräsentiert die Drehzahleinstellung im Gleitkommaformat entsprechend 20 RPM.
- CRC: D76E, Wert zur Sicherstellung der Datenintegrität.
Daraus ergibt sich folgender Befehlsstring zum Einstellen der Pumpendrehzahl auf 20 rpm: 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Diese 2 Beispiele sowie weitere Beispiele für Befehlsstrings sind in der folgenden Tabelle dargestellt.
| Aufgabe | Befehlsstring |
|---|---|
| Pumpe starten | 01 06 03 F0 00 01 48 7D |
| Richtung auf CCW einstellen | 01 06 03 F1 00 00 D8 7D |
| Richtung auf CW einstellen | 01 06 03 F1 00 01 19 BD |
| Drehzahl auf 20 RPM einstellen | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Flussrate auf 50,0 mL/min einstellen | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Pumpe stoppen | 01 06 03 F0 00 00 89 BD |
| Start mit voller Drehzahl | 01 06 03 F2 00 01 E9 BD |
Wie steuert man die LabV Pumpen mit Python?
Die LabV Pumpenserie kann über Python per MODBUS RTU Protokoll remote gesteuert werden, was eine höhere Flexibilität und Benutzerfreundlichkeit bei der Durchführung komplexer Pumpenprogramme mit Schleifen, Pausen und variierenden Geschwindigkeiten bzw. Flussraten bietet. Dieser Ansatz ist besonders nützlich bei der Integration mehrerer Geräte, da er die Automatisierung von Sequenzen aller angeschlossenen Komponenten ermöglicht.
In diesem Abschnitt wird eine spezielle, benutzerdefinierte Python-Bibliothek vorgestellt, die das MODBUS RTU Protokoll nutzt, um die serielle Schnittstelle zu öffnen und Steuerungsbefehle an die LabV Pumpe zu senden. Wir behandeln Beispiele zur Einstellung der Geschwindigkeit, zum Starten und Stoppen der Pumpe, zur Konfiguration von Pumpenkopf und tube Größe usw. und bieten damit einen praxisbezogenen Leitfaden für die Steuerung einer LabV Pumpe mittels Python.
🚨🚨🚨 Wichtiger Hinweis
- When viewing this code, please be aware that <, >, and & symbols might not display correctly due to formatting issues. These should appear as standard Python code syntax, so make sure to interpret < as <, > as >, and & as &.
'''
-----------------------------------------------------------
LABV Peristaltic Pump Control Library Using Modbus Protocol
-----------------------------------------------------------
'''
import serial
import struct
#------------------------------------------------------#
# LIBRARY MANAGING THE COMMUNICATION WITH THE PUMP #
#------------------------------------------------------#
class LABV:
# Initialize the object and establish a serial connection with the corresponding data format
def __init__(self, port, address=1, baudrate=9600, parity='E', bytesize=8, stopbits=1, timeout=1):
self.ser = serial.Serial(port=port, baudrate=baudrate, parity=parity,
bytesize=bytesize, stopbits=stopbits, timeout=timeout)
self.address = address
# Connect the pump
def connect(self):
if not self.ser.is_open:
self.ser.open()
# Close the serial connection
def disconnect(self):
if self.ser.is_open:
self.ser.close()
# Calculate the CRC (Cyclic Redundancy Check) for data integrity as
# explained in "The MODBUS RTU Communication Protocol" section
def _calculate_crc(self, data):
crc = 0xFFFF
for byte in data:
crc ^= byte
for _ in range(8):
if crc & 0x0001:
crc >>= 1
crc ^= 0xA001
else:
crc >>= 1
return crc.to_bytes(2, byteorder='little')
# Convert data into bytes for communication
def _prepare_data(self, data, data_type):
if data_type == 'float':
return struct.pack('>f', data)
elif data_type == 'int':
return data.to_bytes(2, byteorder='big')
else:
raise ValueError("Data type not supported.")
# Construct, send commands to the pump and verify the response
def _send_command(self, function_code, register_address, data, data_type):
data_bytes = self._prepare_data(data, data_type)
payload = bytearray([self.address, function_code])
payload.extend(register_address.to_bytes(2, byteorder='big'))
if function_code == 0x10: # Write multiple registers
number_of_registers = len(data_bytes) // 2
payload.extend(number_of_registers.to_bytes(2, byteorder='big'))
payload.append(len(data_bytes))
payload.extend(data_bytes)
else:
payload.extend(data_bytes)
crc = self._calculate_crc(payload)
payload.extend(crc)
print(f"Sending payload: {payload.hex()}") # Debug: Print the payload
self.ser.write(payload)
response = self.ser.read(8) # Adjust as per the device response length
if len(response) != 8:
raise ValueError("Invalid response length")
if self._calculate_crc(response[:-2]) != response[-2:]:
raise ValueError("Invalid CRC")
return response
#------------------------------#
# BASIC PARAMETERS SETTING #
#------------------------------#
# Start the pump
def start_pump(self):
print("Starting pump...")
response = self._send_command(0x06, 0x03F0, 0x0001, 'int')
print(f"Start pump response: {response.hex()}")
# Stop the pump
def stop_pump(self):
print("Stopping pump...")
response = self._send_command(0x06, 0x03F0, 0x0000, 'int')
print(f"Stop pump response: {response.hex()}")
# Set the pump head
def set_pump_head(self, pump_head):
print(f"Setting pump head to {pump_head}...")
response = self._send_command(0x06, 0x03E8, pump_head, 'int')
print(f"Set pump head response: {response.hex()}")
# Set the tube size
def set_tube_size(self, tube_size):
print(f"Setting tube size to {tube_size}...")
response = self._send_command(0x06, 0x03E9, tube_size, 'int')
print(f"Set tube size response: {response.hex()}")
# Set the direction of rotation
def set_direction(self, direction):
print(f"Setting direction to {direction}...")
data = 0x0001 if direction.upper() == "CW" else 0x0000
response = self._send_command(0x06, 0x03F1, data, 'int')
print(f"Set direction response: {response.hex()}")
# Set the speed of the pump in RPM
def set_speed(self, speed):
print(f"Setting speed to {speed} RPM...")
response = self._send_command(0x10, 0x03EA, speed, 'float')
print(f"Set speed response: {response.hex()}")
# Set the flow rate in mL/min
def set_flow_rate(self, flow_rate):
print(f"Setting flow rate to {flow_rate} mL/min...")
response = self._send_command(0x10, 0x03EC, flow_rate, 'float')
print(f"Set flow rate response: {response.hex()}")
# Set the flow volume in mL
def set_flow_volume(self, volume):
print(f"Setting flow volume to {volume} mL...")
response = self._send_command(0x10, 0x03F3, volume, 'float')
print(f"Set flow volume response: {response.hex()}")
# Set the working time in seconds
def set_working_time(self, time):
print(f"Setting working time to {time} seconds...")
response = self._send_command(0x10, 0x03FA, time, 'float')
print(f"Set working time response: {response.hex()}")
# Set the working mode
def set_working_mode(self, mode):
"""
Working modes:
0: Transferring
1: Fixed volume measurement
2: Fixed time and volume
"""
if mode not in [0, 1, 2]:
raise ValueError("Invalid working mode. Must be 0, 1, or 2.")
print(f"Setting working mode to {mode}...")
response = self._send_command(0x06, 0x03FC, mode, 'int')
print(f"Set working mode response: {response.hex()}")
# Set the pause time in seconds
def set_pause_time(self, time):
print(f"Setting pause time to {time} seconds...")
response = self._send_command(0x10, 0x03FD, time, 'float')
print(f"Set pause time response: {response.hex()}")
# Set the number of copies
def set_copy_numbers(self, numbers):
print(f"Setting copy numbers to {numbers}...")
response = self._send_command(0x06, 0x03FF, numbers, 'int')
print(f"Set copy numbers response: {response.hex()}")
# Set the back suction angle in degrees
def set_back_suction_angle(self, angle):
print(f"Setting back suction angle to {angle} degrees...")
response = self._send_command(0x06, 0x03EF, angle, 'int')
print(f"Set back suction angle response: {response.hex()}")
# Start or stop full speed running
def set_full_speed_running(self, start):
state = "Start" if start else "Stop"
print(f"{state} full speed running...")
data = 0x0001 if start else 0x0000
response = self._send_command(0x06, 0x03F2, data, 'int')
print(f"{state} full speed running response: {response.hex()}")
#---------------------------------------#
# CALIBRATION PARAMETERS SETTING UP #
#---------------------------------------#
# Set the testing time in seconds
def set_testing_time(self, time):
print(f"Setting testing time to {time} seconds...")
response = self._send_command(0x06, 0x07D1, time, 'int')
print(f"Set testing time response: {response.hex()}")
# Start the calibration test
def start_test(self):
print("Starting test...")
response = self._send_command(0x06, 0x07D2, 0x0001, 'int')
print(f"Start test response: {response.hex()}")
# Stop the calibration test
def stop_test(self):
print("Stopping test...")
response = self._send_command(0x06, 0x07D2, 0x0000, 'int')
print(f"Stop test response: {response.hex()}")
# Set the actual volume in mL
def set_actual_volume(self, volume):
print(f"Setting actual volume to {volume} mL...")
response = self._send_command(0x10, 0x07D3, volume, 'float')
print(f"Set actual volume response: {response.hex()}")
# Restore calibration defaults
def restore_defaults(self):
print("Restoring defaults...")
response = self._send_command(0x06, 0x07D5, 0x0001, 'int')
print(f"Restore defaults response: {response.hex()}")
# Perform micro adjustment (increase or decrease)
def micro_adjustment(self, increase=True):
action = "Increase" if increase else "Decrease"
print(f"{action} micro adjustment...")
data = 0x0001 if increase else 0x0000
response = self._send_command(0x06, 0x07D6, data, 'int')
print(f"{action} micro adjustment response: {response.hex()}")
#-----------------------------------------------------------------------#
# EXAMPLES ON HOW TO USE THE DEFINED CLASS TO CONTROL THE LABV PUMP #
#-----------------------------------------------------------------------#
if __name__ == "__main__":
pump = LABV(port='COM6', address=1) # Change port and address according to your setup
pump.connect()
try:
pump.set_pump_head(5)
pump.set_tube_size(16)
pump.set_direction("CW")
pump.set_speed(50)
pump.set_flow_rate(50.0)
pump.set_back_suction_angle(0)
pump.set_full_speed_running(True)
pump.start_pump()
except Exception as e:
print(f"An error occurred: {e}")
finally:
pump.stop_pump()
pump.disconnect()
Diese Python-Bibliothek zur Steuerung der LabV Pumpenserie über das MODBUS RTU Protokoll ermöglicht eine präzise und automatisierte Regelung verschiedener Pumpenparameter wie Geschwindigkeit, Richtung, Pumpenkopf und tube Größe. Nutzer einer LabV Pumpe können diese nun problemlos in komplexe Arbeitsabläufe mit mehreren Geräten integrieren, wodurch die betriebliche Effizienz und Flexibilität gesteigert wird.
Fazit
In diesem Blogbeitrag haben wir die LabV Schlauchpumpenserie vorgestellt und die Grundlagen für deren contrôle externe mittels Python über das MODBUS RTU Kommunikationsprotokoll untersucht. Wir hoffen, dass dieser Beitrag Forschern und Ingenieuren als wertvoller Leitfaden dient, die eine LabV Schlauchpumpe in ihre mikrofluidische Forschung und ihre Experimente einbinden möchten.
🚨 Obwohl es Abweichungen zwischen den verschiedenen Serien von Innofluid Lab Pumpen gibt, möchten wir betonen, dass das Kommunikationsprotokoll nahezu unverändert bleibt. Unabhängig davon, ob Sie die LabF-Serie, die LabN-Serie oder eine andere verwenden, sind wir zuversichtlich, dass dieser Inhalt auch für Ihre zukünftigen Projekte von Nutzen sein wird.
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.


