STRUC++
OpenPLC 背后的开源结构化文本编译器。
STruC++ 将 IEC 61131-3 结构化文本编译为简洁、可读的 C++14。内置单元测试框架、交互式 REPL 和可复用的库系统,全部集成在一个可执行文件中。
- 29K+
- 编译器下载次数
- 60+
- 已发布版本
- 85+
- GitHub 星标
- 原生
- 机器码执行,无需解释器
为什么需要新的编译器
二十年来,几乎所有开源 PLC 项目都依赖同一个编译器:它仅支持 IEC 61131-3 第二版,生成大量宏的 C 代码。我们在 v4 中重建 OpenPLC 时,编译器是旧架构中剩下的最后一块。STruC++ 就是从零编写的替代品。
它有何不同
可读的 C++,而非宏
功能块变成类,接口变成虚方法,泛型变成模板。生成的代码可以阅读、调试,并集成到现有 C++ 项目中。
用 ST 编写单元测试
测试运行器内置于编译器中。编写包含断言、Mock、SETUP/TEARDOWN 和模拟时间的 TEST 块,无需 PLC 即可在任何机器上运行,非常适合 CI 流水线。
交互式 REPL
使用 --build 构建程序并逐周期运行:设置输入、查看和强制变量,并并排查看 ST 与生成的 C++。
零运行时依赖
编译器是单个可执行文件,C++ 运行时仅含头文件。目标设备上无需安装其他任何东西。
输入结构化文本,输出 C++
功能块会变成一个 C++ 类:输入和输出是成员变量,逻辑位于调用运算符中。
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 strucpp语言覆盖范围
覆盖 IEC 61131-3 第三版的大部分内容,以及业界常用的扩展。
数据类型
所有基本类型,包括 64 位整数、字符串以及时间和日期的 L 变体,另有数组、结构体、枚举和子范围。
POU 与变量
PROGRAM、FUNCTION、FUNCTION_BLOCK 和 INTERFACE,支持输入、输出、全局变量、常量、RETAIN 和定位变量。
面向对象
方法、带 GET 和 SET 的属性、EXTENDS、IMPLEMENTS、ABSTRACT、FINAL、OVERRIDE 以及访问修饰符。
指针与引用
POINTER TO、REF_TO、REFERENCE_TO、ADR、解引用和动态分配。
标准库
80 多个标准函数,以及定时器、计数器、边沿检测和双稳态功能块。OSCAT Basic 库可直接编译。
项目模型
CONFIGURATION、RESOURCE 和 TASK,支持程序调度。
在您的工作环境中运行
命令行
适用于 Linux x64 和 ARM64、macOS Intel 和 Apple Silicon 以及 Windows x64 的独立可执行文件。
在浏览器中
同时提供无原生依赖的 JavaScript 和 TypeScript 库,可用于 Node.js、浏览器、Deno 和 Bun。
在 VS Code 中
STruC++ 扩展为结构化文本提供实时诊断、自动补全、跳转到定义和调试功能。
在微控制器上
生成代码面向 C++14,可使用 Arduino 开发板自带的工具链编译,最低支持 avr-g++ 7.3。
开源,您的程序依然属于您
编译器采用 GPL-3.0 许可。C++ 运行时和标准库附带 STruC++ 运行时库例外条款,因此您编译的程序可以按任何许可证分发。

