ParamManagerScripts/backend/script_groups/XML Parser to SCL/HASH_DETECTION.md

4.4 KiB

Detección de Cambios por Hash SHA256

¿Qué es y por qué es importante?

El sistema ahora utiliza hash SHA256 para detectar cambios en archivos XML, complementando el método tradicional basado en tiempo de modificación y tamaño de archivo.

Problema resuelto

Antes (método tradicional)

  • Solo verificaba: tiempo de modificación + tamaño de archivo
  • Problema: Si un archivo XML cambia pero mantiene el mismo tamaño y tiempo, el sistema NO regeneraba los archivos JSON/SCL
  • Resultado: Cambios en el XML no se reflejaban en el código SCL generado

Ahora (método con hash)

  • Verifica: hash SHA256 del contenido completo del archivo
  • Ventaja: Detecta CUALQUIER cambio en el contenido, sin importar tamaño o tiempo
  • Resultado: Regeneración precisa solo cuando el contenido realmente cambió

Casos donde el hash es crucial

Caso 1: Cambios sutiles

<!-- Antes -->
<Name>MotorControl_01</Name>

<!-- Después -->  
<Name>MotorControl_02</Name>
  • Mismo tamaño de archivo
  • Posiblemente mismo tiempo (si se restaura)
  • Método tradicional: NO detecta cambio
  • Método hash: SÍ detecta cambio

Caso 2: Reemplazo de contenido

<!-- Antes -->
<Comment>Test AAAAAA</Comment>

<!-- Después -->
<Comment>Test BBBBBB</Comment>
  • Exactamente el mismo tamaño
  • Método tradicional: NO detecta cambio
  • Método hash: SÍ detecta cambio

Implementación

Archivos modificados

  1. x0_main.py:

    • Añadida función calculate_file_hash()
    • Modificada función check_skip_status() para usar hash como prioridad
    • Logging mejorado para mostrar qué método de detección se usa
  2. x1_to_json.py:

    • Añadida función calculate_file_hash()
    • Modificada función convert_xml_to_json() para calcular y guardar hash
    • Nuevo campo source_xml_hash en archivos JSON
  3. x2_process.py:

    • Modificado para preservar el campo source_xml_hash en JSONs procesados

Nuevo campo en JSON

Los archivos JSON ahora incluyen:

{
    "block_name": "FC Pack Motor 71",
    "source_xml_mod_time": 1755944794.1680913,
    "source_xml_size": 32969,
    "source_xml_hash": "a7f5d2e8c4b6a9f3..."  // <-- NUEVO
}

Comportamiento del sistema

Prioridad de verificación

  1. Primera prioridad: Comparación por hash SHA256

    • Si el hash coincide → saltar procesamiento
    • Si el hash difiere → regenerar archivos
  2. Fallback: Método tradicional (tiempo + tamaño)

    • Se usa si no hay hash almacenado en el JSON
    • Mantiene compatibilidad con archivos JSON existentes

Logging mejorado

El sistema ahora muestra claramente qué método usa:

✓ Hash coincide para FC_Motor_71.xml - Saltando x1/x2
✗ Hash diferente para FC_Motor_72.xml - Regenerando  
✓ Tiempo/tamaño coinciden para FC_Motor_73.xml - Saltando x1/x2 (método legacy)

Beneficios

Para el usuario

  • Precisión: No se pierden cambios por limitaciones del método tradicional
  • Eficiencia: No regenera archivos que realmente no cambiaron
  • Confiabilidad: Detecta modificaciones sutiles pero importantes

Para el desarrollo

  • Compatibilidad: Los archivos JSON existentes siguen funcionando
  • Transparencia: Logs claros sobre qué se procesa y por qué
  • Robustez: Fallback automático al método tradicional si es necesario

Casos de uso típicos

Exportación desde TIA Portal

Cuando exportas un proyecto de TIA Portal varias veces:

  1. Primera exportación: Se generan todos los JSON/SCL
  2. Segunda exportación (sin cambios): Se saltan todos los archivos (hash coincide)
  3. Tercera exportación (con cambios menores): Solo se regeneran los archivos modificados

Modificaciones manuales

Si modificas manualmente un XML:

  • El hash cambia instantáneamente
  • El sistema regenera automáticamente los archivos derivados
  • No importa si el tamaño o tiempo parecen iguales

Testing

Se incluyen scripts de prueba que demuestran la funcionalidad:

  • test_hash_detection.py: Demostración básica
  • test_hash_edge_cases.py: Casos donde el hash es superior al método tradicional

Para ejecutar:

python test_hash_detection.py
python test_hash_edge_cases.py

Migración automática

Los archivos JSON existentes seguirán funcionando:

  • Sin campo source_xml_hash: usa método tradicional
  • Con campo source_xml_hash: usa método de hash (más preciso)
  • La próxima regeneración añadirá automáticamente el hash