Ir al contenido

Envío y recepción de datos por el RS485 del UPSafePi

4 de diciembre de 2023 por
Envío y recepción de datos por el RS485 del UPSafePi
Boot & Work Corp. S.L, Queralt del Águila Munté

Introducción

En este post exploramos cómo lograr una comunicación eficiente de envío y recepción cuando en realidad se trabaja con una configuración half-duplex. Nuestro objetivo es facilitar la comunicación DE/RE, permitiendo enviar y recibir de forma aparentemente simultánea mediante software. En los ejemplos siguientes veremos un método para gestionar el proceso. Aunque no se envíe y se reciba en el mismo instante exacto, buscamos gestionarlo de modo que, automáticamente después de enviar, el dispositivo pase a modo escucha, a la espera de posibles datos entrantes.

UPSafePi RS485

Este dispositivo consta de una Raspberry Pi 4 conectada a un shield UPS & RTC, todo ello alojado en una carcasa perfectamente ajustada. 

Para centrarnos en su comunicación RS485, hay que tener en cuenta ciertos aspectos:

  • Los cables para la comunicación RS485 entre los dos dispositivos se conectarán a los pines 16 y 18. Estos pines están bajo el control del UPS.
  • El pin 13 está asignado a GPIO27, que sirve como control half-duplex del 485. La transmisión se habilita con un valor lógico positivo, mientras que la recepción se habilita con un valor lógico negativo.

En la siguiente imagen vemos cómo se distribuye la gestión de los pines y, efectivamente, solo hay un pin para esta comunicación half-duplex. Por eso no existe un RE independiente: es el mismo pin que DE, pero negado.

Para más información sobre UPSafePI, haz clic aquí.

RPI4pinout

Códigos de ejemplo

Para este ejemplo se utilizan un UPSafePI y un Raspberry PI PLC 21+. Ten en cuenta que esta prueba puede realizarse con otro dispositivo con RS-485 en lugar del Raspberry PI PLC, simplemente conectando los puertos RS-485 entre sí (A-A y B-B). Para llevar a cabo este ejemplo necesitarás algunas librerías de python3:

  1. serial: Esta librería permite interactuar con los puertos serie del sistema. En este código se utiliza para configurar y gestionar la comunicación por el puerto serie, en concreto la comunicación RS485. La clase Serial de esta librería se usa para establecer los parámetros del puerto serie, como el nombre del puerto ('/dev/ttyS0'), la velocidad en baudios (9600) y el timeout (1 segundo).
  2. RPi.GPIO: Esta librería se utiliza para las operaciones de entrada/salida de propósito general (GPIO) en una Raspberry Pi. Permite configurar y controlar los pines GPIO de la placa Raspberry Pi. En este código se usa para configurar y controlar el pin GPIO (27) conectado al pin DE/RE de la interfaz RS485.
  3. time: Es una librería estándar de Python que ofrece diversas funciones relacionadas con el tiempo. En este código se utiliza para medir el tiempo empleado en la transmisión y recepción de datos. La función time.time() se usa para calcular el tiempo empleado en enviar y recibir los datos.

Este primer código es para el dispositivo UPSafePI. Este programa envía unos datos mediante la comunicación RS-485 y recibe una respuesta, calculando el tiempo de envío y de recepción. Ten en cuenta que la señal DE (GPIO27) se pone en HIGH al enviar datos y en LOW al recibirlos.

import serial
import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)

# Set GPIO mode to BCM
GPIO.setmode(GPIO.BCM)

# Set the GPIO pin
gpio_pin = 27
GPIO.setup(gpio_pin, GPIO.OUT)

# Set the GPIO pin to low
GPIO.output(gpio_pin, GPIO.LOW)

# Define RS485 parameters
ser = serial.Serial(
        port='/dev/ttyS0',  # Replace with the actual serial port used by your RS485 adapter
        baudrate=9600,
        timeout=1
)

# Function to send data
def send_data(data):
        GPIO.output(gpio_pin, GPIO.HIGH)

        start_time = time.time()

        ser.write(data.encode('utf-8'))
        #time.sleep(0.05)

        end_time = time.time()

        elapsed_time = end_time - start_time
        print("-------------------------------------------------")
        print(f"Tx time: {elapsed_time} seconds")

        # Sleep to send all data
        time.sleep(0.1)

        GPIO.output(gpio_pin, GPIO.LOW)

# Function to receive data
def receive_data():
        GPIO.output(gpio_pin, GPIO.LOW)
        data = ser.readline().decode('utf-8')
        if data:
                print(f"Received data: {data.strip()}")

i = 0

while True:
data_to_send = f"Message {i}"
i += 1

# Send data
send_data(data_to_send)

# Do things
time.sleep(1)

start_time = time.time()

# Receive data
receive_data()

end_time = time.time()

elapsed_time = end_time - start_time
print(f"Rx time: {elapsed_time} seconds")

ser.close()

Si utilizas un Raspberry PI PLC como el otro dispositivo, carga el siguiente código. Este código simplemente espera a recibir los datos del UPS y devuelve una respuesta. En este caso se utiliza el puerto /dev/ttySC0; recuerda cambiarlo según tus especificaciones.

import serial

# Define RS485 parameters
ser = serial.Serial(
        port='/dev/ttySC0',  # Replace with the actual serial port used by your RS485 adapter
        baudrate=9600,
        timeout=1
)

# Function to send data
def send_data(data):
        ser.write(data.encode('utf-8'))

# Function to receive data continuously
def receive_data():
        data = ser.readline().decode('utf-8')
        if data:
                print(f"Received data: {data.strip()}")
                return True
        return False

i = 0

while True:
        # Receive data
        if receive_data():
                data_to_send = f"Received {i}"
                i += 1
                # Send data
                send_data(data_to_send)

ser.close()


Buscar en nuestro blog

Envío y recepción de datos por el RS485 del UPSafePi
Boot & Work Corp. S.L, Queralt del Águila Munté 4 de diciembre de 2023
Compartir esta publicación
Etiquetas

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs