Skip to content

ebalvis/ExtractSysmac

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ExtraerSysmac

Extractor de proyectos Sysmac Studio (.smc2) a texto plano

Delphi Platform License

ExtraerSysmac

Herramienta para extraer, decodificar y documentar toda la información contenida en un proyecto Sysmac Studio de Omron (.smc2): variables, código fuente ST, estructuras de datos, mapa de E/S hardware, configuración del PLC y conexiones de bloques funcionales.

Disponible como aplicación gráfica (VCL) y como herramienta de línea de comandos.


Características

  • Resolución determinista de POUs vía fichero .oem interno — sin heurísticas, mapeo GUID→nombre 100% fiable
  • Declaraciones IEC 61131-3 completas (VAR_INPUT, VAR_OUTPUT, VAR, VAR_EXTERNAL, RETAIN) antes de cada bloque de código
  • Interfaces compiladas extraídas del ZIP anidado (ficheros .cxif2) para verificación cruzada
  • 8 ficheros de salida configurables individualmente
  • Drag & drop de archivos .smc2 sobre la ventana
  • Barra de progreso y log detallado en tiempo real
  • Compatible con PLCs de la serie NX/NJ (NX1P2, NJ501, etc.)

Ficheros generados

Fichero Formato Contenido
Variables_Sysmac.csv CSV (;) Todas las variables con tipo, scope, dirección HW, retentiva y valor inicial
Codigo_Fuente_Completo.txt Texto Código ST de cada POU con declaraciones IEC 61131-3 completas
Estructuras_Datos.txt Texto Definiciones TYPE/STRUCT (DUTs) con offsets de memoria
Mapa_IO_Hardware.txt Texto Entradas/salidas físicas organizadas por categoría (DI/DO/AI/AO)
Mapa_IO_Hardware.csv CSV (;) Mismo mapa en formato importable a Excel
Estructura_POUs.txt Texto Árbol de POUs con resumen de variables y líneas de código por bloque
Conexiones_FB.txt Texto Conexiones pin-a-pin de bloques funcionales en secciones Ladder/FBD
Configuracion_PLC.txt Texto Modelo CPU, firmware, red, tarea principal y datos del proyecto

Requisitos

  • Compilador: Embarcadero Delphi 10.x, 11.x o 12.x (Community Edition o superior)
  • Plataforma: Windows (32/64 bits)
  • Dependencias: Ninguna externa — usa únicamente unidades de la RTL/VCL estándar:
    • System.Zip
    • System.RegularExpressions
    • System.Generics.Collections

Compilación

Aplicación gráfica (GUI)

  1. Abrir ExtraerSysmacGUI.dpr en el IDE de Delphi
  2. (Opcional) Asignar icono: Project → Options → Application → Icon → Load Icon → seleccionar ExtraerSysmac.ico
  3. Compilar con Ctrl+F9 o ejecutar con F9

Línea de comandos

  1. Abrir ExtraerSysmac.dpr en el IDE de Delphi
  2. Compilar con Ctrl+F9

Alternativamente, desde línea de comandos:

dcc32 ExtraerSysmac.dpr
:: o para 64 bits:
dcc64 ExtraerSysmac.dpr

Uso

Modo gráfico

  1. Ejecutar ExtraerSysmacGUI.exe
  2. Seleccionar el archivo .smc2 con el botón Examinar (o arrastrarlo sobre la ventana)
  3. (Opcional) Cambiar la carpeta de salida
  4. (Opcional) Desmarcar los ficheros que no se necesiten
  5. Pulsar Extraer proyecto
  6. Al finalizar, pulsar Abrir carpeta salida para acceder a los ficheros generados

Modo consola

ExtraerSysmac <archivo.smc2> [opciones]

Si no se especifica carpeta de salida, los ficheros se generan en la misma carpeta del .smc2.

Opciones

Opción Descripción
-o <carpeta> Carpeta de salida (defecto: misma del .smc2)
-no-csv No generar Variables_Sysmac.csv
-no-code No generar Codigo_Fuente_Completo.txt
-no-dut No generar Estructuras_Datos.txt
-no-io No generar Mapa_IO_Hardware.txt/csv
-no-pou No generar Estructura_POUs.txt
-no-fb No generar Conexiones_FB.txt
-no-plc No generar Configuracion_PLC.txt
-solo-csv Generar solo Variables_Sysmac.csv
-solo-code Generar solo Codigo_Fuente_Completo.txt
-solo-pou Generar solo Estructura_POUs.txt
-q Modo silencioso (solo errores y resumen final)
-h, --help Mostrar ayuda

