Intentando usar los parametros en X4 y X5

This commit is contained in:
Miguel 2025-05-03 16:59:00 +02:00
parent 6d021b8211
commit b38c26bee7
14 changed files with 21583 additions and 2112 deletions

View File

@ -0,0 +1,4 @@
{
"scl_output_dir": "scl_output",
"xref_output_dir": "xref_output"
}

View File

@ -1,4 +1,59 @@
{ {
"type": "object", "type": "object",
"properties": {} "properties": {
"scl_output_dir": {
"type": "string",
"title": "Directorio Salida SCL/MD (x3)",
"description": "Nombre del directorio (relativo a la raíz del proyecto PLC) donde x3 genera archivos .scl/.md, y x4/x5 leen.",
"default": "scl_output"
},
"xref_output_dir": {
"type": "string",
"title": "Directorio Salida XRef (x4)",
"description": "Nombre del directorio (relativo a la raíz del proyecto PLC) donde x4 genera archivos de referencias cruzadas.",
"default": "xref_output"
},
"xref_source_subdir": {
"type": "string",
"title": "Subdirectorio Fuentes XRef (x4)",
"description": "Nombre del subdirectorio dentro de xref_output_dir donde x4 coloca archivos fuente (.md) preparados para enlaces Obsidian.",
"default": "source"
},
"call_xref_filename": {
"type": "string",
"title": "Nombre Archivo Árbol Llamadas (x4)",
"description": "Nombre del archivo para la salida del árbol de llamadas generado por x4.",
"default": "xref_calls_tree.md"
},
"db_usage_xref_filename": {
"type": "string",
"title": "Nombre Archivo Uso DBs (x4)",
"description": "Nombre del archivo para el resumen de uso de DBs generado por x4.",
"default": "xref_db_usage_summary.md"
},
"plc_tag_xref_filename": {
"type": "string",
"title": "Nombre Archivo Uso PLC Tags (x4)",
"description": "Nombre del archivo para el resumen de uso de PLC Tags generado por x4.",
"default": "xref_plc_tags_summary.md"
},
"max_call_depth": {
"type": "integer",
"title": "Profundidad Máx. Árbol Llamadas (x4)",
"description": "Profundidad máxima de recursión para el árbol de llamadas generado por x4.",
"default": 5
},
"max_users_list": {
"type": "integer",
"title": "Máx. Usuarios Listados (x4)",
"description": "Número máximo de usuarios listados por DB/Tag en los resúmenes generados por x4.",
"default": 20
},
"aggregated_filename": {
"type": "string",
"title": "Nombre Archivo Agregado (x5)",
"description": "Nombre del archivo Markdown agregado final generado por x5 (se guarda en el directorio de trabajo principal).",
"default": "full_project_representation.md"
}
}
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,14 @@ script_root = os.path.dirname(
sys.path.append(script_root) sys.path.append(script_root)
from backend.script_utils import load_configuration from backend.script_utils import load_configuration
# <-- NUEVO: Importar funciones directamente -->
from x1_to_json import convert_xml_to_json
from x2_process import process_json_to_scl
from x3_generate_scl import generate_scl_or_markdown
# <-- NUEVO: Importar funciones de x4 y x5 -->
from x4_cross_reference import generate_cross_references # Asumiendo que x4_cross_reference.py tiene esta función
from x5_aggregate import aggregate_outputs
CONSOLE_ENCODING = "utf-8" CONSOLE_ENCODING = "utf-8"
@ -78,117 +86,7 @@ def log_message(message, log_file_handle, also_print=True):
# <-- FIN NUEVO --> # <-- FIN NUEVO -->
# <-- MODIFICADO: run_script para aceptar log_file_handle --> # <-- run_script ya no es necesaria -->
def run_script(script_name, xml_arg, log_file_handle, *extra_args):
"""Runs a given script, logs output, and returns success status."""
script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), script_name)
python_executable = sys.executable
command = [python_executable, script_path, os.path.abspath(xml_arg)]
command.extend(extra_args)
# Loguear el comando que se va a ejecutar
log_message(
f"--- Running {script_name} with arguments: {[os.path.relpath(arg) if isinstance(arg, str) and os.path.exists(arg) else arg for arg in command[2:]]} ---",
log_file_handle,
)
try:
result = subprocess.run(
command,
check=True,
capture_output=True,
text=True,
encoding=CONSOLE_ENCODING,
errors="replace",
)
stdout_clean = result.stdout.strip() if result.stdout else ""
stderr_clean = result.stderr.strip() if result.stderr else ""
# Loguear stdout si existe
if stdout_clean:
log_message(
f"--- Stdout ({script_name}) ---", log_file_handle, also_print=False
) # Loguear encabezado
log_message(
stdout_clean, log_file_handle, also_print=True
) # Loguear y mostrar contenido
log_message(
f"--- End Stdout ({script_name}) ---", log_file_handle, also_print=False
) # Loguear fin
# Loguear stderr si existe
if stderr_clean:
# Usar log_message también para stderr, pero imprimir en consola como error
log_message(
f"--- Stderr ({script_name}) ---", log_file_handle, also_print=False
) # Loguear encabezado
log_message(
stderr_clean, log_file_handle, also_print=False
) # Loguear contenido
log_message(
f"--- End Stderr ({script_name}) ---", log_file_handle, also_print=False
) # Loguear fin
# Imprimir stderr en la consola de error estándar
print(f"--- Stderr ({script_name}) ---", file=sys.stderr)
print(stderr_clean, file=sys.stderr)
print("--------------------------", file=sys.stderr)
return True # Éxito
except FileNotFoundError:
error_msg = f"Error: Script '{script_path}' or Python executable '{python_executable}' not found."
log_message(error_msg, log_file_handle, also_print=False) # Loguear error
print(error_msg, file=sys.stderr) # Mostrar error en consola
return False
except subprocess.CalledProcessError as e:
error_msg = f"Error running {script_name}: Script returned non-zero exit code {e.returncode}."
log_message(error_msg, log_file_handle, also_print=False) # Loguear error
print(error_msg, file=sys.stderr) # Mostrar error en consola
stdout_decoded = e.stdout.strip() if e.stdout else ""
stderr_decoded = e.stderr.strip() if e.stderr else ""
if stdout_decoded:
log_message(
f"--- Stdout ({script_name} - Error) ---",
log_file_handle,
also_print=False,
)
log_message(stdout_decoded, log_file_handle, also_print=False)
log_message(
f"--- End Stdout ({script_name} - Error) ---",
log_file_handle,
also_print=False,
)
print(f"--- Stdout ({script_name}) ---", file=sys.stderr)
print(stdout_decoded, file=sys.stderr)
if stderr_decoded:
log_message(
f"--- Stderr ({script_name} - Error) ---",
log_file_handle,
also_print=False,
)
log_message(stderr_decoded, log_file_handle, also_print=False)
log_message(
f"--- End Stderr ({script_name} - Error) ---",
log_file_handle,
also_print=False,
)
print(f"--- Stderr ({script_name}) ---", file=sys.stderr)
print(stderr_decoded, file=sys.stderr)
print("--------------------------", file=sys.stderr)
return False
except Exception as e:
error_msg = f"An unexpected error occurred while running {script_name}: {e}"
log_message(error_msg, log_file_handle, also_print=False) # Loguear error
traceback_str = traceback.format_exc()
log_message(
traceback_str, log_file_handle, also_print=False
) # Loguear traceback
print(error_msg, file=sys.stderr) # Mostrar error en consola
traceback.print_exc(file=sys.stderr) # Mostrar traceback en consola
return False
# --- Función check_skip_status (sin cambios en su lógica interna) --- # --- Función check_skip_status (sin cambios en su lógica interna) ---
@ -259,16 +157,28 @@ def check_skip_status(
return status return status
# --- Constantes ---
AGGREGATED_FILENAME = "full_project_representation.md"
SCL_OUTPUT_DIRNAME = "scl_output"
XREF_OUTPUT_DIRNAME = "xref_output"
# --- Bloque Principal --- # --- Bloque Principal ---
if __name__ == "__main__": if __name__ == "__main__":
configs = load_configuration() configs = load_configuration()
working_directory = configs.get("working_directory") working_directory = configs.get("working_directory")
group_config = configs.get("level2", {})
# <-- NUEVO: Leer parámetros de configuración para x3, x4, x5 -->
xml_parser_config = configs.get("XML Parser to SCL", {})
cfg_scl_output_dirname = xml_parser_config.get("scl_output_dir", "scl_output")
cfg_xref_output_dirname = xml_parser_config.get("xref_output_dir", "xref_output")
cfg_xref_source_subdir = xml_parser_config.get("xref_source_subdir", "source")
cfg_call_xref_filename = xml_parser_config.get("call_xref_filename", "xref_calls_tree.md")
cfg_db_usage_xref_filename = xml_parser_config.get("db_usage_xref_filename", "xref_db_usage_summary.md")
cfg_plc_tag_xref_filename = xml_parser_config.get("plc_tag_xref_filename", "xref_plc_tags_summary.md")
cfg_max_call_depth = xml_parser_config.get("max_call_depth", 5)
cfg_max_users_list = xml_parser_config.get("max_users_list", 20)
cfg_aggregated_filename = xml_parser_config.get("aggregated_filename", "full_project_representation.md")
# <-- FIN NUEVO -->
# Directorio donde se encuentra este script (x0_main.py)
script_dir = os.path.dirname(os.path.abspath(__file__)) script_dir = os.path.dirname(os.path.abspath(__file__))
# <-- MODIFICADO: Abrir archivo log --> # <-- MODIFICADO: Abrir archivo log -->
@ -324,15 +234,15 @@ if __name__ == "__main__":
# --- Directorios de salida --- # --- Directorios de salida ---
# Estos directorios ahora se crearán DENTRO de xml_project_dir (es decir, dentro de 'PLC') # Estos directorios ahora se crearán DENTRO de xml_project_dir (es decir, dentro de 'PLC')
scl_output_dir = os.path.join(xml_project_dir, SCL_OUTPUT_DIRNAME) scl_output_dir = os.path.join(xml_project_dir, cfg_scl_output_dirname) # Usar valor de config
xref_output_dir = os.path.join(xml_project_dir, XREF_OUTPUT_DIRNAME) xref_output_dir = os.path.join(xml_project_dir, cfg_xref_output_dirname) # Usar valor de config
# --- PARTE 2: PROCESAMIENTO INDIVIDUAL (x1, x2, x3) --- # --- PARTE 2: PROCESAMIENTO INDIVIDUAL (x1, x2, x3) ---
log_message("\n--- Fase 1: Procesamiento Individual (x1, x2, x3) ---", log_f) log_message("\n--- Fase 1: Procesamiento Individual (x1, x2, x3) ---", log_f)
script1 = "x1_to_json.py" # Los nombres de script ya no se usan directamente para x1, x2, x3
script2 = "x2_process.py" # script1 = "x1_to_json.py"
script3 = "x3_generate_scl.py" # script2 = "x2_process.py"
file_status = {} # script3 = "x3_generate_scl.py"
processed_count = 0 processed_count = 0
skipped_full_count = 0 skipped_full_count = 0
failed_count = 0 failed_count = 0
@ -341,13 +251,14 @@ if __name__ == "__main__":
for i, xml_filepath in enumerate(xml_files_found): for i, xml_filepath in enumerate(xml_files_found):
relative_path = os.path.relpath(xml_filepath, working_directory) relative_path = os.path.relpath(xml_filepath, working_directory)
log_message(f"\n--- Procesando archivo: {relative_path} ---", log_f) log_message(f"\n--- Procesando archivo: {relative_path} ---", log_f)
status = {"x1_ok": None, "x2_ok": None, "x3_ok": None}
file_status[relative_path] = status
base_filename = os.path.splitext(os.path.basename(xml_filepath))[0] base_filename = os.path.splitext(os.path.basename(xml_filepath))[0]
parsing_dir = os.path.join(os.path.dirname(xml_filepath), "parsing") parsing_dir = os.path.join(os.path.dirname(xml_filepath), "parsing")
# Crear directorio de parsing si no existe
os.makedirs(parsing_dir, exist_ok=True)
json_output_file = os.path.join(parsing_dir, f"{base_filename}.json")
processed_json_filepath = os.path.join( processed_json_filepath = os.path.join(
parsing_dir, f"{base_filename}_processed.json" parsing_dir, f"{base_filename}_processed.json" # <-- Corregido: nombre correcto
) )
# 1. Comprobar estado de salto # 1. Comprobar estado de salto
@ -357,140 +268,184 @@ if __name__ == "__main__":
skip_x1_x2 = skip_info["skip_x1_x2"] skip_x1_x2 = skip_info["skip_x1_x2"]
skip_x3 = skip_info["skip_x3"] skip_x3 = skip_info["skip_x3"]
# 2. Ejecutar/Saltar x1 # Si se salta todo, registrar y continuar
if skip_x1_x2: if skip_x1_x2 and skip_x3:
log_message( log_message(
f"--- SALTANDO x1 para: {relative_path} (archivo XML no modificado y JSON procesado existe)", f"--- SALTANDO TODO (x1, x2, x3) para: {relative_path} (XML no modificado, salida final actualizada)",
log_f, log_f,
) )
status["x1_ok"] = True
else:
if run_script(script1, xml_filepath, log_f): # Pasar log_f
# Mensaje ya logueado por run_script
status["x1_ok"] = True
else:
log_message(
f"--- {script1} FALLÓ para: {relative_path} ---",
log_f,
also_print=False,
) # Ya impreso por run_script
status["x1_ok"] = False
failed_count += 1
continue
# 3. Ejecutar/Saltar x2
if skip_x1_x2:
log_message(
f"--- SALTANDO x2 para: {relative_path} (razón anterior)", log_f
)
status["x2_ok"] = True
else:
if run_script(script2, xml_filepath, log_f): # Pasar log_f
status["x2_ok"] = True
else:
log_message(
f"--- {script2} FALLÓ para: {relative_path} ---",
log_f,
also_print=False,
)
status["x2_ok"] = False
failed_count += 1
continue
# 4. Ejecutar/Saltar x3
if skip_x3: # Solo puede ser True si skip_x1_x2 era True
log_message(
f"--- SALTANDO x3 para: {relative_path} (archivo de salida en '{SCL_OUTPUT_DIRNAME}' está actualizado)",
log_f,
)
status["x3_ok"] = True
skipped_full_count += 1 skipped_full_count += 1
processed_count += 1 processed_count += 1 # Contar como procesado si se salta todo
else: continue
# Usar try/except para capturar errores en las llamadas directas
try:
# 2. Ejecutar/Saltar x1 (convert_xml_to_json)
if skip_x1_x2: if skip_x1_x2:
skipped_partial_count += 1 # Se saltó x1/x2 pero se ejecuta x3 log_message(
if run_script( f"--- SALTANDO x1 para: {relative_path} (XML no modificado, JSON procesado existe)",
script3, xml_filepath, log_f, xml_project_dir log_f,
): # Pasar log_f y project_root_dir )
status["x3_ok"] = True success_x1 = True # Asumir éxito si se salta
processed_count += 1
else: else:
log_message( log_message(
f"--- {script3} FALLÓ para: {relative_path} ---", f"--- Ejecutando x1 (convert_xml_to_json) para: {relative_path} ---", log_f
log_f,
also_print=False,
) )
status["x3_ok"] = False success_x1 = convert_xml_to_json(xml_filepath, json_output_file)
if not success_x1:
log_message(f"--- x1 FALLÓ para: {relative_path} ---", log_f, also_print=False) # La función ya imprime el error
if not success_x1:
failed_count += 1 failed_count += 1
continue continue # No continuar si x1 falló
# 3. Ejecutar/Saltar x2 (process_json_to_scl)
if skip_x1_x2: # Si se saltó x1, también se salta x2
log_message(
f"--- SALTANDO x2 para: {relative_path} (razón anterior)", log_f
)
success_x2 = True # Asumir éxito si se salta
else:
log_message(
f"--- Ejecutando x2 (process_json_to_scl) para: {relative_path} ---", log_f
)
success_x2 = process_json_to_scl(json_output_file, processed_json_filepath)
if not success_x2:
log_message(f"--- x2 FALLÓ para: {relative_path} ---", log_f, also_print=False)
if not success_x2:
failed_count += 1
continue # No continuar si x2 falló
# 4. Ejecutar x3 (generate_scl_or_markdown) - skip_x3 ya se manejó al principio
# Si llegamos aquí, x3 SIEMPRE debe ejecutarse (porque skip_x3 era False)
if skip_x1_x2:
skipped_partial_count += 1 # Se saltó x1/x2 pero se ejecuta x3
log_message(
f"--- Ejecutando x3 (generate_scl_or_markdown) para: {relative_path} ---", log_f
)
# Asegurar que el directorio de salida final exista ANTES de llamar a la función
os.makedirs(scl_output_dir, exist_ok=True)
success_x3 = generate_scl_or_markdown(
processed_json_filepath, scl_output_dir, xml_project_dir
)
if not success_x3:
log_message(f"--- x3 FALLÓ para: {relative_path} ---", log_f, also_print=False)
failed_count += 1
continue # No continuar si x3 falló
# Si todo fue bien
processed_count += 1
except Exception as e:
# Capturar cualquier error inesperado durante las llamadas a funciones
log_message(f"--- ERROR INESPERADO procesando {relative_path}: {e} ---", log_f, also_print=False)
print(f"--- ERROR INESPERADO procesando {relative_path}: {e} ---", file=sys.stderr)
traceback_str = traceback.format_exc()
log_message(traceback_str, log_f, also_print=False) # Loguear traceback
traceback.print_exc(file=sys.stderr) # Mostrar traceback en consola
failed_count += 1
continue # Pasar al siguiente archivo
# --- PARTE 3: EJECUTAR x4 (Referencias Cruzadas) --- # --- PARTE 3: EJECUTAR x4 (Referencias Cruzadas) ---
log_message( log_message(
f"\n--- Fase 2: Ejecutando x4_cross_reference.py (salida en '{XREF_OUTPUT_DIRNAME}/') ---", f"\n--- Fase 2: Ejecutando x4_cross_reference.py (salida en '{cfg_xref_output_dirname}/') ---", # Usar valor de config
log_f, log_f,
) )
script4 = "x4_cross_reference.py"
run_x4 = True run_x4 = True
success_x4 = False success_x4 = False
can_run_x4 = any(s["x1_ok"] and s["x2_ok"] for s in file_status.values()) # La condición para ejecutar x4 ahora depende de si *algún* archivo tuvo éxito en x1 y x2
if not can_run_x4: # (Necesitamos una forma de rastrear esto, o simplemente intentarlo si no hubo fallos fatales antes)
log_message( # Simplificación: Ejecutar x4 si no todos los archivos fallaron en x1/x2.
"Advertencia: Ningún archivo completó x1/x2. Saltando x4.", log_f # Una mejor comprobación sería ver si existe algún archivo _processed.json
can_run_x4 = failed_count < len(xml_files_found) # Aproximación simple
if not can_run_x4 and len(xml_files_found) > 0:
log_message(
"Advertencia: Todos los archivos fallaron en x1/x2. Saltando x4.", log_f
) )
run_x4 = False run_x4 = False
script4_path = os.path.join(script_dir, script4) elif len(xml_files_found) == 0:
if not os.path.exists(script4_path): run_x4 = False # No hay archivos, no ejecutar
log_message(
f"Advertencia: Script '{script4}' no encontrado. Saltando x4.", log_f
)
run_x4 = False
if run_x4: if run_x4:
log_message( log_message(
f"Ejecutando {script4} sobre el directorio: {xml_project_dir}, salida en: {xref_output_dir}", f"Ejecutando x4 (generate_cross_references) sobre: {xml_project_dir}, salida en: {xref_output_dir}",
log_f, log_f,
) )
success_x4 = run_script( try:
script4, xml_project_dir, log_f, "-o", xref_output_dir # Llamada directa a la función de x4
) # Pasar log_f # <-- MODIFICADO: Pasar todos los parámetros leídos de la config -->
if not success_x4: success_x4 = generate_cross_references(
log_message(f"--- {script4} FALLÓ. ---", log_f, also_print=False) xml_project_dir,
# Mensaje de éxito ya logueado por run_script xref_output_dir,
cfg_scl_output_dirname,
cfg_xref_source_subdir,
cfg_call_xref_filename,
cfg_db_usage_xref_filename,
cfg_plc_tag_xref_filename,
cfg_max_call_depth,
cfg_max_users_list)
if not success_x4:
# La función interna ya debería haber impreso/logueado el error específico
log_message(f"--- x4 (generate_cross_references) FALLÓ. ---", log_f, also_print=False)
except Exception as e:
# Capturar error inesperado en la llamada a x4
log_message(f"--- ERROR INESPERADO ejecutando x4: {e} ---", log_f, also_print=False)
print(f"--- ERROR INESPERADO ejecutando x4: {e} ---", file=sys.stderr)
traceback_str = traceback.format_exc()
log_message(traceback_str, log_f, also_print=False)
traceback.print_exc(file=sys.stderr)
success_x4 = False # Marcar como fallo
else: else:
log_message("Fase 2 (x4) omitida.", log_f) log_message("Fase 2 (x4) omitida.", log_f)
# --- PARTE 4: EJECUTAR x5 (Agregación) --- # --- PARTE 4: EJECUTAR x5 (Agregación) ---
log_message(f"\n--- Fase 3: Ejecutando x5_aggregate.py ---", log_f) log_message(
script5 = "x5_aggregate.py" f"\n--- Fase 3: Ejecutando x5_aggregate.py (salida en '{cfg_aggregated_filename}') ---", # Usar valor de config
log_f
)
run_x5 = True run_x5 = True
success_x5 = False success_x5 = False
can_run_x5 = any(s["x3_ok"] for s in file_status.values()) # Condición similar a x4: ejecutar si no todo falló en x1/x2/x3
if not can_run_x5: can_run_x5 = failed_count < len(xml_files_found)
log_message("Advertencia: Ningún archivo completó x3. Saltando x5.", log_f) if not can_run_x5 and len(xml_files_found) > 0:
run_x5 = False
script5_path = os.path.join(script_dir, script5)
if not os.path.exists(script5_path):
log_message( log_message(
f"Advertencia: Script '{script5}' no encontrado. Saltando x5.", log_f "Advertencia: Todos los archivos fallaron en x1/x2/x3. Saltando x5.", log_f
) )
run_x5 = False run_x5 = False
elif len(xml_files_found) == 0:
run_x5 = False
if run_x5: if run_x5:
# El archivo agregado se guarda en el working_directory original, un nivel por encima de xml_project_dir output_agg_file = os.path.join(working_directory, cfg_aggregated_filename) # Usar valor de config
output_agg_file = os.path.join(working_directory, AGGREGATED_FILENAME)
log_message( log_message(
f"Ejecutando {script5} sobre el directorio: {xml_project_dir}, salida agregada en: {output_agg_file}", f"Ejecutando x5 (aggregate_outputs) sobre: {xml_project_dir}, salida agregada en: {output_agg_file}",
log_f log_f
) )
success_x5 = run_script( try:
script5, xml_project_dir, log_f, "-o", output_agg_file # Llamada directa a la función de x5
) # Pasar log_f # <-- MODIFICADO: Pasar los parámetros necesarios leídos de la config -->
if not success_x5: success_x5 = aggregate_outputs(
log_message(f"--- {script5} FALLÓ. ---", log_f, also_print=False) xml_project_dir,
# Mensaje de éxito ya logueado por run_script output_agg_file,
cfg_scl_output_dirname,
cfg_xref_output_dirname)
if not success_x5:
# La función interna ya debería haber impreso/logueado el error específico
log_message(f"--- x5 (aggregate_outputs) FALLÓ. ---", log_f, also_print=False)
except Exception as e:
# Capturar error inesperado en la llamada a x5
log_message(f"--- ERROR INESPERADO ejecutando x5: {e} ---", log_f, also_print=False)
print(f"--- ERROR INESPERADO ejecutando x5: {e} ---", file=sys.stderr)
traceback_str = traceback.format_exc()
log_message(traceback_str, log_f, also_print=False)
traceback.print_exc(file=sys.stderr)
success_x5 = False # Marcar como fallo
else: else:
log_message("Fase 3 (x5) omitida.", log_f) log_message("Fase 3 (x5) omitida.", log_f)
# --- PARTE 5: RESUMEN FINAL --- (MOVIDO AQUÍ)
# --- PARTE 5: RESUMEN FINAL --- # --- PARTE 5: RESUMEN FINAL ---
log_message( log_message(
"\n" + "-" * 20 + " Resumen Final del Procesamiento Completo " + "-" * 20, "\n" + "-" * 20 + " Resumen Final del Procesamiento Completo " + "-" * 20,
@ -508,21 +463,13 @@ if __name__ == "__main__":
f"Archivos parcialmente saltados (x1, x2 saltados; x3 ejecutado): {skipped_partial_count}", f"Archivos parcialmente saltados (x1, x2 saltados; x3 ejecutado): {skipped_partial_count}",
log_f, log_f,
) )
log_message(f"Archivos fallidos (en x1, x2 o x3): {failed_count}", log_f) log_message(f"Archivos fallidos (en x1, x2, x3 o error inesperado): {failed_count}", log_f)
if failed_count > 0: # El detalle de archivos fallidos es más difícil de rastrear ahora sin el dict 'file_status'
log_message("Archivos fallidos:", log_f) # Se podría reintroducir si es necesario, actualizándolo en cada paso.
for f, s in file_status.items(): # Por ahora, solo mostramos el conteo.
if not ( # if failed_count > 0:
s.get("x1_ok", False) # log_message("Archivos fallidos:", log_f)
and s.get("x2_ok", False) # ... (lógica para mostrar cuáles fallaron) ...
and s.get("x3_ok", False)
):
failed_step = (
"x1"
if not s.get("x1_ok", False)
else ("x2" if not s.get("x2_ok", False) else "x3")
)
log_message(f" - {f} (falló en {failed_step})", log_f)
log_message( log_message(
f"Fase 2 (Generación XRef - x4): {'Completada' if run_x4 and success_x4 else ('Fallida' if run_x4 and not success_x4 else 'Omitida')}", f"Fase 2 (Generación XRef - x4): {'Completada' if run_x4 and success_x4 else ('Fallida' if run_x4 and not success_x4 else 'Omitida')}",
log_f, log_f,

View File

@ -13,6 +13,7 @@ import sys
import traceback import traceback
import importlib import importlib
from lxml import etree from lxml import etree
from lxml.etree import XMLSyntaxError as etree_XMLSyntaxError # Alias para evitar conflicto
from collections import defaultdict from collections import defaultdict
import copy import copy
import time # <-- NUEVO: Para obtener metadatos import time # <-- NUEVO: Para obtener metadatos
@ -220,12 +221,18 @@ def load_parsers(parsers_dir="parsers"):
return parser_map return parser_map
def convert_xml_to_json(xml_filepath, json_filepath, parser_map): # <-- MODIFICADO: parser_map ya no es un argumento, se carga dentro -->
def convert_xml_to_json(xml_filepath, json_filepath):
""" """
Convierte XML a JSON, detectando tipo, añadiendo metadatos del XML Convierte XML a JSON, detectando tipo, añadiendo metadatos del XML
y extrayendo comentarios/títulos de red de forma centralizada. (v3) y extrayendo comentarios/títulos de red de forma centralizada. (v3)
Carga los parsers necesarios internamente.
""" """
print(f"Iniciando conversión de '{xml_filepath}' a '{json_filepath}'...") print(f"Iniciando conversión de '{xml_filepath}' a '{json_filepath}'...")
# <-- NUEVO: Cargar parsers aquí -->
print("Cargando parsers de red...")
parser_map = load_parsers()
# <-- FIN NUEVO -->
if not os.path.exists(xml_filepath): if not os.path.exists(xml_filepath):
print(f"Error Crítico: Archivo XML no encontrado: '{xml_filepath}'") print(f"Error Crítico: Archivo XML no encontrado: '{xml_filepath}'")
return False return False
@ -449,7 +456,7 @@ def convert_xml_to_json(xml_filepath, json_filepath, parser_map):
print("Error Crítico: No se generó ningún resultado para el archivo XML.") print("Error Crítico: No se generó ningún resultado para el archivo XML.")
return False return False
except etree.XMLSyntaxError as e: except etree_XMLSyntaxError as e: # Usar alias
print(f"Error Crítico: Sintaxis XML inválida en '{xml_filepath}'. Detalles: {e}") print(f"Error Crítico: Sintaxis XML inválida en '{xml_filepath}'. Detalles: {e}")
return False return False
except Exception as e: except Exception as e:
@ -459,48 +466,49 @@ def convert_xml_to_json(xml_filepath, json_filepath, parser_map):
# --- Punto de Entrada Principal (__main__) --- # --- Punto de Entrada Principal (__main__) ---
if __name__ == "__main__": if __name__ == "__main__":
configs = load_configuration() # Lógica para ejecución standalone
working_directory = configs.get("working_directory") try:
parser = argparse.ArgumentParser( import tkinter as tk
description="Convert Simatic XML (FC/FB/OB/DB/UDT/TagTable) to simplified JSON using dynamic parsers and add XML metadata." from tkinter import filedialog
) except ImportError:
parser.add_argument( print("Error: Tkinter no está instalado. No se puede mostrar el diálogo de archivo.", file=sys.stderr)
"xml_filepath", # No salimos, podríamos intentar obtener el path de otra forma o fallar más adelante
help="Path to the input XML file passed from the main script (x0_main.py).", tk = None # Marcar como no disponible
)
args = parser.parse_args()
xml_input_file = args.xml_filepath
if not os.path.exists(xml_input_file): xml_input_file = ""
print( if tk:
f"Error Crítico (x1): Archivo XML no encontrado: '{xml_input_file}'", root = tk.Tk()
file=sys.stderr, root.withdraw() # Ocultar la ventana principal de Tkinter
print("Por favor, selecciona el archivo XML de entrada...")
xml_input_file = filedialog.askopenfilename(
title="Selecciona el archivo XML de entrada",
filetypes=[("XML files", "*.xml"), ("All files", "*.*")]
) )
sys.exit(1) root.destroy() # Cerrar Tkinter
loaded_parsers = load_parsers() if not xml_input_file:
if not loaded_parsers: print("No se seleccionó ningún archivo. Saliendo.", file=sys.stderr)
print( # sys.exit(1) # No usar sys.exit aquí
"Advertencia (x1): No se cargaron parsers de red. Se continuará para UDT/TagTable/DB."
)
xml_filename_base = os.path.splitext(os.path.basename(xml_input_file))[0]
base_dir = os.path.dirname(xml_input_file)
output_dir = os.path.join(base_dir, "parsing")
os.makedirs(output_dir, exist_ok=True)
json_output_file = os.path.join(output_dir, f"{xml_filename_base}.json")
print(
f"(x1) Convirtiendo: '{os.path.relpath(xml_input_file)}' -> '{os.path.relpath(json_output_file)}'"
)
success = convert_xml_to_json(xml_input_file, json_output_file, loaded_parsers)
if success:
sys.exit(0)
else: else:
print( print(
f"\nError durante la conversión de '{os.path.relpath(xml_input_file)}'.", f"Archivo XML seleccionado: {xml_input_file}"
file=sys.stderr,
) )
sys.exit(1)
# Calcular ruta de salida JSON
xml_filename_base = os.path.splitext(os.path.basename(xml_input_file))[0]
base_dir = os.path.dirname(xml_input_file)
output_dir = os.path.join(base_dir, "parsing")
os.makedirs(output_dir, exist_ok=True)
json_output_file = os.path.join(output_dir, f"{xml_filename_base}.json")
print(
f"(x1 - Standalone) Convirtiendo: '{os.path.relpath(xml_input_file)}' -> '{os.path.relpath(json_output_file)}'"
)
# Llamar a la función principal (que ahora carga los parsers)
success = convert_xml_to_json(xml_input_file, json_output_file)
if success:
print("\nConversión completada exitosamente.")
else:
print(f"\nError durante la conversión de '{os.path.relpath(xml_input_file)}'.", file=sys.stderr)

View File

@ -532,59 +532,54 @@ def process_json_to_scl(json_filepath, output_json_filepath):
# --- Ejecución (MODIFICADO) --- # --- Ejecución (MODIFICADO) ---
if __name__ == "__main__": if __name__ == "__main__":
configs = load_configuration() # Lógica para ejecución standalone
working_directory = configs.get("working_directory") try:
parser = argparse.ArgumentParser( import tkinter as tk
description="Process simplified JSON to embed SCL logic, copying XML metadata. Expects original XML filepath." from tkinter import filedialog
) # <-- MODIFICADO except ImportError:
parser.add_argument( print("Error: Tkinter no está instalado. No se puede mostrar el diálogo de archivo.", file=sys.stderr)
"source_xml_filepath", tk = None
help="Path to the original source XML file (passed from x0_main.py).",
)
args = parser.parse_args()
source_xml_file = args.source_xml_filepath
if not os.path.exists(source_xml_file): input_json_file = ""
print( if tk:
f"Advertencia (x2): Archivo XML original no encontrado: '{source_xml_file}', pero se intentará encontrar el JSON correspondiente.", root = tk.Tk()
file=sys.stderr, root.withdraw()
print("Por favor, selecciona el archivo JSON de entrada (generado por x1)...")
input_json_file = filedialog.askopenfilename(
title="Selecciona el archivo JSON de entrada (.json)",
filetypes=[("JSON files", "*.json"), ("All files", "*.*")]
) )
# No salir, intentar encontrar el JSON de todas formas root.destroy()
xml_filename_base = os.path.splitext(os.path.basename(source_xml_file))[0] if not input_json_file:
base_dir = os.path.dirname(source_xml_file) print("No se seleccionó ningún archivo. Saliendo.", file=sys.stderr)
parsing_dir = os.path.join(base_dir, "parsing")
# x2 LEE el .json y ESCRIBE el _processed.json
input_json_file = os.path.join(parsing_dir, f"{xml_filename_base}.json")
output_json_file = os.path.join(parsing_dir, f"{xml_filename_base}_processed.json")
os.makedirs(parsing_dir, exist_ok=True)
print(
f"(x2) Procesando: '{os.path.relpath(input_json_file)}' -> '{os.path.relpath(output_json_file)}'"
)
if not os.path.exists(input_json_file):
print(
f"Error Fatal (x2): El archivo de entrada JSON no existe: '{input_json_file}'",
file=sys.stderr,
)
print(
f"Asegúrate de que 'x1_to_json.py' se ejecutó correctamente para '{os.path.relpath(source_xml_file)}'.",
file=sys.stderr,
)
sys.exit(1)
else: else:
print(f"Archivo JSON de entrada seleccionado: {input_json_file}")
# Calcular ruta de salida JSON procesado
json_filename_base = os.path.splitext(os.path.basename(input_json_file))[0]
# Asumimos que el _processed.json va al mismo directorio 'parsing'
parsing_dir = os.path.dirname(input_json_file)
output_json_file = os.path.join(parsing_dir, f"{json_filename_base}_processed.json")
# Asegurarse de que el directorio de salida exista (aunque debería si el input existe)
os.makedirs(parsing_dir, exist_ok=True)
print(
f"(x2 - Standalone) Procesando: '{os.path.relpath(input_json_file)}' -> '{os.path.relpath(output_json_file)}'"
)
try: try:
success = process_json_to_scl(input_json_file, output_json_file) success = process_json_to_scl(input_json_file, output_json_file)
if success: if success:
sys.exit(0) print("\nProcesamiento completado exitosamente.")
else: else:
sys.exit(1) print(f"\nError durante el procesamiento de '{os.path.relpath(input_json_file)}'.", file=sys.stderr)
# sys.exit(1) # No usar sys.exit
except Exception as e: except Exception as e:
print( print(
f"Error Crítico (x2) durante el procesamiento de '{input_json_file}': {e}", f"Error Crítico (x2) durante el procesamiento de '{input_json_file}': {e}",
file=sys.stderr, file=sys.stderr,
) )
traceback.print_exc(file=sys.stderr) traceback.print_exc(file=sys.stderr)
sys.exit(1) # sys.exit(1) # No usar sys.exit

View File

@ -36,7 +36,7 @@ except ImportError as e:
sys.exit(1) sys.exit(1)
# --- Constantes --- # --- Constantes ---
SCL_OUTPUT_DIRNAME = "scl_output" # <-- NUEVO: Nombre del directorio de salida final # SCL_OUTPUT_DIRNAME = "scl_output" # <-- Ya no se usa directamente en __main__, se lee de config
# --- Modificar generate_scl_or_markdown para usar el nuevo directorio de salida --- # --- Modificar generate_scl_or_markdown para usar el nuevo directorio de salida ---
@ -143,70 +143,82 @@ def generate_scl_or_markdown(
# --- Ejecución (MODIFICADO para usar SCL_OUTPUT_DIRNAME) --- # --- Ejecución (MODIFICADO para usar SCL_OUTPUT_DIRNAME) ---
if __name__ == "__main__": if __name__ == "__main__":
configs = load_configuration() # Lógica para ejecución standalone
working_directory = configs.get("working_directory")
parser = argparse.ArgumentParser(
description=f"Generate final SCL/Markdown file into '{SCL_OUTPUT_DIRNAME}/'."
) # <-- MODIFICADO
parser.add_argument(
"source_xml_filepath", help="Path to the original source XML file."
)
parser.add_argument(
"project_root_dir",
help="Path to the root directory of the XML project structure.",
)
args = parser.parse_args()
source_xml_file = args.source_xml_filepath
project_root_dir = args.project_root_dir
if not os.path.exists(source_xml_file):
print(
f"Advertencia (x3): Archivo XML original no encontrado: '{source_xml_file}'. Se intentará continuar.",
file=sys.stderr,
)
# No salir necesariamente, podríamos tener el JSON procesado
xml_filename_base = os.path.splitext(os.path.basename(source_xml_file))[0]
xml_dir = os.path.dirname(source_xml_file)
parsing_dir = os.path.join(xml_dir, "parsing")
input_json_file = os.path.join(parsing_dir, f"{xml_filename_base}_processed.json")
# <-- MODIFICADO: Calcular directorio de salida final -->
# Siempre será 'scl_output' bajo la raíz del proyecto
final_output_dir = os.path.join(project_root_dir, SCL_OUTPUT_DIRNAME)
# <-- FIN MODIFICADO -->
print(f"(x3) Generando SCL/MD desde: '{os.path.relpath(input_json_file)}'")
print(f"(x3) Directorio de salida final: '{os.path.relpath(final_output_dir)}'")
print(f"(x3) Usando ruta raíz del proyecto: '{project_root_dir}' para buscar UDTs.")
# Asegurar que el directorio de salida final exista ANTES de llamar a la función
try: try:
os.makedirs(final_output_dir, exist_ok=True) import tkinter as tk
except OSError as e: from tkinter import filedialog
print( except ImportError:
f"Error Crítico (x3): No se pudo crear el directorio de salida '{final_output_dir}': {e}", print("Error: Tkinter no está instalado. No se puede mostrar el diálogo de archivo.", file=sys.stderr)
file=sys.stderr, tk = None
)
sys.exit(1)
if not os.path.exists(input_json_file): input_json_file = ""
print( project_root_dir = ""
f"Error Fatal (x3): JSON procesado no encontrado: '{input_json_file}'",
file=sys.stderr, if tk:
root = tk.Tk()
root.withdraw()
print("Por favor, selecciona el archivo JSON procesado de entrada (generado por x2)...")
input_json_file = filedialog.askopenfilename(
title="Selecciona el archivo JSON procesado de entrada (_processed.json)",
filetypes=[("Processed JSON files", "*_processed.json"), ("JSON files", "*.json"), ("All files", "*.*")]
) )
sys.exit(1) if input_json_file:
else: print(f"Archivo JSON procesado seleccionado: {input_json_file}")
try: print("Por favor, selecciona el directorio raíz del proyecto XML (ej. la carpeta 'PLC')...")
# Pasar el directorio de salida FINAL y la ruta raíz project_root_dir = filedialog.askdirectory(
success = generate_scl_or_markdown( title="Selecciona el directorio raíz del proyecto XML"
input_json_file, final_output_dir, project_root_dir )
) # <-- MODIFICADO if project_root_dir:
if success: print(f"Directorio raíz del proyecto seleccionado: {project_root_dir}")
sys.exit(0)
else: else:
sys.exit(1) # La función ya imprimió el error print("No se seleccionó directorio raíz. Saliendo.", file=sys.stderr)
except Exception as e: else:
print(f"Error Crítico no manejado en x3: {e}", file=sys.stderr) print("No se seleccionó archivo JSON procesado. Saliendo.", file=sys.stderr)
traceback.print_exc(file=sys.stderr) root.destroy()
sys.exit(1)
if input_json_file and project_root_dir:
# Calcular directorio de salida final
# <-- NUEVO: Leer nombre del directorio de salida desde la configuración -->
configs = load_configuration()
xml_parser_config = configs.get("XML Parser to SCL", {})
cfg_scl_output_dirname = xml_parser_config.get("scl_output_dir", "scl_output") # Leer con default
# <-- FIN NUEVO -->
final_output_dir = os.path.join(project_root_dir, cfg_scl_output_dirname) # Usar valor leído
print(f"(x3 - Standalone) Generando SCL/MD desde: '{os.path.relpath(input_json_file)}'")
print(f"(x3 - Standalone) Directorio de salida final: '{os.path.relpath(final_output_dir)}'")
print(f"(x3 - Standalone) Usando ruta raíz del proyecto: '{project_root_dir}' para buscar UDTs.")
# Asegurar que el directorio de salida final exista
try:
os.makedirs(final_output_dir, exist_ok=True)
except OSError as e:
print(
f"Error Crítico (x3): No se pudo crear el directorio de salida '{final_output_dir}': {e}",
file=sys.stderr,
)
# sys.exit(1) # No usar sys.exit
success = False # Marcar como fallo para evitar la llamada
else:
success = True # Marcar como éxito para proceder
if success: # Solo intentar si se pudo crear el directorio
try:
# Llamar a la función principal
success = generate_scl_or_markdown(
input_json_file, final_output_dir, project_root_dir
)
if success:
print("\nGeneración de SCL/MD completada exitosamente.")
else:
# La función generate_scl_or_markdown ya imprime el error
print(f"\nError durante la generación desde '{os.path.relpath(input_json_file)}'.", file=sys.stderr)
# sys.exit(1) # No usar sys.exit
except Exception as e:
print(f"Error Crítico no manejado en x3: {e}", file=sys.stderr)
traceback.print_exc(file=sys.stderr)
# sys.exit(1) # No usar sys.exit
else:
# Mensajes de cancelación ya impresos si aplica
pass

View File

@ -51,14 +51,14 @@ except ImportError:
# --- Constantes --- # --- Constantes ---
SCL_OUTPUT_DIRNAME = "scl_output" # SCL_OUTPUT_DIRNAME = "scl_output" # Se leerá de config
XREF_SOURCE_SUBDIR = "source" # <-- NUEVO: Subdirectorio para fuentes MD # XREF_SOURCE_SUBDIR = "source" # Se leerá de config
CALL_XREF_FILENAME = "xref_calls_tree.md" # CALL_XREF_FILENAME = "xref_calls_tree.md" # Se leerá de config
DB_USAGE_XREF_FILENAME = "xref_db_usage_summary.md" # DB_USAGE_XREF_FILENAME = "xref_db_usage_summary.md" # Se leerá de config
PLC_TAG_XREF_FILENAME = "xref_plc_tags_summary.md" # PLC_TAG_XREF_FILENAME = "xref_plc_tags_summary.md" # Se leerá de config
MAX_CALL_DEPTH = 5 # MAX_CALL_DEPTH = 5 # Se leerá de config
INDENT_STEP = " " INDENT_STEP = " "
MAX_USERS_LIST = 20 # MAX_USERS_LIST = 20 # Se leerá de config
# --- Funciones de Análisis (find_calls_in_scl, find_db_tag_usage, find_plc_tag_usage sin cambios) --- # --- Funciones de Análisis (find_calls_in_scl, find_db_tag_usage, find_plc_tag_usage sin cambios) ---
@ -223,13 +223,14 @@ def find_plc_tag_usage(scl_code, plc_tag_names_set):
# <-- NUEVA FUNCION --> # <-- NUEVA FUNCION -->
def copy_and_prepare_source_files(project_root_dir, xref_output_dir): def copy_and_prepare_source_files(project_root_dir, xref_output_dir, scl_output_dirname, xref_source_subdir):
""" """
Copia archivos .scl y .md desde scl_output a xref_output/source, Copia archivos .scl y .md desde scl_output a xref_output/source,
convirtiendo .scl a .md con formato de bloque de código. convirtiendo .scl a .md con formato de bloque de código.
Usa los nombres de directorios pasados como argumentos.
""" """
scl_source_dir = os.path.join(project_root_dir, SCL_OUTPUT_DIRNAME) scl_source_dir = os.path.join(project_root_dir, scl_output_dirname)
md_target_dir = os.path.join(xref_output_dir, XREF_SOURCE_SUBDIR) md_target_dir = os.path.join(xref_output_dir, xref_source_subdir)
if not os.path.isdir(scl_source_dir): if not os.path.isdir(scl_source_dir):
print( print(
@ -304,7 +305,7 @@ def copy_and_prepare_source_files(project_root_dir, xref_output_dir):
# <-- MODIFICADO: get_scl_link --> # <-- MODIFICADO: get_scl_link -->
def get_scl_link( def get_scl_link(
block_name, block_entry, base_xref_dir block_name, block_entry, xref_source_subdir
): # Ya no necesita project_root_dir ): # Ya no necesita project_root_dir
""" """
Genera un enlace Markdown relativo al archivo .md correspondiente DENTRO de xref_output/source. Genera un enlace Markdown relativo al archivo .md correspondiente DENTRO de xref_output/source.
@ -313,10 +314,10 @@ def get_scl_link(
return f"`{block_name}`" return f"`{block_name}`"
# El nombre del archivo destino siempre será .md # El nombre del archivo destino siempre será .md
md_filename = format_variable_name(block_name) + ".md" md_filename = format_variable_name(block_name) + ".md" # Asegurar que format_variable_name esté disponible
# La ruta siempre estará dentro del subdirectorio 'source' # La ruta siempre estará dentro del subdirectorio fuente de xref
link_target_path = f"{XREF_SOURCE_SUBDIR}/{md_filename}" link_target_path = f"{xref_source_subdir}/{md_filename}"
# Codificar para URL/Markdown # Codificar para URL/Markdown
try: try:
@ -331,7 +332,7 @@ def get_scl_link(
# <-- MODIFICADO: build_call_tree_recursive (ya no necesita project_root_dir) --> # <-- MODIFICADO: build_call_tree_recursive (ya no necesita project_root_dir) -->
def build_call_tree_recursive( def build_call_tree_recursive( # Añadido max_call_depth, xref_source_subdir
current_node, current_node,
call_graph, call_graph,
block_data, block_data,
@ -339,6 +340,8 @@ def build_call_tree_recursive(
visited_in_path, visited_in_path,
base_xref_dir, base_xref_dir,
current_depth=0, current_depth=0,
max_call_depth=5,
xref_source_subdir="source"
): ):
""" """
Función recursiva para construir el árbol de llamadas indentado CON ENLACES Función recursiva para construir el árbol de llamadas indentado CON ENLACES
@ -347,10 +350,10 @@ def build_call_tree_recursive(
indent = INDENT_STEP * current_depth indent = INDENT_STEP * current_depth
block_entry = block_data.get(current_node) block_entry = block_data.get(current_node)
# Llamar a get_scl_link modificado # Llamar a get_scl_link modificado
node_link = get_scl_link(current_node, block_entry, base_xref_dir) node_link = get_scl_link(current_node, block_entry, xref_source_subdir)
output_lines.append(f"{indent}- {node_link}") output_lines.append(f"{indent}- {node_link}")
if current_depth >= MAX_CALL_DEPTH: if current_depth >= max_call_depth:
output_lines.append( output_lines.append(
f"{indent}{INDENT_STEP}[... Profundidad máxima alcanzada ...]" f"{indent}{INDENT_STEP}[... Profundidad máxima alcanzada ...]"
) )
@ -370,20 +373,22 @@ def build_call_tree_recursive(
block_data, block_data,
output_lines, output_lines,
visited_in_path.copy(), visited_in_path.copy(),
base_xref_dir, base_xref_dir, # base_xref_dir no se usa en la recursión, podría quitarse
current_depth + 1, current_depth + 1,
max_call_depth=max_call_depth, # Pasar parámetro
xref_source_subdir=xref_source_subdir # Pasar parámetro
) )
# <-- MODIFICADO: generate_call_tree_output (ya no necesita project_root_dir) --> # <-- MODIFICADO: generate_call_tree_output (ya no necesita project_root_dir) -->
def generate_call_tree_output(call_graph, block_data, base_xref_dir): def generate_call_tree_output(call_graph, block_data, base_xref_dir, max_call_depth, xref_source_subdir): # Añadido max_call_depth, xref_source_subdir
""" """
Genera las líneas de texto para el archivo de árbol de llamadas CON ENLACES Genera las líneas de texto para el archivo de árbol de llamadas CON ENLACES
a los archivos .md en xref_output/source. a los archivos .md en xref_output/source.
""" """
output_lines = ["# Árbol de Referencias Cruzadas de Llamadas\n"] output_lines = ["# Árbol de Referencias Cruzadas de Llamadas\n"]
output_lines.append(f"(Profundidad máxima: {MAX_CALL_DEPTH})\n") output_lines.append(f"(Profundidad máxima: {MAX_CALL_DEPTH})\n")
root_nodes = sorted( root_nodes = sorted( # Encontrar OBs
[ [
name name
for name, data in block_data.items() for name, data in block_data.items()
@ -398,7 +403,7 @@ def generate_call_tree_output(call_graph, block_data, base_xref_dir):
for ob_name in root_nodes: for ob_name in root_nodes:
ob_entry = block_data.get(ob_name) ob_entry = block_data.get(ob_name)
ob_link = get_scl_link( ob_link = get_scl_link(
ob_name, ob_entry, base_xref_dir ob_name, ob_entry, xref_source_subdir
) # Llamar a get_scl_link modificado ) # Llamar a get_scl_link modificado
output_lines.append(f"\n### Iniciando desde: {ob_link}\n") output_lines.append(f"\n### Iniciando desde: {ob_link}\n")
build_call_tree_recursive( build_call_tree_recursive(
@ -407,8 +412,10 @@ def generate_call_tree_output(call_graph, block_data, base_xref_dir):
block_data, block_data,
output_lines, output_lines,
set(), set(),
base_xref_dir, base_xref_dir, # No se usa en recursión
current_depth=0, current_depth=0,
max_call_depth=max_call_depth, # Pasar parámetro
xref_source_subdir=xref_source_subdir # Pasar parámetro
) )
all_callers = set(call_graph.keys()) all_callers = set(call_graph.keys())
@ -427,7 +434,7 @@ def generate_call_tree_output(call_graph, block_data, base_xref_dir):
for block_name in unreached: for block_name in unreached:
block_entry = block_data.get(block_name) block_entry = block_data.get(block_name)
block_link = get_scl_link( block_link = get_scl_link(
block_name, block_entry, base_xref_dir block_name, block_entry, xref_source_subdir
) # Llamar a get_scl_link modificado ) # Llamar a get_scl_link modificado
output_lines.append(f"- {block_link}") output_lines.append(f"- {block_link}")
return output_lines return output_lines
@ -435,7 +442,7 @@ def generate_call_tree_output(call_graph, block_data, base_xref_dir):
# --- Funciones para Salida Resumida (generate_db_usage_summary_output, generate_plc_tag_summary_output SIN CAMBIOS) --- # --- Funciones para Salida Resumida (generate_db_usage_summary_output, generate_plc_tag_summary_output SIN CAMBIOS) ---
# (Se omiten por brevedad) # (Se omiten por brevedad)
def generate_db_usage_summary_output(db_users): def generate_db_usage_summary_output(db_users, max_users_list): # Añadido max_users_list
"""Genera las líneas para el archivo Markdown de resumen de uso de DBs.""" """Genera las líneas para el archivo Markdown de resumen de uso de DBs."""
output_lines = ["# Resumen de Uso de DB Globales por Bloque\n\n"] output_lines = ["# Resumen de Uso de DB Globales por Bloque\n\n"]
if not db_users: if not db_users:
@ -451,7 +458,7 @@ def generate_db_usage_summary_output(db_users):
output_lines.append("- No utilizado directamente.\n") output_lines.append("- No utilizado directamente.\n")
else: else:
output_lines.append("Utilizado por:\n") output_lines.append("Utilizado por:\n")
display_users = users_list[:MAX_USERS_LIST] display_users = users_list[:max_users_list] # Usar parámetro
remaining_count = len(users_list) - len(display_users) remaining_count = len(users_list) - len(display_users)
for user_block in display_users: for user_block in display_users:
output_lines.append(f"- `{user_block}`") output_lines.append(f"- `{user_block}`")
@ -461,7 +468,7 @@ def generate_db_usage_summary_output(db_users):
return output_lines return output_lines
def generate_plc_tag_summary_output(plc_tag_users): def generate_plc_tag_summary_output(plc_tag_users, max_users_list): # Añadido max_users_list
"""Genera las líneas para el archivo Markdown de resumen de uso de PLC Tags.""" """Genera las líneas para el archivo Markdown de resumen de uso de PLC Tags."""
output_lines = ["# Resumen de Uso de PLC Tags Globales por Bloque\n\n"] output_lines = ["# Resumen de Uso de PLC Tags Globales por Bloque\n\n"]
if not plc_tag_users: if not plc_tag_users:
@ -477,7 +484,7 @@ def generate_plc_tag_summary_output(plc_tag_users):
output_lines.append("- No utilizado.\n") output_lines.append("- No utilizado.\n")
else: else:
output_lines.append("Utilizado por:\n") output_lines.append("Utilizado por:\n")
display_users = users_list[:MAX_USERS_LIST] display_users = users_list[:max_users_list] # Usar parámetro
remaining_count = len(users_list) - len(display_users) remaining_count = len(users_list) - len(display_users)
for user_block in display_users: for user_block in display_users:
output_lines.append(f"- `{user_block}`") output_lines.append(f"- `{user_block}`")
@ -488,20 +495,33 @@ def generate_plc_tag_summary_output(plc_tag_users):
# --- Función Principal (MODIFICADA para llamar a copy_and_prepare_source_files) --- # --- Función Principal (MODIFICADA para llamar a copy_and_prepare_source_files) ---
def generate_cross_references(project_root_dir, output_dir): def generate_cross_references(
project_root_dir,
output_dir,
scl_output_dirname,
xref_source_subdir,
call_xref_filename,
db_usage_xref_filename,
plc_tag_xref_filename,
max_call_depth,
max_users_list
):
""" """
Genera archivos de referencias cruzadas y prepara archivos fuente (.md) Genera archivos de referencias cruzadas y prepara archivos fuente (.md)
para visualización en Obsidian. para visualización en Obsidian.
Utiliza los parámetros de configuración pasados como argumentos.
""" """
print(f"--- Iniciando Generación de Referencias Cruzadas y Fuentes MD (x4) ---") print(f"--- Iniciando Generación de Referencias Cruzadas y Fuentes MD (x4) ---")
print(f"Buscando archivos JSON procesados en: {project_root_dir}") print(f"Buscando archivos JSON procesados en: {project_root_dir}")
print(f"Directorio de salida XRef: {output_dir}") print(f"Directorio de salida XRef: {output_dir}")
print(f"Directorio fuente SCL/MD: {scl_output_dirname}")
print(f"Subdirectorio fuentes MD para XRef: {xref_source_subdir}")
output_dir_abs = os.path.abspath(output_dir) output_dir_abs = os.path.abspath(output_dir)
# <-- NUEVO: Crear directorio y preparar archivos fuente ANTES de generar XRefs --> # <-- NUEVO: Crear directorio y preparar archivos fuente ANTES de generar XRefs -->
copy_and_prepare_source_files(project_root_dir, output_dir_abs) # Pasar los nombres de directorios leídos de la config
copy_and_prepare_source_files(project_root_dir, output_dir_abs, scl_output_dirname, xref_source_subdir)
# <-- FIN NUEVO --> # <-- FIN NUEVO -->
json_files = glob.glob( json_files = glob.glob(
os.path.join(project_root_dir, "**", "*_processed.json"), recursive=True os.path.join(project_root_dir, "**", "*_processed.json"), recursive=True
) )
@ -588,14 +608,14 @@ def generate_cross_references(project_root_dir, output_dir):
# 3. Generar Archivos de Salida XRef (MODIFICADO para usar la nueva función de árbol) # 3. Generar Archivos de Salida XRef (MODIFICADO para usar la nueva función de árbol)
os.makedirs(output_dir_abs, exist_ok=True) os.makedirs(output_dir_abs, exist_ok=True)
call_xref_path = os.path.join(output_dir_abs, CALL_XREF_FILENAME) call_xref_path = os.path.join(output_dir_abs, call_xref_filename) # Usar parámetro
db_usage_xref_path = os.path.join(output_dir_abs, DB_USAGE_XREF_FILENAME) db_usage_xref_path = os.path.join(output_dir_abs, db_usage_xref_filename) # Usar parámetro
plc_tag_xref_path = os.path.join(output_dir_abs, PLC_TAG_XREF_FILENAME) plc_tag_xref_path = os.path.join(output_dir_abs, plc_tag_xref_filename) # Usar parámetro
print(f"Generando ÁRBOL XRef de llamadas en: {call_xref_path}") print(f"Generando ÁRBOL XRef de llamadas en: {call_xref_path}")
try: try:
# <-- MODIFICADO: Llamar a la nueva función sin project_root_dir --> # <-- MODIFICADO: Llamar a la nueva función sin project_root_dir -->
call_tree_lines = generate_call_tree_output( call_tree_lines = generate_call_tree_output( # Pasar parámetros
call_graph, block_data, output_dir_abs call_graph, block_data, output_dir_abs
) )
with open(call_xref_path, "w", encoding="utf-8") as f: with open(call_xref_path, "w", encoding="utf-8") as f:
@ -609,7 +629,7 @@ def generate_cross_references(project_root_dir, output_dir):
# Generar Resumen de Uso de DB (sin cambios aquí) # Generar Resumen de Uso de DB (sin cambios aquí)
print(f"Generando RESUMEN XRef de uso de DBs en: {db_usage_xref_path}") print(f"Generando RESUMEN XRef de uso de DBs en: {db_usage_xref_path}")
try: try:
db_summary_lines = generate_db_usage_summary_output(db_users) db_summary_lines = generate_db_usage_summary_output(db_users, max_users_list) # Pasar parámetro
with open(db_usage_xref_path, "w", encoding="utf-8") as f: with open(db_usage_xref_path, "w", encoding="utf-8") as f:
[f.write(line + "\n") for line in db_summary_lines] [f.write(line + "\n") for line in db_summary_lines]
except Exception as e: except Exception as e:
@ -622,7 +642,7 @@ def generate_cross_references(project_root_dir, output_dir):
# Generar Resumen de Uso de PLC Tags (sin cambios aquí) # Generar Resumen de Uso de PLC Tags (sin cambios aquí)
print(f"Generando RESUMEN XRef de uso de PLC Tags en: {plc_tag_xref_path}") print(f"Generando RESUMEN XRef de uso de PLC Tags en: {plc_tag_xref_path}")
try: try:
plc_tag_lines = generate_plc_tag_summary_output(plc_tag_users) plc_tag_lines = generate_plc_tag_summary_output(plc_tag_users, max_users_list) # Pasar parámetro
with open(plc_tag_xref_path, "w", encoding="utf-8") as f: with open(plc_tag_xref_path, "w", encoding="utf-8") as f:
[f.write(line + "\n") for line in plc_tag_lines] [f.write(line + "\n") for line in plc_tag_lines]
except Exception as e: except Exception as e:
@ -638,37 +658,53 @@ def generate_cross_references(project_root_dir, output_dir):
# --- Punto de Entrada (sin cambios) --- # --- Punto de Entrada (sin cambios) ---
if __name__ == "__main__": if __name__ == "__main__":
print("(x4 - Standalone) Ejecutando generación de referencias cruzadas...")
# Cargar configuración para obtener rutas
configs = load_configuration() configs = load_configuration()
working_directory = configs.get("working_directory") working_directory = configs.get("working_directory")
parser = argparse.ArgumentParser(
description="Genera refs cruzadas y prepara archivos fuente MD para Obsidian."
)
parser.add_argument("project_root_dir", help="Ruta dir raíz proyecto XML.")
parser.add_argument(
"-o",
"--output",
help="Directorio para guardar salida XRef (incluyendo subdir 'source').",
)
args = parser.parse_args()
if not os.path.isdir(args.project_root_dir):
print(
f"Error: Dir proyecto no existe: '{args.project_root_dir}'", file=sys.stderr
)
sys.exit(1)
if not args.output:
print(
"Error: Se requiere el argumento -o/--output para especificar el directorio de salida XRef.",
file=sys.stderr,
)
sys.exit(1)
output_destination = args.output # Acceder a la configuración específica del grupo
success = generate_cross_references(args.project_root_dir, output_destination) group_config = configs.get("level2", {})
if success:
print( # Leer parámetros con valores por defecto (usando los defaults del esquema como guía)
f"Archivos XRef y fuentes MD generados en: {os.path.abspath(output_destination)}" # Parámetros necesarios para x4
) cfg_scl_output_dirname = group_config.get("scl_output_dir", "scl_output")
sys.exit(0) cfg_xref_output_dirname = group_config.get("xref_output_dir", "xref_output")
cfg_xref_source_subdir = group_config.get("xref_source_subdir", "source")
cfg_call_xref_filename = group_config.get("call_xref_filename", "xref_calls_tree.md")
cfg_db_usage_xref_filename = group_config.get("db_usage_xref_filename", "xref_db_usage_summary.md")
cfg_plc_tag_xref_filename = group_config.get("plc_tag_xref_filename", "xref_plc_tags_summary.md")
cfg_max_call_depth = group_config.get("max_call_depth", 5)
cfg_max_users_list = group_config.get("max_users_list", 20)
# Calcular rutas
if not working_directory:
print("Error: 'working_directory' no encontrado en la configuración.", file=sys.stderr)
# No usamos sys.exit(1)
else: else:
print("Hubo errores durante la generación de refs cruzadas.", file=sys.stderr) # Calcular rutas basadas en la configuración
sys.exit(1) plc_subdir_name = "PLC" # Asumir nombre estándar
project_root_dir = os.path.join(working_directory, plc_subdir_name)
xref_output_dir = os.path.join(project_root_dir, cfg_xref_output_dirname) # Usar nombre de dir leído
if not os.path.isdir(project_root_dir):
print(f"Error: Directorio del proyecto '{project_root_dir}' no encontrado.", file=sys.stderr)
else:
# Llamar a la función principal
success = generate_cross_references(
project_root_dir,
xref_output_dir,
cfg_scl_output_dirname,
cfg_xref_source_subdir,
cfg_call_xref_filename,
cfg_db_usage_xref_filename,
cfg_plc_tag_xref_filename,
cfg_max_call_depth,
cfg_max_users_list
)
if success:
print("\n(x4 - Standalone) Proceso completado exitosamente.")
else:
print("\n(x4 - Standalone) Proceso finalizado con errores.", file=sys.stderr)

View File

@ -19,26 +19,28 @@ from backend.script_utils import load_configuration
# --- Constantes --- # --- Constantes ---
# Nombre del archivo de salida por defecto (se creará en el directorio raíz del proyecto) # Nombre del archivo de salida por defecto (se creará en el directorio raíz del proyecto)
AGGREGATED_FILENAME = "full_project_representation.md" # AGGREGATED_FILENAME = "full_project_representation.md" # Se leerá de config
# Directorio donde x4 guarda sus salidas (relativo al directorio raíz del proyecto) # Directorio donde x4 guarda sus salidas (relativo al directorio raíz del proyecto)
XREF_OUTPUT_SUBDIR = "xref_output" # XREF_OUTPUT_SUBDIR = "xref_output" # Se leerá de config
# SCL_OUTPUT_DIRNAME = "scl_output" # Se leerá de config
def aggregate_files(project_root_dir, output_filepath): def aggregate_outputs(project_root_dir, output_filepath, scl_output_dirname, xref_output_dirname): # Añadido scl_output_dirname, xref_output_dirname
""" """
Busca archivos .scl y .md generados y los agrega en un único archivo Markdown. Busca archivos .scl y .md generados y los agrega en un único archivo Markdown.
""" """
print(f"--- Iniciando Agregación de Archivos (x5) ---") print(f"--- Iniciando Agregación de Archivos (x5) ---")
print(f"Leyendo desde directorios: '{scl_output_dirname}' y '{xref_output_dirname}' (relativos a la raíz)")
print(f"Directorio Raíz del Proyecto: {project_root_dir}") print(f"Directorio Raíz del Proyecto: {project_root_dir}")
print(f"Archivo de Salida: {output_filepath}") print(f"Archivo de Salida: {output_filepath}")
# Patrones para buscar archivos generados # Patrones para buscar archivos generados
# Buscamos .scl en cualquier subdirectorio (generados por x3 junto a los XML) # Buscamos .scl en cualquier subdirectorio (generados por x3 junto a los XML)
scl_pattern = os.path.join(project_root_dir, "**", "*.scl") scl_pattern = os.path.join(project_root_dir, "**", "*.scl")
# Buscamos .md en cualquier subdirectorio (UDT/TagTable generados por x3) # Buscamos .md en cualquier subdirectorio (UDT/TagTable generados por x3, XRef por x4)
md_pattern_general = os.path.join(project_root_dir, "**", "*.md") md_pattern_general = os.path.join(project_root_dir, "**", "*.md")
# Buscamos .md específicamente en el directorio de salida de x4 # Directorio de salida de x4
xref_dir = os.path.join(project_root_dir, XREF_OUTPUT_SUBDIR) xref_dir_abs = os.path.join(project_root_dir, xref_output_dirname)
# xref_pattern = os.path.join(xref_dir, "*.md") # No es necesario, el general los incluye scl_dir_abs = os.path.join(project_root_dir, scl_output_dirname)
print(f"Buscando archivos SCL con patrón: {scl_pattern}") print(f"Buscando archivos SCL con patrón: {scl_pattern}")
print(f"Buscando archivos MD con patrón: {md_pattern_general}") print(f"Buscando archivos MD con patrón: {md_pattern_general}")
@ -46,16 +48,18 @@ def aggregate_files(project_root_dir, output_filepath):
scl_files = glob.glob(scl_pattern, recursive=True) scl_files = glob.glob(scl_pattern, recursive=True)
md_files = glob.glob(md_pattern_general, recursive=True) md_files = glob.glob(md_pattern_general, recursive=True)
# Filtrar los archivos de salida del propio x5 y los XRef para que no se incluyan dos veces # Filtrar los archivos para asegurar que provienen de los directorios esperados
# si el patrón general los captura y están en el directorio raíz # y excluir el archivo de salida del propio x5.
output_filename_base = os.path.basename(output_filepath) output_filename_base = os.path.basename(output_filepath)
scl_files_filtered = [f for f in scl_files if os.path.dirname(f).startswith(scl_dir_abs)]
md_files_filtered = [ md_files_filtered = [
f for f in md_files f for f in md_files
if os.path.basename(f) != output_filename_base # Excluir el archivo de salida if os.path.basename(f) != output_filename_base # Excluir el archivo de salida
# No es necesario excluir los XRef explícitamente si están en su subdir and (os.path.dirname(f).startswith(scl_dir_abs) or os.path.dirname(f).startswith(xref_dir_abs)) # Incluir MD de scl_output y xref_output
# and XREF_OUTPUT_SUBDIR not in os.path.relpath(f, project_root_dir).split(os.sep)
] ]
all_files = sorted(scl_files_filtered + md_files_filtered) # Combinar y ordenar alfabéticamente
all_files = sorted(scl_files + md_files_filtered) # Combinar y ordenar alfabéticamente all_files = sorted(scl_files + md_files_filtered) # Combinar y ordenar alfabéticamente
@ -107,44 +111,44 @@ def aggregate_files(project_root_dir, output_filepath):
traceback.print_exc(file=sys.stderr) traceback.print_exc(file=sys.stderr)
return False return False
# --- Punto de Entrada --- # --- Punto de Entrada ---
if __name__ == "__main__": if __name__ == "__main__":
print("(x5 - Standalone) Ejecutando agregación de salidas...")
# Cargar configuración para obtener rutas
configs = load_configuration() configs = load_configuration()
working_directory = configs.get("working_directory") working_directory = configs.get("working_directory")
parser = argparse.ArgumentParser(
description="Agrega archivos .scl y .md generados en un único archivo Markdown."
)
parser.add_argument(
"project_root_dir",
help="Ruta al directorio raíz del proyecto XML (donde se buscarán los archivos generados)."
)
parser.add_argument(
"-o", "--output",
help=f"Ruta completa para el archivo Markdown agregado (por defecto: '{AGGREGATED_FILENAME}' en project_root_dir)."
)
args = parser.parse_args() # Acceder a la configuración específica del grupo
group_config = configs.get("level2", {})
# Validar directorio de entrada # Leer parámetros con valores por defecto (usando los defaults del esquema como guía)
if not os.path.isdir(args.project_root_dir): # Parámetros necesarios para x5
print(f"Error: El directorio del proyecto no existe: '{args.project_root_dir}'", file=sys.stderr) cfg_scl_output_dirname = group_config.get("scl_output_dir", "scl_output")
sys.exit(1) cfg_xref_output_dirname = group_config.get("xref_output_dir", "xref_output")
cfg_aggregated_filename = group_config.get("aggregated_filename", "full_project_representation.md")
# Determinar ruta de salida if not working_directory:
output_file = args.output print("Error: 'working_directory' no encontrado en la configuración.", file=sys.stderr)
if not output_file:
output_file = os.path.join(args.project_root_dir, AGGREGATED_FILENAME)
else: else:
# Asegurarse de que el directorio de salida exista si se especifica una ruta completa # Calcular rutas basadas en la configuración
output_dir = os.path.dirname(output_file) plc_subdir_name = "PLC" # Asumir nombre estándar
if output_dir and not os.path.exists(output_dir): project_root_dir = os.path.join(working_directory, plc_subdir_name)
os.makedirs(output_dir) # El archivo agregado va al working_directory original
output_agg_file = os.path.join(working_directory, cfg_aggregated_filename) # Usar nombre de archivo leído
if not os.path.isdir(project_root_dir):
print(f"Error: Directorio del proyecto '{project_root_dir}' no encontrado.", file=sys.stderr)
else:
# Llamar a la función principal
# Pasar los nombres de directorios leídos
success = aggregate_outputs(
project_root_dir,
output_agg_file,
cfg_scl_output_dirname,
cfg_xref_output_dirname)
# Llamar a la función principal if success:
success = aggregate_files(args.project_root_dir, output_file) print("\n(x5 - Standalone) Proceso completado exitosamente.")
else:
if success: print("\n(x5 - Standalone) Proceso finalizado con errores.", file=sys.stderr)
sys.exit(0)
else:
sys.exit(1)

View File

@ -1,925 +0,0 @@
[15:12:33] Iniciando ejecución de x0_main.py en C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport...
[15:12:37] Advertencia: No se pudo importar 'format_variable_name' desde processors.processor_utils.
[15:12:37] Usando una implementación local básica.
[15:12:37] INFO: format_variable_name importado desde generators.generator_utils
[15:12:37] ======================================== LOG START ========================================
[15:12:37] Directorio de trabajo base configurado: 'C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport'
[15:12:37] Buscando archivos XML recursivamente en el subdirectorio: 'C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport\PLC'
[15:12:37] Se encontraron 408 archivos XML para procesar:
[15:12:37] - PLC\PlcDataTypes\AnalogInstrument.xml
[15:12:37] - PLC\PlcDataTypes\CIP_Link_Type.xml
[15:12:37] - PLC\PlcDataTypes\CIP_Simple_Type.xml
[15:12:37] - PLC\PlcDataTypes\CIP_Step_Type.xml
[15:12:37] - PLC\PlcDataTypes\CIP_WaitEvent_Type.xml
[15:12:37] - PLC\PlcDataTypes\Device.xml
[15:12:37] - PLC\PlcDataTypes\DigitalInstrument.xml
[15:12:37] - PLC\PlcDataTypes\FunctionButton.xml
[15:12:37] - PLC\PlcDataTypes\PID.xml
[15:12:37] - PLC\PlcDataTypes\QCO Phase.xml
[15:12:37] - PLC\PlcDataTypes\QCO Spare.xml
[15:12:37] - PLC\PlcDataTypes\QCO Timer.xml
[15:12:37] - PLC\PlcDataTypes\QCO Timer_Array_1.xml
[15:12:37] - PLC\PlcDataTypes\Recipe_Prod.xml
[15:12:37] - PLC\PlcDataTypes\ReportCIPSimpleData.xml
[15:12:37] - PLC\PlcDataTypes\TADDR_PAR.xml
[15:12:37] - PLC\PlcDataTypes\TCON_PAR.xml
[15:12:37] - PLC\PlcDataTypes\TCON_PAR_LF.xml
[15:12:37] - PLC\PlcDataTypes\Tipo di dati utente_1.xml
[15:12:37] - PLC\PlcDataTypes\Tipo di dati utente_2.xml
[15:12:37] - PLC\PlcTags\IO Not in Hardware\InputsMaster.xml
[15:12:37] - PLC\PlcTags\IO Not in Hardware\OutputsMaster.xml
[15:12:37] - PLC\PlcTags\Inputs.xml
[15:12:37] - PLC\PlcTags\Memories.xml
[15:12:37] - PLC\PlcTags\Outputs.xml
[15:12:37] - PLC\PlcTags\OutputsFesto.xml
[15:12:37] - PLC\PlcTags\Tabella delle variabili standard.xml
[15:12:37] - PLC\PlcTags\Tabella delle variabili_1.xml
[15:12:37] - PLC\PlcTags\Tabella delle variabili_2.xml
[15:12:37] - PLC\PlcTags\Timers_Counters.xml
[15:12:37] - PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia MainRoutine.xml
[15:12:37] - PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profibus.xml
[15:12:37] - PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfibusData.xml
[15:12:37] - PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profinet.xml
[15:12:37] - PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfinetData.xml
[15:12:37] - PLC\ProgramBlocks_XML\Baialage.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlendFill StartUp_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_All Auto.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_CIPModeInit.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_InitErrors.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_MFM Command.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_MachineInit.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_ManualActive.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_ProdModeInit.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_ResetSPWord.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl_UpdatePWord.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderCtrl__Main.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_Monitor.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_PresRelea.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_ReadAnIn.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveInteg.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveValve.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl_WriteAnOu.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPIDCtrl__Loop.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_ActualRecipe.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_BlendingFault.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_FlowMeterErro.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_NextRecipe.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_PIDFFCalc.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_PIDInitParam.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_PIDResInteg.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID_PIDSPCalc.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID__Main.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderPID__Main_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRinse.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRinse_Done.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun_MeasFilSpeed.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun_MeasFil_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun_ProdTime.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun_SelectConstan.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun_Stopping.xml
[15:12:37] - PLC\ProgramBlocks_XML\BlenderRun__Control.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blender_Constants.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blender_Procedure Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blender_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blender_Variables_Pers.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blocco_1.xml
[15:12:37] - PLC\ProgramBlocks_XML\Blocco_dati_Test.xml
[15:12:37] - PLC\ProgramBlocks_XML\Block_compare.xml
[15:12:37] - PLC\ProgramBlocks_XML\Block_move.xml
[15:12:37] - PLC\ProgramBlocks_XML\BrixTracking_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\BrixTracking_ProdSamples.xml
[15:12:37] - PLC\ProgramBlocks_XML\BrixTracking_SampleTime.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIP CVQ.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIP FlipFlop.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_ExecSimpleCIP.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_ExecStep.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_ProgInizialize.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_ProgStepDown.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_ProgStepUp.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPLocal_WaitEvent_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPMain.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPMain_Flood.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPMain_Total Drain.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#01.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#02.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#03.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#04.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#05.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#06.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#07.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#08.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#09.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#10.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#11.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#12.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#13.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#14.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#15.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#16.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#17.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#18.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#19.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#20.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#21.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#22.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#23.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#24.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#25.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#26.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#27.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#28.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#29.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipe#30.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipeManagement.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPRecipeManagement_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPReportDB.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIPReportManager.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIP_Program_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\CIP_SimpleProgr_Init.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2 Solubility.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2EqPress.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2InjPressure.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2Tracking.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2Tracking_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2Tracking_ProdSamples.xml
[15:12:37] - PLC\ProgramBlocks_XML\CO2Tracking_SampleTime.xml
[15:12:37] - PLC\ProgramBlocks_XML\COMPLETE RESTART.xml
[15:12:37] - PLC\ProgramBlocks_XML\CPU_DP Global Diag.xml
[15:12:37] - PLC\ProgramBlocks_XML\CTRLCoolingSystem.xml
[15:12:37] - PLC\ProgramBlocks_XML\CVQ_1p7_8_Perc.xml
[15:12:37] - PLC\ProgramBlocks_XML\CYC_INT5.xml
[15:12:37] - PLC\ProgramBlocks_XML\CarboWaterLine_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\Cetrifugal_Head.xml
[15:12:37] - PLC\ProgramBlocks_XML\Clock Signal.xml
[15:12:37] - PLC\ProgramBlocks_XML\Co2_Counters.xml
[15:12:37] - PLC\ProgramBlocks_XML\Co2_Counters_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\DELETE.xml
[15:12:37] - PLC\ProgramBlocks_XML\DeairCO2TempComp.xml
[15:12:37] - PLC\ProgramBlocks_XML\DeaireationValve.xml
[15:12:37] - PLC\ProgramBlocks_XML\Deaireator StartUp_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\Default_SupervisionDB.xml
[15:12:37] - PLC\ProgramBlocks_XML\Delay.xml
[15:12:37] - PLC\ProgramBlocks_XML\DeltaP.xml
[15:12:37] - PLC\ProgramBlocks_XML\EQ_STRNG.xml
[15:12:37] - PLC\ProgramBlocks_XML\FW_DRand.xml
[15:12:37] - PLC\ProgramBlocks_XML\FeedForward.xml
[15:12:37] - PLC\ProgramBlocks_XML\FillerControl.xml
[15:12:37] - PLC\ProgramBlocks_XML\FillerControl_DataSend.xml
[15:12:37] - PLC\ProgramBlocks_XML\Filler_Head_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\FillingTime.xml
[15:12:37] - PLC\ProgramBlocks_XML\FirstProduction_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\Flow_To_Press_Loss.xml
[15:12:37] - PLC\ProgramBlocks_XML\Freq_To_mmH2O.xml
[15:12:37] - PLC\ProgramBlocks_XML\FrictionLoss.xml
[15:12:37] - PLC\ProgramBlocks_XML\GLOBAL_DIAG_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\GetProdBrixCO2_Anal_Inpt.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI CPU_DP Diag.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI Key User.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Alarms.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Blender_Parameters.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Device.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Digital.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_IO_Showing.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Instrument.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Local_CIP_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_PID.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Recipe_Edit.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Recipe_Name.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Refrige_IO_Showing.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Service.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Variables_Cmd.xml
[15:12:37] - PLC\ProgramBlocks_XML\HMI_Variables_Status.xml
[15:12:37] - PLC\ProgramBlocks_XML\IO_FLT1.xml
[15:12:37] - PLC\ProgramBlocks_XML\ISOonTCP_or_TCP_Protocol.xml
[15:12:37] - PLC\ProgramBlocks_XML\ISOonTCP_or_TCP_Protocol_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic CIP DI.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic CIPRoom.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic Filler DI.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic Filler.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic MainData.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic MainRoutine.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic Mixer DI.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic ProdRoom.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Communic Product Room DI.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC DataIn.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC DataOut.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC Exchange MainRoutine.xml
[15:12:37] - PLC\ProgramBlocks_XML\ITC MainRoutine.xml
[15:12:37] - PLC\ProgramBlocks_XML\Input.xml
[15:12:37] - PLC\ProgramBlocks_XML\Input_CheckFlowMetersSta.xml
[15:12:37] - PLC\ProgramBlocks_XML\Input_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\Input_DigitalCtrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\Input_DigitalScanner.xml
[15:12:37] - PLC\ProgramBlocks_XML\Instrument_Scanner.xml
[15:12:37] - PLC\ProgramBlocks_XML\Integral.xml
[15:12:37] - PLC\ProgramBlocks_XML\Interlocking_Panel.xml
[15:12:37] - PLC\ProgramBlocks_XML\Interlocking_Panel_1.xml
[15:12:37] - PLC\ProgramBlocks_XML\Interlocking_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\Key Read & Write Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\Key Read & Write.xml
[15:12:37] - PLC\ProgramBlocks_XML\LIMIT_I.xml
[15:12:37] - PLC\ProgramBlocks_XML\LIMIT_R.xml
[15:12:37] - PLC\ProgramBlocks_XML\LowPassFilter.xml
[15:12:37] - PLC\ProgramBlocks_XML\MFMAnalogValues.xml
[15:12:37] - PLC\ProgramBlocks_XML\MFMAnalogValues_Totalize.xml
[15:12:37] - PLC\ProgramBlocks_XML\MFM_Analog_Value_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\MOD_ERR.xml
[15:12:37] - PLC\ProgramBlocks_XML\MSE Slope.xml
[15:12:37] - PLC\ProgramBlocks_XML\Machine_Co2_Cons.xml
[15:12:37] - PLC\ProgramBlocks_XML\Maselli_PA_Control.xml
[15:12:37] - PLC\ProgramBlocks_XML\Maselli_PA_Ctrl_Read.xml
[15:12:37] - PLC\ProgramBlocks_XML\Maselli_PA_Ctrl_Transfer.xml
[15:12:37] - PLC\ProgramBlocks_XML\Maselli_PA_Ctrl_Write.xml
[15:12:37] - PLC\ProgramBlocks_XML\Maselli_PA_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\MaxCarboCO2 Vol.xml
[15:12:37] - PLC\ProgramBlocks_XML\MessageScroll.xml
[15:12:37] - PLC\ProgramBlocks_XML\ModValveFault.xml
[15:12:37] - PLC\ProgramBlocks_XML\ONS_R.xml
[15:12:37] - PLC\ProgramBlocks_XML\Output.xml
[15:12:37] - PLC\ProgramBlocks_XML\Output_AnalogValueToHMI.xml
[15:12:37] - PLC\ProgramBlocks_XML\Output_CO2InjPress.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID MAIN Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PIDControl.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_Filling_Head.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_Filling_Head_Calc.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_Filling_Head_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM301.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM301_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM303.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM303_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM304.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMM304_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMP302.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RMP302_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVM301.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVM301_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVM319_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVM319_PRD.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVN302.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVN302_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVP303.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVP303_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVS318.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_RVS318_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\PID_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPM O2.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPM303_VFC_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPM305_VFC_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPM307_VFC_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPN301_VFC_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\PPP302_VFC_Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\Pneumatic Valve Ctrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\Pneumatic Valve Fault DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\Pneumatic Valve Fault.xml
[15:12:37] - PLC\ProgramBlocks_XML\Procedure.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureBlendFill StartUp.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureBrixTracking.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureCarboWaterLine.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureDeaireator StartUp.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureFirstProduction.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureProdBrixRecovery.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureProdTankDrain.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureProdTankRunOut.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureSyrup RunOut.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureSyrupLineMFMPrep.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProcedureSyrupMFMStartUp.xml
[15:12:37] - PLC\ProgramBlocks_XML\Procedure_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\Prod Tank Drain_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\Prod Tank PressCtrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\Prod Tank RunOut_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProdBrixRecovery_BrixCal.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProdBrixRecovery_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProdReportDB.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProdReportManager.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductAvailable.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductLiterInTank.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductPipeDrain.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductPipeDrain_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductPipeRunOut.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductPipeRunOut_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductQuality.xml
[15:12:37] - PLC\ProgramBlocks_XML\ProductQuality_Messages.xml
[15:12:37] - PLC\ProgramBlocks_XML\Profibus Network.xml
[15:12:37] - PLC\ProgramBlocks_XML\Profibus_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\Programming error.xml
[15:12:37] - PLC\ProgramBlocks_XML\PumpsControl.xml
[15:12:37] - PLC\ProgramBlocks_XML\QCO Monitor.xml
[15:12:37] - PLC\ProgramBlocks_XML\QCO Timing DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\RACK_FLT.xml
[15:12:37] - PLC\ProgramBlocks_XML\REPLACE_Mod.xml
[15:12:37] - PLC\ProgramBlocks_XML\ReadAnalogIn.xml
[15:12:37] - PLC\ProgramBlocks_XML\ReadAnalogIn_Fault_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #01.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #02.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #03.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #04.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #05.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #06.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #07.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #08.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #09.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #10.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #11.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #12.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #13.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #14.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #15.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #16.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #17.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #18.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #19.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #20.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #21.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #22.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #23.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #24.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #25.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #26.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #27.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #28.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #29.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #30.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #31.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #32.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #33.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #34.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #35.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #36.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #37.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #38.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #39.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #40.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #41.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #42.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #43.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #44.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #45.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #46.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #47.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #48.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #49.xml
[15:12:37] - PLC\ProgramBlocks_XML\Recipe #50.xml
[15:12:37] - PLC\ProgramBlocks_XML\RecipeCalculation.xml
[15:12:37] - PLC\ProgramBlocks_XML\RecipeEditDataSave.xml
[15:12:37] - PLC\ProgramBlocks_XML\RecipeManagement - Prod.xml
[15:12:37] - PLC\ProgramBlocks_XML\RecipeManagement_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\SEL_I.xml
[15:12:37] - PLC\ProgramBlocks_XML\SEL_R.xml
[15:12:37] - PLC\ProgramBlocks_XML\SLIM_Block.xml
[15:12:37] - PLC\ProgramBlocks_XML\SLIM_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\Safeties.xml
[15:12:37] - PLC\ProgramBlocks_XML\SelCheckBrixSource.xml
[15:12:37] - PLC\ProgramBlocks_XML\Sel_Check_Brix_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\Signal Gen.xml
[15:12:37] - PLC\ProgramBlocks_XML\Signal_Gen_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\SlewLimit.xml
[15:12:37] - PLC\ProgramBlocks_XML\SpeedAdjust.xml
[15:12:37] - PLC\ProgramBlocks_XML\Statistical_Analisys.xml
[15:12:37] - PLC\ProgramBlocks_XML\SubCarb.xml
[15:12:37] - PLC\ProgramBlocks_XML\SubCarb_DB.xml
[15:12:37] - PLC\ProgramBlocks_XML\SyrBrix Autocorrection.xml
[15:12:37] - PLC\ProgramBlocks_XML\SyrBrix_SyrupCorrPerc.xml
[15:12:37] - PLC\ProgramBlocks_XML\Syrup Line MFM Prep_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\Syrup MFM StartUp_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\Syrup Rinse QCO_Seq.xml
[15:12:37] - PLC\ProgramBlocks_XML\SyrupDensity.xml
[15:12:37] - PLC\ProgramBlocks_XML\SyrupRoomCtrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\SyrupRoomCtrl_UpdateVal.xml
[15:12:37] - PLC\ProgramBlocks_XML\System_RunOut_Variables.xml
[15:12:37] - PLC\ProgramBlocks_XML\System_Run_Out.xml
[15:12:37] - PLC\ProgramBlocks_XML\System_Run_Out_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\T_Timer.xml
[15:12:37] - PLC\ProgramBlocks_XML\TankLevel.xml
[15:12:37] - PLC\ProgramBlocks_XML\TankLevelToHeight.xml
[15:12:37] - PLC\ProgramBlocks_XML\Time error interrupt.xml
[15:12:37] - PLC\ProgramBlocks_XML\VacuumCtrl.xml
[15:12:37] - PLC\ProgramBlocks_XML\ValveFlow.xml
[15:12:37] - PLC\ProgramBlocks_XML\WaterDensity.xml
[15:12:37] - PLC\ProgramBlocks_XML\WritePeripheral.xml
[15:12:37] - PLC\ProgramBlocks_XML\_CYCL_EXC.xml
[15:12:37] - PLC\ProgramBlocks_XML\_StepMove.xml
[15:12:37] - PLC\ProgramBlocks_XML\_StepMove_Test.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Control.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Ctrl_Parameters.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Ctrl_Read.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Ctrl_Transfer.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Ctrl_Write.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_PA_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Control.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Ctrl_Param.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Ctrl_Read.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Ctrl_Trans.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Ctrl_Write.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPDS_SYR_PA_Data.xml
[15:12:37] - PLC\ProgramBlocks_XML\mPPM303StartUpRamp.xml
[15:12:37] - PLC\ProgramBlocks_XML\mmH2O_TO_Freq.xml
[15:12:37] --- Fase 1: Procesamiento Individual (x1, x2, x3) ---
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\AnalogInstrument.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\AnalogInstrument.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\AnalogInstrument.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\AnalogInstrument.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\CIP_Link_Type.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\CIP_Link_Type.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\CIP_Link_Type.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\CIP_Link_Type.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\CIP_Simple_Type.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\CIP_Simple_Type.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\CIP_Simple_Type.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\CIP_Simple_Type.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\CIP_Step_Type.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\CIP_Step_Type.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\CIP_Step_Type.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\CIP_Step_Type.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\CIP_WaitEvent_Type.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\CIP_WaitEvent_Type.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\CIP_WaitEvent_Type.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\CIP_WaitEvent_Type.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\Device.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\Device.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\Device.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\Device.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\DigitalInstrument.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\DigitalInstrument.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\DigitalInstrument.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\DigitalInstrument.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\FunctionButton.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\FunctionButton.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\FunctionButton.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\FunctionButton.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\PID.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\PID.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\PID.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\PID.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\QCO Phase.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\QCO Phase.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\QCO Phase.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\QCO Phase.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\QCO Spare.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\QCO Spare.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\QCO Spare.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\QCO Spare.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\QCO Timer.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\QCO Timer.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\QCO Timer.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\QCO Timer.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\QCO Timer_Array_1.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\QCO Timer_Array_1.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\QCO Timer_Array_1.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\QCO Timer_Array_1.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\Recipe_Prod.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\Recipe_Prod.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\Recipe_Prod.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\Recipe_Prod.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\ReportCIPSimpleData.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\ReportCIPSimpleData.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\ReportCIPSimpleData.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\ReportCIPSimpleData.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\TADDR_PAR.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\TADDR_PAR.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\TADDR_PAR.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\TADDR_PAR.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\TCON_PAR.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\TCON_PAR.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\TCON_PAR.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\TCON_PAR.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\TCON_PAR_LF.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\TCON_PAR_LF.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\TCON_PAR_LF.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\TCON_PAR_LF.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\Tipo di dati utente_1.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\Tipo di dati utente_1.xml (archivo XML no modificado y JSON procesado existe)
[15:12:37] --- SALTANDO x2 para: PLC\PlcDataTypes\Tipo di dati utente_1.xml (razón anterior)
[15:12:37] --- SALTANDO x3 para: PLC\PlcDataTypes\Tipo di dati utente_1.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:37] --- Procesando archivo: PLC\PlcDataTypes\Tipo di dati utente_2.xml ---
[15:12:37] --- SALTANDO x1 para: PLC\PlcDataTypes\Tipo di dati utente_2.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcDataTypes\Tipo di dati utente_2.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcDataTypes\Tipo di dati utente_2.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\IO Not in Hardware\InputsMaster.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\IO Not in Hardware\InputsMaster.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\IO Not in Hardware\InputsMaster.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\IO Not in Hardware\InputsMaster.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\IO Not in Hardware\OutputsMaster.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\IO Not in Hardware\OutputsMaster.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\IO Not in Hardware\OutputsMaster.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\IO Not in Hardware\OutputsMaster.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Inputs.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Inputs.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Inputs.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Inputs.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Memories.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Memories.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Memories.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Memories.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Outputs.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Outputs.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Outputs.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Outputs.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\OutputsFesto.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\OutputsFesto.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\OutputsFesto.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\OutputsFesto.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Tabella delle variabili standard.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Tabella delle variabili standard.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Tabella delle variabili standard.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Tabella delle variabili standard.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Tabella delle variabili_1.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Tabella delle variabili_1.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Tabella delle variabili_1.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Tabella delle variabili_1.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Tabella delle variabili_2.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Tabella delle variabili_2.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Tabella delle variabili_2.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Tabella delle variabili_2.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\PlcTags\Timers_Counters.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\PlcTags\Timers_Counters.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\PlcTags\Timers_Counters.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\PlcTags\Timers_Counters.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia MainRoutine.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia MainRoutine.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia MainRoutine.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia MainRoutine.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profibus.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profibus.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profibus.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profibus.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfibusData.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfibusData.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfibusData.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfibusData.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profinet.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profinet.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profinet.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia Profinet.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfinetData.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfinetData.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfinetData.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\40_10_GNS_PLCdia Main\GNS PLCdia ProfinetData.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\Baialage.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Baialage.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Baialage.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Baialage.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlendFill StartUp_Seq.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlendFill StartUp_Seq.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlendFill StartUp_Seq.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlendFill StartUp_Seq.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_All Auto.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_All Auto.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_All Auto.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_All Auto.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_CIPModeInit.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_CIPModeInit.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_CIPModeInit.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_CIPModeInit.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_InitErrors.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_InitErrors.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_InitErrors.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_InitErrors.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_MFM Command.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_MFM Command.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_MFM Command.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_MFM Command.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_MachineInit.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_MachineInit.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_MachineInit.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_MachineInit.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_ManualActive.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_ManualActive.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_ManualActive.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_ManualActive.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_ProdModeInit.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_ProdModeInit.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_ProdModeInit.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_ProdModeInit.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_ResetSPWord.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_ResetSPWord.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_ResetSPWord.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_ResetSPWord.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl_UpdatePWord.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl_UpdatePWord.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl_UpdatePWord.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl_UpdatePWord.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderCtrl__Main.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderCtrl__Main.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderCtrl__Main.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderCtrl__Main.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_Monitor.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_Monitor.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_Monitor.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_Monitor.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_PresRelea.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_PresRelea.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_PresRelea.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_PresRelea.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_ReadAnIn.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_ReadAnIn.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_ReadAnIn.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_ReadAnIn.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveInteg.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveInteg.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveInteg.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveInteg.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveValve.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveValve.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveValve.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_SaveValve.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl_WriteAnOu.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_WriteAnOu.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_WriteAnOu.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl_WriteAnOu.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPIDCtrl__Loop.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl__Loop.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl__Loop.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPIDCtrl__Loop.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_ActualRecipe.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_ActualRecipe.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_ActualRecipe.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_ActualRecipe.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_BlendingFault.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_BlendingFault.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_BlendingFault.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_BlendingFault.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_FlowMeterErro.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_FlowMeterErro.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_FlowMeterErro.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_FlowMeterErro.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_NextRecipe.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_NextRecipe.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_NextRecipe.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_NextRecipe.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_PIDFFCalc.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_PIDFFCalc.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_PIDFFCalc.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_PIDFFCalc.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_PIDInitParam.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_PIDInitParam.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_PIDInitParam.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_PIDInitParam.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_PIDResInteg.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_PIDResInteg.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_PIDResInteg.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_PIDResInteg.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID_PIDSPCalc.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID_PIDSPCalc.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID_PIDSPCalc.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID_PIDSPCalc.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID__Main.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID__Main.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID__Main.xml (razón anterior)
[15:12:38] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderPID__Main.xml (archivo de salida en 'scl_output' está actualizado)
[15:12:38] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderPID__Main_Data.xml ---
[15:12:38] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderPID__Main_Data.xml (archivo XML no modificado y JSON procesado existe)
[15:12:38] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderPID__Main_Data.xml (razón anterior)
[15:12:38] --- Running x3_generate_scl.py with arguments: ['PLC\\ProgramBlocks_XML\\BlenderPID__Main_Data.xml', 'PLC'] ---
[15:17:56] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRinse.xml ---
[15:17:56] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRinse.xml (archivo XML no modificado y JSON procesado existe)
[15:17:56] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRinse.xml (razón anterior)
[15:17:56] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRinse.xml (archivo de salida en 'scl_output' está actualizado)
[15:17:56] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRinse_Done.xml ---
[15:17:56] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRinse_Done.xml (archivo XML no modificado y JSON procesado existe)
[15:17:56] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRinse_Done.xml (razón anterior)
[15:17:56] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRinse_Done.xml (archivo de salida en 'scl_output' está actualizado)
[15:17:56] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun_MeasFilSpeed.xml ---
[15:17:56] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun_MeasFilSpeed.xml (archivo XML no modificado y JSON procesado existe)
[15:17:56] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun_MeasFilSpeed.xml (razón anterior)
[15:17:56] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRun_MeasFilSpeed.xml (archivo de salida en 'scl_output' está actualizado)
[15:17:56] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun_MeasFil_Data.xml ---
[15:17:56] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun_MeasFil_Data.xml (archivo XML no modificado y JSON procesado existe)
[15:17:56] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun_MeasFil_Data.xml (razón anterior)
[15:17:56] --- Running x3_generate_scl.py with arguments: ['PLC\\ProgramBlocks_XML\\BlenderRun_MeasFil_Data.xml', 'PLC'] ---
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun_ProdTime.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun_ProdTime.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun_ProdTime.xml (razón anterior)
[15:18:13] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRun_ProdTime.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun_SelectConstan.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun_SelectConstan.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun_SelectConstan.xml (razón anterior)
[15:18:13] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRun_SelectConstan.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun_Stopping.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun_Stopping.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun_Stopping.xml (razón anterior)
[15:18:13] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRun_Stopping.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\BlenderRun__Control.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BlenderRun__Control.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BlenderRun__Control.xml (razón anterior)
[15:18:13] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BlenderRun__Control.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\Blender_Constants.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blender_Constants.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blender_Constants.xml (razón anterior)
[15:18:13] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Blender_Constants.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:13] --- Procesando archivo: PLC\ProgramBlocks_XML\Blender_Procedure Data.xml ---
[15:18:13] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blender_Procedure Data.xml (archivo XML no modificado y JSON procesado existe)
[15:18:13] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blender_Procedure Data.xml (razón anterior)
[15:18:13] --- Running x3_generate_scl.py with arguments: ['PLC\\ProgramBlocks_XML\\Blender_Procedure Data.xml', 'PLC'] ---
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Blender_Variables.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blender_Variables.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blender_Variables.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Blender_Variables.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Blender_Variables_Pers.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blender_Variables_Pers.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blender_Variables_Pers.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Blender_Variables_Pers.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Blocco_1.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blocco_1.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blocco_1.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Blocco_1.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Blocco_dati_Test.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Blocco_dati_Test.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Blocco_dati_Test.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Blocco_dati_Test.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Block_compare.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Block_compare.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Block_compare.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Block_compare.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\Block_move.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\Block_move.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\Block_move.xml (razón anterior)
[15:18:33] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\Block_move.xml (archivo de salida en 'scl_output' está actualizado)
[15:18:33] --- Procesando archivo: PLC\ProgramBlocks_XML\BrixTracking_Data.xml ---
[15:18:33] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BrixTracking_Data.xml (archivo XML no modificado y JSON procesado existe)
[15:18:33] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BrixTracking_Data.xml (razón anterior)
[15:18:33] --- Running x3_generate_scl.py with arguments: ['PLC\\ProgramBlocks_XML\\BrixTracking_Data.xml', 'PLC'] ---
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\BrixTracking_ProdSamples.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BrixTracking_ProdSamples.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BrixTracking_ProdSamples.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BrixTracking_ProdSamples.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\BrixTracking_SampleTime.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\BrixTracking_SampleTime.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\BrixTracking_SampleTime.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\BrixTracking_SampleTime.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIP CVQ.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIP CVQ.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIP CVQ.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIP CVQ.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIP FlipFlop.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIP FlipFlop.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIP FlipFlop.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIP FlipFlop.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_ExecSimpleCIP.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_ExecSimpleCIP.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_ExecSimpleCIP.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_ExecSimpleCIP.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_ExecStep.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_ExecStep.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_ExecStep.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_ExecStep.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_ProgInizialize.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_ProgInizialize.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_ProgInizialize.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_ProgInizialize.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_ProgStepDown.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepDown.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepDown.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepDown.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_ProgStepUp.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepUp.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepUp.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_ProgStepUp.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPLocal_WaitEvent_Ctrl.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPLocal_WaitEvent_Ctrl.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPLocal_WaitEvent_Ctrl.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPLocal_WaitEvent_Ctrl.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPMain.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPMain.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPMain.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPMain.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPMain_Flood.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPMain_Flood.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPMain_Flood.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPMain_Flood.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPMain_Total Drain.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPMain_Total Drain.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPMain_Total Drain.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPMain_Total Drain.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#01.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#01.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#01.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#01.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#02.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#02.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#02.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#02.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#03.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#03.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#03.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#03.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#04.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#04.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#04.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#04.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#05.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#05.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#05.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#05.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#06.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#06.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#06.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#06.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#07.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#07.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#07.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#07.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#08.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#08.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#08.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#08.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#09.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#09.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#09.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#09.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#10.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#10.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#10.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#10.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#11.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#11.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#11.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#11.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#12.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#12.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#12.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#12.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#13.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#13.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#13.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#13.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#14.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#14.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#14.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#14.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#15.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#15.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#15.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#15.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#16.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#16.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#16.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#16.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#17.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#17.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#17.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#17.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#18.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#18.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#18.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#18.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#19.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#19.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#19.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#19.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#20.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#20.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#20.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#20.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#21.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#21.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#21.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#21.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#22.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#22.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#22.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#22.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#23.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#23.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#23.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#23.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#24.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#24.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#24.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#24.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#25.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#25.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#25.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#25.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#26.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#26.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#26.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#26.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#27.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#27.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#27.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#27.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#28.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#28.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#28.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#28.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#29.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#29.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#29.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#29.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipe#30.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipe#30.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipe#30.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipe#30.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipeManagement.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipeManagement.xml (archivo XML no modificado y JSON procesado existe)
[15:19:59] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipeManagement.xml (razón anterior)
[15:19:59] --- SALTANDO x3 para: PLC\ProgramBlocks_XML\CIPRecipeManagement.xml (archivo de salida en 'scl_output' está actualizado)
[15:19:59] --- Procesando archivo: PLC\ProgramBlocks_XML\CIPRecipeManagement_Data.xml ---
[15:19:59] --- SALTANDO x1 para: PLC\ProgramBlocks_XML\CIPRecipeManagement_Data.xml (archivo XML no modificado y JSON procesado existe)
[15:20:00] --- SALTANDO x2 para: PLC\ProgramBlocks_XML\CIPRecipeManagement_Data.xml (razón anterior)
[15:20:00] --- Running x3_generate_scl.py with arguments: ['PLC\\ProgramBlocks_XML\\CIPRecipeManagement_Data.xml', 'PLC'] ---