Para que la comunicación entre un activo industrial y un sensor de adquisición de datos sea eficaz y aporte beneficios, es crucial contar con un entendimiento profundo del propio equipo. Esta comunicación permite el monitoreo en tiempo real, el mantenimiento predictivo, la optimización y la digitalización de procesos.
Los sensores son la “puerta de entrada” de la información al sistema, midiendo diversas variables físicas o químicas de los activos industriales y del entorno. Como ejemplo, en el sector minero, algunas de las variables recolectadas pueden ser:
- Temperatura (física): sobrecalentamiento de motores en camiones mineros de gran capacidad, excavadoras, trituradoras y molinos;
- Flujo y caudal (física): monitoreo del caudal de agua para el control de polvo, o en procesos de beneficio como flotación y lixiviación;
- Calidad de aire y gases (química): monitoreo de la concentración de gases tóxicos (metano, monóxido de carbono, dióxido de carbono) y oxígeno en minas subterráneas.
Los datos recolectados por los sensores pueden estar en formato analógico o digital. Las señales en formato analógico varían dentro de un rango, por ejemplo: tensión de 0-10V, corriente de 4-20mA. Mientras que las señales digitales son discretas y pueden representarse de la siguiente manera: encendido/apagado, 0/1.
La forma en que los datos se transmiten desde el sensor hacia el activo industrial (o hacia un sistema de control/monitoreo) depende de varios factores, incluyendo la distancia, el entorno industrial, la velocidad de transmisión requerida y el costo. La conexión física (con cable) es la forma más tradicional y robusta, donde los sensores se conectan a controladores, utilizando protocolos de comunicación.
La conexión inalámbrica, por otro lado, se ha utilizado cada vez más debido a su flexibilidad, facilidad de instalación y reducción de costos en cableado. Las más comunes incluyen:
- Wi-Fi: adaptado para uso industrial con estándares más robustos (ej: Wi-Fi 6 para IIoT);
- Bluetooth/BLE (Bluetooth Low Energy): para sensores pequeños y portátiles;
- Zigbee/Z-Wave: para una gran cantidad de sensores distribuidos;
- LoRaWAN: para sensores en áreas extensas de la planta;
- 5G: para aplicaciones industriales críticas.
De la solicitud de datos al análisis: conectando la industria
A diferencia de los sistemas cableados, donde cada sensor requiere un cable físico para transmitir datos, la comunicación inalámbrica se basa en ondas de radio para enviar información. En primer lugar, el sensor se acopla directamente al activo o se posiciona para monitorear una variable específica de su entorno.
Como ejemplo, en un entorno minero, dentro de un sistema hidráulico utilizado en equipos de perforación, excavadoras y chancadoras, los sensores de temperatura ayudan a evitar fallas por sobrecalentamiento del fluido hidráulico y los sensores de presión verifican si el sistema opera dentro de los límites de seguridad. Estos sensores se comunican con un gateway o punto de acceso mediante tecnologías inalámbricas (Wi-Fi industrial, LoRaWAN, 5G, BLE).
La forma más común y robusta de recolectar datos de sensores puede ser a través de la consulta de APIs RESTful o de protocolos de mensajería como MQTT. Muchas plataformas de IIoT (Internet Industrial de las Cosas) exponen los datos de telemetría de los equipos mediante APIs REST. El proceso puede ilustrarse de la siguiente manera:
- Autenticación: obtención de credenciales (llaves de API, tokens OAuth 2.0);
- Endpoint: identificación de la URL de la API para acceder a los datos de los sensores;
- Solicitud: realizar solicitudes HTTP GET (para lectura) al endpoint;
- Parsing: procesamiento de la respuesta, usualmente en formato JSON o XML.
import requests
--- Configuraciones Esenciales ---
API_URL = "https://api.ejemplo-mineria.com/data/MINER_007/_temperature/latest"
En un escenario real, API_URL sería el endpoint exacto que retorna el dato deseado.
Ej: https://api.tu_plataforma.com/v1/assets/MINER_007/sensors/_temperature?limit=1
try:
# 1. Realiza la petición HTTP GET
response = requests.get(API_URL)
# 2. Verifica si la petición fue exitosa (estatus 200 OK)
response.raise_for_status() # Lanza un error para códigos HTTP 4xx/5xx
# 3. Extrae el dato de la respuesta JSON
# Asumimos que la respuesta es un JSON sencillo como: {"value": 85.5, "unit": "C", "timestamp": "..."}
data = response.json()
temperatura = data.get("value")
unidad = data.get("unit", "°C")
# 4. Imprime el resultado
print(f"Temperatura: {temperatura} {unidad}")
except requests.exceptions.RequestException as e: print(f"Error al conectar u obtener datos de la API: {e}") if 'response' in locals() and response.text: print(f"Respuesta de la API (para depuración): {response.text}") except Exception as e: print(f"Ocurrió un error inesperado: {e}")
Código Python - Recolección de datos de un sensor vía API
El código Python simuló la obtención de la temperatura de un sensor de un activo minero a través de una API REST, utilizando la librería requests. En este sentido, existen varias ventajas en la recolección de datos mediante un sensor inalámbrico, tales como:
- Flexibilidad: facilidad de instalación y reubicación de sensores;
- Reducción de costos: menor costo de instalación y mantenimiento;
- Acceso a sitios remotos: permite monitorear activos en áreas de difícil acceso o peligrosas;
- Movilidad: esencial para monitorear equipos móviles como camiones, excavadoras y perforadoras;
- Mantenimiento predictivo mejorado: la recolección continua de datos amplía la visibilidad sobre el estado del equipo y anticipa fallas.
Limpieza y estandarización de datos: etapas esenciales antes del análisis
Después de la recopilación de datos, siempre es necesario depurarlos, especialmente en entornos industriales, como el sector minero. Conocida como «limpieza de datos» (data cleansing), esta etapa es crucial para identificar y corregir errores e inconsistencias en los conjuntos de datos en bruto. Este proceso garantiza la calidad, precisión y confiabilidad de la información que se utilizará para el análisis y la toma de decisiones.
La limpieza de datos implica diversas técnicas, muchas de las cuales pueden implementarse con Python:
- Tratamiento de datos faltantes: eliminación e imputación;
- Detección y tratamiento de valores atípicos (outliers): límites estadísticos, límites físicos y operativos, eliminación o sustitución;
- Suavizado de ruido: filtrado;
- Eliminación de duplicados;
- Estandarización y normalización;
- Verificación de consistencia.
La biblioteca Pandas es la herramienta más popular para la depuración y manipulación de datos en Python. El siguiente ejemplo demuestra algunas de las técnicas mencionadas:
import pandas as pd
import numpy as np
Datos de ejemplo de un sensor de temperatura
data = {
'timestamp': pd.to_datetime(['2024-07-24 08:00', '2024-07-24 08:01', '2024-07-24 08:02', '2024-07-24 08:03', '2024-07-24 08:04', '2024-07-24 08:05', '2024-07-24 08:06']),
'temperature_C': [85.2, 85.5, 150.0, np.nan, 86.1, 86.3, 86.0]
}
Creando un DataFrame
df = pd.DataFrame(data)
print("--- Datos Crudos ---")
print(df)
--- Proceso de Depuración de Datos ---
Paso 1: Detección y manejo de valores atípicos (límites operativos)
Suponiendo que la temperatura del motor nunca debe exceder los 100°C.
Los valores por encima de este umbral se reemplazan por NaN.
df.loc[df['temperature_C'] > 90, 'temperature_C'] = np.nan
print("\n--- Después de eliminar el valor atípico (150°C) ---")
print(df)
Paso 2: Manejo de datos faltantes (NaN)
Usando interpolación para rellenar los valores ausentes.
df['temperature_C'] = df['temperature_C'].interpolate(method='linear')
print("\n--- Después de interpolar los valores ausentes ---")
print(df)
Paso 3: Suavizado de datos (filtrado de ruido)
Aplicando un promedio móvil de 3 puntos para suavizar pequeñas variaciones.
df['temperature_C'] = df['temperature_C'].rolling(window=3, min_periods=1, center=True).mean()
print("\n--- Datos Suavizados (depurados) ---")
print(df)
En este caso, los datos en bruto contenían un valor atípico (150°C) y un valor faltante (nan). En el paso 1, la limpieza eliminó el outlier, posteriormente rellenó el vacío con un valor interpolado y, finalmente, suavizó la serie para eliminar el ruido. Dado que la limpieza es un proceso iterativo, requiere conocimiento del dominio (qué mide el sensor y cuál es el comportamiento esperado del activo) para realizarse de forma eficaz.
El siguiente paso es la transformación de estos datos para convertirlos en un formato más útil y estructurado para análisis, modelado y visualización. Este proceso también puede realizarse con la biblioteca pandas, ya que ofrece una amplia gama de funciones para limpiar, formatear, agregar y manipular datos de series temporales:
1. Estandarización para análisis: pandas + scikit-learn:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
DataFrame de ejemplo con datos de temperatura y presión
datos = {'temperatura': [85, 82, 88, 85, 87], 'presion_psi': [1050, 1065, 1055, 1070, 1060]} df = pd.DataFrame(datos)
Crea un objeto normalizador
escalador = MinMaxScaler()
Aplica la normalización a las columnas seleccionadas
df_normalizado = pd.DataFrame(escalador.fit_transform(df), columns=df.columns)
print("--- Datos Originales ---") print(df) print("\n--- Datos Normalizados (escala 0 a 1) ---") print(df_normalizado)
Ejemplo: normalización de la temperatura a una escala de 0 a 1.
2. Agregación: análisis de tendencias diarias o semanales:
import pandas as pd
import numpy as np
DataFrame de ejemplo con marcas de tiempo a una granularidad de 1 minuto
timestamps = pd.date_range(start='2024-07-25 08:00', periods=60, freq='T') temperaturas = np.random.uniform(80, 90, 60) df = pd.DataFrame({'timestamp': timestamps, 'temperatura': temperaturas}) df = df.set_index('timestamp')
Remuestreo (agregación) para calcular el promedio cada 15 minutos
df_agregado = df.resample('15T').mean()
print(" --- Datos Originales (primeras 5 filas) --- ") print(df.head()) print("\n --- Datos Agregados (promedio cada 15 minutos) --- ") print(df_agregado)
Cálculo del promedio de temperatura cada 15 minutos a partir de datos con granularidad de 1 minuto.
3. Creación de nuevas características (Ingeniería de características – Feature Engineering): generación de columnas más informativas para el análisis:
import pandas as pd
DataFrame de ejemplo con datos de temperatura
data = {'temperatura': [85.0, 85.5, 86.1, 87.5, 88.0, 87.2, 86.8]} df = pd.DataFrame(data)
Crea una nueva característica: "Tasa de variación"
El método .diff() calcula la diferencia entre un registro y el anterior.
df['tasa_de_variacion'] = df['temperatura'].diff()
Crea otra característica: "Media móvil" de los últimos 3 puntos
El método .rolling(window=3).mean() calcula el promedio de 3 datos en cada ventana deslizante.
df['media_movil_3pts'] = df['temperatura'].rolling(window=3).mean()
print(" --- DataFrame con Nuevas Características --- ") print(df)
Cálculo de la "tasa de variación" de una temperatura y la "media móvil" para suavizar el ruido.
Los ejemplos demuestran cómo pandas permite transformar y preparar datos de forma robusta y eficiente, dejándolos listos para análisis y modelado. Así como en el caso de datos de temperatura en operaciones mineras, este proceso estructurado permite identificar patrones, anticipar riesgos y fundamentar decisiones técnicas y estratégicas para la industria.
Conoce más sobre ST-One.