DÍA 296 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

Inductancia Mutua y Crosstalk (Diafonía)

Cuando la corriente alterna o un pulso PWM viaja por un cable de potencia, genera un campo magnético a su alrededor. Si un cable de señal analógica corre paralelo a este cable de potencia, la Ley de Faraday dicta que se inducirá un voltaje parásito en él: $V_{noise} = -M \frac{di}{dt}$, donde $M$ es la inductancia mutua. Mientras más cerca y paralelos estén los cables, mayor será la transferencia de ruido (Crosstalk).

La Defensa Mecánica: STP (Shielded Twisted Pair)

Un cable de instrumentación industrial no es un par de hilos rectos. Utiliza dos estrategias mecánicas simultáneas para aniquilar el ruido electromagnético:

  1. Par Trenzado (Twisted Pair): Los cables A y B (RS-485) o los cables de 4-20mA se trenzan físicamente. Esto obliga al campo magnético externo a inducir ruido positivo en una vuelta de la trenza, y ruido negativo en la siguiente vuelta. El resultado es que el ruido se cancela a sí mismo matemáticamente. (Mitiga campos magnéticos bajos).
  2. Malla de Blindaje (Foil/Braid Shield): El par trenzado se envuelve en papel de aluminio (Foil) o en una malla de cobre estañado (Braid). Esta malla actúa como una Jaula de Faraday. Las ondas de radiofrecuencia (RF) impactan la malla y se derivan a tierra antes de tocar los cables interiores. (Mitiga campos eléctricos altos).
ANATOMÍA DEL CABLE INDUSTRIAL Y RUTEO DE CONDUCTOS CABLE STP (SHIELDED TWISTED PAIR) - SECCIÓN TRANSVERSAL Chaqueta PVC Malla Trenzada (EMI Baja frec.) Foil Aluminio (EMI Alta frec.) Drain Wire (Al Chasis GND) RS-485 (A) RS-485 (B) REGLAS DE SEGREGACIÓN EN CONDUCTOS (TRAYS / CONDUIT) INCORRECTO (Peligro Crosstalk) 220V / 24V POTENCIA 4-20mA SENSOR DATA Acoplamiento Magnético Inducido CORRECTO (Geometría Segura) D > 15 cm Bandejas Separadas Cruce a 90° (Cancela Inducción)

⚙️ Procedimiento Paso a Paso (Instalación Física)

Paso 1: Elección del Cable.
Nunca uses cable UTP (Cable de red normal sin blindaje) para sensores industriales o RS-485 en ambientes con motores. Exige cable de instrumentación STP (Shielded Twisted Pair) o FTP. Estos cables poseen un alambre de cobre desnudo interno en contacto con el papel de aluminio, conocido como Drain Wire (Hilo de Drenaje).

Paso 2: Conexión de la Pantalla (Ground Loop Kills).
Tomas el Drain Wire del cable del sensor y lo atornillas rígidamente al borne de la Tierra de Chasis (PE) en el gabinete de tu Despachador. ¡ADVERTENCIA! Cuando el cable llegue al sensor físico (a 5 metros de distancia), NO conectes el blindaje a la carcasa del sensor. Corta el Drain Wire y aíslalo con cinta termo retráctil. Si lo conectas en ambos extremos, la diferencia de potencial de la tierra entre la bomba y la tarjeta creará un bucle de corriente masiva (Ground Loop) que quemará el blindaje por dentro.

Paso 3: Segregación en Conductos (Zoning).
Eléctricamente, clasifica tus cables en "Sucios" (24V, 120V, cables al relé del motor) y "Sensibles" (RS-485, ADC 4-20mA, I2C Display). Está terminantemente prohibido pasarlos por el mismo tubo conduit PVC o metálico. Debes tender dos ductos separados por al menos 15 a 30 centímetros de aire. Si por razones arquitectónicas los cables "sucios" y "sensibles" tienen que cruzarse, oblígalos a cruzarse en un ángulo exacto de 90 grados. Al ser perpendiculares, el acoplamiento magnético se vuelve matemáticamente cero.

💻 Firmware: La Última Defensa de Datos (CRC-16 Modbus)

A pesar del mejor cable STP y los ductos segregados, si un rayo cae a 100 metros de la gasolinera, la radiación inducirá un pico que podría alterar un "0" por un "1" en la transmisión de red RS-485. Por ello, el software no debe confiar en los bytes crudos. Implementamos un Control de Redundancia Cíclica (CRC-16). Si el hardware pierde un bit, el software descarta el paquete entero, protegiendo las finanzas del despacho de gas.


