创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

基于三叉树链表的编译器中间结构的设计方案研究

来源:电子元器件应用 作者:马圣 2020-05-14 09:13 次阅读

引言

IEC61131—3组态软件是分布式控制系统中的上位软件,是工程师与系统的接口,可完成控制系统中现场设备运行的逻辑组态,从而实现对系统的控制。随着PLC与DCS系统的应用日趋广泛,IEC6113l一3已经在工业自动化中建立了牢固的国际标准,国内外大部分工业自动化厂商都有提供基于国际标准IEC6113l一3的IEC组态编程系统,IEC组态软件的研发已经成为工业自动化厂商的核心技术。IEC组态软件的实现原理之一是将前端用各种组态语言(ST,LD,FBD,SFC,IL)编写的程序转化成中间结构,再由组态软件编译后端根据不同的硬件平台信息将中间结构编译成在该平台上可执行的目标文件。组态软件编译部分的中间结构是组态软件IEC语言前端与组态软件编译后端的主要接口。好的中间结构可使IEC语言前端做到与目标机器无关,而不依赖于目标机器平台,同时可节省IEC语言前端的翻译工作。现今编译程序使用的中间结构有很多种形式,常见的有逆波兰式、三元式、四元式和树形结构,本文介绍一种基于三叉树链表的中间结构。

1 、总体设计思想

基于树形结构的中间结构是现今大多数编译器中间结构的主流设计方案,比如GCC、LCC、TCC等均使用二叉树或者多又树作为其中间结构。本文介绍的是一种三叉树的设计方案。该方案中,以中间结构表示的高级语言程序单元就是三叉语法树节点组成的多层森林,每一层森林都是一个一维双向链表,链表中的每个“节点”称之为语法树(一棵三叉树),而每棵语法树的节点则称之为树节点。其中,程序单元以POU(程序组织单元)为翻译单位。

每个三叉树节点包括的信息主要有语法树的操作、节点类型、指向三个子树的指针、链表前项与后项指针、关联符号指针等。树节点结构体的数据结构表示如下:

基于三叉树链表的编译器中间结构的设计方案研究

其中,语法操作表示该节点可以完成什么样的“运算”。语法分析树的语法操作符可以分为分别是POU节点操作符、语句操作符和表达式操作符三种类型,这三种类型的语法操作符将在下一节详细介绍,通常可以语法分析树的语法操作来区分不同的语法分析树。

类型是指当前语法分析树所代表的语法操作的类型。

符号指针是指向该节点关联的符号表项,并非所有节点的此项都有内容,具体那些节点中可以关联符号也将在下一节介绍。

图1所示是一个POU程序单元以三叉树链表的中间结构总体表示的总体形式。

采用三叉树森林的方法能够充分的表示正常的高级语言,同时,与其他编译器不同,该方法还引入了POU节点操作符和语句操作符,而省去了前端大量语法翻译的工作,符合IEC工业语言编译器多前端的特征。

2、 中间结构说明

语法分析树的语法操作符可分为POU节点操作符、语句操作符和表达式操作符三种类型。下面来详细介绍这三种语法树节点的各种属性。

2.1 POU节点操作符

POU节点操作符可用于表示POU的开始、结束、作用域和变量定义。各节点属性如表l所列。

其中,语法操作以宏定义的形式声明。符号是该节点关联的符号表项。符号可分为POU符号和变量符号。POU符号包括POU名、参数个数及类型、返回值类型、POU地址等信息;变量符号则包括变量名、类型、作用域和地址等信息。

表l中的唯一节点指整个森林第一层链表中的节点;叶节点指链表中一棵三叉树的叶节点。

2.2 语句操作符

语句操作符分为分支选择操作符、循环操作符、跳出、返回、调用和无条件跳转等。各节点属性如表2所列。

表2中的根节点指森林中一棵三叉树的根节点;中间节点指某三叉树中的中间节点,它既非根节点,也非叶节点。CH00SE的左子节点是条件判定,中子节点是条件为真的内容,右子节点是条件为假的内容。同样,LOOP的左子节点是条件判定,中子节点是循环体,右子节点是循环计数。对于WHILE语句,右子节点可以为空。RETURN的左子节点是返回表达式子树。CALL的左子节点是参数子树,中子节点是调用子树。

