DÍA 326 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

Metrología Evolutiva: El Fenómeno del Slippage

Un caudalímetro de turbina o de desplazamiento positivo no es mágicamente perfecto para siempre. Con el roce constante del gas y las impurezas (compuestos sulfurosos del Gas LP), los baleros se desgastan. Este desgaste provoca que, a flujos bajos, la turbina oponga un micro-nivel de resistencia mecánica. Parte del gas se desliza entre el aspa y la pared de la tubería sin ser registrado. Esto se llama Slippage (Deslizamiento).

A nivel metrológico, esto significa que el Error de Medición comenzará a desplazarse hacia un sesgo negativo (la máquina entrega más gas del que cuenta). La tolerancia legal máxima en México (PROFECO) es típicamente del ±0.5% (o ±50 mL en un Jarro Patrón de 20 Litros).

El Odómetro Vitalicio (Lifetime Totalizer) y la Tabla de Búsqueda (LUT)

Para mitigar este efecto físico mediante software, implementaremos un Odómetro Vitalicio Inborrable en la memoria EEPROM. Este contador registrará cada mililitro despachado desde que la máquina salió de la fábrica. Utilizaremos el desgaste empírico del fabricante del medidor para construir una Tabla de Búsqueda de Interpolación (LUT - Look-Up Table). Si la máquina sabe que ha cruzado el umbral de los 500,000 Litros, multiplicará el volumen en tiempo real por un minúsculo Coeficiente de Desgaste (Wear Coefficient) para recuperar el gas perdido por el Slippage.

DERIVA METROLÓGICA (DRIFT) Y COMPENSACIÓN DE DESGASTE Odómetro (Litros) Error Volumétrico % 0.0% (Ideal) +0.5% -0.5% LÍMITE LEGAL PROFECO (Multa / Clausura) 0 L 250,000 L 500,000 L 750,000 L 1,000,000 L Desgaste Mecánico Físico (Pérdidas) Hardware Ajustado por LUT (Firmware) LUT Offset Max Compensation ALARMA PREDICTIVA Si el Odómetro > 900,000 L, exigir recalibración física o reemplazo.

⚙️ Procedimiento Práctico: Implementación Legal

Paso 1: Transparencia Legal (OIML R 117).
Ante la autoridad (PROFECO), modificar el volumen de manera encubierta es un delito de evasión. La norma OIML estipula que cualquier compensación algorítmica (temperatura, presión o desgaste) debe ser documentada, auditable y poder deshabilitarse mediante el interruptor de calibración (Día 307). Las Tablas LUT de desgaste deben cargarse de fábrica y no ser modificables remotamente sin romper el precinto de hardware.

Paso 2: Memoria del Odómetro (Wear Leveling).
El Odómetro Vitalicio de Litros se actualizará en la memoria EEPROM no volátil de la placa base (I2C). Sin embargo, las EEPROMs tienen un límite de ~1,000,000 de ciclos de escritura. Si grabas cada mililitro despachado, destruirás la memoria en una semana. El Odómetro Vitalicio se guardará en la EEPROM solamente cuando la venta haya concluido, o durante un apagón utilizando el "Dying Breath" (Día 325).

💻 Firmware: Interpolación Lineal a Segmentos (Punto Fijo)

Diseñaremos una estructura en lenguaje C que contenga los "Nodos de Desgaste" proveídos por el fabricante del medidor (Flowmeter). Si la máquina lleva 350,000 Litros de vida, el algoritmo buscará entre el nodo de 250k y 500k, y realizará una interpolación matemática de Punto Fijo (Fixed-Point) para obtener el multiplicador milimétrico exacto a aplicar.


/**
 * @file metrology_wear_compensation.c
 * @brief Algoritmo Predictivo de Compensación de Desgaste Mecánico (Slippage)
 */

#include <stdint.h>
#include <stdio.h>

// =========================================================================
// TABLA DE BÚSQUEDA (LUT) DE PERFIL DE DESGASTE
// =========================================================================
// Matemáticas Punto Fijo: Multiplicador Base 10000 -> 1.0000 (Sin desgaste)
// Ej: 10025 -> 1.0025 (Agrega 0.25% al volumen despachado para compensar la fuga física)

typedef struct {
    uint32_t odometer_liters_threshold;
    uint32_t wear_multiplier_base10k;
} WearProfileNode_t;

#define WEAR_NODES_COUNT 5

// Datos empíricos sellados de fábrica (Basados en banco de pruebas del caudalímetro)
const WearProfileNode_t WearProfile_LUT[WEAR_NODES_COUNT] = {
    {0,       10000}, // Máquina nueva: 1.0000x
    {250000,  10010}, // A los 250k L:  1.0010x (Pérdida del 0.10%)
    {500000,  10028}, // A los 500k L:  1.0028x (Pérdida del 0.28%)
    {750000,  10045}, // A los 750k L:  1.0045x (Pérdida del 0.45%)
    {1000000, 10065}  // Al millón L:   1.0065x (Peligro, recalibración inminente)
};

