La série de pompes LabV d'Innofluid (anciennement connue sous le nom de Shenchen Baoding) est une série avancée de pompes péristaltiques de mesure de débit, dotée d'un écran tactile couleur de 4,3 pouces pour un contrôle intuitif. Elle affiche simultanément les données de débit, les réglages et les informations système, avec des animations pour montrer l'état de fonctionnement. Équipée d'un étalonnage intelligent, d'un micro-ajustement en ligne et de trois modes de mesure — volume fixe, temps et volume fixes, et démarrage/arrêt temporisé — elle est très polyvalente. Compatible avec diverses têtes de pompe et offrant de multiples options de contrôle externe, la série LabV est idéale pour une utilisation en laboratoire, l'intégration d'équipements et la production industrielle.
Dans cet article de blog, nous explorerons comment contrôler les pompes LabV en utilisant le protocole MODBUS RTU via une plateforme de programmation courante : Python.
Il est à noter que, bien qu'il puisse y avoir de légères différences dans la configuration des registres et les commandes entre les différentes séries de pompes Lab (telles que LabF, LabN, LabK, etc.), elles partagent toutes le même protocole de communication MODBUS RTU. Par conséquent, les informations fournies dans cet article sont pertinentes et applicables aux utilisateurs de toute série de pompes Lab d'Innofluid.
Pourquoi choisir une pompe péristaltique de la série LabV ?
La pompe péristaltique LabV se distingue comme un choix de premier ordre pour les besoins de manipulation des fluides, tant en laboratoire qu'en milieu industriel. Dotée d'un nouveau servomoteur pour une précision et une durabilité accrues, associée à une interface à écran tactile LCD de 4,3 pouces, cette pompe offre un contrôle intuitif pour des modes de dispense précise et de volume fixe. Fabriquée en ABS de qualité laboratoire, elle garantit à la fois une facilité d'utilisation et des performances robustes.
Avec des débits allant de 0,0053 µL/min à 775 mL/min, et la flexibilité d'accueillir jusqu'à 8 canaux, elle répond à un large éventail d'applications. De plus, sa construction de qualité industrielle, son affichage dynamique et sa fonctionnalité d'étalonnage intelligent en font un atout fiable pour diverses tâches de transfert de fluide.
Que ce soit pour la recherche, le support d'équipement ou la production industrielle, la série de pompes péristaltiques LabV constitue une très bonne solution aux défis de manipulation des fluides.
De quoi avez-vous besoin pour communiquer avec une pompe LabV ?
Pour communiquer avec une pompe LabV en utilisant le protocole MODBUS RTU, vous aurez besoin des éléments suivants :
- Une pompe LabV (une pompe péristaltique à débit intelligent LabV1-III sera utilisée ici) avec une tête de pompe et un tube de votre choix
- Un câble série qui se connecte à votre ordinateur ou appareil
- Un câblage RS485 ou RS232 sur le port de contrôle externe à l'arrière de la pompe
- Une plateforme de programmation (Python dans le cas présent)
- Une compréhension de base du protocole de communication MODBUS RTU détaillé ci-dessous 👇.
Comment configurer le port de communication ?
Avant de pouvoir commencer à envoyer et recevoir des données de la pompe, vous devez configurer correctement le port de communication. Voici les étapes à suivre :
- Connecter le câble de communication RS232 ou RS485 au port de contrôle externe situé à l'arrière de la pompe.
- Allumez la pompe
- Dans l'interface de réglage de la communication sur l'écran de la pompe, choisissez RS232 ou RS485 comme interface de communication (les détails du câblage RS232 et RS485 sont présentés dans les tableaux ci-dessous)
- Que vous choisissiez RS232 ou RS485, le protocole de communication est le MODBUS RTU standard
- Régler le débit en bauds
- Cliquer sur le bouton Slave No. pour définir l'adresse de la pompe péristaltique (plage : 1-32).
- Sélectionnez l'activation de la communication ACTIVÉ
- Retourner à l'interface principale, car la pompe ne reçoit le contrôle de communication que lorsqu'elle est dans l'interface principale ; le contrôle de communication est invalide dans les autres interfaces de réglage.
| Détails de câblage RS232 | |
|---|---|
| Terminal | Description |
| GND | Borne de masse de communication. |
| TXD | Maître envoi, terminal de réception du signal de la pompe péristaltique. |
| RXD | Pompe péristaltique envoi, terminal de réception du signal du maître. |
| Détails de câblage RS485 | |
|---|---|
| Terminal | Description |
| GD1 | Masse de signal RS485. |
| A+ | Connecter la borne A+ RS485. |
| B- | Connecter la borne B- RS485. |
Le protocole de communication MODBUS RTU de la série LabV
La série de pompes péristaltiques LabV offre un jeu de commandes complet pour un contrôle et une surveillance précis via le protocole MODBUS RTU. Ce jeu de commandes englobe diverses directives catégorisées pour faciliter la manipulation des fonctionnalités de la pompe, couvrant des actions telles que les réglages de vitesse du moteur, les configurations de débit, les sélections de tête de pompe et les routines de calibration. Chaque commande, identifiée par des paramètres uniques, assure un contrôle précis du fonctionnement de la pompe.
Des explications détaillées et des informations complémentaires concernant le protocole MODBUS RTU pour le contrôle des pompes LabV seront fournies ci-dessous et peuvent également être trouvées dans la documentation du protocole de communication.
Format de communication standard RTU MODBUS
Le format du message est celui décrit dans le tableau ci-dessous.
| Champ | Taille | Description |
|---|---|---|
| Adresse esclave | 1 octet | Adresse de la pompe. La plage de numéros est de 1 à 32 et 0 est utilisé pour la diffusion. |
| Code de fonction | 1 octet | Instruction pour le dispositif esclave. 03H : Lecture des registres de maintien 06H : Écriture d'un registre unique 10H : Écriture de plusieurs registres 02H : Lecture des entrées discrètes (Lecture de bits de données) 05H : Écriture d'un bit unique dans un registre |
| Zone de données | 0 – 252 octets | Données à transmettre (longueur variable) |
| Contrôle CRC | 2 octets | Contrôle de Redondance Cyclique pour la détection d'erreurs CRC faible (1 octet) : Octet de poids faible du CRC CRC élevé (1 octet) : Octet de poids fort du CRC |
Contrôle CRC avec CRC-16 en Python
Le CRC (Cyclic Redundancy Check) est une technique essentielle pour la détection d'erreurs dans la transmission de données. Dans ce qui suit, nous allons démontrer comment implémenter le CRC-16, celui utilisé dans le système synchrone binaire américain, en utilisant Python. Dans le CRC-16, l'algorithme de détection d'erreurs utilise un polynôme G(X) = X16 + X15 + X2 + 1 pour générer la somme de contrôle. Ce polynôme définit les opérations mathématiques effectuées sur les bits du message pendant le processus de calcul du CRC. Un aperçu de l'algorithme est détaillé ci-dessous :
- Initialiser un registre 16 bits avec la valeur hexadécimale FFFF (tous les bits à un), désigné comme le registre CRC.
- Effectuez un XOR sur les 8 premiers octets du message avec l'octet de poids faible du registre CRC. Stockez le résultat dans le registre CRC.
- Décaler le registre CRC d'un bit vers la droite, avec le bit de poids fort (MSB) mis à zéro.
- Vérifier le bit de poids faible (LSB) du registre CRC :
- Si le LSB est 0, répétez l'étape 3 (opération de décalage).
- Si le LSB est 1, effectuez un XOR du registre CRC avec la valeur polynomiale 0xA001 (1010 0000 0000 0001).
- Répétez les étapes 3 et 4, pour un total de 8 décalages, afin de traiter chaque octet.
- Répétez les étapes 2 à 5 pour chaque octet du message jusqu'à ce que tous les octets aient été traités.
- Le contenu final du registre CRC est la valeur CRC.
Paramètres de communication
Chaque octet de données possède une structure composée d'un bit de début, de 8 bits de données, d'un bit de parité et d'un bit d'arrêt. Les bits sont envoyés dans l'ordre du bit de poids faible (LSB) au bit de poids fort (MSB). Les débits en bauds de communication possibles incluent 1200, 2400, 4800 et 9600 bits/s.
Pour les entiers (2 octets), les données sont organisées avec le deuxième octet en premier, suivi du premier octet. Par exemple, la valeur hexadécimale 2378H est envoyée sous la forme 23H 78H. Pour les entiers longs et les flottants (4 octets), les données sont organisées avec le quatrième octet en premier, suivi des troisième, deuxième et premier octets.
Format de trame de message RTU MODBUS
Le format de trame RTU du message MODBUS est celui décrit dans le tableau ci-dessous.
| Champ | Taille | Description |
|---|---|---|
| Démarrer | ≥ 3,5 caractères | Indique le début de la transmission |
| Adresse | 8 bits | Adresse du dispositif esclave |
| Code de fonction | 8 bits | Instruction pour le dispositif esclave |
| Données | N x 8 Bits | Données à transmettre (longueur variable, N octets) |
| Code de contrôle CRC | 16 Bits | Contrôle de Redondance Cyclique pour la détection d'erreurs |
| Fin | ≥ 3,5 caractères | Indique la fin de la transmission |
🚨 Assurez-vous que la trame de message est transmise en continu sans espaces inactifs entre les caractères supérieurs à 1,5 temps caractère. Les trames de message incomplètes, indiquées par un espace inactif excessif, doivent être ignorées par le nœud récepteur.
Réaction anormale
Lorsqu'un hôte envoie une requête de données et que l'esclave reçoit des données anormales, une réaction anormale devrait être déclenchée. Si le code d'adresse envoyé par l'hôte est incorrect, c'est-à-dire qu'il ne correspond à aucun code d'adresse parmi les esclaves, ou si les données reçues par l'esclave échouent à la vérification CRC, aucun code anormal n'est renvoyé. Dans de tels cas, l'hôte doit initier un processus de réaction supérieur.
Dans la zone du code de fonction, le code de fonction de réaction anormale est défini comme le code de fonction de réaction normale plus 80H.
Dans la zone de données, le code d'anomalie à retourner est défini comme dans le tableau ci-dessous.
| Code | Nom | Signification |
|---|---|---|
| 01H | Code de fonction illégal | Le code de fonction reçu par la pompe péristaltique n'est pas autorisé, à l'exception de 03H, 06H ou 10H. |
| 02H | Adresse de données illégale | L'adresse de registre reçue par la pompe péristaltique n'est pas autorisée. |
| 03H | Valeur de données illégale | Les données écrites ne correspondent pas à la plage de fonctionnement attendue par la pompe péristaltique. |
| 06H | Esclave (pompe péristaltique) occupé | La pompe péristaltique est actuellement occupée et incapable d'exécuter la commande en raison d'un état conflictuel. |
🚨La pompe péristaltique accepte uniquement les commandes MODBUS via l'interface principale ; les autres interfaces ne reçoivent pas de messages.
Adresse et Contenu du Registre de Maintien
Ci-dessous se trouvent les tableaux détaillant les réglages des paramètres de base et d'étalonnage respectivement.
Réglage des paramètres de base
| Adresse (Décimal) | Nom | Plage | Type de données |
|---|---|---|---|
| 1000 | tête de pompe | Par rapport au tableau 1 | unsigned short int (2 octets) |
| 1001 | Taille du tube | Par rapport au tableau 1 | unsigned short int (2 octets) |
| 1002 | Vitesse du moteur | 0.1-600 tr/min | float (4 octets) |
| 1004 | débit | 0.1-99999 mL | float (4 octets) |
| 1007 | Angle d'aspiration arrière | 0-360° | unsigned short int (2 octets) |
| 1008 | Contrôle Démarrage/Arrêt | 1 : Démarrer, 0 : Arrêter | unsigned short int (2 octets) |
| 1009 | Contrôle de direction | 1 : Sens horaire, 0 : Sens antihoraire | unsigned short int (2 octets) |
| 1010 | Fonctionnement à pleine vitesse | 1 : Démarrer à pleine vitesse, 0 : Arrêter à pleine vitesse | unsigned short int (2 octets) |
| 1015 | Régler le volume de débit | 0-99999 mL | float (4 octets) |
| 1018 | Temps de fonctionnement | 0.1-9999 s | float (4 octets) |
| 1020 | Mode de fonctionnement | 0: Transfert, 1: Mesure de volume fixe, 2: Temps et volume fixes | unsigned short int (2 octets) |
| 1021 | Temps de pause | 0.1-9999 s | float (4 octets) |
| 1023 | Nombres de copies | 0-9999 fois, 0 signifie infini | unsigned short int (2 octets) |
💡 Notes importantes :
- Les registres 1015 et 1018 sont invalides lorsque le mode de fonctionnement est réglé sur transfert.
- Le registre 1018 est invalide lorsque le mode de fonctionnement est réglé sur Mesure de volume fixe.
- Les registres 1002 et 1004 sont invalides lorsque le mode de fonctionnement est réglé sur Temps et volume fixes.
- Assurez-vous que les données du registre sont configurées conformément au tableau fourni, et évitez d'envoyer plusieurs configurations de registre en une seule commande.
Réglage des paramètres de calibration
| Adresse (Décimal) | Nom | Plage | Type de données |
|---|---|---|---|
| 2001 | Temps de test | 0.5-9999 s | unsigned short int (2 octets) |
| 2002 | Test Démarrage/Arrêt | 1 : Démarrer, 0 : Arrêter | unsigned short int (2 octets) |
| 2003 | Volume actuel | 0-9999 mL | float (4 octets) |
| 2005 | Restaurer les paramètres par défaut | 1 : Restaurer la calibration | unsigned short int (2 octets) |
| 2006 | Micro-ajustement | 1 : Augmenter, 0 : Diminuer | unsigned short int (2 octets) |
Tableau de correspondance des têtes de pompe et des tubes
| Nom de la tête de pompe | Type de tête de pompe | Taille du tube | Spécificités du 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# |
💡 Note importante :
- Le tableau ci-dessus n'est pas exhaustif et ne comprend qu'un sous-ensemble de têtes de pompe et de tailles de tube. Pour la liste complète, veuillez vous référer à la documentation.
Exemples de chaînes de commande
Exemple 1 : Démarrer la pompe
- Adresse : 01, indique l'adresse du dispositif auquel la commande est envoyée.
- Code de fonction : 06, utilisé pour écrire une seule valeur dans un registre.
- Adresse du registre : 03F0, adresse de registre correspondant au registre de commande pour le démarrage de la pompe (1008 en hexadécimal).
- Données : 0001, écrites dans le registre pour démarrer la pompe (1 : Démarrer, 0 : Arrêter).
- CRC : 487D, valeur utilisée pour garantir l'intégrité des données.
Par conséquent, la chaîne de commande correspondante pour démarrer la pompe est : 01 06 03 F0 00 01 48 7D.
Exemple 2 : Régler la vitesse de la pompe à 20 tr/min
- Adresse : 01, indique l'adresse du dispositif auquel la commande est envoyée.
- Code de fonction : 10, utilisé pour écrire des valeurs dans plusieurs registres.
- Adresse du registre : 03EA, adresse de registre correspondant au registre de réglage de la vitesse (1002 en hexadécimal).
- Nombre de registres : 0002, deux registres seront écrits.
- Nombre d'octets : 04, nombre d'octets de données à écrire.
- Données : 41A00007, représente le réglage de vitesse au format flottant correspondant à 20 RPM.
- CRC : D76E, valeur utilisée pour garantir l'intégrité des données.
Par conséquent, la chaîne de commande correspondante pour régler la vitesse de la pompe à 20 tr/min est : 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Ces 2 exemples et d'autres exemples de chaînes de commande sont présentés dans le tableau ci-dessous.
| Tâche | Chaîne de commande |
|---|---|
| Démarrer la pompe | 01 06 03 F0 00 01 48 7D |
| Régler le sens de rotation sur anti-horaire | 01 06 03 F1 00 00 D8 7D |
| Régler le sens de rotation sur horaire | 01 06 03 F1 00 01 19 BD |
| Régler la vitesse à 20 tr/min | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Régler le débit à 50,0 mL/min | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Arrêter la pompe | 01 06 03 F0 00 00 89 BD |
| Démarrer l'exécution à pleine vitesse | 01 06 03 F2 00 01 E9 BD |
Comment contrôler les pompes LabV en utilisant Python ?
La série de pompes LabV peut être contrôlée à distance à l'aide du protocole MODBUS RTU via Python, offrant une plus grande flexibilité et commodité pour l'exécution de programmes de pompage complexes avec des boucles, des pauses et des vitesses/débits variables. Cette approche est particulièrement utile lors de l'intégration de plusieurs dispositifs, car elle permet l'automatisation de séquences impliquant tous les équipements connectés.
Cette section présentera une bibliothèque Python personnalisée dédiée, utilisant le protocole MODBUS RTU, qui permet d'ouvrir le port série et d'envoyer des chaînes de commande à la pompe LabV. Nous aborderons des exemples montrant comment régler la vitesse, démarrer et arrêter la pompe, définir la tête de pompe et la taille du tube, etc., offrant ainsi un guide pratique pour le contrôle d'une pompe LabV avec Python.
🚨🚨🚨 Note 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()
Cette bibliothèque Python, conçue pour contrôler la série de pompes LabV via le protocole MODBUS RTU, permet un contrôle précis et automatisé de divers paramètres de la pompe tels que la vitesse, la direction, la tête de pompe et la taille du tube. Les utilisateurs d'une pompe LabV peuvent désormais intégrer facilement leur pompe dans des flux de travail complexes impliquant plusieurs appareils, améliorant ainsi l'efficacité opérationnelle et la flexibilité.
Conclusion
Dans cet article de blog, nous avons présenté la série de pompes péristaltiques LabV et exploré les bases de son contrôle externe Python à l'aide du protocole de communication MODBUS RTU. Nous espérons que cet article servira de guide précieux aux chercheurs et ingénieurs souhaitant utiliser une pompe péristaltique LabV dans leurs recherches et expériences en microfluidique.
🚨 Bien qu'il existe des variations entre les différentes séries de pompes Innofluid Lab, nous soulignons que le protocole de communication reste presque inchangé. Que vous utilisiez la série LabF, la série LabN ou toute autre, nous sommes convaincus que ce contenu vous sera également bénéfique pour vos futurs projets.
Restez à l'écoute pour plus d'informations, de tutoriels et d'applications pratiques dans nos futurs articles. D'ici là, bon pompage et bon codage 💻!
📧 If you have any questions or feedback, please feel free to contact us at support@darwin-microfluidics.com.