2.3 表达式操作符

表达式操作符包括所有的高级语言运算符,如赋值、算术、关系、逻辑运算符等,以赋值、取地址和加法运算符为例,其表达式操作符号主要属性如表3所列。

3 、ST语言代码对应的中间结构表示

本节以一段ST的POU程序为例,将其转化为中间结构,以证明中间结构的可行性。假设此POU中所定义的整型变量为a,b,那么,其POU程序如下:

对应的中间结构如图2所示。其中,EQUAL是等值运算符的宏定义。

4、结束语

本文介绍了一种三叉树的中间结构设计方案。该方案充分考虑了IEC61131—3组态软件的多前端特性,并能够做到不依赖于后端,同时为各语言翻译前端的设计提供了很大的便利。这种中间结构设计在HCC(Hollysys C Compiler)编译器的开发中已经实现,其可行性也得到了验证,并已应用在实际的组态软件开发项目中。

责任编辑:gt

  • plc
    plc
    +关注

    关注

    4460

    文章

    6816

    浏览量

    436072
  • 组态软件
    +关注

    关注

    3

    文章

    173

    浏览量

    24196
  • 编译器
    +关注

    关注

    1

    文章

    908

    浏览量

    44504
收藏 人收藏

    评论

    相关推荐

    带有CAN接口的PLC是什么优势

    一条自动化生产线,除了有那些实际干活的设备,控制器也是必不可少的。很多的的项目现在都用PLC进行总的....
    的头像 广成CAN总线 发表于 06-27 14:44 33次 阅读

    QDL9000电力监控系统的应用案例

    本文介绍河南省商丘市中骏.云景台项目配电房供配电电力监控系统,系统采集400V多功能电力仪表、400....
    发表于 06-27 11:41 16次 阅读
    QDL9000电力监控系统的应用案例

    PLC和上位机组态软件通讯方式

    PLC和上位机组态软件不在同一个地方,那PLC如何远程和上位机通讯呢。现在物联网技术快速发展,PLC....
    的头像 PLC远程通讯 发表于 06-27 08:05 132次 阅读
    PLC和上位机组态软件通讯方式

    西门子PLC中文手册

    西门子PLC中文手册
    发表于 06-24 15:36 18次 阅读

    PLC可编程逻辑控制器的编程语言

    前三种编程语言都是图形类编程语言,后面的两种编程语言是文本型编程语言。这时候有的小白朋友可能会问了,....
    的头像 广成CAN总线 发表于 06-24 14:09 90次 阅读

    1500PLC的通信知识

    全双工(Full Simplex):也称双工,指数据可以进行双向数据传送,同一时刻既能发送也能接收数....
    的头像 工控论坛 发表于 06-24 11:02 177次 阅读

    是德科技与新思科技定制化编译器设计环境完成整合

    2022年6月23日,是德科技(Keysight Technologies,Inc.)日前宣布Key....
    的头像 科技绿洲 发表于 06-24 10:41 133次 阅读

    警惕C++中的异常处理

      许多编译器默认包含 EHS 代码。这意味着不知情的用户会自动合并开销,即使他们无意使用 EHS。....
    发表于 06-24 10:31 334次 阅读
    警惕C++中的异常处理

    WINCC组态软件的报警怎么发到微信和短信上

    wincc是西门子公司开发的上位机视窗监控编程软件,用户可以利用软件提供的控件、脚本、方法等进行开发....
    的头像 PLC远程通讯 发表于 06-24 09:46 84次 阅读
    WINCC组态软件的报警怎么发到微信和短信上

    是德科技与新思科技定制化编译器设计环境已完成整合

    PathWave RFPro 与新思科技定制化编译器相辅相成,可提供无线晶片设计工作流程所需的整合式....
    的头像 是德科技快讯 发表于 06-24 09:36 97次 阅读

    I/O模块的数字输入组件的设计

      与分立元件实施相比,尺寸为 2.8mm × 2.9mm 的小型 6 引脚 SOT23 封装可将所....
    的头像 星星科技指导员 发表于 06-23 16:34 252次 阅读
    I/O模块的数字输入组件的设计

    PLC编程:以Siemens产品为实例的技术总结

    可编程逻辑控制器 (PLC) 就是一种基于微处理器的、坚固耐用的电子装置,是所有现代自动化中必不可少....
    的头像 物联网评论 发表于 06-23 16:17 389次 阅读

    开源软件-Zapcc基于Clang的C++编译器

    ./oschina_soft/zapcc.zip
    发表于 06-23 15:17 6次 阅读
    开源软件-Zapcc基于Clang的C++编译器

    开源软件-TruffleRuby ​Ruby语言的高性能实现

    ./oschina_soft/truffleruby.zip
    发表于 06-23 15:08 9次 阅读
    开源软件-TruffleRuby ​Ruby语言的高性能实现

    数据块(DB)的结构

    实例数据块是指派给特定功能块的数据块。它们功能块的指定的本地数据。当FB被用户程序调用时,这些数据块....
    的头像 机器人及PLC自动化应用 发表于 06-23 11:20 136次 阅读

    标准PLC数据类型 (UDT)之间的差别

    要创建 F 型 PLC 数据类型 (UDT) ,请启用“添加新 PLC 数据类型”(Add n....
    的头像 机器人及PLC自动化应用 发表于 06-23 11:09 210次 阅读

    Vim编辑器的使用学习和使用技巧

    首先我们先理清楚一个概念:编辑器和编译器和调试器!
    的头像 马哥Linux运维 发表于 06-23 10:43 213次 阅读

    PLC采集网关在光伏行业MES系统的应用

    光伏行业是国家碳中和战略发展规划的要点,而光伏行业规模大,产品价值高,生产过程管控对成本和品质影响大....
    发表于 06-23 10:26 62次 阅读

    polarphp新的PHP语言编译器和运行时

    ./oschina_soft/gitee-polarphp.zip
    发表于 06-22 15:05 3次 阅读
    polarphp新的PHP语言编译器和运行时

    立柱机器人码垛机的结构特点及应用优势

    立柱机器人
    发表于 06-22 14:42 9次 阅读

    devilution Diablo devolved电脑游戏

    ./oschina_soft/devilution.zip
    发表于 06-22 14:32 10次 阅读
    devilution Diablo devolved电脑游戏

    用于实时开发的Eclipse插件

      通过利用与流行的 RTOS 工具和其他实时开发所需的工具套件的集成,实时开发人员现在也受益于不断....
    的头像 星星科技指导员 发表于 06-22 11:45 141次 阅读
    用于实时开发的Eclipse插件

    MazuCC微型C编译器

    ./oschina_soft/MazuCC.zip
    发表于 06-22 11:36 9次 阅读
    MazuCC微型C编译器

    CDT 4.0提高生产力并提供更大的可扩展性

      对 Windows SDK 的支持:最近,Microsoft 提供了它的编译器作为其 Windo....
    的头像 星星科技指导员 发表于 06-22 11:30 90次 阅读
    CDT 4.0提高生产力并提供更大的可扩展性

    工控系统中硬线交换信号,和不同设备间的通讯

    比如说PROFIBUS,PROFINET,Modbus,自由口通讯等等,这是一种硬件+软件的方式,一....
    的头像 工控论坛 发表于 06-22 10:04 149次 阅读

    vim.wasm Vim-WebAssembly编译器

    ./oschina_soft/vim.wasm.zip
    发表于 06-22 09:57 5次 阅读
    vim.wasm Vim-WebAssembly编译器

    Bamcompile PHP-EXE编译器

    ./oschina_soft/Bamcompile.zip
    发表于 06-22 09:55 4次 阅读
    Bamcompile PHP-EXE编译器

    CC65 65(C)02系统的完整交叉开发包

    ./oschina_soft/cc65.zip
    发表于 06-22 09:33 9次 阅读
    CC65 65(C)02系统的完整交叉开发包

    如何实现modbus RTU对AB Ethernet/IP协议的自动转换

    AB 1756 PLC 直接读RS 485 modbus RTU 仪表需要增加1761-NET-AI....
    的头像 PLC远程通讯 发表于 06-22 08:21 176次 阅读
    如何实现modbus RTU对AB Ethernet/IP协议的自动转换

    组合式PLC的工作流程

    很多时候,我们会面临PLC IO接口数量或者种类不够的情况,为了完成目标,我们会添加PLC的数量,但....
    的头像 科技绿洲 发表于 06-21 15:35 253次 阅读

    使用Nuba扩展在Python中编写光线跟踪应用程序

      光线跟踪是一种计算密集型算法。虽然理论上可以使用标准 C Python 解释器运行光线跟踪内核,....
    的头像 星星科技指导员 发表于 06-21 15:03 168次 阅读
    使用Nuba扩展在Python中编写光线跟踪应用程序

    pacific方舟编译器的Runtime参考实现

    ./oschina_soft/gitee-pacific.zip
    发表于 06-21 14:19 9次 阅读
    pacific方舟编译器的Runtime参考实现

    Pythran Python前置编译器

    ./oschina_soft/pythran.zip
    发表于 06-21 11:23 6次 阅读
    Pythran Python前置编译器

    自适应PLC芯片和低功耗EDA设计流程

      Calypto Design Systems、Virage Logic 和半导体技术学术研究中心....
    的头像 星星科技指导员 发表于 06-21 11:12 170次 阅读
    自适应PLC芯片和低功耗EDA设计流程

    PROFINET接口实现开放的ISOonTCp通信

    要通过S7-PN CPU的集成PROFINET接口实现开放的ISOonTCp通信,不能再硬件组态中完....
    的头像 机器人及PLC自动化应用 发表于 06-21 10:42 184次 阅读

    华为方舟编译器

    ./oschina_soft/gitee-OpenArkCompiler.zip
    发表于 06-21 09:46 22次 阅读
    华为方舟编译器

    CacheQ的编译器支持多线程CPU加速

      该工具套件支持对生成的虚拟引擎进行编译、检查和错误检测、性能预测、分析、调试和可视化。它支持目标....
    的头像 星星科技指导员 发表于 06-21 09:15 79次 阅读

    MISRA C在安全和安全编程中的位置

      从本质上讲,MISRA C 追求的所有目标都在 SPARK 中得到了最好的实现,结合了更强大的基....
    的头像 星星科技指导员 发表于 06-20 16:07 134次 阅读
    MISRA C在安全和安全编程中的位置

    嵌入式系统设计中的注释和调试代码

    使用 C++ 风格的//注释符号——即,将//放在每行的开头——稍微好一点,但应用起来非常乏味,而且....
    的头像 星星科技指导员 发表于 06-20 16:04 173次 阅读
    嵌入式系统设计中的注释和调试代码

    一文搞懂头文件的用法和规则

    提到头文件,大家肯定不陌生。在编写模块的时候,一般有一个.c就会有一个.h,如下图: 在.c中需要使用其他模块的变量和函数时...
    发表于 06-20 15:41 992次 阅读

    AC6编译器出现ArmClang的问题该怎样去解决呢

    问题复现步骤 使用Env工具—dist命令创建工程 将bsp(stm32)的libraries文件夹复制到新创建的工程 menuconfig添加SPI驱动和...
    发表于 06-20 14:18 772次 阅读

    通过生成式模型驱动开发车辆中的电子E/E系统问题

      总之,在汽车市场快速发展趋势的推动下,可扩展保真度、测试重用、生成工作流和设计感知 V&V 工具....
    的头像 星星科技指导员 发表于 06-20 10:27 129次 阅读

    以太网无线通讯的应用场景 三菱FX5U PLC之间以太网通讯案例

    在这几个应用场景中,要想成功实现设备间的无线以太网通讯都需借助以太网通讯终端,比如日系PLC无线通讯....
    的头像 达泰电子 发表于 06-20 10:23 229次 阅读

    信号隔离器在锅炉控制系统中的应用

    摘要:锅炉是工业中普遍的动力设备,其控制系统的可靠性直接影响了锅炉的安全和经济运行。在实际工作中,锅....
    的头像 jsacrelhfr 发表于 06-20 09:41 74次 阅读
    信号隔离器在锅炉控制系统中的应用

    CANopen转modbus的实现方式有哪些

    在工业项目里,很多时候我们需要进行数据转换。如果是常见的数据类型还好,对应的数据转换工具一找大堆。但....
    的头像 广成CAN总线 发表于 06-20 09:10 337次 阅读

    巨控4G模块实现PLC远程数据传输的原理及流程

    两个PLC之间相距很远,要实现远程通讯,怎么实现呢?拉光纤,几十公里,成本高;租赁VPN专网,每年要....
    的头像 PLC远程通讯 发表于 06-20 07:51 426次 阅读
    巨控4G模块实现PLC远程数据传输的原理及流程

    确保嵌入式软件的功能安全

      静态分析不能代替硬件和软件验证,但对于防止应用程序中的干扰非常有价值。它可以在您的源代码中发现违....
    的头像 星星科技指导员 发表于 06-19 16:05 265次 阅读

    利用静态分析工具构建模型实现多核处理器的高质量软件

      为了实现多核处理器的高质量软件,建议对数据竞争采取零容忍政策。使用静态和动态技术的组合来查找它们....
    的头像 星星科技指导员 发表于 06-19 07:52 200次 阅读

    高级静态分析符合基于合约的编程

      显式契约还可以帮助其他希望利用子程序的程序员,因为它们充当机器可检查的注释和直接嵌入代码中的低级....
    的头像 星星科技指导员 发表于 06-19 07:17 148次 阅读
    高级静态分析符合基于合约的编程

    工业自动化产品研发生产企业伟创电气发布2022第一季度报告

    工业自动化产品研发生产企业苏州伟创电气科技股份有限公司发布2022第一季度报告,具体内容如下。 一、....
    的头像 汽车玩家 发表于 06-18 10:11 525次 阅读

    视觉系统在冲击测试后检查脚轮

      该机器使用类似于以前的脚轮装配系统的技术执行各种自动化装配操作。脚轮组件使用取放技术进行检查和组....
    的头像 星星科技指导员 发表于 06-17 17:02 399次 阅读

    OPCUA转数据库-通过智能网关读取OPCUA标签,数据转存到数据库

            本文是通过智能网关模块连接OPCUA服务端,读取服务端的标签数值,将数据转存到MyS...
    发表于 06-14 14:42 1626次 阅读

    谁会画帮帮忙

    谁会画帮帮忙电路图或者plc单品机
    发表于 06-06 21:25 5645次 阅读
    谁会画帮帮忙

    OpenHarmony工具链arm_linux_x86_64,编译第三方库libsqlite3报错怎么处理?

    官方中提供的工具链(ohos_x86_64目录相关),编译器可以在带有鸿蒙系统的开发板33Hi16DV300IoT的官方库中提供的libsqlite,...
    发表于 06-06 16:34 526次 阅读

    用CH554e开发产品请问需要用什么开发工具?

    以前也用过其他公司的MCU做产品。现发现这产品用CH554E比较合适,初次接触,请问需要什么开发环境(IDE,编译器,连接器...
    发表于 06-06 07:22 72次 阅读

    PLC学习从什么入手?

    主要是PLC控制电机。
    发表于 06-04 08:06 3578次 阅读

    求助大佬,用mdk-arm打开rt-thread第一个例程的步骤报错怎么办呀

    求助大佬,我初次听说rt-thread,搜索到用mdk-arm打开rt-thread第一个例程的步骤,照做后,报错 Build started: Project: pro...
    发表于 05-31 14:31 1272次 阅读

    【小凌派RK2206开发板试用体验】1.Ubuntu22.04搭建编译环境遇到的问题及解决方法

    0.开箱清单 一块RK2206主板以及传感器主板(包含光照强度,气压,振动马达,LED等) 整体而言,整块板该引出的线都有,做...
    发表于 05-29 16:55 4653次 阅读
    【小凌派RK2206开发板试用体验】1.Ubuntu22.04搭建编译环境遇到的问题及解决方法

    新手求助ARM编译器预定义的宏都有哪些呢

    ARM编译器预定义了许多宏。这些宏提供有关工具链版本号和编译器选项的信息。 编译器版本 宏为:__ARMCC_VERSION...
    发表于 05-26 16:46 3681次 阅读