4.4 KiB
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
-
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
- Añadida función
-
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
- Añadida función
-
x2_process.py
:- Modificado para preservar el campo
source_xml_hash
en JSONs procesados
- Modificado para preservar el campo
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
-
Primera prioridad: Comparación por hash SHA256
- Si el hash coincide → saltar procesamiento
- Si el hash difiere → regenerar archivos
-
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:
- Primera exportación: Se generan todos los JSON/SCL
- Segunda exportación (sin cambios): Se saltan todos los archivos (hash coincide)
- 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ásicatest_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