// =========================================================================
// ALGORITMO DE INTERPOLACIÓN LINEAL (PUNTO FIJO 64-BIT)
// =========================================================================
/**
 * @brief Calcula el coeficiente dinámico exacto de compensación.
 * @param lifetime_liters: Odómetro total de la máquina extraído de EEPROM.
 * @retval uint32_t: Multiplicador dinámico (ej. 10015 -> 1.0015)
 */
uint32_t Calculate_Dynamic_Wear_Multiplier(uint32_t lifetime_liters) {
    
    // Si la máquina superó la tabla, alertamos pero mantenemos el último valor seguro
    if (lifetime_liters >= WearProfile_LUT[WEAR_NODES_COUNT - 1].odometer_liters_threshold) {
        printf("[WARN] Odómetro excedió curva de desgaste. MANTENIMIENTO REQUERIDO.\r\n");
        return WearProfile_LUT[WEAR_NODES_COUNT - 1].wear_multiplier_base10k;
    }

    // Buscar entre qué dos nodos nos encontramos (Segmento)
    for (uint8_t i = 0; i < WEAR_NODES_COUNT - 1; i++) {
        uint32_t x0 = WearProfile_LUT[i].odometer_liters_threshold;
        uint32_t x1 = WearProfile_LUT[i+1].odometer_liters_threshold;
        
        if (lifetime_liters >= x0 && lifetime_liters < x1) {
            
            uint32_t y0 = WearProfile_LUT[i].wear_multiplier_base10k;
            uint32_t y1 = WearProfile_LUT[i+1].wear_multiplier_base10k;
            
            // Fórmula de Interpolación Lineal: y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
            // Usamos uint64_t para evitar desbordamientos durante la multiplicación
            uint64_t dx = (uint64_t)(lifetime_liters - x0);
            uint64_t dy = (uint64_t)(y1 - y0);
            uint64_t step = x1 - x0;
            
            uint32_t interpolated_multiplier = y0 + (uint32_t)((dx * dy) / step);
            
            return interpolated_multiplier;
        }
    }
    return 10000; // Fallback de seguridad (Sin compensación)
}

// =========================================================================
// APLICACIÓN EN LA METROLOGÍA (INTEGRACIÓN EN VENTAS)
// =========================================================================
/**
 * @brief Función maestra que fusiona compensación térmica API y compensación mecánica.
 */
uint64_t Apply_Full_Metrology_Compensation(uint64_t raw_volume_mL, uint32_t lifetime_odometer) {
    
    // 1. Obtener la compensación térmica (Día 298)
    // uint32_t api_factor = Calculate_API_54_Factor(current_temp_C);
    
    // 2. Obtener el factor mecánico dinámico basado en la edad de la máquina
    uint32_t wear_multiplier = Calculate_Dynamic_Wear_Multiplier(lifetime_odometer);
    
    // 3. Aplicar compensación usando matemáticas seguras de Punto Fijo (Base 10k)
    // Nuevo Volumen = (Volumen Raw * Multiplicador) / 10000
    uint64_t compensated_volume_mL = (raw_volume_mL * (uint64_t)wear_multiplier) / 10000ULL;
    
    // Aquí se aplicaría posteriormente el factor de temperatura.
    
    return compensated_volume_mL;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Mantenimiento Predictivo Algorítmico y Estabilidad a Largo Plazo (TCO).

Si ibas a extender la Fase de Hardware y Metrología hasta el Día 365, tenías que elevar el estándar más allá de lo que cualquier ingeniero recién egresado construye. Las fábricas de gas venden maquinaria bruta; se descalibra, llaman al técnico, el técnico cobra por cambiar piezas, y el ciclo se repite. Esto eleva el Costo Total de Propiedad (TCO) del equipo.

Al implementar el **Análisis de Desgaste Mecánico (Wear Drift Compensation)**, has cruzado la línea entre el hardware pasivo y la Inteligencia Cibernética. Tu STM32 ahora "sabe" qué tan viejo es su propio sistema circulatorio. En lugar de permitir que el desgaste de la turbina cause pérdidas progresivas del 0.3% o 0.4% en las ventas de la gasera (miles de dólares al año), el algoritmo de interpolación lineal ajusta la metrología milisegundo a milisegundo en tiempo real. Cuando la erosión mecánica finalmente es tan severa que el algoritmo ya no puede compensarla sin riesgo de violar la ley (ej. 1 Millón de Litros), la máquina activa voluntariamente una bandera de Mantenimiento Predictivo, enviando un reporte por AWS antes de que la estación pierda un solo centavo. Tu hardware ahora combate a la entropía física usando matemáticas puras.

📝 Resumen del Día