Het LabV pompserie van Innofluid (voorheen bekend als Shenchen Baoding) is een geavanceerde serie peristaltische pompen voor debietmeting, voorzien van een 4,3-inch kleuren-touchscreen voor intuïtieve bediening. Het scherm geeft tegelijkertijd debietgegevens, instellingen en systeeminformatie weer, met animaties die de werkstatus weergeven. Dankzij de intelligente kalibratie, online micro-afstelling en drie meetmodi – vast volume, vaste tijd en volume, en timer start/stop – is de serie uiterst veelzijdig. De LabV-serie is compatibel met diverse pompkoppen en biedt meerdere aansluit contrôle externe en, waardoor deze ideaal is voor laboratoriumgebruik, integratie in apparatuur en industriële productie.
In deze blogpost gaan we bekijken hoe je de LabV-pompen kunt aansturen met behulp van het MODBUS RTU-protocol via een veelgebruikt programmeerplatform: Python.
Het is goed om te weten dat er weliswaar kleine verschillen kunnen zijn in de registerinstellingen en commando’s tussen de verschillende Lab-pompseries (zoals LabF, LabN, LabK, enz.), maar dat ze allemaal hetzelfde MODBUS RTU-communicatieprotocol gebruiken. Daarom zijn de inzichten uit dit artikel relevant en van toepassing voor gebruikers van alle Innofluid Lab-pompseries.
Waarom kiezen voor een peristaltische pomp uit de LabV-serie?
De LabV-peristaltische pomp is een uitstekende keuze voor vloeistofverwerking in zowel laboratoria als industriële omgevingen. Dankzij de nieuwe servomotor, die zorgt voor meer nauwkeurigheid en duurzaamheid, en het 4,3-inch LCD-touchscreen biedt deze pomp een intuïtieve bediening voor zowel nauwkeurig doseren als vaste-volumemodi. De pomp is vervaardigd uit ABS van laboratoriumkwaliteit en garandeert zowel gebruiksgemak als robuuste prestaties.
Met doorstroomsnelheden variërend van 0,0053 µL/min tot 775 mL/min en de flexibiliteit om tot 8 kanalen te ondersteunen, is het apparaat geschikt voor een breed scala aan toepassingen. Bovendien maken de robuuste constructie, het dynamische display en de intelligente kalibratiefunctie het tot een betrouwbaar hulpmiddel voor diverse vloeistofoverdrachtstaken.
Of het nu gaat om onderzoek, ondersteuning van apparatuur of industriële productie: de LabV-serie peristaltische pompen biedt een uitstekende oplossing voor uitdagingen op het gebied van vloeistofbehandeling.
Wat heb je nodig om met een LabV-pomp te communiceren?
Om via het MODBUS RTU-protocol met een LabV-pomp te communiceren, hebt u het volgende nodig:
- Een LabV-pomp (in dit geval wordt een LabV1-III Intelligent Flow Rate peristaltische pomp gebruikt) met een pompkop en een tube naar keuze
- Een seriële kabel die je op je computer of apparaat aansluit
- Een RS485- of RS232-aansluiting op de poort ‘ contrôle externe ’ aan de achterzijde van de pomp
- Een programmeerplatform (in dit geval Python)
- Een basiskennis van het MODBUS RTU-communicatieprotocol, zoals hieronder beschreven 👇.
Hoe stel je de communicatiepoort in?
Voordat u gegevens kunt verzenden naar en ontvangen van de pomp, moet u de communicatiepoort correct instellen. Volg hiervoor de onderstaande stappen:
- Sluit de kabel voor de RS232- of RS485-communicatie aan op de poort ‘ contrôle externe ’ aan de achterzijde van de pomp
- Zet de pomp aan
- Kies in het instellingenscherm voor de communicatie-interface op het pompscherm RS232 of RS485 als communicatie-interface (details over de bedrading van RS232 en RS485 staan in de onderstaande tabellen )
- Of je nu kiest voor RS232 of RS485, het communicatieprotocol is standaard MODBUS RTU
- Stel de baudrate in
- Klik op de knop ‘Slave-nr.’ om het adres van de peristaltische pomp in te stellen (bereik: 1-32)
- Schakel 'Communicatie inschakelen' in
- Ga terug naar het hoofdscherm, aangezien de pomp alleen communicatieopdrachten ontvangt wanneer het hoofdscherm is geopend; communicatieopdrachten in andere instellingsschermen zijn ongeldig.
| Details over de RS232-bekabeling | |
|---|---|
| Terminal | Beschrijving |
| GND | Aardingsklem voor communicatie. |
| TXD | Hoofdverzender, aansluiting voor ontvangstsignaal van de peristaltische pomp. |
| RXD | Uitgang voor peristaltische pomp, aansluiting voor hoofdontvangstsignaal. |
| Details over de RS485-bedrading | |
|---|---|
| Terminal | Beschrijving |
| GD1 | RS485-signaalaarde. |
| A+ | Sluit de RS485 A+-aansluiting aan. |
| B- | Sluit de RS485 B-aansluiting aan. |
Het MODBUS RTU-communicatieprotocol van de LabV-serie
De LabV-serie peristaltische pompen biedt een uitgebreide reeks commando’s voor nauwkeurige regeling en bewaking via het MODBUS RTU-protocol. Deze reeks commando’s omvat diverse instructies die zijn ingedeeld in categorieën om het bedienen van de pompfuncties te vergemakkelijken, waaronder het instellen van het motortoerental, het configureren van het debiet, het selecteren van de opvoerhoogte en het uitvoeren van kalibratieroutines. Elk commando, dat wordt geïdentificeerd aan de hand van unieke parameters, zorgt voor een nauwkeurige regeling van de werking van de pomp.
Hieronder volgt een uitgebreide toelichting en aanvullende informatie over het MODBUS RTU-protocol voor de aansturing van de LabV-pompen; deze informatie is ook te vinden in de documentatie bij het communicatieprotocol.
MODBUS RTU-standaardcommunicatieformaat
Het berichtformaat is zoals beschreven in de onderstaande tabel.
| Veld | Afmetingen | Beschrijving |
|---|---|---|
| Slave-adres | 1 byte | Adres van de pomp. Het nummerbereik loopt van 1 tot en met 32; 0 wordt gebruikt voor een broadcast. |
| Functiecode | 1 byte | Instructie voor het slave-apparaat. 03H: Registers uitlezen 06H: Eén register schrijven 10H: Meerdere registers schrijven 02H: Discrete ingangen uitlezen (bits met gegevens uitlezen) 05H: Eén bit naar een register schrijven |
| Gegevensgebied | 0 – 252 bytes | Te verzenden gegevens (variabele lengte) |
| CRC-controle | 2 bytes | Cyclische redundantiecontrole (CRC) voor foutdetectie CRC-laag (1 byte): onderste byte van de CRC CRC-hoog (1 byte): bovenste byte van de CRC |
CRC-controle met CRC-16 in Python
CRC (Cyclic Redundancy Check) is een essentiële techniek voor het opsporen van fouten bij gegevensoverdracht. Hieronder laten we zien hoe je CRC-16, de variant die wordt gebruikt in het Amerikaanse binaire synchrone systeem, kunt implementeren met Python. Bij CRC-16 maakt het foutdetectie-algoritme gebruik van een veelterm G(X) =X¹⁶ +X¹⁵ +X² + 1 om de checksum te genereren. Deze veelterm definieert de wiskundige bewerkingen die tijdens het CRC-berekeningsproces op de bits van het bericht worden uitgevoerd. Hieronder volgt een gedetailleerd overzicht van het algoritme:
- Initialiseer een 16-bits register met de hexadecimale waarde FFFF (allemaal enen), ook wel het CRC-register genoemd.
- Voer een XOR-bewerking uit op de eerste 8 bytes van het bericht met de laagste byte van het CRC-register. Sla het resultaat weer op in het CRC-register.
- Verschuif het CRC-register één bit naar rechts, waarbij het meest significante bit (MSB) op nul wordt gezet.
- Controleer het minst significante bit (LSB) van het CRC-register:
- Als LSB 0 is, herhaal dan stap 3 (verschuivingsbewerking).
- Als LSB 1 is, voer dan een XOR-bewerking uit tussen het CRC-register en de polynoomwaarde 0xA001 (1010 0000 0000 0001).
- Herhaal stap 3 en 4, in totaal 8 keer, om elke byte te verwerken.
- Herhaal stap 2 tot en met 5 voor elke byte in het bericht, totdat alle bytes zijn verwerkt.
- De uiteindelijke inhoud van het CRC-register is de CRC-waarde.
Communicatie-instellingen
Elke byte aan gegevens heeft een structuur die bestaat uit 1 startbit, 8 databits, 1 pariteitsbit en 1 stopbit. De bits worden in volgorde verzonden, van het minst significante bit (LSB) naar het meest significante bit (MSB). De mogelijke communicatiesnelheden zijn 1200, 2400, 4800 en 9600 bits/s.
Bij gehele getallen (2 bytes) worden de gegevens zo gerangschikt dat de tweede byte eerst komt, gevolgd door de eerste byte. De hexadecimale waarde 2378H wordt bijvoorbeeld verzonden als 23H 78H. Bij lange gehele getallen en drijvende-kommagetallen (4 bytes) worden de gegevens zo gerangschikt dat de vierde byte eerst komt, gevolgd door de derde, tweede en eerste byte.
MODBUS-bericht: RTU-frameformaat
Het frameformaat van het MODBUS-bericht in RTU-formaat is zoals beschreven in de onderstaande tabel.
| Veld | Afmetingen | Beschrijving |
|---|---|---|
| Start | ≥ 3,5 tekens | Geeft het begin van de verzending aan |
| Adres | 8 bits | Adres van het ondergeschikte apparaat |
| Functiecode | 8 bits | Instructies voor het ondergeschikte apparaat |
| Gegevens | N × 8 bits | Te verzenden gegevens (variabele lengte, N bytes) |
| CRC-controlecode | 16 bits | Cyclische redundantiecontrole voor foutdetectie |
| Einde | ≥ 3,5 tekens | Geeft het einde van de verzending aan |
🚨 Zorg ervoor dat het berichtframe continu wordt verzonden, zonder tussenruimtes tussen tekens die groter zijn dan 1,5 keer de tekenlengte. Onvolledige berichtframes, die worden gekenmerkt door buitensporige tussenruimtes, moeten door het ontvangende knooppunt worden genegeerd.
Abnormale reactie
Wanneer een host een verzoek om gegevens verstuurt en de slave afwijkende gegevens ontvangt, moet dit een afwijkingsreactie in gang zetten. Als de door de host verzonden adrescode onjuist is, dat wil zeggen dat deze niet overeenkomt met een adrescode van een van de slaves, of als de door de slave ontvangen gegevens de CRC-controle niet doorstaan, wordt er geen afwijkingscode teruggestuurd. In dergelijke gevallen moet de host een hoger niveau van reactie in gang zetten.
In het functie-codegedeelte wordt de functie-code voor een abnormale reactie gedefinieerd als de functie-code voor een normale reactie plus 80H.
In het gegevensgedeelte wordt de af te geven foutcode gedefinieerd zoals in de onderstaande tabel.
| Code | Naam | Betekenis |
|---|---|---|
| 01H | Ongeldige functiecode | De functiecode die door de peristaltische pomp wordt ontvangen, is niet toegestaan, met uitzondering van 03H, 06H of 10H. |
| 02H | Ongeldig gegevensadres | Het registeradres dat door de peristaltische pomp is ontvangen, is niet toegestaan. |
| 03H | Ongeldige gegevenswaarde | De ingevoerde gegevens voldoen niet aan het door de peristaltische pomp verwachte werkingsbereik. |
| 06H | Slave (peristaltische pomp) bezig | De peristaltische pomp is momenteel bezig en kan de opdracht niet uitvoeren vanwege een conflict. |
🚨De peristaltische pomp accepteert alleen MODBUS-commando's via de hoofdinterface; andere interfaces ontvangen geen berichten.
Adres en inhoud van het houdersregister
Hieronder staan de tabellen met respectievelijk de instellingen voor de basisparameters en de kalibratieparameters.
Instelling van basisparameters
| Adres (decimaal) | Naam | Bereik | Gegevenstype |
|---|---|---|---|
| 1000 | Pompkop | In verband met grafiek 1 | unsigned short int (2 bytes) |
| 1001 | tube Afmetingen | In verband met grafiek 1 | unsigned short int (2 bytes) |
| 1002 | Motortoerental | 0,1–600 tpm | float (4 bytes) |
| 1004 | Doorstroomsnelheid | 0,1–99 999 ml | float (4 bytes) |
| 1007 | Achterste zuighoek | 0-360° | unsigned short int (2 bytes) |
| 1008 | Start-/stopregeling | 1: Start, 0: Stop | unsigned short int (2 bytes) |
| 1009 | Richtingsregeling | 1: Met de klok mee, 0: Tegen de klok in | unsigned short int (2 bytes) |
| 1010 | Rennen op volle snelheid | 1: Op volle snelheid starten, 0: Op volle snelheid stoppen | unsigned short int (2 bytes) |
| 1015 | Stroomvolume instellen | 0-99999 ml | float (4 bytes) |
| 1018 | Arbeidstijd | 0,1–9999 s | float (4 bytes) |
| 1020 | Werkmodus | 0: Overdracht, 1: Meting met vast volume, 2: Vaste tijd en vast volume | unsigned short int (2 bytes) |
| 1021 | Pauzetijd | 0,1–9999 s | float (4 bytes) |
| 1023 | Aantal kopieën | 0-9999 keer; 0 betekent oneindig | unsigned short int (2 bytes) |
💡 Belangrijke opmerkingen:
- De registers 1015 en 1018 zijn ongeldig wanneer de werkmodus is ingesteld op ‘overdracht’.
- Register 1018 is ongeldig wanneer de werkmodus is ingesteld op ‘Vaste volumemeting’.
- De registers 1002 en 1004 zijn ongeldig wanneer de werkmodus is ingesteld op ‘Vaste tijd en volume’.
- Zorg ervoor dat de registergegevens worden ingesteld volgens de bijgevoegde tabel, en vermijd het verzenden van meerdere registerinstellingen in één bestelling.
Instellen van kalibratieparameters
| Adres (decimaal) | Naam | Bereik | Gegevenstype |
|---|---|---|---|
| 2001 | Examenperiode | 0,5–9999 s | unsigned short int (2 bytes) |
| 2002 | Start/stop-test | 1: Start, 0: Stop | unsigned short int (2 bytes) |
| 2003 | Werkelijk volume | 0-9999 ml | float (4 bytes) |
| 2005 | Standaardinstellingen herstellen | 1: Kalibratie herstellen | unsigned short int (2 bytes) |
| 2006 | Microverstelling | 1: Verhogen, 0: Verlagen | unsigned short int (2 bytes) |
Overzichtstabel met pompkoppen en tube -nummers
| Naam van de pompkop | Type pompkop | tube Afmetingen | tube Specifiek |
|---|---|---|---|
| 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# |
💡 Belangrijke opmerking:
- De bovenstaande tabel is niet volledig en bevat slechts een deel van de pompkoppen en de afmetingen van de tube . Raadpleeg de documentatie voor de volledige lijst.
Voorbeelden van opdrachtstrings
Voorbeeld 1: Start de pomp
- Adres: 01, geeft het adres van het apparaat aan waarnaar het commando wordt verzonden.
- Functiecode: 06, wordt gebruikt om één waarde naar een register te schrijven.
- Registeradres: 03F0, registeradres dat overeenkomt met het besturingsregister voor het starten van de pomp (1008 in hexadecimaal).
- Gegevens: 0001, naar het register geschreven om de pomp te starten (1: Start, 0: Stop).
- CRC: 487D, waarde die wordt gebruikt om de gegevensintegriteit te waarborgen.
De bijbehorende opdrachtreeks om de pomp te starten is dus: 01 06 03 F0 00 01 48 7D.
Voorbeeld 2: Stel het toerental van de pomp in op 20 tpm
- Adres: 01, geeft het adres van het apparaat aan waarnaar het commando wordt verzonden.
- Functiecode: 10, wordt gebruikt om waarden naar meerdere registers te schrijven.
- Registeradres: 03EA, registeradres dat overeenkomt met het register voor de snelheidsinstelling (1002 in hexadecimaal).
- Aantal registers: 0002, er wordt naar twee registers geschreven.
- Aantal bytes: 04, het aantal te schrijven gegevensbytes.
- Gegevens: 41A00007, geeft de snelheidsinstelling weer in float-formaat, wat overeenkomt met 20 RPM.
- CRC: D76E, waarde die wordt gebruikt om de gegevensintegriteit te waarborgen.
De bijbehorende commandoreeks om het toerental van de pomp in te stellen op 20 tpm is dan ook: 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Deze twee voorbeelden en andere voorbeelden van opdrachtreeksen worden in de onderstaande tabel weergegeven.
| Opdracht | Opdrachtreeks |
|---|---|
| Pomp starten | 01 06 03 F0 00 01 48 7D |
| Stel de draairichting in op tegen de klok in | 01 06 03 F1 00 00 D8 7D |
| Stel de draairichting in op CW | 01 06 03 F1 00 01 19 BD |
| Stel de snelheid in op 20 RPM | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Stel het debiet in op 50,0 ml/min | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Pomp uitschakelen | 01 06 03 F0 00 00 89 BD |
| Begin op volle snelheid te rennen | 01 06 03 F2 00 01 E9 BD |
Hoe bedien je de LabV-pompen met Python?
De LabV-pompserie kan op afstand worden aangestuurd via het MODBUS RTU-protocol met behulp van Python, wat meer flexibiliteit en gebruiksgemak biedt bij het uitvoeren van complexe pompprogramma’s met lussen, pauzes en variërende snelheden/debieten. Deze aanpak is met name nuttig bij de integratie van meerdere apparaten, omdat hiermee reeksen kunnen worden geautomatiseerd waarbij alle aangesloten apparatuur betrokken is.
In dit hoofdstuk wordt een speciaal op maat gemaakte Python-bibliotheek geïntroduceerd die gebruikmaakt van het MODBUS RTU-protocol, waarmee men de seriële poort kan openen en besturingsopdrachten naar de LabV-pomp kan verzenden. We behandelen voorbeelden die laten zien hoe je de snelheid kunt instellen, de pomp kunt starten en stoppen, de opvoerhoogte en de slangdiameter kunt instellen, enzovoort, en bieden zo een praktische handleiding voor het gebruik van Python bij het aansturen van een LabV-pomp.
🚨🚨🚨 Belangrijke opmerking
- 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()
Deze Python-bibliotheek, waarmee de LabV-pompserie via het MODBUS RTU-protocol kan worden aangestuurd, maakt een nauwkeurige en geautomatiseerde regeling mogelijk van diverse pompparameters, zoals snelheid, draairichting, opvoerhoogte en slangdiameter. Gebruikers van een LabV-pomp kunnen hun pomp nu eenvoudig integreren in complexe werkprocessen waarbij meerdere apparaten betrokken zijn, waardoor de operationele efficiëntie en flexibiliteit worden vergroot.
Conclusie
In deze blogpost hebben we de LabV-serie peristaltische pompen geïntroduceerd en de basisprincipes van de Python- contrôle externe , met behulp van het MODBUS RTU-communicatieprotocol, toegelicht. We hopen dat deze post een waardevolle leidraad vormt voor onderzoekers en ingenieurs die een LabV-peristaltische pomp willen inzetten bij hun onderzoek en experimenten op het gebied van microfluïdica.
🚨 Hoewel er verschillen bestaan tussen de verschillende series Innofluid Lab-pompen, benadrukken we dat het communicatieprotocol vrijwel ongewijzigd blijft. Of u nu de LabF-serie, de LabN-serie of een andere serie gebruikt, wij zijn ervan overtuigd dat deze informatie ook voor uw toekomstige projecten van nut zal zijn.
Blijf ons volgen voor meer inzichten, tutorials en praktische toepassingen in onze toekomstige berichten. Tot dan: veel plezier met pompen en coderen 💻!
📧 Mocht u vragen of opmerkingen hebben, neem dan gerust contact met ons op via support@darwin-microfluidics.com.


