136 lines
4.4 KiB
Markdown
136 lines
4.4 KiB
Markdown
# 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
|
|
<!-- 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
|
|
```xml
|
|
<!-- 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:
|
|
```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
|