Las opciones -no-* se pueden combinar entre sí. Las opciones -solo-* desactivan todos los demás ficheros.

Ejemplos

# Extracción completa (todos los ficheros)
ExtraerSysmac MiProyecto.smc2

# Salida en otra carpeta
ExtraerSysmac MiProyecto.smc2 -o C:\Documentacion

# Solo el CSV de variables
ExtraerSysmac MiProyecto.smc2 -solo-csv

# Todo excepto mapa I/O y conexiones FB
ExtraerSysmac MiProyecto.smc2 -no-io -no-fb

# Código fuente en carpeta específica, sin log detallado
ExtraerSysmac MiProyecto.smc2 -solo-code -o D:\Export -q

Salida típica

  ExtraerSysmac v2.1
  Extractor de proyectos Sysmac Studio (.smc2)
  Resolucion OEM determinista + Interfaces compiladas
  =======================================================

  Archivo:  Seguridad_Grua.smc2
  Ruta:     C:\Proyectos\
  Salida:   C:\Proyectos\

  Fase 0: Leyendo metadatos del proyecto...
    OEM: 36 entidades mapeadas
    Interfaces compiladas (.cxif2): 6
  Fase 1: Extrayendo datos...
  Fase 2: Construyendo POUs...
    VARS 43a65a73 -> Main (25 vars)
    VARS 6e314df6 -> FB_InputProcessing (12 vars)
    CODE f9beeca7 -> FB_InputProcessing (3420 chars)
    ...
  Generando ficheros de salida...
    -> Variables_Sysmac.csv (48 variables)
    -> Codigo_Fuente_Completo.txt (7 POUs)
    -> Estructuras_Datos.txt (3 estructuras)
    -> Mapa_IO_Hardware.txt (22 puntos)
    -> Estructura_POUs.txt (7 POUs)
    -> Conexiones_FB.txt (15 conexiones)
    -> Configuracion_PLC.txt

  ============================================================
    EXTRACCION COMPLETADA
  ============================================================

    Variables:      48
    POUs:           7
    DUTs:           3
    Puntos E/S:     22
    Conexiones FB:  15
    Interfaces:     6
    PLC:            NX1P2-9024DT1 1.49

    Ficheros generados: 8
      Variables_Sysmac.csv
      Codigo_Fuente_Completo.txt
      Estructuras_Datos.txt
      Mapa_IO_Hardware.txt
      Mapa_IO_Hardware.csv
      Estructura_POUs.txt
      Conexiones_FB.txt
      Configuracion_PLC.txt

    Tiempo: 0.34 segundos

Código de retorno

Código Significado
0 Extracción completada correctamente
1 Error (archivo no encontrado, ZIP dañado, parámetro inválido)

Esto permite integrar ExtraerSysmac en scripts batch o pipelines CI/CD:

ExtraerSysmac %1 -solo-csv -q -o %OUTPUT_DIR%
IF ERRORLEVEL 1 (
    echo Error en la extraccion
    exit /b 1
)

Arquitectura interna

Estructura del proyecto

ExtraerSysmacGUI/
├── ExtraerSysmacGUI.dpr     # Proyecto GUI (VCL Forms)
├── ExtraerSysmac.dpr        # Proyecto consola
├── uSysmacExtractor.pas     # Lógica de extracción (1587 líneas)
├── uMainForm.pas            # Formulario principal
├── uMainForm.dfm            # Diseño del formulario
├── ExtraerSysmac.ico        # Icono (6 tamaños: 16-256px)
├── ExtraerSysmacGUI.rc      # Script de recursos
└── README.md

La lógica de extracción está completamente separada en uSysmacExtractor.pas, lo que permite:

  • Reutilizar el motor desde cualquier aplicación Delphi
  • Integrar en procesos batch o servicios
  • Añadir nuevas interfaces (web, REST, etc.) sin modificar el core

Formato .smc2

Un fichero .smc2 de Sysmac Studio es un archivo ZIP que contiene:

<GUID_proyecto>/
├── <guid>.oem                    # Árbol del proyecto (GUID→nombre)
├── <guid>.manifest               # Metadatos del proyecto
├── <guid>.xml (×52)              # Datos: variables (SLWD), código (ST), config
├── <guid>.BookmarkGroup (×11)    # Marcadores del IDE
├── <guid>.NexBuildResults        # Resultados de compilación
├── <guid>.NexTransferInformation # Última transferencia al PLC
├── <guid>.dat (×3)               # Configuración EtherCAT/NXBus
├── <guid>.zip                    # ZIP anidado con código compilado
│   ├── *.cxif2                   #   Interfaces compiladas FB/FC
│   ├── *.cxil2                   #   Variables compiladas
│   ├── *.o                       #   Código objeto
│   └── Resource_UserTypes.cxip   #   Tipos de usuario compilados
└── StorageData/
    └── SysmacStudio.stsdb4       # Base de datos interna (cookies)

