STRUC++
O compilador open source de Structured Text por trás do OpenPLC.
O STruC++ compila Structured Text IEC 61131-3 em C++14 limpo e legível. Vem com framework de testes unitários embutido, REPL interativo e sistema de bibliotecas reutilizáveis, em um único binário.
- 29K+
- Downloads do compilador
- 60+
- Versões lançadas
- 85+
- Estrelas no GitHub
- Nativo
- Código de máquina, sem interpretador
Por que um novo compilador
Por duas décadas, praticamente todo projeto open source de CLP dependeu de um único compilador, limitado à segunda edição da IEC 61131-3 e gerando C cheio de macros. Quando reconstruímos o OpenPLC na v4, o compilador era a última peça da pilha antiga. O STruC++ é o substituto, escrito do zero.
O que ele tem de diferente
C++ legível, não macros
Function blocks viram classes, interfaces viram métodos virtuais e genéricos viram templates. Dá para ler o resultado, depurar e integrar a um projeto C++ existente.
Testes unitários em ST
O executor de testes está dentro do compilador. Escreva blocos TEST com asserções, mocks, SETUP/TEARDOWN e tempo simulado, e rode em qualquer máquina sem CLP, ideal para pipelines de CI.
REPL interativo
Gere o programa com --build e avance ciclo a ciclo: defina entradas, inspecione e force variáveis e veja o ST e o C++ gerado lado a lado.
Zero dependências de runtime
O compilador é um único binário e o runtime C++ é header-only. Nada mais para instalar no alvo.
Entra Structured Text, sai C++
Um function block vira uma classe C++, com entradas e saídas como membros e a lógica em um operador de chamada.
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 da linguagem
Um amplo subconjunto da IEC 61131-3 Edição 3, mais extensões comuns usadas na indústria.
Tipos de dados
Todos os tipos elementares, incluindo inteiros de 64 bits, strings e variantes L de tempo e data, além de arrays, structs, enums e subfaixas.
POUs e variáveis
PROGRAM, FUNCTION, FUNCTION_BLOCK e INTERFACE, com entradas, saídas, globais, constantes, RETAIN e variáveis localizadas.
Orientação a objetos
Métodos, propriedades com GET e SET, EXTENDS, IMPLEMENTS, ABSTRACT, FINAL, OVERRIDE e modificadores de acesso.
Ponteiros e referências
POINTER TO, REF_TO, REFERENCE_TO, ADR, desreferência e alocação dinâmica.
Biblioteca padrão
Mais de 80 funções padrão, além de timers, contadores, detectores de borda e biestáveis. A biblioteca OSCAT Basic compila sem ajustes.
Modelo de projeto
CONFIGURATION, RESOURCE e TASK, com agendamento de programas.
Roda onde você trabalha
Linha de comando
Binários independentes para Linux x64 e ARM64, macOS Intel e Apple Silicon e Windows x64.
No navegador
Também é uma biblioteca JavaScript e TypeScript sem dependências nativas, para Node.js, navegadores, Deno e Bun.
No VS Code
A extensão STruC++ traz diagnósticos em tempo real, autocompletar, ir para definição e depuração para Structured Text.
Em microcontroladores
A saída usa C++14 para compilar com as toolchains das placas Arduino, até o avr-g++ 7.3.
Open source, e seus programas continuam seus
O compilador é licenciado sob GPL-3.0. O runtime C++ e as bibliotecas padrão têm a STruC++ Runtime Library Exception, então os programas que você compila podem ser distribuídos sob qualquer licença.
Experimente o STruC++
Baixe uma versão, compile seu primeiro arquivo ST e rode os testes, sem CLP.

