172 lines
5.0 KiB
Markdown
172 lines
5.0 KiB
Markdown
# 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. |