Fases de extracción

El proceso se ejecuta en 3 fases secuenciales:

Fase 0 — Metadatos

Parsea el fichero .oem que contiene el árbol completo del proyecto como XML jerárquico. Cada entidad tiene un type, id (GUID) y name. Se construye un diccionario OEMMap[GUID] → (NombrePOU, TipoPOU, Rol) que permite resolver de forma determinista a qué POU pertenece cada fichero .xml.

También extrae interfaces compiladas (.cxif2) del ZIP anidado y datos de compilación.

Ejemplo de mapeo OEM:

GUID (primeros 8) Rol POU Tipo
43a65a73 VARS Main PROGRAM
f9beeca7 CODE FB_InputProcessing FUNCTION_BLOCK
ccfa256a VARS FC_SensorOK FUNCTION
4dcd6a74 VARS Variables_Globales GLOBAL

Fase 1 — Extracción de datos

Recorre todos los .xml del ZIP y clasifica cada uno:

  • SLWD (variables): Formato propietario con líneas ++D= tabuladas. Se parsean nombre, tipo, scope, dirección HW, retentiva, valor inicial y comentario
  • ST (código fuente): XML con tags <Text> conteniendo Structured Text codificado en XML entities
  • JSON (Ladder/FBD): Secciones de programa con bloques funcionales y sus conexiones pin-a-pin
  • XML Config: Configuración de red (IP, máscara), tarea (periodo, timeout) y hardware (modelo CPU)
  • DUTs: Definiciones <DataType BaseType="STRUCT"> con miembros y offsets

Fase 2 — Construcción de POUs

Vincula variables y código al POU correcto usando el OEMMap:

  1. Para cada GUID en VarsMap: busca en OEM → asigna al POU correspondiente
  2. Para cada GUID en CodeMap: busca en OEM → acumula código en el POU
  3. Registra secciones de programa (ConfigDefault, HMI_IO, Control) desde OEM
  4. Asocia interfaces compiladas por nombre de POU
  5. Elimina variables duplicadas (conserva la más completa)
  6. Clasifica variables con dirección HW en el mapa de E/S

Formato SLWD (variables)

Las variables se almacenan en formato SLWD propietario, una por línea:

