Autonomy industrial automation software logoAutonomy®, industrial automation platform

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++ 类:输入和输出是成员变量,逻辑位于调用运算符中。

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

语言覆盖范围

覆盖 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++ 运行时库例外条款,因此您编译的程序可以按任何许可证分发。

试用 STruC++

下载发布版本,编译您的第一个 ST 文件并运行测试,无需 PLC。