一种梯形图程序编译方法与流程

文档序号:32661508发布日期:2022-12-23 23:42阅读:66来源:国知局
一种梯形图程序编译方法与流程

1.本发明涉及工控领域可编程逻辑控制器plc的梯形图程序编译技术领域。


背景技术:

2.可编程逻辑控制器plc在工控领域被广泛运用在多种场景下,而为了充分使用plc的功能,需要有与plc适配的组态软件,在plc组态软件上完成plc的硬件组态、梯形图编程编译和程序下载等功能。梯形图编译作为组态软件的重要功能之一。
3.传统的windows平台适配研发的组态软件是基于mfc类库开发,其软件框架依赖于windows操作系统,同时mfc类库在使用和学习上较为复杂,在linux平台上使用时也需要重新设计和实现同样功能的组态软件。因此,在多平台应用时由于操作系统的不一致会出现软件的适配问题,所以在梯形图编译设计时需要考虑平台类库的不同做相应的优化设计。
4.长期以来,主流的一线plc市场被西门子、三菱和欧姆龙等厂商所垄断,国际厂商的plc编程软件不但具有强大的跨平台适配能力,而且具有良好的人机交互界面和满足不同客户使用习惯的软件功能设计,而国内厂商在软件设计上的重视程度不足,存在着一定的差距。而基于传统的windosw平台mfc类库设计的组态软件在跨平台适配上明显不足而且编译效率也不理想,不能满足多系统多平台运行的需求。
5.传统的组态软件,在梯形图编程过程中,在梯形图模块数量多、梯形图程序行数多的情况下,存在梯形图程序编译时间过长的问题,其主要原因便是在梯形图程序遍历功能设计上的不足,缺乏足够的代码架构设计。
6.传统windows平台的组态软件在x86平台上有现成的交叉编译器。对于x86平台的linux操作系统,gnu gcc可以很好的满足各种需求,针对mips平台,如龙芯平台,可以在龙芯的开源社区里面下载交叉编译工具,里面有详细的环境配置说明。其他平台也有类似的解决办法。
7.交叉编译器可以通过交叉编译工具适配,那么要提高编译的效率就要从交叉编译器的输入部分着手。一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器。提高编译效率是提高plc组态软件用户满意度的关键。


技术实现要素:

