Autonomy industrial automation software logoAutonomy®, industrial automation platform

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.

counter.st
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_BLOCK
C++ generado
namespace 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 strucpp

Cobertura 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.