Reinicios por watchdog y errores CRC en un nodo Modbus RTU con registro en flash
Un nodo de adquisición para el monitoreo de vibración de una bomba usa un MCU Cortex-M0+ a 48 MHz con FreeRTOS. Conviven tres tareas: muestreo del ADC de 12 bits por DMA a 1 kHz (prioridad alta), esclavo Modbus RTU por UART a 19200 baudios sobre RS-485 (prioridad media) y registro de bloques de 4 kB en una memoria flash SPI (prioridad baja). El bus recorre 900 m hasta el maestro, con 12 nodos conectados mediante derivaciones de 3 m y resistencias de 120 Ω en los nodos 1 y 12. El watchdog tiene un timeout de 200 ms y solo se recarga desde la tarea de registro. El borrado de un sector de flash tarda 45 ms y cada página de 256 B tarda 4 ms; ese ciclo se ejecuta en una sección crítica con las interrupciones deshabilitadas. Síntomas: el nodo se reinicia cada 40 s aproximadamente; el maestro registra 2 % de tramas con error de CRC, concentradas en los nodos 4 y 5, que se alimentan de una fuente de 24 V distinta; y al deshabilitar el registro en flash los reinicios desaparecen.
1. Explique por qué se reinicia el nodo y proponga la corrección de firmware, con un cálculo de tiempos que respalde el diagnóstico.
Read the worked answer
Diagnóstico. El ciclo de registro consume 45 ms de borrado más 16 páginas × 4 ms = 64 ms, es decir, ~109 ms nominales. Ese ciclo se ejecuta en una sección crítica con interrupciones deshabilitadas y, además, es la única tarea que recarga el watchdog de 200 ms. Al sumar la atención de la trama Modbus y la planificación, el peor caso supera los 200 ms y el MCU se reinicia. La evidencia es concluyente: al deshabilitar el registro desaparecen los reinicios.
Efectos secundarios del mismo defecto. Con la UART a 19200 baudios cada carácter tarda 11/19200 ≈ 573 µs, y una trama de 8 bytes llega en ~4.6 ms. Una ventana de 45 ms sin interrupciones equivale a 78 caracteres: el receptor se desborda con seguridad y las tramas se pierden o se corrompen.
Corrección de arquitectura:
- Nunca deshabilitar interrupciones durante el borrado; usar DMA para el SPI y una máquina de estados no bloqueante.
- Mover el registro a una tarea dedicada de prioridad baja que se bloquee en el driver; los datos llegan por un ring buffer en RAM.
- Recargar el watchdog desde una tarea de alta prioridad que verifique latidos (heartbeat) de las demás, o usar watchdog de ventana; el registro no debe ser el único que lo alimenta.
- Si se requiere atomicidad, deshabilitar interrupciones solo durante el comando de escritura (unos pocos µs), no durante la espera.
Verificación: sacar por GPIO un pulso al inicio y al final del registro y medir el peor caso con analizador lógico; el objetivo es que ninguna ventana sin interrupciones supere 50 µs y que la recarga del watchdog sea menor al 50 % del timeout.
2. Diagnostique los errores CRC concentrados en los nodos 4 y 5 y proponga correcciones de capa física.
Read the worked answer
Lo que se puede descartar. A 19200 baudios el bit dura 52 µs; una derivación de 3 m introduce una reflexión con retardo de ida y vuelta de ~30 ns, tres órdenes de magnitud menor que el tiempo de bit. Las derivaciones cortas no explican el 2 % de CRC. La terminación de 120 Ω en los extremos 1 y 12 también es correcta (carga de 60 Ω vista por el driver), siempre que no haya terminaciones adicionales ocultas.
Causa más probable. Los nodos 4 y 5 son los únicos alimentados por otra fuente de 24 V, de modo que su referencia de 0 V flota respecto a la del maestro. Un desplazamiento de 2.5 V más picos de 15 V durante la conmutación del variador sale del rango de modo común del receptor RS-485 (−7 V a +12 V) y el receptor entrega niveles indefinidos justo en esos nodos. El patrón -siempre los mismos dos nodos, siempre con carga inductiva cerca- apunta a un problema de referencia, no de reflexión.
Correcciones, en orden de eficacia:
- Aislar galvánicamente los transceptores de los nodos 4 y 5 (aislador digital + transceptor aislado), con lo que el modo común deja de importar.
- Tender un conductor de referencia común entre todos los nodos y el maestro y unir las tierras de ambas fuentes en un solo punto.
- Verificar la polarización de falla: dos resistencias de 560 Ω a 5 V y a 0 V en un solo punto del bus, comprobando que el maestro no las tenga ya (sobrecarga del driver).
- Par trenzado con malla conectada a tierra en un solo extremo; separar ≥ 30 cm del cableado de potencia y cruzar a 90°.
Verificación: medir con osciloscopio diferencial la tensión diferencial y el modo común en los extremos del bus con el variador en marcha, y repetir la prueba de 24 h de tráfico contando CRC.
3. El muestreo corre a 1 kHz y el esclavo Modbus comparte CPU. ¿Qué condiciones debe cumplir el firmware para no perder muestras ni tramas? Justifique con tiempos.
Read the worked answer
Presupuesto de tiempo. El periodo de muestreo es 1 ms. Una trama de 8 bytes a 19200 baudios ocupa 8 × 11 / 19200 = 4.58 ms, es decir, la recepción es más lenta que el periodo de muestreo: por tanto, la UART debe trabajar por interrupción o DMA y el parser solo debe copiar bytes a un buffer, nunca procesar la trama completa dentro de la ISR de recepción.
Condiciones mínimas:
- El ADC por DMA no consume CPU más que en el callback; el procesamiento por muestra (filtro, RMS) debe acotarse a menos de 300 µs para dejar margen al 1 ms.
- El tiempo de respuesta Modbus exige que el esclavo conteste dentro del timeout del maestro, típicamente cientos de ms; eso es holgado, pero solo si la tarea de registro no bloquea la CPU. Con la corrección anterior, el registro espera por DMA y libera el procesador.
- La sección crítica máxima debe ser de decenas de µs, muy por debajo del tiempo de un carácter (573 µs), para no perder bytes.
- El watchdog (200 ms) debe recargarse desde una tarea de alta prioridad con verificación de latidos, de modo que un bloqueo del registro provoque un reinicio controlado y no una pérdida silenciosa.
Verificación: prueba de 24 h con un maestro generando tráfico al 80 % de ocupación y una fuente de vibración conocida; se cuentan muestras perdidas por el contador de DMA y tramas fallidas en el maestro. Criterio de aceptación: cero muestras perdidas y menos de 1 error CRC por millón de tramas, con el peor caso de sección crítica medido en el osciloscopio.