Autonomy industrial automation software logoAutonomy®, industrial automation platform

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.

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++ gerado
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 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.