Autonomy industrial automation software logoAutonomy®, industrial automation platform

STRUC++

Der Open-Source-Compiler für Structured Text hinter OpenPLC.

STruC++ übersetzt IEC-61131-3 Structured Text in sauberes, lesbares C++14. Mit integriertem Unit-Test-Framework, interaktiver REPL und wiederverwendbarem Bibliothekssystem, in einer einzigen Binärdatei.

29K+
Downloads des Compilers
60+
Veröffentlichte Versionen
85+
Sterne auf GitHub
Nativ
Maschinencode, kein Interpreter

Warum ein neuer Compiler

Zwei Jahrzehnte lang hing praktisch jedes Open-Source-SPS-Projekt von einem einzigen Compiler ab, beschränkt auf die zweite Ausgabe der IEC 61131-3 und mit makrolastigem C als Ausgabe. Beim Neubau von OpenPLC als v4 war der Compiler das letzte Stück des alten Stacks. STruC++ ersetzt ihn, von Grund auf neu geschrieben.

Was ihn unterscheidet

Lesbares C++ statt Makros

Funktionsbausteine werden zu Klassen, Interfaces zu virtuellen Methoden und Generics zu Templates. Die Ausgabe lässt sich lesen, debuggen und in bestehende C++-Projekte einbinden.

Unit-Tests in ST

Der Test-Runner steckt im Compiler. Schreiben Sie TEST-Blöcke mit Assertions, Mocks, SETUP/TEARDOWN und simulierter Zeit und führen Sie sie auf jedem Rechner ohne SPS aus, ideal für CI-Pipelines.

Interaktive REPL

Programm mit --build erzeugen und Zyklus für Zyklus durchlaufen: Eingänge setzen, Variablen prüfen und forcen, ST und generiertes C++ nebeneinander ansehen.

Keine Laufzeitabhängigkeiten

Der Compiler ist eine einzige Binärdatei, die C++-Runtime ist header-only. Auf dem Zielsystem ist nichts weiter zu installieren.

Structured Text rein, C++ raus

Ein Funktionsbaustein wird zur C++-Klasse, mit Ein- und Ausgängen als Member und der Logik im Aufrufoperator.

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
Generiertes C++
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

Sprachumfang

Eine breite Teilmenge der IEC 61131-3 Ausgabe 3 sowie branchenübliche Erweiterungen.

Datentypen

Alle elementaren Typen inklusive 64-Bit-Ganzzahlen, Strings und L-Varianten von Zeit und Datum, dazu Arrays, Structs, Enums und Teilbereiche.

POUs und Variablen

PROGRAM, FUNCTION, FUNCTION_BLOCK und INTERFACE, mit Ein- und Ausgängen, globalen Variablen, Konstanten, RETAIN und adressierten Variablen.

Objektorientierung

Methoden, Properties mit GET und SET, EXTENDS, IMPLEMENTS, ABSTRACT, FINAL, OVERRIDE und Zugriffsmodifikatoren.

Zeiger und Referenzen

POINTER TO, REF_TO, REFERENCE_TO, ADR, Dereferenzierung und dynamische Allokation.

Standardbibliothek

Über 80 Standardfunktionen sowie Timer, Zähler, Flankenerkennung und Kippglieder. Die OSCAT-Basic-Bibliothek lässt sich direkt kompilieren.

Projektmodell

CONFIGURATION, RESOURCE und TASK, mit Programmplanung.

Läuft dort, wo Sie arbeiten

Kommandozeile

Eigenständige Binärdateien für Linux x64 und ARM64, macOS Intel und Apple Silicon sowie Windows x64.

Im Browser

Auch als JavaScript- und TypeScript-Bibliothek ohne native Abhängigkeiten, für Node.js, Browser, Deno und Bun.

In VS Code

Die STruC++-Erweiterung bringt Echtzeit-Diagnosen, Autovervollständigung, Gehe-zu-Definition und Debugging für Structured Text.

Auf Mikrocontrollern

Die Ausgabe zielt auf C++14 und baut damit mit den Toolchains der Arduino-Boards, bis hinunter zu avr-g++ 7.3.

Open Source, und Ihre Programme bleiben Ihre

Der Compiler steht unter GPL-3.0. Die C++-Runtime und die Standardbibliotheken tragen die STruC++ Runtime Library Exception, sodass kompilierte Programme unter jeder Lizenz verbreitet werden dürfen.

STruC++ ausprobieren

Release herunterladen, erste ST-Datei kompilieren und Tests ausführen, ganz ohne SPS.