# 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 ```xml MotorControl_01 MotorControl_02 ``` - 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 ```xml Test AAAAAA Test BBBBBB ``` - 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: ```json { "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: ```bash 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