STRUC++
El compilador open source de Structured Text detrás de OpenPLC.
STruC++ compila Structured Text IEC 61131-3 en C++14 limpio y legible. Incluye un framework de pruebas unitarias, un REPL interactivo y un sistema de bibliotecas reutilizables, en un único binario.
- 29K+
- Descargas del compilador
- 60+
- Versiones publicadas
- 85+
- Estrellas en GitHub
- Nativo
- Código máquina, sin intérprete
Por qué un nuevo compilador
Durante dos décadas, casi todos los proyectos open source de PLC dependieron de un único compilador, limitado a la segunda edición de IEC 61131-3 y que generaba C lleno de macros. Al reconstruir OpenPLC como v4, el compilador era la última pieza de la pila antigua. STruC++ es su reemplazo, escrito desde cero.
Qué lo hace diferente
C++ legible, no macros
Los function blocks se convierten en clases, las interfaces en métodos virtuales y los genéricos en templates. Puedes leer el resultado, depurarlo e integrarlo en un proyecto C++ existente.
Pruebas unitarias en ST
El ejecutor de pruebas está dentro del compilador. Escribe bloques TEST con aserciones, mocks, SETUP/TEARDOWN y tiempo simulado, y ejecútalos en cualquier máquina sin PLC, ideal para pipelines de CI.
REPL interactivo
Genera el programa con --build y avanza ciclo a ciclo: define entradas, inspecciona y fuerza variables y ve el ST y el C++ generado lado a lado.
Cero dependencias de runtime
El compilador es un único binario y el runtime C++ es header-only. Nada más que instalar en el destino.
Entra Structured Text, sale C++
Un function block se convierte en una clase C++, con entradas y salidas como miembros y la lógica en un operador de llamada.
FUNCTION_BLOCK Counter
VAR_INPUT
enable : BOOL;
reset : BOOL;
END_VAR
VAR_OUTPUT
count : INT;
END_VAR
IF reset THEN
count := 0;
ELSIF enable THEN
count := count + 1;
END_IF;
END_FUNCTION_BLOCKnamespace strucpp {
class Counter {
public:
IEC_BOOL enable;
IEC_BOOL reset;
IEC_INT count;
void operator()();
};
void Counter::operator()() {
if (reset) {
count = 0;
} else if (enable) {
count = count + 1;
}
}
} // namespace strucppCobertura del lenguaje
Un amplio subconjunto de IEC 61131-3 Edición 3, más extensiones comunes en la industria.
Tipos de datos
Todos los tipos elementales, incluidos enteros de 64 bits, strings y variantes L de tiempo y fecha, además de arrays, structs, enums y subrangos.
POUs y variables
PROGRAM, FUNCTION, FUNCTION_BLOCK e INTERFACE, con entradas, salidas, globales, constantes, RETAIN y variables localizadas.
Orientación a objetos
Métodos, propiedades con GET y SET, EXTENDS, IMPLEMENTS, ABSTRACT, FINAL, OVERRIDE y modificadores de acceso.
Punteros y referencias
POINTER TO, REF_TO, REFERENCE_TO, ADR, desreferencia y asignación dinámica.
Biblioteca estándar
Más de 80 funciones estándar, además de temporizadores, contadores, detectores de flanco y biestables. La biblioteca OSCAT Basic compila sin cambios.
Modelo de proyecto
CONFIGURATION, RESOURCE y TASK, con planificación de programas.
Funciona donde trabajas
Línea de comandos
Binarios independientes para Linux x64 y ARM64, macOS Intel y Apple Silicon, y Windows x64.
En el navegador
También es una biblioteca JavaScript y TypeScript sin dependencias nativas, para Node.js, navegadores, Deno y Bun.
En VS Code
La extensión STruC++ añade diagnósticos en tiempo real, autocompletado, ir a definición y depuración para Structured Text.
En microcontroladores
La salida usa C++14 para compilar con las toolchains de las placas Arduino, hasta avr-g++ 7.3.
Open source, y tus programas siguen siendo tuyos
El compilador tiene licencia GPL-3.0. El runtime C++ y las bibliotecas estándar incluyen la STruC++ Runtime Library Exception, así que los programas que compiles pueden distribuirse bajo cualquier licencia.
Prueba STruC++
Descarga una versión, compila tu primer archivo ST y ejecuta sus pruebas, sin PLC.

