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

122 lines
4.1 KiB
Markdown

Para generar un resultado directo desde un xml a 1 scl
```bash
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:**
```bash
# 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**
```bash
# 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):
```python
# 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**
```bash
# 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**
```bash
# 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**
```bash
# Comparar antes/después
diff old_output.scl new_output.scl
```
### 5. Herramientas de Debugging
#### **A. Activar Debug en x2_process.py**
```python
# Agregar prints de debug en procesadores específicos
print(f"DEBUG: Processing {instr_type} - UID: {instr_uid}")
```
#### **B. Revisar Logs de Conversión**
```bash
# Buscar patrones en logs
grep "ERROR\|WARNING\|TODO" log_*.txt
```