/**
 * @file modbus_crc.c
 * @brief Algoritmo CRC-16 para integridad de datos en buses RS-485 expuestos a EMI
 */

#include <stdint.h>
#include <stdbool.h>

// =========================================================================
// RUTINA DE VALIDACIÓN MATEMÁTICA (CRC-16 MODBUS)
// =========================================================================
/**
 * @brief Calcula el CRC-16 estandarizado para Modbus RTU.
 * @param buffer: Puntero al arreglo de bytes recibidos por el cable blindado.
 * @param length: Cantidad de bytes en el mensaje (excluyendo el CRC adjunto).
 * @retval uint16_t: El valor CRC calculado que debe coincidir con el enviado.
 */
uint16_t Calculate_Modbus_CRC16(const uint8_t *buffer, uint16_t length) {
    uint16_t crc = 0xFFFF; // El polinomio Modbus inicializa en FFFF
    
    for (uint16_t pos = 0; pos < length; pos++) {
        crc ^= (uint16_t)buffer[pos];          // XOR byte en el bit menos significativo de CRC
        
        for (uint8_t i = 8; i != 0; i--) {     // Repetir por los 8 bits del byte
            if ((crc & 0x0001) != 0) {         // Si el LSB es 1
                crc >>= 1;                     // Shift a la derecha y XOR con polinomio A001
                crc ^= 0xA001;
            }
            else {                             // Si LSB es 0
                crc >>= 1;                     // Solo shift a la derecha
            }
        }
    }
    // Nota: El protocolo Modbus transmite primero el byte Bajo y luego el Alto (Little Endian).
    return crc;  
}

// =========================================================================
// VALIDACIÓN EN LA CAPA DE APLICACIÓN
// =========================================================================
/**
 * @brief Valida un paquete RS-485 recibido desde la tarjeta de control.
 */
bool Validate_Incoming_RS485_Packet(const uint8_t *rx_packet, uint16_t total_length) {
    
    // Si el paquete es muy corto, ignorarlo (Posible Glitch EMI cortado)
    if (total_length < 4) return false; 
    
    // Los últimos dos bytes del paquete son el CRC inyectado por el emisor
    uint16_t received_crc = (rx_packet[total_length - 1] << 8) | rx_packet[total_length - 2];
    
    // Calculamos el CRC del payload (todos los bytes excepto los 2 últimos)
    uint16_t calculated_crc = Calculate_Modbus_CRC16(rx_packet, total_length - 2);
    
    // Veredicto
    if (calculated_crc == received_crc) {
        // [V] La Jaula de Faraday del cable funcionó, los datos son puros.
        return true;
    } else {
        // [X] Fallo de integridad. El ruido electromagnético volteó un bit.
        // El software rechaza el paquete y solicita retransmisión.
        return false;
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Inmunidad Radiada de Larga Distancia e Integridad en Comunicación Dúplex.

El diseño de tu placa base está blindado, pero la información crucial de tu proyecto viaja a la intemperie. La lectura del sensor 4-20mA (que define cuánta masa de gas está fluyendo por la tubería) y el bus RS-485 (que envía las transacciones de cobro a la computadora administrativa de la gasera) viajan por cables de hasta 15 metros. En ese trayecto, pasan junto a motores de compresores y balastros de iluminación fluorescentes. Un cable estándar absorbería ese "Crosstalk" magnético instantáneamente.

Al exigir cable de grado de instrumentación **STP (Shielded Twisted Pair)**, el trenzado interno aniquila el ruido de baja frecuencia (inducción de 60Hz), y la malla de aluminio (Foil Shield) bloquea los picos de radiofrecuencia. Además, como Arquitecto, has impuesto la regla de oro: atornillar el **Drain Wire** a la tierra física (PE) únicamente en el lado de tu gabinete de control, evitando los catastróficos bucles de tierra. Y sabiendo que ningún blindaje físico es un 100% perfecto bajo el asedio electromagnético constante, tu rutina **CRC-16 en Firmware** audita criptográficamente cada byte, garantizando que tu STM32 jamás cobre un litro de gas basándose en una trama corrupta por ruido industrial.

📝 Resumen del Día