++D=+N=i_Raw_Viento	+D=INT	+AT=IOBus://...	+Com=AI viento crudo	+R=1	+IV=0
Campo Significado
+N= Nombre de la variable
+D= Tipo de dato (BOOL, INT, REAL, STRING, struct...)
+AT= Dirección hardware (IOBus://, BuiltInIO://, %MW...)
+Com= Comentario (codificado en XML entities)
+G= Grupo/scope (VAR_INPUT, VAR_OUTPUT, VAR_GLOBAL...)
+R=1 Variable retentiva
+RO=1 Solo lectura
+IV= Valor inicial
+Ord= Orden de declaración

Declaraciones IEC 61131-3

El extractor genera declaraciones estándar antes de cada bloque de código:

FUNCTION_BLOCK FB_LCI_Safety
======================================================================
VAR_INPUT
    Enabled                      : BOOL;
    i_Raw_Viento                 : INT;  (* AI viento crudo *)
    i_Config                     : DUT_Crane_Config;
END_VAR
VAR_OUTPUT
    o_Bloqueo                    : BOOL;
    o_Baliza_Sirena              : BOOL;
END_VAR
VAR RETAIN
    v_tareStored                 : REAL := 0.0;
END_VAR
(* --- Codigo --- *)
IF Enabled THEN
  ...
END_IF
END_FUNCTION_BLOCK

Ejemplo de salida

Variables_Sysmac.csv

Variable;Tipo;Puerto;RW;Comentario;DireccionHW;Scope;Retentiva;ValorInicial
bFirstRun;BOOL;;R/W;;;VAR_GLOBAL;SI;TRUE
CraneConfig;DUT_Crane_Config;;R/W;Configuracion grua;;VAR_GLOBAL;SI;
i_Raw_Viento;INT;AnalogInput_Ch1;R;AI viento crudo;IOBus://...;VAR_INPUT;;0

Estructura_POUs.txt

======================================================================
  FB_LCI_Safety  [FUNCTION_BLOCK]
----------------------------------------------------------------------
  Variables: VAR_INPUT:11  VAR_OUTPUT:8  VAR:5  VAR_EXTERNAL:2
  Codigo ST: 187 lineas
  Interfaz compilada: SI (.cxif2)
----------------------------------------------------------------------

  VAR_INPUT
  --------------------------------------------------
  NOMBRE                       TIPO                 FLAGS        COMENTARIO
  --------------------------------------------------
  Enabled                      BOOL                              Habilitar bloque
  i_Raw_Viento                 INT                               AI viento crudo
  i_Raw_Angulo                 INT                               AI angulo pluma

Configuracion_PLC.txt

  HARDWARE
  --------
  Modelo CPU:        NX1P2-9024DT1
  Firmware:          1.49
  Version compilador: 2.0,6.4.3.0

  RED
  ---
  Direccion IP:      192.168.250.1
  Mascara subred:    255.255.255.0

  TAREA PRINCIPAL
  ---------------
  Periodo:           4000 us
  Prioridad:         16
  Programa:          Main

API para integración

La unidad uSysmacExtractor.pas expone una API limpia con callbacks:

uses uSysmacExtractor;

var
  Opciones: TOpcionesExtraccion;
  Resultado: TResultadoExtraccion;
begin
  Opciones := OpcionesTodas;
  // Desactivar ficheros no necesarios:
  // Opciones.GenMapaIO_CSV := False;

  ExtraerDatosSysmac(
    'C:\Proyecto.smc2',        // Archivo entrada
    'C:\Salida\',              // Carpeta salida
    Opciones,                  // Qué ficheros generar
    Resultado,                 // Resultado (out)
    procedure(const Msg: string)
    begin
      Writeln(Msg);            // Callback de log
    end,
    procedure(Porcentaje: Integer)
    begin
      ProgressBar.Position := Porcentaje;  // Callback de progreso
    end
  );

  if Resultado.Exito then
    Writeln('Variables: ', Resultado.NumVariables,
            ' POUs: ', Resultado.NumPOUs);

  Resultado.FicherosGenerados.Free;
end;

Tipos principales

Tipo Descripción
TOpcionesExtraccion 8 flags booleanos para seleccionar ficheros de salida
TResultadoExtraccion Contadores, lista de ficheros generados, config PLC, estado
TPOUInfo POU completo: nombre, tipo, variables locales, código ST
TVarSysmac Variable global: nombre, tipo, dirección, scope, comentario
TPLCConfig Configuración del PLC: modelo, red, tarea, proyecto
TLogCallback reference to procedure(const Msg: string)
TProgressCallback reference to procedure(Porcentaje: Integer)

Compatibilidad probada

PLC Sysmac Studio Estado
NX1P2-9024DT1 1.49+ ✅ Verificado
Serie NJ501 1.40+ ✅ Compatible

El formato .smc2 es consistente entre versiones de Sysmac Studio. Proyectos con Ladder, Structured Text y Ladder+InlineST mixto son soportados.


Limitaciones conocidas

  • Secciones Ladder puro: Se extraen las conexiones de FBs y el código InlineST embebido, pero la lógica de contactos/bobinas se representa como conexiones, no como diagrama visual
  • FBD: Similar a Ladder — se extraen conexiones pero no el layout gráfico
  • Motion/Axes: Se detecta la configuración de ejes pero no se extraen los perfiles de movimiento
  • Datos de cam: Referenciados pero no extraídos en detalle
  • Archivos protegidos: Si el proyecto tiene contraseña de protección, no se puede abrir el ZIP

Historial de versiones

v2.1 (actual)

  • Interfaz gráfica VCL con drag & drop y barra de progreso
  • Resolución determinista de POUs vía fichero .oem
  • Extracción de interfaces compiladas (.cxif2) del ZIP anidado
  • Separación en unidad reutilizable (uSysmacExtractor.pas)
  • Versión consola y GUI desde el mismo código fuente
  • Selección individual de ficheros a generar

v2.0

  • Declaraciones IEC 61131-3 (VAR_INPUT/VAR_OUTPUT/VAR) antes de cada POU
  • Cross-referencia SLWD↔ST por matching de nombres de variable
  • Generación de Estructura_POUs.txt

v1.0

  • Extracción básica: variables CSV, código ST, DUTs, mapa I/O, config PLC

Licencia

MIT License — ver LICENSE.


Autor

Desarrollado para la extracción y documentación de proyectos de automatización industrial con PLCs Omron serie NX/NJ.

About

Herramienta para extraer, decodificar y documentar toda la información contenida en un proyecto Sysmac Studio de Omron (.smc2): variables, código fuente ST, estructuras de datos, mapa de E/S hardware, configuración del PLC y conexiones de bloques funcionales.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages