# 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