ParamManagerScripts/backend/script_groups/XML Parser to SCL/.doc/readme_x0.md

4.1 KiB

Para generar un resultado directo desde un xml a 1 scl

C:/Users/migue/miniconda3/envs/tia_scripting/python.exe "d:/Proyectos/Scripts/ParamManagerScripts/backend/script_groups/XML Parser to SCL/x0_main.py" --plc-dir "D:\Trabajo\VM\45 - HENKEL - VM Auto Changeover\ExportTia" --source-xml "D:\Trabajo\VM\45 - HENKEL - VM Auto Changeover\ExportTia\PLC_TL27_Q1\ProgramBlocks_XML\FB HMI Interlock.xml" --dest-scl "D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\XML Parser to SCL\.example\FB_HMI_Interlock.scl"

Flujo de Trabajo para Resolución de Errores de Conversión

1. Identificación de Errores

Comando para buscar errores en SCL generados:

# Buscar TODOs sin implementar
grep -r "TODO:" *.scl

# Buscar líneas duplicadas P_TRIG
grep -r "P_TRIG.*- Mem:" *.scl

# Buscar acceso directo a memoria
grep -r "%DB[0-9]*\.DBX[0-9]*" *.scl

# Buscar instancias no declaradas
grep -r "#.*_INSTANCE_.*(" *.scl

2. Categorización de Errores Comunes

A. Errores de Edge Detection (P_TRIG/N_TRIG)

  • Síntoma: Líneas duplicadas con comentarios // P_TRIG(...) - Mem: "variable"
  • Causa: El procesador de Coils genera tanto la asignación como el comentario
  • Solución: Crear procesador específico para edge detection o mejorar process_coil.py

B. Instancias de Timer No Declaradas

  • Síntoma: #TP_INSTANCE_X(...); // TODO: Declarar #TP_INSTANCE_X : TP;
  • Causa: Los timers temporales no se declaran automáticamente en VAR_TEMP
  • Solución: Mejorar process_timer.py para auto-declarar instancias temporales

C. Acceso Directo a Memoria

  • Síntoma: %DB960.DBX56.1 := ...
  • Causa: El symbol_manager no resuelve direcciones absolutas a variables simbólicas
  • Solución: Mejorar symbol_manager.py para mapear direcciones absolutas

D. Lógica Agrupada Incorrecta

  • Síntoma: Lógica compleja en una sola línea, difícil de leer
  • Causa: El agrupador de IFs es demasiado agresivo
  • Solución: Ajustar process_group_ifs en x2_process.py

3. Metodología de Corrección

Paso 1: Análisis de Archivos SCL Problemáticos

# Revisar archivo específico
python x0_main.py --source-xml "path/to/file.xml" --dest-scl "output.scl"
# Examinar output.scl para identificar patrones de error

Paso 2: Identificar el Procesador Responsable

  • Coils: processors/process_coil.py - Para asignaciones y edge detection
  • Timers: processors/process_timer.py - Para TON, TOF, TP
  • Contacts: processors/process_contact.py - Para lectura de variables
  • Direcciones de memoria: processors/symbol_manager.py - Para resolución simbólica

Paso 3: Implementar Corrección

  1. Crear nuevo procesador (si es necesario):

    # processors/process_ptrig.py
    def get_processor_info():
        return {
            "type_name": "ptrig",
            "processor_func": process_ptrig_instruction,
            "priority": 5  # Ejecutar antes que Coils
        }
    
  2. Mejorar procesador existente:

    • Agregar lógica específica para el caso problemático
    • Actualizar manejo de dependencias
    • Mejorar almacenamiento en sympy_map

Paso 4: Validación

# Re-ejecutar conversión
python x0_main.py --source-xml "problema.xml" --dest-scl "test.scl"

# Verificar que el error se resolvió
grep -c "TODO:" test.scl  # Debe ser 0
grep -c "P_TRIG.*- Mem:" test.scl  # Debe ser 0

4. Patrones de Testing

A. Testing Incremental

# Test con archivo pequeño conocido
python x0_main.py --source-xml "simple_test.xml" --dest-scl "simple_out.scl"

# Test con archivo complejo original
python x0_main.py --source-xml "complex_original.xml" --dest-scl "complex_out.scl"

B. Comparación de Resultados

# Comparar antes/después
diff old_output.scl new_output.scl

5. Herramientas de Debugging

A. Activar Debug en x2_process.py

# Agregar prints de debug en procesadores específicos
print(f"DEBUG: Processing {instr_type} - UID: {instr_uid}")

B. Revisar Logs de Conversión

# Buscar patrones en logs
grep "ERROR\|WARNING\|TODO" log_*.txt