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

