# Convertidor LAD a Pseudocódigo Estructurado

## Descripción

Este proyecto proporciona herramientas para convertir código LAD (Ladder Diagram) de TwinCAT a pseudocódigo estructurado compatible con IEC61131-3. El convertidor mantiene la semántica original del código LAD mientras lo transforma a un formato más legible y estructurado.

## Características

- ✅ **Parsing completo de LAD**: Analiza la estructura completa de archivos `.EXP` de TwinCAT
- ✅ **Conversión semántica**: Mantiene la lógica original del diagrama ladder
- ✅ **Formato estructurado**: Genera código pseudo estructurado con IF-THEN-END_IF
- ✅ **Manejo de contactos**: Convierte contactos normales y negados correctamente
- ✅ **Function blocks**: Identifica y convierte llamadas a bloques de función
- ✅ **Operadores matemáticos**: Maneja operaciones aritméticas y lógicas
- ✅ **Comentarios**: Preserva comentarios de las redes originales

## Archivos del Proyecto

### Convertidores Principales

1. **`simple_lad_converter.py`** - Convertidor simplificado y robusto (recomendado)
2. **`lad_to_pseudocode_converter.py`** - Convertidor básico inicial
3. **`lad_to_pseudocode_converter_enhanced.py`** - Versión avanzada con más características

### Archivos de Prueba

- **`test_simple.py`** - Script de prueba para el convertidor simple
- **`ejemplo_conversion.py`** - Ejemplo de uso del convertidor básico
- **`test_enhanced_converter.py`** - Prueba para el convertidor avanzado

## Uso Rápido

### Método Simple (Recomendado)

```bash
python test_simple.py
```

Este comando procesará el archivo `.example/INPUT.EXP` y generará `output_simple.txt` con el código convertido.

### Uso Directo del Convertidor

```python
from simple_lad_converter import SimpleLadConverter

converter = SimpleLadConverter()
converter.parse_file("mi_archivo.EXP")
structured_code = converter.save_to_file("salida.txt")
```

### Línea de Comandos

```bash
python lad_to_pseudocode_converter.py archivo_entrada.EXP archivo_salida.txt
```

## Estructura del Código LAD Soportada

El convertidor puede procesar las siguientes estructuras de TwinCAT:

### Elementos LAD Reconocidos

- `_NETWORK` - Inicio de red
- `_LD_ASSIGN` - Asignaciones
- `_LD_CONTACT` - Contactos (entradas)
- `_LD_AND` / `_LD_OR` - Operaciones lógicas
- `_FUNCTIONBLOCK` - Bloques de función
- `_OPERATOR` - Operadores matemáticos
- `_COMMENT` / `_END_COMMENT` - Comentarios
- `_OUTPUT` - Variables de salida

### Operadores Soportados

- **Aritméticos**: ADD, SUB, MUL, DIV
- **Lógicos**: AND, OR
- **Comparación**: LT, GT, EQ
- **Especiales**: SEL, MOVE

## Ejemplo de Conversión

### Código LAD Original
```
_NETWORK
_COMMENT
Verificación de presión CO2
_END_COMMENT
_LD_ASSIGN
_LD_CONTACT
DI_Air_InletPress_OK
_NEGATIV
_FUNCTIONBLOCK
mAirPressOk
_OUTPUT
gInLinePressAirOk
```

### Código Estructurado Generado
```
// Red 5
// Verificación de presión CO2
IF NOT DI_Air_InletPress_OK THEN
    gInLinePressAirOk := mAirPressOk();
END_IF;
```

## Estructura del Archivo de Salida

El código generado sigue esta estructura:

```
// Código pseudo estructurado generado desde LAD TwinCAT
// Compatible con IEC61131-3
PROGRAM Input_Converted

    // Red 1
    IF condicion1 AND condicion2 THEN
        variable_salida := funcion_bloque(parametros);
    END_IF;
    
    // Red 2
    variable := operando1 ADD operando2;
    
    // Red N...

END_PROGRAM
```

## Resultados de la Conversión

El convertidor ha procesado exitosamente el archivo `INPUT.EXP` que contiene:

- **86 redes LAD** en total
- **Múltiples tipos de elementos**: contactos, function blocks, operadores
- **Preservación de comentarios** originales
- **Conversión correcta de lógica condicional** con IF-THEN-END_IF

### Estadísticas del Ejemplo

- Archivo de entrada: `.example/INPUT.EXP` (4,611 líneas)
- Redes procesadas: 86
- Archivo de salida: ~235 líneas de código estructurado
- Reducción de complejidad: ~95%

## Ventajas del Código Convertido

1. **Legibilidad**: Más fácil de leer que el formato LAD textual
2. **Mantenibilidad**: Estructura clara con comentarios preservados
3. **Debugging**: Lógica condicional explícita
4. **Documentación**: Comentarios de red integrados
5. **Portabilidad**: Formato pseudo-código universal

## Limitaciones Conocidas

- Algunos parámetros internos pueden aparecer como `_POSITIV`, `_NEGATIV`
- Estructuras complejas de LAD pueden requerir revisión manual
- El convertidor es específico para el formato de TwinCAT

## Desarrollo Futuro

- [ ] Mejorar el parsing de parámetros de function blocks
- [ ] Añadir soporte para más tipos de operadores
- [ ] Implementar validación de sintaxis
- [ ] Crear interfaz gráfica para conversión
- [ ] Soporte para otros formatos de PLC

## Contribuciones

Este convertidor fue desarrollado para facilitar el análisis y mantenimiento de código LAD en proyectos de automatización industrial. Las contribuciones y mejoras son bienvenidas.

---

**Nota**: Este es un proyecto de código abierto para ayudar en la migración y análisis de código LAD de TwinCAT a formatos más estructurados. 