8.本发明针对以上问题,提出了一种梯形图程序编译方法,旨在提高梯形图程序编译的效率;将模块编译功能具体职责分配给各个模块类,职责划分更加清晰,编译速度更可,人机界面更加流畅;同时,优化了语法语义检查的方法和步骤,通过links数据的收集排序,优化为图元分配编号的算法,为ld转ldo,ldo转c提供了便利,从而实现了快速编译。
9.本发明的技术方案为:按以下步骤进行:步骤1、links排序,分析连线信号的传递方向,对所有的连线进行排序;步骤2、为items分配编号,并根据编号排序,以递归函数analysisexeno作为排序
算法;步骤3、语法语义检查;步骤3.1、模块语法语义检查,语法语义检查所涉及的函数是syntax( )和semantics( );步骤3.2、输入引脚的语法语义检查;步骤3.3、输出引脚的语法语义检查;步骤4、上述中语法语义检查有错给出提示,没有错误的情况下再进入生成中间程序阶段,生成中间文件ldo和.c文件,最后调用gcc编译成机器可识别的.o文件。
10.进一步的,步骤1中links排序,即连线排序,首先分析连线信号的传递方向,对所有的连线进行排序,排序原则是自上而下、自左而右。具体方法是从左总线开始,将与其相连的图元按照纵坐标从上而下进行排序,再将与右总线相连的图元按照从上而下进行排序。
11.进一步的,步骤2为items分配编号,即为图元分配编号,并根据编号排序,以递归函数analysisexeno作为排序算法;按以下步骤进行:步骤2.1、判断当前图元是否已经被分配编号,如果否则分以下步骤进行,如果是则遍历下一个图元,直至所有图元全部被分配编号;步骤2.2、处理输入引脚,判断输入引脚依赖的连线是否检查完毕;如果已经检查完,则分配编号,当前图元的输入引脚处理完毕,进入下一步;如果没有,则依次查找关联的图元,并返回进入步骤2.1先对关联的图元进行处理;步骤2.3、处理输出引脚;判断输出引脚是否有依赖的连线是否检查完毕;如果已经检查完,则分配编号,当前图元的输出引脚处理完毕,返回步骤2.1;如果没有,则依次查找关联的图元,并返回进入步骤2.1先对关联的图元进行处理。
12.进一步的,步骤3.1语法检查的流程是:遍历所有图元,根据图元的类型进行语法语义检查,检查图元的输入输出引脚是否为空,检查引脚的数据类型是否匹配,引脚参数名称是否有冲突。
13.进一步的,步骤3.2具体包括:步骤3.2.1、开始遍历图元输入引脚;步骤3.2.2、判断当前输入引脚是否完成语法检查,如果已完成,返回步骤3.2.1,继续检查下一个输入引脚;如果未完成,则进行下一步;步骤3.2.3、遍历与之关联的输入引脚所在的图元和输出引脚所在图元,根据数据类型进行语法检查,如果非法,输出错误信息,如果合法,则继续检查是否完成所有关联引脚的检查。如果未完成,继续遍历下一个关联图元;如果完成,则语法检查成功。
14.进一步的,步骤3.3具体包括:步骤3.3.1、开始遍历图元输出引脚;步骤3.3.2、判断当前输出引脚是否完成语法检查,如果已完成,返回步骤3.3.1,继续检查下一个输出引脚;如果未完成,则进行下一步;步骤3.3.3、遍历与之关联的输入引脚所在图元和输出引脚所在图元,根据数据类
型进行语法检查,如果非法,输出错误信息,如果合法,则继续检查是否完成所有关联引脚的检查。如果未完成,继续遍历下一个关联图元;如果完成,则语法检查成功。
15.本发明利用qt平台搭建的plc组态软件,实现在不同平台上运行的梯形图编译方法,可以满足不同项目的使用要求,便于在windows和linuxs上开展不同的项目,解决了原先mfc组态软件只能满足在windows平台开发项目的弊端。
16.在梯形图编译时,通过分析连线信号的传递方向,依据自上而下、自左而右的原则对梯形图程序进行转化编译,从而将梯形图程序转换为可以在底层嵌入式硬件上运行的程序。同时,本发明将模块编译功能具体职责分配给各个模块类,职责划分更加清晰,编译速度更快,人机界面更加流畅,能够为客户带来更好的体验。
17.本发明避免传统编译过程中,冗长的模块类型判断和编译流程,通过语法检查函数syntax( )和语义检查函数semantics( ),让各个模块对象自己实现编译功能,未使用的模块不编译,职责分配清晰。语法语义检查有错给出提示,没有错误的情况下再进入生成中间程序阶段,生成中间文件ldo和.c文件,最后调用gcc编译成机器可识别的.o文件。
附图说明
18.图1是程序编译的原理图,图2a是线圈类和触电类梯形图图元的示意图,图2b是基本功能模块梯形图图元的示意图,图2c是连线类梯形图图元的示意图,图2d是图元类设计示意图;图3是梯形图编译流程示意图,图4是编译编号分配示意图,图5是编号分配流程图,图6是语法语义检查整理流程,图7是输入引脚语法语义检查流程,图8是输出引脚语法语义检查流程。
具体实施方式
19.为能清楚说明本专利的技术特点,下面通过具体实施方式,并结合其附图,对本专利进行详细阐述。
20.编译程序是现代计算机系统的基本组成部分之一。从功能上讲,编译程序就是一个语言翻译程序。它把一种语言(称为源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。由于计算机硬件只懂自己的指令系统,即只能执行用相应机器语言编写的代码程序,而不能直接执行用高级语言或汇编语言编写的程序。因此,要在计算机上实现除机器语言之外的任意程序设计语言,使此种源语言能够被计算机所认识,就要涉及到编译程序。编译的进行不外乎以下两种方式:一种是对程序进行翻译;另一种是对程序进行解释。
21.一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器。一个完整的程序要变成机器能够运行的目
标代码,其大体的处理过程如图1所示,从图中可以看出将编译过程划分成了词法分析、语法分析、语义分析、中间代码生成、代码优化、和目标代码生成六个阶段,另外两个重要的工作表格管理和出错处理与上述六个阶段都有联系。
22.编译过程中的源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要表格管理的工作;如果编译过程中发现源程序有错误,编译过程应报告错误的性质和错误发生的位置,并且将错误所造成的影响限制在尽可能小的范围内,使得其他源程序的其他部分能继续被编译下去。
23.本发明主要解决在生成中间代码之前所做的工作。包括执行顺序的确定以及语法语义检查流程。
24.关于梯形图图元根据功能和分类不同,梯形图的图元主要分为如下几种大类,如图2a-2d所示:1)qcoil线圈类,派生自qld,作为各具体线圈模块类的基类,完成线圈模块的共有功能,各具体线圈包括有线圈、反向线圈、正转换感应线圈、负转换感应线圈等。
25.2)qcontact触点类,派生自qld,作为各具体触点模块类的基类,完成触点模块的共有功能,各具体触点包括有常开触点、常闭触点、正转换感应触点和负转换感应触点等。
26.3)qbus梯形图编程界面两边的墙壁类,作为每行梯形图程序的起始信号给与位置和终止信号接收位置。
27.4)基本功能模块,直接派生自qld,包括有数学运算模块,如qadd、qsub和qdiv等,统计运算模块如qmin、qmax和qave等,逻辑运算模块如qand、qor和qnot等。其余基本功能模块包括有关系运算模块、数据转化模块、数据移动模块和定时器模块等,在此不一一赘述。
28.5)qline连线类,负责完成各模块间的连线,将连线起始端的信号传输给连线末端的模块处。连线类又分为三类分别是水平线,左垂线和右垂线。
29.a)水平线:如图2c所示,水平线由输出引脚连接输入引脚;b)左垂线:输入引脚连接输入引脚;c)右垂线:输出引脚链接输出引脚。
30.如图2d所示,梯形图中包含图元类,这些图元类都包含了语法检查函数syntax( )和语义检查函数semantics( ),这样在我们编译过程中可以调用这些图元自己的检查函数进行语法和语言检查。
31.关于梯形图编译顺序在梯形图编译时,通过分析连线信号的传递方向,依据自上而下、自左而右的原则对梯形图程序进行转化编译,从而将梯形图程序转换为可以在底层嵌入式硬件上运行的程序。在这个过程中确定编译的顺序尤为重要。
32.为了避免传统编译过程中,冗长的模块类型判断和编译流程,为实现梯形图的编译功能设计了语法检查函数syntax( )和语义检查函数semantics( ),让各个模块对象自己实现编译功能,未使用的模块不编译,职责分配清晰。通过对各个函数的逻辑实现,可以在编写正确的梯形图程序后,经组态编译等过程实现梯形图程序在硬件上的正确运行。
33.关于梯形图编译流程在梯形图编译时,通过分析连线信号的传递方向,依据自上而下、自左而右的原则对梯形图程序进行转化编译,从而将梯形图程序转换为可以在底层嵌入式硬件上运行的程
序。在这个过程中确定编译的顺序尤为重要。
34.ld程序编译流程图如图3所示,本发明完成生成中间程序之前的工作,也就是ld转ldo之前的工作。
35.本发明的开发平台是qt,自定义的场景类qldscene是图元梯形图模块qld及其相关派生类对象的容器。通过qldscene获取梯形图中的所有图元。这些图元包括连线,线圈,触点以及功能块。图元类都派生自qld基类。qld的设计如下,包含了图元排序,语法语义检查,以及引脚的维护,模块编译功能具体职责分配给各个模块类,职责划分更加清晰,编译速度更可,人机界面更加流畅。
36.步骤1、links排序,即连线排序,首先分析连线信号的传递方向,对所有的连线进行排序,排序原则是自上而下、自左而右。具体方法是从左总线开始,将与其相连的图元按照纵坐标从上而下进行排序,再将与右总线相连的图元1~6按照从上而下进行排序。如下图4所示,编译过后梯形图程序中图元序号标识信号的传递顺序。
37.步骤2、为items分配编号,即为图元分配编号,并根据编号排序;递归函数analysisexeno是排序算法。如图5所示,算法如下:步骤2.1、判断当前图元是否已经被分配编号,如果否则分以下步骤进行,如果是则遍历下一个图元,直至所有图元全部被分配编号;步骤2.2、处理输入引脚,判断输入引脚依赖的连线是否检查完毕;如果已经检查完,则分配编号,当前图元的输入引脚处理完毕,进入下一步;如果没有,则依次查找关联的图元(包括关联的输出引脚所在的图元以及关联的左垂线所在的图元),并返回进入步骤2.1先对该关联的图元进行处理;步骤2.3、处理输出引脚;判断输出引脚是否有依赖的连线是否检查完毕;如果已经检查完,则分配编号,当前图元的输出引脚处理完毕,返回步骤2.1;如果没有,则依次查找关联的图元(包括关联的输入引脚所在的图元以及关联的右垂线所在的图元),并返回进入步骤2.1先对该关联的图元进行处理。
38.步骤3、语法语义检查,如图6所示。
39.步骤3.1、模块语法语义检查,模块的语法语义检查包括了自定义功能块、系统自带功能块、线圈、连线、触点,这些模块都是从qld类派生,调用同一个语法语义检查函数即可。语法语义检查是根据不同类型的图元进行检查,比如如果是触点和线圈类的图元是语法检查是检查其引脚不为空,语法语义检查所涉及的函数是syntax( )和semantics( )。
40.语法检查的流程是:遍历所有图元,根据图元的类型进行语法语义检查,检查图元的输入输出引脚是否为空,检查引脚的数据类型是否匹配,引脚参数名称是否有冲突等。
41.梯形图程序可以有若干个,每个程序可以包含成百上千个图元,每个图元有自己的语法检查函数能大大提高效率。
42.步骤3.2、输入引脚的语法语义检查流程如下图7所示:步骤3.2.1、开始遍历图元输入引脚;步骤3.2.2、判断当前输入引脚是否完成语法检查,如果已完成,返回步骤3.2.1,继续检查下一个输入引脚;如果未完成,则进行下一步;步骤3.2.3、遍历与之关联的输入引脚所在的图元和输出引脚所在图元,根据数据
类型进行语法检查,如果非法,输出错误信息,如果合法,则继续检查是否完成所有关联引脚的检查。如果未完成,继续遍历下一个关联图元;如果完成,则语法检查成功;步骤3.3、输出引脚的语法语义检查流程如下图8所示:步骤3.3.1、开始遍历图元输出引脚;步骤3.3.2、判断当前输出引脚是否完成语法检查,如果已完成,返回步骤3.3.1,继续检查下一个输出引脚;如果未完成,则进行下一步;步骤3.3.3、遍历与之关联的输入引脚所在图元和输出引脚所在图元,根据数据类型进行语法检查,如果非法,输出错误信息,如果合法,则继续检查是否完成所有关联引脚的检查。如果未完成,继续遍历下一个关联图元;如果完成,则语法检查成功。
43.上述中,如果语法语义检查有误,输出错误信息之后就不会进行编译了,用户修改了错误之后重新进行语法语义检查,只有通过所有的语法语义检查才会进入真正的编译阶段;语法语义检查是为了保证传递给编译程序的内容是合法的。
44.步骤4、上述中语法语义检查有错给出提示,没有错误的情况下再进入生成中间程序阶段,生成中间文件ldo和.c文件,最后调用gcc编译成机器可识别的.o文件。避免传统编译过程中,冗长的模块类型判断和编译流程,通过语法检查函数syntax( )和语义检查函数semantics( ),让各个模块对象自己实现编译功能,未使用的模块不编译,职责分配清晰。
45.本发明具体实施途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进,这些改进也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1