Simatic_XML_Parser_to_SCL/generators/generate_scl_db.py

60 lines
2.2 KiB
Python

# generators/generate_scl_db.py
# -*- coding: utf-8 -*-
from .generator_utils import format_variable_name, generate_scl_declarations
def _generate_scl_header(data, scl_block_name):
"""Genera el encabezado SCL para DB."""
scl_output = []
block_type = data.get("block_type", "Unknown")
block_name = data.get("block_name", "UnknownBlock")
block_number = data.get("block_number")
block_comment = data.get("block_comment", "")
scl_output.append(f"// Block Type: {block_type}")
if block_name != scl_block_name:
scl_output.append(f"// Block Name (Original): {block_name}")
if block_number:
scl_output.append(f"// Block Number: {block_number}")
if block_comment:
scl_output.append(f"// Block Comment:")
for line in block_comment.splitlines():
scl_output.append(f"// {line}")
scl_output.append("")
scl_output.append(f'DATA_BLOCK "{scl_block_name}"') # Keyword específica
scl_output.append("{ S7_Optimized_Access := 'TRUE' }")
scl_output.append("VERSION : 0.1")
scl_output.append("")
return scl_output
def _generate_scl_interface(interface_data):
"""Genera la sección VAR para DB (basada en 'Static')."""
scl_output = []
static_vars = interface_data.get("Static", [])
if static_vars:
scl_output.append("VAR")
scl_output.extend(generate_scl_declarations(static_vars, indent_level=1))
scl_output.append("END_VAR")
else:
print("Advertencia: No se encontró sección 'Static' o está vacía en la interfaz del DB.")
scl_output.append("VAR\nEND_VAR") # Añadir vacío
scl_output.append("")
return scl_output
def generate_scl_for_db(data):
"""Genera el contenido SCL completo para un DATA_BLOCK."""
scl_output = []
scl_block_name = format_variable_name(data.get("block_name", "UnknownDB"))
# Generar cabecera
scl_output.extend(_generate_scl_header(data, scl_block_name))
# Generar interfaz
interface_data = data.get("interface", {})
scl_output.extend(_generate_scl_interface(interface_data))
# Generar cuerpo (vacío para DB)
scl_output.append("BEGIN")
scl_output.append(" // Data Blocks have no executable code")
scl_output.append("END_DATA_BLOCK")
return scl_output