Ir al contenido

← Todas las funcionalidades

Monitorización textil (tejeduría)ESP32 PLCHTTPResiliencia / OTA

Actualizar el firmware del PLC desde el navegador con un servidor web embebido

Las actualizaciones OTA de firmware por servidor web convierten un trabajo de escalera y portátil en una subida desde el navegador. Cuando hay PLC ESP32 junto a cada máquina de la planta, reflashear por USB significa subirse a cada armario. Este ejemplo embebe un servidor web con página de estado, un endpoint JSON y una ruta POST /update que graba un .bin compilado y reinicia — exactamente como se usa en un despliegue real de monitorización de máquinas textiles en dos plantas.

Tres endpoints, un servidor diminuto

GET / sirve una página de estado legible con uptime, heap libre y el formulario de subida de firmware. GET /status devuelve los mismos datos más todas las entradas digitales como JSON — útil para scripts de shell y para que el concentrador Node-RED lo consulte periódicamente. POST /update recibe el propio binario de firmware. Todo el servidor añade una única llamada a server.handleClient() en el loop, con un coste de apenas microsegundos por iteración.

Cómo funciona la subida OTA

La ruta /update usa dos callbacks: el segundo recibe el fichero en fragmentos y los pasa a Update.begin(), Update.write() y Update.end() del core del ESP32; el primero envía OK o FAIL al terminar la transferencia y reinicia el PLC con el firmware nuevo. Exporta el binario compilado desde el IDE de Arduino con "Export compiled binary" y sube el .bin desde cualquier navegador.

Por qué importa en producción

El firmware itera rápido en un despliegue real — un campo XML nuevo que parsear, un ajuste del periodo de snapshot. Con OTA, desplegar un arreglo a una flota de PLC lleva minutos desde una mesa en lugar de un paseo por la planta con escalera y portátil. Si una actualización falla a mitad de transferencia, Update.hasError() lo reporta y el PLC sigue ejecutando la imagen antigua.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el ESP32 PLC — cópialo libremente:

void setupOTA() {
  server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", Update.hasError() ? "FAIL" : "OK - rebooting");
      delay(1000);
      ESP.restart();                          // boots with the new firmware
    }, []() {
      HTTPUpload &up = server.upload();
      if (up.status == UPLOAD_FILE_START) {
        Serial.println("OTA: receiving " + up.filename);
        if (!Update.begin(UPDATE_SIZE_UNKNOWN)) Update.printError(Serial);
      } else if (up.status == UPLOAD_FILE_WRITE) {
        if (Update.write(up.buf, up.currentSize) != up.currentSize)
          Update.printError(Serial);
      } else if (up.status == UPLOAD_FILE_END) {
        if (Update.end(true))
          Serial.println("OTA OK: " + String(up.totalSize) + " bytes");
        else
          Update.printError(Serial);
      }
    });
}

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Es seguro dejar el endpoint OTA abierto en la red de planta?

Mantén los PLC en una VLAN aislada y añade autenticación HTTP básica a la ruta /update en producción. La red de planta nunca debería ser alcanzable desde fuera de las instalaciones.

¿Qué pasa si la subida se interrumpe a mitad?

Update.end() no llega a ejecutarse, así que la imagen nueva no se activa y el PLC continúa con el firmware actual. Simplemente reintenta la subida.

¿Puedo lanzar diagnósticos sin el navegador?

Sí. El mismo despliegue lo combina con comandos remotos MQTT, de modo que una consola Node-RED puede pedir información del sistema o listados de la SD a toda la flota, mientras el servidor web cubre el trabajo por dispositivo, como el flasheo.

Funcionalidades relacionadas