跳到主要内容

创新功能(1)-多语言编程与编译

· 阅读需 6 分钟

1. 多语言编程与编译能力

IEC61131-3与计算机语言(C/C++/Rust)混合开发

  • 项目主程序使用语言: IEC61131-3
  • 库开发支持的语言: IEC61131-3、C、C++、Rust
  • 多语言混合编译: 支持
  • 多混合源码调试: 支持
  • 编译方式: 2级编译 (IDE编译 + 安装编译)
  • IDE编译输出格式: WebAssembly (第1级)
  • 安装编译输出格式: 机器指令程序 (第2级)
  • C、C++编译框架
    • IDE自动完成源码的编译
    • 或使用cmake自定义编译架构
  • Rust编译框架
    • IDE自动完成源码的编译
    • 或使用cargo自定义编译架构

2. 支持计算机程序(C/C++/Rust)的方式

WasomeCodeX支持两种计算机程序(C/C++/Rust)的方式:

  • 方式1:单独编译成动态库文件,启动时动态加载 (传统方式)
  • 方式2:与IEC61131-3程序混合编译与调试 (业界首家)

技术架构如下:

3. 动态库的传统方式的主要问题

在使用动态库的传统方式中,存在着多个主要问题:

  1. 动态库方式C++开发的复杂度
    目前市场许多IDE支持C++开发需要使用独立的三方IDE,比如Visual Studio。用户不得不在两个IDE分别完成开发,编译和调试。使用效率非常不理想。

  2. 巨大安全风险
    由于用户开发的动态库代码和PLC厂商的runtime运行在一个地址空间,任何用户代码的错误,可能造成巨大的风险。比如用户C地址操作的一个写入错误的地址,可能破坏PLC厂商在runtime的某个功能安全保护。

  3. 多语言程序的热更新和热备份支持复杂性
    目前工业界尚没有发现能够支持在引入C/C++编程后可以支持热更新和热备份能力的产品。计算机编程引入的堆操作,带来内存布局的不确定性是一个主要的障碍。一些产品在ST中扩展的指针地址访问,在文档中申明其应用中如使用了地址操作,将不能支持热更新和热备份。

  4. 缺乏对Rust等更多计算机编程语言的支持

4. WasomeCodeX的技术原理与优势

WasomeCodeX业界首家应用了计算机编程技术的最新成果WebAssembly技术,WebAssembly提供了线性空间与内存沙箱,为所有的上述问题带来全新的解决方案

下图是WasomeCodeX程序运行的内存布局, 其主要特点:

  1. PLC引擎程序与应用运行与一个进程之中。对于引擎,PLC应用就像一组函数库。
  2. 引擎与应用运行中使用各自的程序内存空间
  3. 应用只能访问自己的线性空间,使用自己的地址寻址(一般从0开始)
  4. 引擎代码可以访问整个进程地址空间,包含线性空间

alt text

基于以上设计与特点,WasomeCodeX的解决方案能完全预防用户的应用程序损坏引擎(宿主)的内存数据

5. 两级编译的优势

  • 第一级编译:在IDE上,将前端程序 (IEC61131-3、C、C++、Rust) 编译到WebAssembly。具有跨平台分发能力。
  • 第二级编译:在目标系统上,将WebAssembly编译到本机的机器指令程序。获得深度优化的运行性能。

6. 支持全语法ST程序

在支持常规的程序单位(POU)之外,还支持全语法ST源程序。用户在一个全语法ST源程序中可以定义多个POU(功能块、函数),数据类型和CONFIGURATION(资源、任务)。

WasomeIDE对全语法ST提供实时解析支持,提供outline展示帮助用户快速定位程序对象。

全语法ST程序更加有利于开发者全面拥抱版本管理、代码评审、自动连续开发/测试(CD/CI)等现代IT开发基础设施和工程方法,获得更高的开发效率。