La serie di pompe LabV di Innofluid (precedentemente nota come Shenchen Baoding) è una linea avanzata di pompe peristaltiche per la misurazione della portata, dotata di un touch screen a colori da 4,3 pollici per un controllo intuitivo. Mostra simultaneamente dati di flusso, impostazioni e informazioni di sistema, con animazioni che indicano lo stato operativo. Dotata di calibrazione intelligente, micro-regolazione online e tre modalità di misurazione (volume fisso, tempo e volume fissi, avvio/arresto con timer), risulta estremamente versatile. Compatibile con diverse testine per pompa e dotata di molteplici opzioni di contrôle externe, la serie LabV è ideale per l'uso in laboratorio, l'integrazione di apparecchiature e la produzione industriale.
In questo articolo del blog, analizzeremo come controllare le pompe LabV utilizzando il protocollo MODBUS RTU tramite una comune piattaforma di programmazione: Python.
Vale la pena notare che, sebbene possano esserci lievi differenze nella configurazione dei registri e nei comandi tra le varie serie di pompe Lab (come LabF, LabN, LabK, ecc.), tutte condividono lo stesso protocollo di comunicazione MODBUS RTU. Pertanto, le informazioni fornite in questo articolo sono pertinenti e applicabili agli utenti di qualsiasi serie di pompe Innofluid Lab.
Perché scegliere una pompa peristaltica della serie LabV?
La pompa peristaltica LabV si distingue come scelta d'eccellenza per la gestione dei fluidi sia in contesti di laboratorio che industriali. Dotata di un nuovo servomotore per maggiore precisione e durata, abbinata a un'interfaccia touchscreen LCD da 4.3", questa pompa offre un controllo intuitivo per la dispensazione precisa e le modalità a volume fisso. Realizzata in ABS di grado di laboratorio, garantisce facilità d'uso e prestazioni robuste.
Con portate che variano da 0.0053 µL/min a 775 mL/min e la flessibilità di supportare fino a 8 canali, si adatta a un'ampia gamma di applicazioni. Inoltre, la sua struttura di grado industriale, il display dinamico e la funzionalità di calibrazione intelligente la rendono una risorsa affidabile per diverse attività di trasferimento dei fluidi.
Che si tratti di ricerca, supporto di apparecchiature o produzione industriale, la serie di pompe peristaltiche LabV rappresenta un'ottima soluzione per le sfide legate alla gestione dei fluidi.
Cosa serve per comunicare con una pompa LabV?
Per comunicare con una pompa LabV tramite il protocollo MODBUS RTU, saranno necessari i seguenti elementi:
- Una pompa LabV (in questo articolo verrà utilizzata una pompa peristaltica a portata intelligente LabV1-III) con una testata della pompa e un tube a scelta
- Un cavo seriale da collegare al computer o al dispositivo
- Un cablaggio RS485 o RS232 collegato alla porta di contrôle externe sul retro della pompa
- Una piattaforma di programmazione (Python in questo caso)
- Una comprensione di base del protocollo di comunicazione MODBUS RTU illustrato di seguito 👇.
Come configurare la porta di comunicazione?
Prima di poter iniziare a inviare e ricevere dati dalla pompa, è necessario configurare correttamente la porta di comunicazione. Ecco i passaggi da seguire:
- Collegare il cavo per la comunicazione RS232 o RS485 alla porta di contrôle externe sul retro della pompa
- Accendere la pompa
- Nell'interfaccia di impostazione della comunicazione sullo schermo della pompa, selezionare RS232 o RS485 come interfaccia di comunicazione (i dettagli del cablaggio RS232 e RS485 sono presentati nelle tabelle sottostanti)
- Indipendentemente dalla scelta tra RS232 e RS485, il protocollo di comunicazione è il MODBUS RTU standard
- Impostare il baud rate
- Fare clic sul pulsante Slave No. per impostare l'indirizzo della pompa peristaltica (intervallo: 1-32)
- Selezionare l'abilitazione della comunicazione su ON
- Tornare all'interfaccia principale poiché la pompa riceve i comandi di comunicazione solo quando si trova in tale interfaccia; il controllo tramite comunicazione non è valido nelle altre interfacce di impostazione.
| Dettagli sul cablaggio RS232 | |
|---|---|
| Terminale | Descrizione |
| GND | Terminale di terra per la comunicazione. |
| TXD | Trasmissione del Master, terminale di ricezione del segnale della pompa peristaltica. |
| RXD | Trasmissione della pompa peristaltica, terminale del segnale di ricezione del master. |
| Dettagli di cablaggio RS485 | |
|---|---|
| Terminale | Descrizione |
| GD1 | Massa del segnale RS485. |
| A+ | Collegare il terminale A+ di RS485. |
| B- | Collegare il terminale B- di RS485. |
Il protocollo di comunicazione MODBUS RTU della serie LabV
La serie di pompe peristaltiche LabV offre un set completo di comandi per il controllo e il monitoraggio di precisione tramite il protocollo MODBUS RTU. Questo set di comandi comprende varie direttive categorizzate per facilitare la gestione delle funzionalità della pompa, coprendo azioni quali l'impostazione della velocità del motore, la configurazione della portata, la selezione della testa della pompa e le routine di calibrazione. Ciascun comando, identificato da parametri univoci, garantisce un controllo preciso sul funzionamento della pompa.
Spiegazioni dettagliate e ulteriori informazioni sul protocollo MODBUS RTU per il controllo delle pompe LabV vengono fornite di seguito e possono essere consultate anche nella documentazione del protocollo di comunicazione.
Formato di comunicazione standard MODBUS RTU
Il formato del messaggio è quello descritto nella tabella sottostante.
| Campo | Dimensione | Descrizione |
|---|---|---|
| Indirizzo dello slave | 1 Byte | Indirizzo della pompa. L'intervallo dei numeri va da 1 a 32 e 0 viene utilizzato per il broadcast. |
| Codice funzione | 1 Byte | Istruzione per il dispositivo slave. 03H: Lettura dei registri di mantenimento 06H: Scrittura di un singolo registro 10H: Scrittura di registri multipli 02H: Lettura degli ingressi discreti (lettura di bit di dati) 05H: Scrittura di un singolo bit nel registro |
| Area dati | 0 – 252 Byte | Dati da trasmettere (lunghezza variabile) |
| Controllo CRC | 2 Byte | Controllo di ridondanza ciclica (Cyclic Redundancy Check) per il rilevamento degli errori CRC low (1 Byte): Byte inferiore del CRC CRC high (1 Byte): Byte superiore del CRC |
Controllo CRC con CRC-16 in Python
Il CRC (Cyclic Redundancy Check) è una tecnica fondamentale per il rilevamento degli errori nella trasmissione dei dati. Di seguito, mostreremo come implementare il CRC-16, utilizzato nel sistema sincrono binario americano, tramite Python. Nel CRC-16, l'algoritmo di rilevamento degli errori impiega un polinomio G(X) = X16 + X15 + X2 + 1 per generare il checksum. Questo polinomio definisce le operazioni matematiche eseguite sui bit del messaggio durante il processo di calcolo del CRC. Una panoramica dell'algoritmo è dettagliata di seguito:
- Inizializzare un registro a 16 bit con il valore esadecimale FFFF (tutti uno), indicato come registro CRC.
- Eseguire uno XOR tra i primi 8 byte del messaggio e il byte inferiore del registro CRC. Memorizzare nuovamente il risultato nel registro CRC.
- Scorrere il registro CRC di un bit verso destra, impostando a zero il bit più significativo (MSB).
- Verificare il bit meno significativo (LSB) del registro CRC:
- Se l'LSB è 0, ripetere il passaggio 3 (operazione di shift).
- Se l'LSB è 1, eseguire uno XOR tra il registro CRC e il valore polinomiale 0xA001 (1010 0000 0000 0001).
- Ripetere i passaggi da 3 a 4, per un totale di 8 shift, per elaborare ciascun byte.
- Ripetere i passaggi da 2 a 5 per ogni byte nel messaggio finché tutti i byte non saranno stati elaborati.
- Il contenuto finale del registro CRC corrisponde al valore CRC.
Impostazioni di comunicazione
Ciascun byte di dati ha una struttura costituita da 1 bit di start, 8 bit di dati, 1 bit di parità e 1 bit di stop. I bit vengono inviati in ordine dal bit meno significativo (LSB) al bit più significativo (MSB). I baud rate di comunicazione supportati includono 1200, 2400, 4800 e 9600 bit/s.
Per i numeri interi (2 byte), i dati sono disposti con il secondo byte per primo, seguito dal primo byte. Ad esempio, il valore esadecimale 2378H viene trasmesso come 23H 78H. Per i numeri interi lunghi e i float (4 byte), i dati sono disposti con il quarto byte per primo, seguito dal terzo, dal secondo e dal primo byte.
Formato del frame RTU del messaggio MODBUS
Il formato del frame RTU del messaggio MODBUS è quello descritto nella tabella sottostante.
| Campo | Dimensione | Descrizione |
|---|---|---|
| Start | ≥ 3,5 caratteri | Indica l'inizio della trasmissione |
| Indirizzo | 8 Bit | Indirizzo del dispositivoslave |
| Codice funzione | 8 Bit | Istruzione per il dispositivo slave |
| Dati | N x 8 bit | Dati da trasmettere (lunghezza variabile, N byte) |
| Codice di controllo CRC | 16 bit | Controllo di ridondanza ciclica per il rilevamento degli errori |
| Fine | ≥ 3,5 caratteri | Indica la fine della trasmissione |
🚨 Assicurarsi che il frame del messaggio venga trasmesso in modo continuo, senza intervalli di inattività tra i caratteri superiori a 1,5 tempi carattere. I frame di messaggio incompleti, indicati da un tempo di inattività eccessivo, devono essere scartati dal nodo ricevente.
Risposta anomala
Quando un host invia una richiesta di dati e lo slave riceve dati anomali, deve attivarsi una risposta anomala. Se il codice di indirizzo inviato dall'host non è corretto, ovvero non corrisponde ad alcun codice di indirizzo tra gli slave, o se i dati ricevuti dallo slave non superano il controllo CRC, non viene restituito alcun codice di anomalia. In tali casi, l'host deve avviare un processo di gestione superiore.
Nell'area del codice funzione, il codice funzione di risposta anomala è definito come il codice funzione di risposta normale più 80H.
Nell'area dei dati, il codice di anomalia da restituire è definito come nella tabella sottostante.
| Codice | Nome | Significato |
|---|---|---|
| 01H | Codice funzione non valido | Il codice funzione ricevuto dalla pompa peristaltica non è consentito, ad eccezione di 03H, 06H o 10H. |
| 02H | Indirizzo dati non valido | L'indirizzo di registro ricevuto dalla pompa peristaltica non è consentito. |
| 03H | Valore dati non valido | I dati scritti non rientrano nell'intervallo operativo previsto dalla pompa peristaltica. |
| 06H | Slave (pompa peristaltica) occupato | La pompa peristaltica è attualmente occupata e non è in grado di completare il comando a causa di un conflitto di stato. |
🚨La pompa peristaltica accetta unicamente comandi MODBUS tramite la Main Interface; le altre interfacce non ricevono messaggi.
Indirizzo e contenuto del registro di mantenimento (Holding Register)
Di seguito sono riportate le tabelle che descrivono rispettivamente l'impostazione dei parametri di base e di calibrazione.
Impostazione dei parametri di base
| Indirizzo (Decimale) | Nome | Intervallo | Tipo di dato |
|---|---|---|---|
| 1000 | Testata della pompa | Relativo alla Tabella 1 | unsigned short int (2 Byte) |
| 1001 | Dimensioni del tube | Relativo alla Tabella 1 | unsigned short int (2 Byte) |
| 1002 | Velocità del motore | 0,1-600 rpm | float (4 Byte) |
| 1004 | Portata | 0,1-99999 mL | float (4 Byte) |
| 1007 | Angolo di aspirazione inversa | 0-360° | unsigned short int (2 Byte) |
| 1008 | Controllo Avvio/Arresto | 1: Avvio, 0: Arresto | unsigned short int (2 Byte) |
| 1009 | Controllo della direzione | 1: Orario, 0: Antiorario | unsigned short int (2 Byte) |
| 1010 | Funzionamento a piena velocità | 1: Avvia piena velocità, 0: Arresta piena velocità | unsigned short int (2 Byte) |
| 1015 | Imposta il volume di flusso | 0-99999 mL | float (4 Byte) |
| 1018 | Tempo di lavoro | 0,1-9999 s | float (4 Byte) |
| 1020 | Modalità di lavoro | 0: Trasferimento, 1: Misurazione a volume fisso, 2: Tempo e volume fissi | unsigned short int (2 Byte) |
| 1021 | Tempo di pausa | 0,1-9999 s | float (4 Byte) |
| 1023 | Numero di cicli | 0-9999 volte, 0 significa infinito | unsigned short int (2 Byte) |
💡 Note importanti:
- I registri 1015 e 1018 non sono validi quando la modalità di lavoro è impostata su trasferimento.
- Il registro 1018 non è valido quando la modalità di lavoro è impostata su Misurazione a volume fisso.
- I registri 1002 e 1004 non sono validi quando la modalità di lavoro è impostata su Tempo e volume fissi.
- Assicurarsi che i dati del registro siano impostati secondo la tabella fornita ed evitare di inviare più configurazioni di registro in un unico comando.
Impostazione dei parametri di calibrazione
| Indirizzo (Decimale) | Nome | Intervallo | Tipo di dato |
|---|---|---|---|
| 2001 | Tempo di test | 0,5-9999 s | unsigned short int (2 Byte) |
| 2002 | Avvia/Arresta test | 1: Avvio, 0: Arresto | unsigned short int (2 Byte) |
| 2003 | Volume effettivo | 0-9999 mL | float (4 Byte) |
| 2005 | Ripristina impostazioni predefinite | 1: Ripristina calibrazione | unsigned short int (2 Byte) |
| 2006 | Microregolazione | 1: Aumenta, 0: Diminuisci | unsigned short int (2 Byte) |
Tabella delle teste della pompa e dei tube
| Nome della testa della pompa | Tipo di testa della pompa | Dimensioni del tube | Specifiche dei tube |
|---|---|---|---|
| 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# |
💡 Nota importante:
- La tabella sopra non è esaustiva e include solo un sottoinsieme di teste della pompa e dimensioni dei tube. Per l'elenco completo, fare riferimento alla documentazione.
Esempi di stringhe di comando
Esempio 1: Avvio della pompa
- Indirizzo: 01, indica l'indirizzo del dispositivo a cui viene inviato il comando.
- Codice funzione: 06, utilizzato per scrivere un singolo valore in un registro.
- Indirizzo del registro: 03F0, indirizzo del registro corrispondente al registro di controllo per l'avvio della pompa (1008 in esadecimale).
- Dati: 0001, scritti nel registro per avviare la pompa (1: Avvio, 0: Arresto).
- CRC: 487D, valore utilizzato per garantire l'integrità dei dati.
Pertanto, la stringa di comando corrispondente per avviare la pompa è: 01 06 03 F0 00 01 48 7D.
Esempio 2: Impostazione della velocità della pompa a 20 rpm
- Indirizzo: 01, indica l'indirizzo del dispositivo a cui viene inviato il comando.
- Codice funzione: 10, utilizzato per scrivere valori su più registri.
- Indirizzo del registro: 03EA, indirizzo del registro corrispondente al registro di impostazione della velocità (1002 in esadecimale).
- Numero di registri: 0002, verranno scritti due registri.
- Conteggio dei byte: 04, numero di byte di dati da scrivere.
- Dati: 41A00007, rappresenta l'impostazione della velocità in formato float corrispondente a 20 RPM.
- CRC: D76E, valore utilizzato per garantire l'integrità dei dati.
Pertanto, la stringa di comando corrispondente per impostare la velocità della pompa a 20 rpm è: 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Questi 2 esempi e altri esempi di stringhe di comando sono presentati nella tabella sottostante.
| Operazione | Stringa di comando |
|---|---|
| Avvia pompa | 01 06 03 F0 00 01 48 7D |
| Imposta direzione su CCW | 01 06 03 F1 00 00 D8 7D |
| Imposta direzione su CW | 01 06 03 F1 00 01 19 BD |
| Imposta velocità a 20 RPM | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Imposta portata a 50,0 mL/min | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Arresta la pompa | 01 06 03 F0 00 00 89 BD |
| Avvia la corsa a piena velocità | 01 06 03 F2 00 01 E9 BD |
Come controllare le pompe LabV tramite Python?
La serie di pompe LabV può essere controllata da remoto utilizzando il protocollo MODBUS RTU tramite Python, offrendo maggiore flessibilità e praticità per l'esecuzione di programmi di pompaggio complessi con cicli, pause e velocità/portate variabili. Questo approccio è particolarmente utile quando si integrano più dispositivi, poiché consente l'automazione di sequenze che coinvolgono tutte le apparecchiature collegate.
In questa sezione verrà introdotta una libreria Python personalizzata e dedicata che utilizza il protocollo MODBUS RTU, consentendo di aprire la porta seriale e inviare stringhe di comando di controllo alla pompa LabV. Tratteremo esempi che mostrano come impostare la velocità, avviare e arrestare la pompa, configurare la testa della pompa e le dimensioni dei tubi, ecc., fornendo una guida pratica all'uso di Python per il controllo di una pompa LabV.
🚨🚨🚨 Nota importante
- 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()
Questa libreria Python, per il controllo della serie di pompe LabV tramite il protocollo MODBUS RTU, consente un controllo preciso e automatizzato di vari parametri della pompa come velocità, direzione, testa della pompa e dimensioni dei tubi. Gli utenti di una pompa LabV possono ora integrare facilmente la propria pompa in flussi di lavoro complessi che coinvolgono più dispositivi, migliorando l'efficienza operativa e la flessibilità.
Conclusione
In questo articolo del blog, abbiamo presentato la serie di pompe peristaltiche LabV ed esplorato le basi del suo contrôle externe in Python utilizzando il protocollo di comunicazione MODBUS RTU. Ci auguriamo che questo articolo funga da guida preziosa per ricercatori e ingegneri che desiderano impiegare una pompa peristaltica LabV nella loro ricerca ed esperimenti di microfluidica.
🚨 Sebbene esistano variazioni tra le diverse serie di pompe Innofluid Lab, sottolineiamo che il protocollo di comunicazione rimane quasi invariato. Che stiate utilizzando la serie LabF, la serie LabN o qualsiasi altra, siamo certi che questo contenuto sarà utile anche per i vostri progetti futuri.
Rimanete sintonizzati per ulteriori approfondimenti, tutorial e applicazioni pratiche nei nostri prossimi articoli. Fino ad allora, buon lavoro con il pompaggio e la programmazione 💻!
📧 In caso di domande o commenti, non esitate a contattarci all'indirizzo support@darwin-microfluidics.com.


