El serie de bombas de Innofluid (anteriormente conocida como Shenchen Baoding) es una serie avanzada de bombas peristálticas para la medición de caudal que cuenta con una pantalla táctil a color de 4,3 pulgadas para un control intuitivo. Muestra simultáneamente los datos de caudal, los ajustes y la información del sistema, con animaciones que indican el estado de funcionamiento. Equipada con calibración inteligente, microajuste en línea y tres modos de medición —volumen fijo, tiempo y volumen fijos, y inicio/parada por temporizador—, es muy versátil. Compatible con diversos cabezales de bomba y con múltiples opciones de contrôle externe , la serie LabV es ideal para uso en laboratorio, integración en equipos y producción industrial.
En esta entrada del blog, veremos cómo controlar las bombas LabV utilizando el protocolo MODBUS RTU a través de una plataforma de programación habitual: Python.
Cabe señalar que, aunque puede haber ligeras diferencias en la configuración de los registros y en los comandos entre las distintas series de bombas Lab (como LabF, LabN, LabK, etc.), todas ellas comparten el mismo protocolo de comunicación MODBUS RTU. Por lo tanto, la información que se ofrece en este artículo es relevante y aplicable a los usuarios de cualquier serie de bombas Lab de Innofluid .
¿Por qué elegir una bomba peristáltica de la serie LabV?
La bomba peristáltica LabV destaca como la mejor opción para las necesidades de manejo de fluidos, tanto en laboratorios como en entornos industriales. Equipada con un nuevo servomotor que garantiza una mayor precisión y durabilidad, y con una pantalla táctil LCD de 4,3", esta bomba ofrece un control intuitivo para la dosificación precisa y los modos de volumen fijo. Fabricada en ABS de calidad de laboratorio, garantiza tanto facilidad de uso como un rendimiento robusto.
Con caudales que van desde los 0,0053 µL/min hasta los 775 mL/min, y la flexibilidad de poder albergar hasta 8 canales, se adapta a una amplia gama de aplicaciones. Además, su diseño de calidad industrial, su pantalla dinámica y su función de calibración inteligente lo convierten en un recurso fiable para diversas tareas de transferencia de fluidos.
Ya sea para investigación, soporte técnico de equipos o producción industrial, la serie LabV de bombas peristálticas constituye una excelente solución para los retos que plantea el manejo de fluidos.
¿Qué se necesita para comunicarse con una bomba LabV?
Para comunicarte con una bomba LabV mediante el protocolo MODBUS RTU, necesitarás lo siguiente:
- Se utilizará una bomba LabV (en este caso, una bomba peristáltica de caudal inteligente LabV1-III ) con un cabezal de bombeo y una tube de su elección
- Un cable serie que se conecta al ordenador o al dispositivo
- Una conexión RS485 o RS232 al puerto « contrôle externe » situado en la parte trasera de la bomba
- Una plataforma de programación (Python, en este caso)
- Conocimientos básicos sobre el protocolo de comunicación MODBUS RTU que se detallan a continuación 👇.
¿Cómo se configura el puerto de comunicación?
Antes de poder empezar a enviar y recibir datos de la bomba, debes configurar correctamente el puerto de comunicación. Estos son los pasos que debes seguir:
- Conecta el cable de comunicación RS232 o RS485 al puerto « contrôle externe » situado en la parte trasera de la bomba.
- Enciende la bomba
- En la interfaz de configuración de comunicación de la pantalla de la bomba, seleccione RS232 o RS485 como interfaz de comunicación (en las tablas siguientes se detallan las conexiones de RS232 y RS485).
- Tanto si eliges RS232 como RS485, el protocolo de comunicación es el estándar MODBUS RTU
- Configurar la velocidad de transmisión
- Haz clic en el botón «N.º de esclavo» para configurar la dirección de la bomba peristáltica (rango: 1-32)
- Selecciona «Activación de la comunicación» ( ON)
- Vuelve a la interfaz principal, ya que la bomba solo recibe comandos de comunicación cuando se encuentra en la interfaz principal; estos comandos no son válidos en otras interfaces de configuración.
| Detalles del cableado RS232 | |
|---|---|
| Terminal | Descripción |
| GND | Terminal de tierra de comunicación. |
| TXD | Terminal de señal de envío del maestro y de recepción de la bomba peristáltica. |
| RXD | Terminal de envío de la bomba peristáltica y de recepción de la señal maestra. |
| Detalles del cableado RS485 | |
|---|---|
| Terminal | Descripción |
| GD1 | Tierra de señal RS485. |
| A+ | Conecta el terminal A+ del RS485. |
| B- | Conecta el terminal B del RS485. |
El protocolo de comunicación MODBUS RTU de la serie LabV
La serie de bombas peristálticas LabV ofrece un completo conjunto de comandos para un control y una supervisión precisos a través del protocolo MODBUS RTU. Este conjunto de comandos incluye diversas instrucciones clasificadas para facilitar el manejo de las funciones de la bomba, y abarca acciones como el ajuste de la velocidad del motor, la configuración del caudal, la selección de la altura de bombeo y las rutinas de calibración. Cada comando, identificado mediante parámetros únicos, garantiza un control preciso del funcionamiento de la bomba.
A continuación se ofrecen explicaciones detalladas e información adicional sobre el protocolo MODBUS RTU para el control de las bombas LabV; dicha información también se puede consultar en la documentación del protocolo de comunicación.
Formato de comunicación estándar MODBUS RTU
El formato del mensaje es el que se describe en la tabla siguiente.
| Campo | Tamaño | Descripción |
|---|---|---|
| Dirección del esclavo | 1 byte | Dirección de la bomba. El rango de números es del 1 al 32, y el 0 se utiliza para la difusión general. |
| Código de función | 1 byte | Instrucciones para el dispositivo esclavo. 03H: Lectura de registros de retención 06H: Escritura en un único registro 10H: Escritura en varios registros 02H: Lectura de entradas discretas (lectura de bits de datos) 05H: Escritura de un único bit en un registro |
| Área de datos | 0 – 252 bytes | Datos que se van a transmitir (longitud variable) |
| Comprobación de la CRC | 2 bytes | Comprobación de redundancia cíclica (CRC) para la detección de errores CRC bajo (1 byte): byte inferior del CRC CRC alto (1 byte): byte superior del CRC |
Comprobación del CRC con CRC-16 en Python
El CRC (Cyclic Redundancy Check) es una técnica fundamental para detectar errores en la transmisión de datos. A continuación, mostraremos cómo implementar el CRC-16, el que se utiliza en el sistema síncrono binario americano, mediante Python. En el CRC-16, el algoritmo de detección de errores emplea un polinomio G(X) =X¹⁶ +X¹⁵ +X² + 1 para generar la suma de comprobación. Este polinomio define las operaciones matemáticas que se realizan sobre los bits del mensaje durante el proceso de cálculo del CRC. A continuación se detalla una descripción general del algoritmo:
- Inicializa un registro de 16 bits con el valor hexadecimal FFFF (todo unos), denominado «registro CRC».
- Realiza una operación XOR entre los primeros 8 bytes del mensaje y el byte menos significativo del registro CRC. Guarda el resultado de nuevo en el registro CRC.
- Desplaza el registro CRC un bit hacia la derecha, con el bit más significativo (MSB) a cero.
- Comprueba el bit menos significativo (LSB) del registro CRC:
- Si LSB es 0, repite el paso 3 (operación de desplazamiento).
- Si LSB es 1, aplica la operación XOR al registro CRC con el valor polinómico 0xA001 (1010 0000 0000 0001).
- Repite los pasos 3 y 4, hasta completar un total de 8 ciclos, para procesar cada byte.
- Repite los pasos 2 a 5 para cada byte del mensaje hasta que se hayan procesado todos los bytes.
- El contenido final del registro CRC es el valor CRC.
Configuración de comunicación
Cada byte de datos tiene una estructura compuesta por 1 bit de inicio, 8 bits de datos, 1 bit de paridad y 1 bit de parada. Los bits se envían en orden, desde el bit menos significativo (LSB) hasta el bit más significativo (MSB). Las velocidades de transmisión posibles son 1200, 2400, 4800 y 9600 bits/s.
En el caso de los enteros (2 bytes), los datos se ordenan de forma que el segundo byte va primero, seguido del primero. Por ejemplo, el valor hexadecimal 2378H se envía como 23H 78H. En el caso de los enteros largos y los números de coma flotante (4 bytes), los datos se ordenan de forma que el cuarto byte va primero, seguido del tercero, el segundo y el primero.
Formato de trama RTU de los mensajes MODBUS
El formato de trama RTU de los mensajes MODBUS es el que se describe en la tabla siguiente.
| Campo | Tamaño | Descripción |
|---|---|---|
| Inicio | ≥ 3,5 caracteres | Indica el inicio de la transmisión |
| Dirección | 8 bits | Dirección del dispositivo esclavo |
| Código de función | 8 bits | Instrucciones para el dispositivo esclavo |
| Datos | N × 8 bits | Datos que se van a transmitir (longitud variable, N bytes) |
| Código de verificación CRC | 16 bits | Comprobación de redundancia cíclica para la detección de errores |
| Fin | ≥ 3,5 caracteres | Indica el final de la transmisión |
🚨 Asegúrate de que la trama del mensaje se transmita de forma continua, sin espacios en blanco entre caracteres superiores a 1,5 veces el tamaño de un carácter. El nodo receptor debe descartar las tramas de mensaje incompletas, que se identifican por un espacio en blanco excesivo.
Reacción anómala
Cuando un host envía una solicitud de datos y el esclavo recibe datos anómalos, debe activarse una reacción ante la anomalía. Si el código de dirección enviado por el host es incorrecto, es decir, si no se corresponde con ningún código de dirección de los esclavos, o si los datos recibidos por el esclavo no superan la comprobación CRC, no se devuelve ningún código de anomalía. En tales casos, el host debe iniciar un proceso de reacción de nivel superior.
En el área de códigos de función, el código de función de reacción anómala se define como el código de función de reacción normal más 80H.
En el área de datos, el código de error que se debe devolver se define tal y como se indica en la tabla siguiente.
| Código | Nombre | Significado |
|---|---|---|
| 01H | Código de función no válido | No se admite el código de función recibido por la bomba peristáltica, salvo 03H, 06H o 10H. |
| 02H | Dirección de datos no válida | La dirección de registro recibida por la bomba peristáltica no es válida. |
| 03H | Valor de datos no válido | Los datos registrados no se ajustan al rango de funcionamiento previsto para la bomba peristáltica. |
| 06H | Esclavo (bomba peristáltica) ocupado | La bomba peristáltica está ocupada en este momento y no puede ejecutar el comando debido a un conflicto de estados. |
🚨La bomba peristáltica solo acepta comandos MODBUS a través de la interfaz principal; las demás interfaces no reciben mensajes.
Dirección y contenido del registro de retención
A continuación se muestran las tablas en las que se detallan, respectivamente, la configuración de los parámetros básicos y los de calibración.
Configuración de los parámetros básicos
| Dirección (decimal) | Nombre | Gama | Tipo de datos |
|---|---|---|---|
| 1000 | Cabezal de la bomba | En relación con el gráfico 1 | unsigned short int (2 bytes) |
| 1001 | tube Tamaño | En relación con el gráfico 1 | unsigned short int (2 bytes) |
| 1002 | Velocidad del motor | 0,1-600 rpm | float (4 bytes) |
| 1004 | Caudal | 0,1-99 999 ml | float (4 bytes) |
| 1007 | Ángulo de succión trasera | 0-360° | unsigned short int (2 bytes) |
| 1008 | Control de arranque/parada | 1: Inicio, 0: Parada | unsigned short int (2 bytes) |
| 1009 | Control de dirección | 1: En el sentido de las agujas del reloj, 0: En sentido contrario a las agujas del reloj | unsigned short int (2 bytes) |
| 1010 | Correr a toda velocidad | 1: Arranque a máxima velocidad, 0: Parada a máxima velocidad | unsigned short int (2 bytes) |
| 1015 | Ajustar el volumen de caudal | 0-99 999 ml | float (4 bytes) |
| 1018 | Tiempo de trabajo | 0,1-9999 s | float (4 bytes) |
| 1020 | Modo de funcionamiento | 0: Transferencia, 1: Medición de volumen fijo, 2: Tiempo y volumen fijos | unsigned short int (2 bytes) |
| 1021 | Tiempo de pausa | 0,1-9999 s | float (4 bytes) |
| 1023 | Número de copias | De 0 a 9999 veces; 0 significa infinito | unsigned short int (2 bytes) |
💡 Notas importantes:
- Los registros 1015 y 1018 no son válidos cuando el modo de funcionamiento está configurado en «transferencia».
- El registro 1018 no es válido cuando el modo de funcionamiento está configurado en «Medición de volumen fijo».
- Los registros 1002 y 1004 no son válidos cuando el modo de funcionamiento está configurado en «Tiempo y volumen fijos».
- Asegúrate de que los datos del registro se configuren según la tabla facilitada y evita enviar varias configuraciones de registro en un mismo pedido.
Configuración de los parámetros de calibración
| Dirección (decimal) | Nombre | Gama | Tipo de datos |
|---|---|---|---|
| 2001 | Hora de los exámenes | 0,5-9999 s | unsigned short int (2 bytes) |
| 2002 | Prueba de arranque/parada | 1: Inicio, 0: Parada | unsigned short int (2 bytes) |
| 2003 | Volumen real | 0-9999 ml | float (4 bytes) |
| 2005 | Restablecer valores predeterminados | 1: Restablecer la calibración | unsigned short int (2 bytes) |
| 2006 | Ajuste fino | 1: Aumentar, 0: Disminuir | unsigned short int (2 bytes) |
Tabla de números de cabezales de bomba y « tube »
| Nombre del cabezal de la bomba | Tipo de cabezal de la bomba | tube Tamaño | tube Específico |
|---|---|---|---|
| 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 tabla anterior no es exhaustiva y solo incluye una selección de alturas de bombeo y tamaños de tube . Para consultar la lista completa, remítase a la documentación.
Ejemplos de cadenas de comandos
Ejemplo 1: Poner en marcha la bomba
- Dirección: 01, indica la dirección del dispositivo al que se envía el comando.
- Código de función: 06, que se utiliza para escribir un único valor en un registro.
- Dirección de registro: 03F0, dirección de registro correspondiente al registro de control para la puesta en marcha de la bomba (1008 en hexadecimal).
- Dato: 0001, escrito en el registro para poner en marcha la bomba (1: Arranque, 0: Parada).
- CRC: 487D, valor utilizado para garantizar la integridad de los datos.
Por lo tanto, la cadena de comandos correspondiente para poner en marcha la bomba es: 01 06 03 F0 00 01 48 7D.
Ejemplo 2: Ajusta la velocidad de la bomba a 20 rpm
- Dirección: 01, indica la dirección del dispositivo al que se envía el comando.
- Código de función: 10, utilizado para escribir valores en varios registros.
- Dirección de registro: 03EA, dirección de registro correspondiente al registro de configuración de velocidad (1002 en hexadecimal).
- Número de registros: 0002; se escribirán datos en dos registros.
- Recuento de bytes: 04, número de bytes de datos que se van a escribir.
- Dato: 41A00007, representa el ajuste de velocidad en formato flotante correspondiente a 20 RPM.
- CRC: D76E, valor utilizado para garantizar la integridad de los datos.
Por lo tanto, la cadena de comandos correspondiente para ajustar la velocidad de la bomba a 20 rpm es: 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E.
Estos dos ejemplos, junto con otros ejemplos de cadenas de comandos, se recogen en la tabla siguiente.
| Tarea | Cadena de comandos |
|---|---|
| Poner en marcha la bomba | 01 06 03 F0 00 01 48 7D |
| Establecer la dirección en sentido antihorario | 01 06 03 F1 00 00 D8 7D |
| Establecer la dirección en sentido horario | 01 06 03 F1 00 01 19 BD |
| Ajusta la velocidad a 20 RPM | 01 10 03 EA 00 02 04 41 A0 00 07 D7 6E |
| Ajusta el caudal a 50,0 ml/min | 01 10 03 EC 00 02 04 42 48 00 00 7D 2C |
| Detener la bomba | 01 06 03 F0 00 00 89 BD |
| Empieza a correr a toda velocidad | 01 06 03 F2 00 01 E9 BD |
¿Cómo se controlan las bombas LabV con Python?
La serie de bombas LabV se puede controlar de forma remota mediante el protocolo MODBUS RTU a través de Python, lo que ofrece una mayor flexibilidad y comodidad a la hora de ejecutar programas de bombeo complejos con bucles, pausas y velocidades o caudales variables. Este enfoque resulta especialmente útil a la hora de integrar varios dispositivos, ya que permite automatizar secuencias en las que intervienen todos los equipos conectados.
En esta sección se presentará una biblioteca de Python personalizada y específica que utiliza el protocolo MODBUS RTU, lo que permite abrir el puerto serie y enviar cadenas de comandos de control a la bomba LabV. Veremos ejemplos que muestran cómo ajustar la velocidad, poner en marcha y detener la bomba, configurar la altura de bombeo y el diámetro del tubo, etc., ofreciendo así una guía práctica sobre el uso de Python para controlar una bomba LabV.
🚨🚨🚨 Aviso 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()
Esta biblioteca de Python, diseñada para controlar la serie de bombas LabV a través del protocolo MODBUS RTU, permite un control preciso y automatizado de diversos parámetros de la bomba, como la velocidad, la dirección, la altura de bombeo y el tamaño del tubo. Los usuarios de una bomba LabV ahora pueden integrar fácilmente su bomba en flujos de trabajo complejos que involucran múltiples dispositivos, lo que mejora la eficiencia operativa y la flexibilidad.
Conclusión
En esta entrada del blog, hemos presentado la serie de bombas peristálticas LabV y hemos analizado los aspectos básicos de su contrôle externe en Python mediante el protocolo de comunicación MODBUS RTU. Esperamos que esta entrada sirva de guía útil para los investigadores e ingenieros que deseen utilizar una bomba peristáltica LabV en sus investigaciones y experimentos sobre microfluídica.
🚨 Aunque existen diferencias entre las distintas series de bombas « Innofluid » Lab, queremos destacar que el protocolo de comunicación se mantiene prácticamente sin cambios. Tanto si utilizas la serie LabF, la serie LabN o cualquier otra, estamos convencidos de que este contenido también te resultará útil para tus futuros proyectos.
No te pierdas más análisis, tutoriales y aplicaciones prácticas en nuestras próximas publicaciones. Hasta entonces, ¡feliz bombeo y programación 💻!
📧 Si tienes alguna pregunta o comentario, no dudes en ponerte en contacto con nosotros en support@darwin-microfluidics.com.


