Das LabV Pumpenserie von Innofluid (früher bekannt als Shenchen Baoding) ist eine fortschrittliche Serie von Peristaltikpumpen zur Durchflussmessung, die über einen 4,3-Zoll-Farb-Touchscreen für eine intuitive Steuerung verfügt. Sie zeigt Durchflussdaten, Einstellungen und Systeminformationen gleichzeitig an und veranschaulicht den Betriebszustand mithilfe von Animationen. Ausgestattet mit intelligenter Kalibrierung, Online-Feineinstellung und drei Messmodi – festes Volumen, feste Zeit und festes Volumen sowie Timer-Start/Stopp – ist sie äußerst vielseitig einsetzbar. Die LabV-Serie ist mit verschiedenen Pumpenköpfen kompatibel und bietet zahlreiche Anschluss contrôle externe en. Damit eignet sie sich ideal für den Laboreinsatz, die Geräteintegration und die industrielle Fertigung.
In diesem Blogbeitrag werden wir uns damit befassen, wie man die LabV-Pumpen mithilfe des MODBUS-RTU-Protokolls über eine gängige Programmierplattform – Python – steuern kann.
Es ist anzumerken, dass es zwar geringfügige Unterschiede bei der Registerkonfiguration und den Befehlen zwischen den verschiedenen Lab-Pumpenserien (wie LabF, LabN, LabK usw.) geben mag, diese jedoch alle dasselbe MODBUS-RTU-Kommunikationsprotokoll verwenden. Daher sind die in diesem Artikel dargelegten Erkenntnisse für Anwender aller Lab-Pumpenserien von Innofluid relevant und anwendbar.
Warum sollten Sie sich für eine Peristaltikpumpe der LabV-Serie entscheiden?
Die LabV-Peristaltikpumpe ist die erste Wahl für die Förderung von Flüssigkeiten sowohl in Laboren als auch in der Industrie. Ausgestattet mit einem neuen Servomotor für höhere Genauigkeit und Langlebigkeit sowie einem 4,3-Zoll-LCD-Touchscreen bietet diese Pumpe eine intuitive Steuerung für präzise Dosier- und Festvolumenmodi. Sie ist aus ABS in Laborqualität gefertigt und gewährleistet 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, eignet es sich für ein breites Spektrum an Anwendungen. Darüber hinaus machen seine robuste Bauweise, das dynamische Display und die intelligente Kalibrierungsfunktion es zu einem zuverlässigen Begleiter für verschiedene Aufgaben im Bereich der Flüssigkeitsförderung.
Ob für Forschungszwecke, zur Unterstützung der Geräteausstattung oder in der industriellen Fertigung – die Peristaltikpumpen der LabV-Serie sind eine hervorragende Lösung für Herausforderungen im Bereich der Fördertechnik.
Was benötigen Sie, um mit einer LabV-Pumpe zu kommunizieren?
Um über das MODBUS-RTU-Protokoll mit einer LabV-Pumpe zu kommunizieren, benötigen Sie Folgendes:
- Eine LabV-Pumpe (im vorliegenden Fall wird eine intelligente peristaltische Durchflusspumpe vom Typ LabV1-III verwendet) mit einem Pumpenkopf und einer tube Ihrer Wahl
- Ein serielles Kabel, das an Ihren Computer oder Ihr Gerät angeschlossen wird
- Ein RS485- oder RS232-Anschluss am „ contrôle externe “-Anschluss auf der Rückseite der Pumpe
- Eine Programmierplattform (im vorliegenden Fall Python)
- Grundlegende Kenntnisse des MODBUS-RTU-Kommunikationsprotokolls, das im Folgenden näher erläutert 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 Kabel für die RS232- oder RS485-Kommunikation an den Anschluss „ contrôle externe “ auf der Rückseite der Pumpe an.
- Schalten Sie die Pumpe ein
- Wählen Sie im Menü „Kommunikationseinstellungen“ auf dem Pumpenbildschirm „RS232“ oder „RS485“ als Kommunikationsschnittstelle aus (Einzelheiten zur Verkabelung von RS232 und RS485 finden Sie in den folgenden Tabellen ).
- Unabhängig davon, ob Sie sich für RS232 oder RS485 entscheiden, ist das Kommunikationsprotokoll MODBUS RTU nach Standard.
- Baudrate einstellen
- Klicken Sie auf die Schaltfläche „Slave-Nr.“, um die Adresse der Peristaltikpumpe einzustellen (Bereich: 1–32).
- Kommunikation aktivieren ( ON) auswählen
- Kehren Sie zur Hauptoberfläche zurück, da die Pumpe nur in der Hauptoberfläche Kommunikationsbefehle empfängt; in anderen Einstellungsoberflächen sind diese Befehle ungültig.
| Details zur RS232-Verkabelung | |
|---|---|
| Terminal | Beschreibung |
| GND | Kommunikations-Masseanschluss. |
| TXD | Master-Sendeanschluss, Empfangsanschluss für Peristaltikpumpe. |
| RXD | Sendeanschluss der Peristaltikpumpe, Empfangssignalanschluss des Master-Geräts. |
| Details zur RS485-Verkabelung | |
|---|---|
| Terminal | Beschreibung |
| GD1 | RS485-Signalerdung. |
| A+ | Schließen Sie den RS485-Anschluss A+ an. |
| B- | RS485-B-Klemme anschließen. |
Das MODBUS-RTU-Kommunikationsprotokoll der LabV-Serie
Die LabV-Peristaltikpumpen-Serie bietet einen umfassenden Befehlssatz für die präzise Steuerung und Überwachung über das MODBUS-RTU-Protokoll. Dieser Befehlssatz umfasst verschiedene Befehle, die zur einfacheren Steuerung der Pumpenfunktionen in Kategorien unterteilt sind und unter anderem die Einstellung der Motordrehzahl, die Konfiguration der Durchflussrate, die Auswahl der Förderhöhe sowie Kalibrierungsroutinen abdecken. Jeder Befehl, der durch eindeutige Parameter gekennzeichnet ist, gewährleistet eine präzise Steuerung des Pumpenbetriebs.
Ausführliche Erläuterungen und weitere Informationen zum MODBUS-RTU-Protokoll für die Steuerung der LabV-Pumpen werden im Folgenden bereitgestellt und sind zudem in der Dokumentation zum Kommunikationsprotokoll zu finden.
MODBUS RTU – Standard-Kommunikationsformat
Das Nachrichtenformat entspricht dem in der folgenden Tabelle beschriebenen.
| Feld | Größe | Beschreibung |
|---|---|---|
| Slave-Adresse | 1 Byte | Adresse der Pumpe. Der Nummernbereich reicht von 1 bis 32, wobei 0 für eine Rundsendung verwendet wird. |
| Funktionscode | 1 Byte | Befehle für das Slave-Gerät. 03H: Halte-Register lesen 06H: Einzelnes Register schreiben 10H: Mehrere Register schreiben 02H: Diskrete Eingänge lesen (Datenbits lesen) 05H: Einzelnes Bit in ein Register schreiben |
| Datenbereich | 0 – 252 Byte | Zu übertragende Daten (variable Länge) |
| CRC-Prüfung | 2 Byte | Zyklische Redundanzprüfung (CRC) zur Fehlererkennung CRC-Low (1 Byte): Unteres Byte des CRC CRC-High (1 Byte): Oberes Byte des CRC |
CRC-Prüfung mit CRC-16 in Python
CRC (Cyclic Redundancy Check) ist ein unverzichtbares Verfahren zur Fehlererkennung bei der Datenübertragung. Im Folgenden zeigen wir, wie man CRC-16, das im amerikanischen binären synchronen System verwendete Verfahren, mit Python implementiert. Bei CRC-16 verwendet der Fehlererkennungsalgorithmus ein Polynom G(X) =X¹⁶ +X¹⁵ +X² + 1 zur Erzeugung der Prüfsumme. Dieses Polynom definiert die mathematischen Operationen, die während des CRC-Berechnungsprozesses auf die Bits der Nachricht angewendet werden. Nachfolgend finden Sie eine detaillierte Übersicht über den Algorithmus:
- Initialisieren Sie ein 16-Bit-Register mit dem Hexadezimalwert FFFF (nur Einsen), das als CRC-Register bezeichnet wird.
- Führe eine XOR-Operation zwischen den ersten 8 Bytes der Nachricht und dem niedrigsten Byte des CRC-Registers durch. Speichere 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 niedrigstwertige Bit (LSB) des CRC-Registers:
- Wenn LSB 0 ist, wiederhole Schritt 3 (Verschiebungsoperation).
- Wenn LSB 1 ist, führe eine XOR-Operation zwischen dem CRC-Register und dem Polynomwert 0xA001 (1010 0000 0000 0001) durch.
- Wiederholen Sie die Schritte 3 bis 4 insgesamt achtmal, um jedes Byte zu verarbeiten.
- Wiederholen Sie die Schritte 2 bis 5 für jedes Byte der Nachricht, bis alle Bytes verarbeitet wurden.
- Der endgültige Inhalt des CRC-Registers ist der CRC-Wert.
Kommunikationseinstellungen
Jedes Datenbyte hat eine Struktur, die aus 1 Startbit, 8 Datenbits, 1 Paritätsbit und 1 Stoppbit besteht. Die Bits werden der Reihe nach vom niedrigstwertigen Bit (LSB) zum höchstwertigen Bit (MSB) gesendet. Zu den möglichen Baudraten gehören 1200, 2400, 4800 und 9600 Bit/s.
Bei Ganzzahlen (2 Byte) werden die Daten so angeordnet, dass das zweite Byte zuerst kommt, gefolgt vom ersten Byte. Der Hexadezimalwert 2378H wird beispielsweise als 23H 78H gesendet. Bei langen Ganzzahlen und Gleitkommazahlen (4 Byte) werden die Daten so angeordnet, dass das vierte Byte zuerst kommt, gefolgt vom dritten, zweiten und ersten Byte.
MODBUS-Nachrichten-RTU-Rahmenformat
Das Rahmenformat der MODBUS-RTU-Nachrichten entspricht der Beschreibung in der folgenden Tabelle.
| Feld | Größe | Beschreibung |
|---|---|---|
| Start | ≥ 3,5 Zeichen | Zeigt den Beginn der Übertragung an |
| Adresse | 8 Bit | Adresse des Slave-Geräts |
| Funktionscode | 8 Bit | Anleitung für das Slave-Gerät |
| Daten | N × 8 Bit | Zu übertragende Daten (variable Länge, N Byte) |
| CRC-Prüfsumme | 16 Bit | Zyklische Redundanzprüfung zur Fehlererkennung |
| Ende | ≥ 3,5 Zeichen | Zeigt das Ende der Übertragung an |
🚨 Stellen Sie sicher, dass der Nachrichtenrahmen kontinuierlich übertragen wird, ohne dass zwischen den Zeichen Leerzeichen auftreten, die länger als das 1,5-Fache der Zeichenlänge sind. Unvollständige Nachrichtenrahmen, die durch übermäßige Leerzeichen gekennzeichnet sind, sollten vom empfangenden Knoten verworfen werden.
Ungewöhnliche Reaktion
Wenn ein Host eine Datenanfrage sendet und der Slave fehlerhafte Daten empfängt, sollte dies eine Fehlerreaktion auslösen. Ist der vom Host gesendete Adresscode falsch, d. h. entspricht er keinem der Adresscodes der Slaves, oder besteht der vom Slave empfangene Datensatz die CRC-Prüfung nicht, wird kein Fehlercode zurückgegeben. In solchen Fällen sollte der Host einen übergeordneten Reaktionsprozess einleiten.
Im Funktionscode-Bereich wird der Funktionscode für die abnormale Reaktion als der Funktionscode für die normale Reaktion plus 80H definiert.
Im Datenbereich ist der zurückzugebende Fehlercode wie in der folgenden Tabelle definiert.
| Code | Name | Bedeutung |
|---|---|---|
| 01H | Ungültiger Funktionscode | Der von der Peristaltikpumpe empfangene Funktionscode ist nicht zulässig, mit Ausnahme von 03H, 06H oder 10H. |
| 02H | Ungültige Datenadresse | Die von der Peristaltikpumpe empfangene Registeradresse ist nicht zulässig. |
| 03H | Ungültiger Datenwert | Die eingegebenen Daten entsprechen nicht dem von der Peristaltikpumpe erwarteten Betriebsbereich. |
| 06H | Slave (Peristaltikpumpe) beschäftigt | Die Peristaltikpumpe ist derzeit ausgelastet und kann den Befehl aufgrund eines Konflikts nicht ausführen. |
🚨Die Peristaltikpumpe akzeptiert MODBUS-Befehle ausschließlich über die Hauptschnittstelle; andere Schnittstellen empfangen keine Nachrichten.
Adresse und Inhalt des Registerfelds „Holding“
Nachstehend finden Sie die Tabellen mit den Einstellungen für die Basis- bzw. Kalibrierungsparameter.
Einstellung der Grundparameter
| Adresse (dezimal) | Name | Reichweite | Datentyp |
|---|---|---|---|
| 1000 | Pumpenkopf | Bezugnehmend auf Abbildung 1 | unsigned short int (2 Byte) |
| 1001 | tube Größe | Bezugnehmend auf Abbildung 1 | unsigned short int (2 Byte) |
| 1002 | Motordrehzahl | 0,1–600 U/min | float (4 Byte) |
| 1004 | Durchflussmenge | 0,1–99.999 ml | float (4 Byte) |
| 1007 | Rücksaugwinkel | 0–360° | unsigned short int (2 Byte) |
| 1008 | Start-/Stopp-Steuerung | 1: Start, 0: Stopp | unsigned short int (2 Byte) |
| 1009 | Richtungssteuerung | 1: im Uhrzeigersinn, 0: gegen den Uhrzeigersinn | unsigned short int (2 Byte) |
| 1010 | Laufen mit voller Geschwindigkeit | 1: Mit voller Geschwindigkeit starten, 0: Mit voller Geschwindigkeit anhalten | unsigned short int (2 Byte) |
| 1015 | Durchflussmenge einstellen | 0–99.999 ml | float (4 Byte) |
| 1018 | Arbeitszeit | 0,1–9999 s | float (4 Byte) |
| 1020 | Betriebsmodus | 0: Übertragen, 1: Messung mit festem Volumen, 2: Feste Zeit und festes Volumen | unsigned short int (2 Byte) |
| 1021 | Pausenzeit | 0,1–9999 s | float (4 Byte) |
| 1023 | Anzahl der Kopien | 0–9999 Mal, wobei 0 unendlich bedeutet | unsigned short int (2 Byte) |
💡 Wichtige Hinweise:
- Die Register 1015 und 1018 sind ungültig, wenn der Betriebsmodus auf „Übertragung“ eingestellt ist.
- Register 1018 ist ungültig, wenn der Betriebsmodus auf „Feste Volumenmessung“ eingestellt ist.
- Die Register 1002 und 1004 sind ungültig, wenn der Betriebsmodus auf „Feste Zeit und Lautstärke“ eingestellt ist.
- Stellen Sie sicher, dass die Registerdaten gemäß der bereitgestellten Tabelle eingestellt sind, und vermeiden Sie es, mehrere Registerkonfigurationen in einem einzigen Auftrag zu übermitteln.
Einstellung der Kalibrierungsparameter
| Adresse (dezimal) | Name | Reichweite | Datentyp |
|---|---|---|---|
| 2001 | Prüfzeit | 0,5–9999 s | unsigned short int (2 Byte) |
| 2002 | Start-/Stopp-Test | 1: Start, 0: Stopp | unsigned short int (2 Byte) |
| 2003 | Tatsächliches Volumen | 0–9999 ml | float (4 Byte) |
| 2005 | Standardeinstellungen wiederherstellen | 1: Kalibrierung zurücksetzen | unsigned short int (2 Byte) |
| 2006 | Feineinstellung | 1: Erhöhen, 0: Verringern | unsigned short int (2 Byte) |
Tabelle mit Pumpenkopf- und „ tube “-Nummern
| Bezeichnung des Pumpenkopfes | Pumpenkopf-Typ | tube Größe | tube Spezifisch |
|---|---|---|---|
| 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 vollständig 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 Befehlszeichenfolgen
Beispiel 1: Die Pumpe starten
- Adresse: 01 gibt die Geräteadresse an, an die der Befehl gesendet wird.
- Funktionscode: 06, dient zum Schreiben eines einzelnen Werts in ein Register.
- Registeradresse: 03F0, Registeradresse, die dem Steuerregister zum Starten der Pumpe entspricht (1008 im Hexadezimalformat).
- Daten: 0001, in das Register geschrieben, um die Pumpe zu starten (1: Start, 0: Stopp).
- CRC: 487D, Wert zur Gewährleistung der Datenintegrität.
Daher lautet die entsprechende Befehlszeichenfolge zum Starten der Pumpe: 01 06 03 F0 00 01 48 7D.
Beispiel 2: Stellen Sie die Pumpendrehzahl auf 20 U/min ein.
- Adresse: 01 gibt die Geräteadresse an, an die der Befehl gesendet wird.
- Funktionscode: 10, dient zum Schreiben von Werten in mehrere Register.
- Registeradresse: 03EA, Registeradresse, die dem Geschwindigkeits-Einstellungsregister entspricht (1002 im Hexadezimalformat).
- Anzahl der Register: 0002, es wird in zwei Register geschrieben.
- Byteanzahl: 04, Anzahl der zu schreibenden Datenbytes.
- Daten: 41A00007, stellt die Drehzahleinstellung im Float-Format dar, die 20 U/min entspricht.
- CRC: D76E, Wert zur Gewährleistung der Datenintegrität.
Daher lautet die entsprechende Befehlszeichenfolge, um die Pumpendrehzahl auf 20 U/min einzustellen: 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Diese beiden Beispiele sowie weitere Beispiele für Befehlszeichenfolgen sind in der folgenden Tabelle aufgeführt.
| Aufgabe | Befehlszeichenfolge |
|---|---|
| Pumpe starten | 01 06 03 F0 00 01 48 7D |
| Richtung auf „gegen den Uhrzeigersinn“ einstellen | 01 06 03 F1 00 00 D8 7D |
| Richtung auf „CW“ einstellen | 01 06 03 F1 00 01 19 BD |
| Stellen Sie die Drehzahl auf 20 U/min ein | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Durchflussrate auf 50,0 ml/min einstellen | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Pumpe anhalten | 01 06 03 F0 00 00 89 BD |
| Lauf mit voller Geschwindigkeit los | 01 06 03 F2 00 01 E9 BD |
Wie lassen sich die LabV-Pumpen mit Python steuern?
Die Pumpenreihe LabV lässt sich über das MODBUS-RTU-Protokoll mithilfe von Python fernsteuern 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 wird eine speziell entwickelte Python-Bibliothek vorgestellt, die das MODBUS-RTU-Protokoll nutzt und es ermöglicht, die serielle Schnittstelle zu öffnen und Steuerbefehlszeichenfolgen an die LabV-Pumpe zu senden. Wir werden Beispiele behandeln, die zeigen, wie man die Drehzahl einstellt, die Pumpe startet und stoppt, die Förderhöhe und den Schlauchdurchmesser festlegt usw., und bieten damit eine praktische Anleitung zur Verwendung von Python für die Steuerung einer LabV-Pumpe.
🚨🚨🚨 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 Steuerung verschiedener Pumpenparameter wie Drehzahl, Drehrichtung, Förderhöhe und Schlauchdurchmesser. Nutzer einer LabV-Pumpe können ihre Pumpe nun problemlos in komplexe Arbeitsabläufe mit mehreren Geräten integrieren und so die betriebliche Effizienz und Flexibilität steigern.
Fazit
In diesem Blogbeitrag haben wir die LabV-Schlauchpumpenreihe vorgestellt und die Grundlagen ihrer Programmierung mit Python unter contrôle externe mithilfe des MODBUS-RTU-Kommunikationsprotokolls erläutert. Wir hoffen, dass dieser Beitrag Forschern und Ingenieuren, die eine LabV-Schlauchpumpe in ihrer Mikrofluidik-Forschung und bei ihren Experimenten einsetzen möchten, als wertvolle Orientierungshilfe dient.
🚨 Zwar gibt es Unterschiede zwischen den verschiedenen Baureihen der „ Innofluid “-Laborpumpen, doch möchten wir betonen, dass das Kommunikationsprotokoll nahezu unverändert bleibt. Ganz gleich, ob Sie die LabF-Serie, die LabN-Serie oder eine andere Baureihe verwenden – wir sind überzeugt, dass diese Informationen auch für Ihre zukünftigen Projekte von Nutzen sein werden.
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.


