Extractor de proyectos Sysmac Studio (.smc2) a texto plano
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.
- Resolución determinista de POUs vía fichero
.oeminterno — 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
.smc2sobre la ventana - Barra de progreso y log detallado en tiempo real
- Compatible con PLCs de la serie NX/NJ (NX1P2, NJ501, etc.)
| 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 |
- 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.ZipSystem.RegularExpressionsSystem.Generics.Collections
- Abrir
ExtraerSysmacGUI.dpren el IDE de Delphi - (Opcional) Asignar icono: Project → Options → Application → Icon → Load Icon → seleccionar
ExtraerSysmac.ico - Compilar con Ctrl+F9 o ejecutar con F9
- Abrir
ExtraerSysmac.dpren el IDE de Delphi - Compilar con Ctrl+F9
Alternativamente, desde línea de comandos:
dcc32 ExtraerSysmac.dpr
:: o para 64 bits:
dcc64 ExtraerSysmac.dpr- Ejecutar
ExtraerSysmacGUI.exe - Seleccionar el archivo
.smc2con el botón Examinar (o arrastrarlo sobre la ventana) - (Opcional) Cambiar la carpeta de salida
- (Opcional) Desmarcar los ficheros que no se necesiten
- Pulsar Extraer proyecto
- Al finalizar, pulsar Abrir carpeta salida para acceder a los ficheros generados
ExtraerSysmac <archivo.smc2> [opciones]
Si no se especifica carpeta de salida, los ficheros se generan en la misma carpeta del .smc2.
| 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.
# 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 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 | 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
)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
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)
El proceso se ejecuta en 3 fases secuenciales:
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 |
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
Vincula variables y código al POU correcto usando el OEMMap:
- Para cada GUID en
VarsMap: busca en OEM → asigna al POU correspondiente - Para cada GUID en
CodeMap: busca en OEM → acumula código en el POU - Registra secciones de programa (ConfigDefault, HMI_IO, Control) desde OEM
- Asocia interfaces compiladas por nombre de POU
- Elimina variables duplicadas (conserva la más completa)
- Clasifica variables con dirección HW en el mapa de E/S
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 |
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
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======================================================================
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
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
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;| 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) |
| 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.
- 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
- 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
- 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
- Extracción básica: variables CSV, código ST, DUTs, mapa I/O, config PLC
MIT License — ver LICENSE.
Desarrollado para la extracción y documentación de proyectos de automatización industrial con PLCs Omron serie NX/NJ.
