ParamManagerScripts/backend/script_groups/TwinCat/test_arraytoreal.py

141 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
# Agregar el directorio padre al path
sys.path.append('.')
# Importar el convertidor
from x1_lad_converter import SimpleLadConverter
def test_arraytoreal():
"""Probar específicamente ARRAYTOREAL.EXP para verificar preservación de indentación"""
print("=== TEST: ARRAYTOREAL.EXP - Preservación de indentación ST ===")
print("-" * 60)
# Buscar el archivo
possible_paths = [
"ExportTwinCat/ARRAYTOREAL.EXP",
"../ExportTwinCat/ARRAYTOREAL.EXP",
"../../ExportTwinCat/ARRAYTOREAL.EXP",
"C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/ExportTwinCat/ARRAYTOREAL.EXP"
]
test_file = None
for path in possible_paths:
if os.path.exists(path):
test_file = path
break
if test_file is None:
print(f"❌ Error: No se encontró ARRAYTOREAL.EXP")
return
print(f"✓ Archivo encontrado: {test_file}")
print("-" * 60)
# Leer archivo original para mostrar indentación
print("📄 CÓDIGO ORIGINAL:")
with open(test_file, 'r', encoding='utf-8', errors='ignore') as f:
original_lines = f.readlines()
# Mostrar solo las líneas de código ST (después de (* @END_DECLARATION := '0' *))
st_start = False
for i, line in enumerate(original_lines):
if "@END_DECLARATION" in line:
st_start = True
continue
if st_start and line.strip() and not line.strip().startswith("END_FUNCTION"):
print(f" {i+1:2d}: '{line.rstrip()}'")
print("-" * 60)
# Crear convertidor
converter = SimpleLadConverter()
# Parsear archivo
print("🔍 PARSEANDO ARCHIVO...")
converter.parse_file(test_file)
print(f"\n📊 INFORMACIÓN DETECTADA:")
print(f" ✓ Tipo: {getattr(converter, 'program_type', 'PROGRAM')}")
print(f" ✓ Nombre: {converter.program_name}")
print(f" ✓ Path: {converter.program_path}")
print(f" ✓ Variables: {list(converter.var_sections.keys())}")
print(f" ✓ Código ST: {'' if converter.st_main_code else 'No'}")
if converter.st_main_code:
print(f"\n📝 CÓDIGO ST EXTRAÍDO ({len(converter.st_main_code)} caracteres):")
for i, line in enumerate(converter.st_main_code.split('\n')[:10], 1):
print(f" {i:2d}: '{line}'")
# Generar código SCL
print(f"\n📝 GENERANDO CÓDIGO SCL...")
scl_code = converter.convert_to_structured()
# Guardar archivo de prueba
output_file = "test_arraytoreal_indent.scl"
with open(output_file, 'w', encoding='utf-8') as f:
f.write(scl_code)
print(f" ✓ Guardado en: {output_file}")
# Mostrar código SCL generado
print(f"\n📄 CÓDIGO SCL GENERADO:")
lines = scl_code.split('\n')
# Encontrar línea donde empieza el código ST
st_start_line = -1
for i, line in enumerate(lines):
if "Código ST original" in line:
st_start_line = i
break
if st_start_line > -1:
# Mostrar desde el código ST hasta el final de la función
for i in range(st_start_line, min(st_start_line + 20, len(lines))):
if i < len(lines):
line = lines[i]
if line.strip() and ("END_FUNCTION" in line or "END_PROGRAM" in line):
print(f" {i+1:2d}: {line}")
break
print(f" {i+1:2d}: {line}")
# Verificar preservación de indentación
print(f"\n🔍 VERIFICANDO PRESERVACIÓN DE INDENTACIÓN:")
if converter.st_main_code:
original_lines = converter.st_main_code.split('\n')
scl_lines = scl_code.split('\n')
# Encontrar líneas con indentación en el original
original_indented = []
for line in original_lines:
if line.startswith('\t') or line.startswith(' '):
original_indented.append(line)
# Verificar que se preserven en el SCL
if original_indented:
print(f" 📋 Líneas con indentación original: {len(original_indented)}")
print(f" Ejemplo: '{original_indented[0]}'" if original_indented else "")
# Verificar si aparecen en el SCL preservadas
preserved_count = 0
for orig_line in original_indented:
for scl_line in scl_lines:
if orig_line.strip() in scl_line and orig_line.startswith(('\t', ' ')):
preserved_count += 1
break
print(f" ✅ Indentación preservada: {preserved_count}/{len(original_indented)} líneas")
else:
print(f" No se encontraron líneas con indentación específica")
else:
print(f" ⚠ No hay código ST para verificar")
return scl_code
if __name__ == "__main__":
test_arraytoreal()