Peristaltikpumpen spielen eine entscheidende Rolle in der Mikrofluidikforschung und der medizinischen Diagnostik und ermöglichen eine präzise Flüssigkeitssteuerung bei minimalem Kontaminationsrisiko. Unter den vielen verfügbaren Optionen Longer Pumpenvon „ Longer Precision Pump Co., Ltd.“ haben sich aufgrund ihrer Zuverlässigkeit, Präzision und Vielseitigkeit einen guten Ruf erworben.
Eines der herausragenden Merkmale der Peristaltikpumpen von Longer ist die Möglichkeit, sie per Fernsteuerung über einen Computer zu bedienen. Dadurch können Anwender komplexe Pumpenprogramme mit Schleifen, Pausen und variierenden Durchflussraten flexibler und bequemer ausführen.
In diesem Blogbeitrag befassen wir uns mit der Steuerung von Peristaltikpumpen der Serie „ Longer “ mithilfe des Modbus-RTU-Protokolls, einem weit verbreiteten seriellen Kommunikationsprotokoll, das das Senden von Befehlen und das Empfangen von Antworten von der Pumpe ermöglicht. Auch wenn die Einzelheiten des Modbus-Protokolls je nach Pumpenmodell leicht variieren können, verwenden wir in diesem Artikel die Peristaltikpumpe „Longer L100-1S-2“ als Beispiel. Außerdem führen wir Sie durch Python-Beispiele und Codeausschnitte, die Sie direkt kopieren und in Ihren eigenen Skripten verwenden können, um Ihre Pumpe ganz einfach zu steuern.
🚨 Sie können dieselben Konzepte und Code-Beispiele auch auf andere Pumpen von Longer anwenden, wobei Sie einige Befehle entsprechend dem spezifischen Protokoll Ihres Pumpenmodells anpassen müssen.
Was benötigen Sie, um mit Ihrer „ Longer “-Pumpe zu kommunizieren?
Um mit einer Peristaltikpumpe vom Typ „ Longer “ über das Modbus-RTU-Protokoll zu kommunizieren, benötigen Sie Folgendes:
- Eine „ Longer “-Pumpe mit einem Pumpenkopf und tube Ihrer Wahl
- Ein RS485 -Steuermodul, das an den DB15-Anschluss auf der Rückseite der Pumpe angeschlossen wird
- Ein serielles Kabel, das das RS485-Steuermodul mit Ihrem Computer oder Gerät verbindet
- Eine Programmierplattform (im vorliegenden Fall Python)
- Grundlegende Kenntnisse des Modbus-RTU-Protokolls (Erläuterung siehe unten 👇).
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 den DB15-Stecker an den DB15-Anschluss auf der Rückseite der Pumpe an.
- Schalten Sie die Pumpe ein und rufen Sie über die Tasten auf der Vorderseite der Pumpe das Einstellungsmenü für die Fernbedienung auf. Stellen Sie den Fernbedienungsmodus auf „COM“ ein 🕹️
- Stellen Sie sicher, dass die Kommunikationsparameter Ihrer Programmierplattform mit denen des L100-1S-2 übereinstimmen (wie in der folgenden Abbildung dargestellt). Diese lauten:
- 1 Startbit
- 8 Datenbits
- Parität: P-n (keine Parität), P-O (ungerade Parität) oder P-E (gerade Parität)
- Stoppbit: S-1 (1 Stoppbit) oder S-2 (2 Stoppbits)
- Baudrate: 12 (1200 Bit/s), 24 (2400 Bit/s), 48 (4800 Bit/s), 96 (9600 Bit/s), 192 (19200 Bit/s) oder 384 (38400 Bit/s).
🚨 Die Kommunikation ist nur dann gültig, wenn die Pumpe den Betriebsbildschirm des Kommunikationssteuerungsmodus„COM“ anzeigt.
Das Modbus-RTU-Protokoll verstehen
Das Modbus-RTU-Protokoll ist ein weit verbreiteter Kommunikationsstandard, der in Industrie- und Automatisierungssystemen zum Datenaustausch zwischen Geräten eingesetzt wird. Es ist bekannt für seine Einfachheit und Robustheit und eignet sich ideal zur Steuerung von Geräten wie den Peristaltikpumpen von Longer . In diesem Abschnitt werden wir uns eingehend mit den wichtigsten Elementen von Modbus RTU befassen, darunter das Kommunikationsformat, die zyklische Redundanzprüfung (CRC) und die Kommunikationseinstellungen. Außerdem werden wir die Struktur von Modbus-RTU-Nachrichten sowie den Befehlssatz untersuchen, der zur effektiven Steuerung von Longer -Pumpen verwendet wird.
Standard-Kommunikationsformat nach Modbus RTU
Das Modbus-Protokoll ist ein weit verbreitetes Kommunikationsframework, das die Master-Slave-Interaktion zwischen intelligenten Geräten ermöglicht. Eine vom Master an einen Slave übertragene Modbus-Nachricht enthält die Adresse des Slaves, einen bestimmten Befehl (z. B. das Lesen oder Schreiben in ein Register), die zugehörigen Daten sowie eine Prüfsumme zur Fehlerprüfung.
Dieses Nachrichtenformat wird in der folgenden Tabelle beschrieben.
| Feld | Größe | Beschreibung |
|---|---|---|
| Slave-Adresse | 1 Byte | Adresse der Pumpe. Der Bereich liegt zwischen 1 und 32; 0 wird für die Rundsende-Kommunikation verwendet. |
| Funktionscode | 1 Byte | Befehl für das Slave-Gerät: - 03H: Halte-Register lesen - 06H: Einzelnes Register schreiben - 10H: Mehrere 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- s - CRC-High (1 Byte): Oberes Byte des CRC- s |
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 oder 2 Stoppbits besteht. Die Bits werden der Reihe nach vom niedrigstwertigen Bit (LSB) zum höchstwertigen Bit (MSB) gesendet.
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.
Format des Modbus-RTU-Nachrichtenrahmens
Die Rahmenrate für Modbus-RTU-Nachrichten entspricht der in der folgenden Tabelle angegebenen.
| 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.
Parametereinstellung
Die folgende Tabelle gibt einen Überblick über die wesentlichen Parametereinstellungen für das Modell L100-1S-2. Diese Parameter können bei verschiedenen Pumpenmodellen von Longer variieren, entweder aufgrund der jeweils verfügbaren spezifischen Funktionen oder aufgrund der individuellen Adressen und Beschreibungen, die jedem Parameter zugeordnet sind.
| Parameter | Adresse | Datentyp | Beschreibung |
|---|---|---|---|
| Geschwindigkeit | 0x01 | uint_16 | Bereich: 1–10.000, was 0,01 U/min bis 100 U/min entspricht, in Schritten von 0,01 U/min. Die Pumpe zeigt die Drehzahl in U/min an. Beispiel: 100 = 0,01 U/min, 10.000 = 100 U/min. |
| Durchflussmenge | 0x02 | uint_16 | Die hohen Bytes des Durchflusswerts. Werden zusammen mit dem niedrigen Byte des Durchflusswerts verwendet. Die Einheit des Durchflusswerts ist 1 nL/min. Beispiel: 02 FA F0 80H = 50,0 mL/min. |
| 0x03 | uint_16 | Die unteren Bytes des Durchflusswerts. Werden zusammen mit dem oberen Byte des Durchflusswerts verwendet. Die Einheit des Durchflusswerts ist 1 nL/min. Beispiel: 02 FA F0 80H = 50,0 mL/min. | |
| Pumpenzustand | 0x04 | uint_16 | Das niedrige Byte ist gültig. BIT0: Lauf/Stopp (0 = Stopp, 1 = Lauf). BIT1: Volldrehzahl (0 = normale Drehzahl, 1 = Volldrehzahl). BIT2: Drehzahl-/Durchflussanzeige. BIT3: Reserviert. BIT4: Drehrichtung (0 = im Uhrzeigersinn, 1 = gegen den Uhrzeigersinn) |
| Pumpenadresse | 0x05 | uint_16 | Das Low-Byte ist gültig. Gültiger Bereich: 1–32 |
| Baudrate | 0x06 | uint_16 | Das Low-Byte ist gültig. 01H: 1200 bps 02H: 2400 bps 03H: 4800 bps 04H: 9600 bps 05H: 19200 bps 06H: 38400 bps |
| Parität | 0x07 | uint_16 | Das Low-Byte ist gültig. 01H: Keine Parität 02H: Ungerade Parität 03H: Gerade Parität |
| Stoppbit | 0x08 | uint_16 | Das niedrige Byte ist gültig. 01H: 1 Stoppbit 02H: 2 Stoppbits |
| Tastatursperre | 0x09 | uint_16 | Unteres Byte: Aktiviert die Tastensperre. 01H: Deaktiviert 02H: Aktiviert Oberes Byte: Verzögerung vor der Sperrung. 00H: 30 s 01H: 60 s 02H: 180 s 03H: 300 s 04H: 480 s 05H: 600 s |
💡 Wichtige Hinweise:
- Das Modbus-RTU-Protokoll des „ Longer “ unterstützt nur die Funktionscodes 03H (Register lesen), 06H (einzelnes Register schreiben) und 10H (mehrere Register schreiben).
- Bei Verwendung des Funktionscodes 06H arbeitet die Pumpe auf Basis des zuletzt empfangenen Befehls und zeigt die Drehzahl über einen Drehzahlparameter sowie die Fördermenge über einen Fördermengenparameter an.
- Um die Durchflussrate einzustellen, müssen sowohl das High-Byte als auch das Low-Byte gleichzeitig angegeben werden. Die Einheit für die Durchflussrate ist 1 nL/min (z. B. entspricht der Befehl 02 FA F0 80H 50,0 mL/min).
- Überschreitet die Durchflussmenge oder Drehzahl den zulässigen Bereich, zeigt die Pumpe den Maximal- oder Minimalwert an, ohne eine Warnung auszugeben.
Umrechnungsverhältnis zwischen Durchflussmenge und Geschwindigkeit
Der Zusammenhang zwischen Durchfluss und Drehzahl beim Modell L100-1S-2 lässt sich durch folgende Gleichung beschreiben: Q = V × f
Dabei steht Q für den Durchfluss in ml/min, V für die Drehzahl in U/min und f für den Durchflusskoeffizienten in ml/r, dessen Standardwert 1.
Der Standardwert f = 1 deutet auf eine direkte Korrelation zwischen Drehzahl und Fördermenge unter Standardbedingungen hin. Diese Einfachheit macht es für den Bediener leicht, die Pumpeneinstellungen für seine spezifischen Anwendungen zu optimieren.
Wie kommuniziert man mit dem L100-1S-2 über Python?
In diesem Abschnitt wird eine grundlegende Python-Bibliothek vorgestellt, die die Kommunikation mit und die Steuerung von Peristaltikpumpen der Baureihe „ Longer “ über das Modbus-RTU-Protokoll erleichtern soll. Sie umfasst wesentliche Funktionen wie die Einstellung der Pumpendrehzahl, der Fördermenge und der Förderrichtung sowie das einfache Starten und Stoppen der Pumpe.
Diese Bibliothek wurde speziell auf der Grundlage des Protokolls der Peristaltikpumpe L100-1S-2 von Longer entwickelt und dient als Beispiel, das angepasst werden kann. Durch die entsprechende Anpassung der Befehle und Parameter können Anwender die Bibliothek an das Modbus-RTU-Protokoll ihres jeweiligen Pumpenmodells von Longer anpassen.
🚨🚨🚨 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 &.
'''
-------------------------------------------------------------
Longer Peristaltic Pump Control Library Using Modbus Protocol
-------------------------------------------------------------
'''
import serial
import time
#------------------------------------------------------#
# LIBRARY MANAGING THE COMMUNICATION WITH THE PUMP #
#------------------------------------------------------#
class Longer_Pump:
# Initialize the class with serial communication parameters
def __init__(self, port, address=1, baudrate=9600, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=1):
"""
Parameters:
port (str): The COM port for serial communication.
address (int): Modbus address of the pump (default is 1).
baudrate (int): The baud rate (default is 9600).
parity (str): Parity for serial communication (default is none).
bytesize (int): Number of data bits (default is 8).
stopbits (int): Number of stop bits (default is 1).
timeout (int): Timeout for serial communication (default is 1s).
"""
self.ser = serial.Serial(port=port, baudrate=baudrate, parity=parity, bytesize=bytesize, stopbits=stopbits, timeout=timeout)
self.address = address
# Open the serial port for communication with the pump
def connect(self):
if not self.ser.is_open:
self.ser.open()
# Close the serial port to end communication with the pump
def disconnect(self):
if self.ser.is_open:
self.ser.close()
# Calculate the CRC for Modbus communication
def _calculate_crc(self, data):
"""
Parameters:
data (bytearray): The data for which to calculate the CRC.
Returns:
bytes: The calculated CRC as a 2-byte value.
"""
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')
# Send a command to the pump using the Modbus protocol
def _send_command(self, function_code, register_address, data):
"""
Parameters:
function_code (int): e.g., 0x03 for read, 0x06 for write.
register_address (int): to read from or write to.
data (list or int): to be sent (for writing registers).
Returns:
bytes: The response from the pump.
"""
# Prepare the command payload for Modbus
payload = bytearray([self.address, function_code])
payload.extend(register_address.to_bytes(2, byteorder='big'))
if isinstance(data, list):
# For multi-register commands (function code 0x10)
number_of_registers = len(data)
payload.extend(number_of_registers.to_bytes(2, byteorder='big'))
payload.append(len(data) * 2) # Byte count for the data
for value in data:
payload.extend(value.to_bytes(2, byteorder='big'))
else:
# For single-register commands (function code 0x06)
payload.extend(data.to_bytes(2, byteorder='big'))
# Append CRC
crc = self._calculate_crc(payload)
payload.extend(crc)
# Send the command to the pump
self.ser.write(payload)
response = self.ser.read(8) # Adjust this based on expected response length
return response
# Set the pump speed in RPM (0.01 RPM increments)
def set_speed(self, speed_rpm):
"""
Parameters:
speed_rpm (float): The desired speed in RPM.
"""
speed_value = int(speed_rpm * 100) # 0.01 RPM increments
response = self._send_command(0x06, 0x01, speed_value)
print(f"Set speed response: {response.hex()}")
# Set the pump flow rate in mL/min (combined high/low bytes)
def set_flow_rate(self, flow_rate_ml_min):
"""
Parameters:
flow_rate_ml_min (float): The desired flow rate in mL/min.
"""
flow_rate_nl_min = int(flow_rate_ml_min * 1_000_000) # Convert mL/min to nL/min
high_byte = (flow_rate_nl_min >> 16) & 0xFFFF
low_byte = flow_rate_nl_min & 0xFFFF
response = self._send_command(0x10, 0x02, [high_byte, low_byte])
print(f"Set flow rate response: {response.hex()}")
# Start the pump and set the display mode to either 'speed' (RPM) or 'flow_rate' (mL/min)
def start(self, display_mode="speed"):
"""
Parameters:
display_mode (str): 'speed' or 'flow_rate'.
"""
if display_mode == "speed":
pump_state = 0b00000001 # Run + Display Speed
elif display_mode == "flow_rate":
pump_state = 0b00000101 # Run + Display Flow Rate
else:
raise ValueError("Invalid display_mode. Use 'speed' or 'flow_rate'.")
response = self._send_command(0x06, 0x04, pump_state)
print(f"Start pump response: {response.hex()}")
# Stop the pump and set the display mode to either 'speed' (RPM) or 'flow_rate' (mL/min)
def stop(self, display_mode="speed"):
"""
Parameters:
display_mode (str): 'speed' or 'flow_rate'.
"""
if display_mode == "speed":
pump_state = 0b00000000 # Stop + Display Speed
elif display_mode == "flow_rate":
pump_state = 0b00000100 # Stop + Display Flow Rate
else:
raise ValueError("Invalid display_mode. Use 'speed' or 'flow_rate'.")
response = self._send_command(0x06, 0x04, pump_state)
print(f"Stop pump response: {response.hex()}")
# Set the pump direction (CW or CCW)
def set_direction(self, direction):
"""
Parameters:
direction (str): 'CW' for clockwise, 'CCW' for counter-clockwise.
"""
direction_value = 0x0010 if direction.upper() == 'CCW' else 0x0000
response = self._send_command(0x06, 0x04, direction_value)
print(f"Set direction response: {response.hex()}")
# Custom function: Run the pump at the specified speed for a certain amount of time and then stop
def run(self, speed_rpm, run_time_s, direction='CW'):
"""
Parameters:
speed_rpm (float): The speed at which to run the pump in RPM.
run_time_s (int): The time to run the pump in seconds.
direction (str): 'CW' or 'CCW'.
"""
try:
self.set_speed(speed_rpm)
self.set_direction(direction)
self.start(display_mode="speed")
# Run the pump for the specified time
for remaining_time in range(run_time_s, 0, -1):
print(f"Running... {remaining_time} seconds remaining")
time.sleep(1)
finally:
self.stop(display_mode="speed")
#-----------------------------------------------------------------------#
# EXAMPLES ON HOW TO USE THE DEFINED CLASS TO CONTROL A LONGER PUMP #
#-----------------------------------------------------------------------#
pump = Longer_Pump(port='COM7', address=1) # Adjust port and address as needed
pump.connect()
# Run the pump at 40 rpm
pump.set_speed(40.00) # Speed in RPM
pump.start(display_mode="speed")
pump.stop(display_mode="speed")
# Set direction to counter-clockwise
pump.set_direction('CCW')
# Run the pump in flow rate mode at 35 mL/min
pump.set_flow_rate(35) # Flow rate in mL/min
pump.start(display_mode="flow_rate")
pump.stop(display_mode="flow_rate") # Stop the pump
# Run the pump counter-clockwise at 10 RPM for 25 seconds
pump.run(speed_rpm=10.0, run_time_s=25, direction='CCW')
# Disconnect the pump
pump.disconnect()
Fazit
In diesem Blogbeitrag haben wir erläutert, wie man Peristaltikpumpen von „ Longer “ über das Modbus-RTU-Protokoll steuert. Dabei haben wir Einblicke in das Kommunikationsformat gegeben und eine Python-Bibliothek bereitgestellt, die Ihnen den Einstieg erleichtern soll. Ganz gleich, ob Sie mit dem Modell L100-1S-2 arbeiten oder den Code an eine andere Pumpe anpassen – wir hoffen, dass dieser Leitfaden Ihnen als wertvolle Hilfe dient.
Seid gespannt auf weitere Tutorials und praktische Anwendungsbeispiele in zukünftigen 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.

