CN102750177A - 一种使用编译器的脚本实现方法 - Google Patents
一种使用编译器的脚本实现方法 Download PDFInfo
- Publication number
- CN102750177A CN102750177A CN2012102028093A CN201210202809A CN102750177A CN 102750177 A CN102750177 A CN 102750177A CN 2012102028093 A CN2012102028093 A CN 2012102028093A CN 201210202809 A CN201210202809 A CN 201210202809A CN 102750177 A CN102750177 A CN 102750177A
- Authority
- CN
- China
- Prior art keywords
- script
- function
- user
- name
- compiler
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000013515 script Methods 0.000 title claims abstract description 153
- 238000000034 method Methods 0.000 title claims abstract description 23
- 230000006870 function Effects 0.000 claims abstract description 52
- 238000013507 mapping Methods 0.000 claims description 12
- 238000007781 pre-processing Methods 0.000 abstract description 3
- 239000011800 void material Substances 0.000 description 6
- 238000010586 diagram Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 2
- 230000018109 developmental process Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000004886 process control Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000033772 system development Effects 0.000 description 1
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种使用编译器的脚本实现方法,该方法首先对用户编写的脚本进行预处理,生成临时文件;然后,使用编译器对脚本生成的临时文件进行编译,生成可被主程序调用的动态链接库;最后,在主程序运行时,加载该动态库,当主程序需要调用脚本时,从动态链接库中找到该脚本对应的脚本函数。本发明将用户脚本直接编译成可执行代码,相比传统的对脚本进行解释执行的方案,提高了程序的执行效率;而且在脚本中还允许用户直接使用标准语言的各种语法规则,这样在保持组态软件简单易用的同时,极大的提高了软件的灵活性和可扩展性。
Description
技术领域
本发明属于工业组态软件开发运行技术领域,具体涉及一种使用编译器的脚本实现方法。
背景技术
随着工业自动化水平的迅速提高,计算机在工业领域的广泛应用,人们对工业自动化的要求越来越高,种类繁多的控制设备和过程监控装置在工业领域的应用,使得工业控制软件越来越复杂。此时如果采用编程语言直接进行系统开发,虽然可以满足各种各样复杂的需求,并且能保证足够高的执行效率,但面临着开发难度大,开发周期长,代码重用性差等问题。因此组态软件应运而生。组态软件是指一些用于数据采集与过程控制的专用软件。它们是处在自动控制系统监控层一级的软件平台和开发环境,使用灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。组态软件主要特点如下:
(1)延续性和可扩充性。用组态软件开发的应用程序,当现场(包括硬件设备或系统结构)或用户需求发生改变时,不需作很多修改而方便地完成软件的更新和升级;
(2)封装性(易学易用),组态软件所能完成的功能都用一种方便用户使用的方法包装起来,对于用户,不需掌握太多的编程语言技术(甚至不需要编程技术),就能很好地完成一个复杂工程所要求的所有功能;
(3)通用性,每个用户根据工程实际情况,利用组态软件提供的底层设备(PLC、智能仪表、智能模块、板卡、变频器等)的I/O Driver、开放式的数据库和画面制作工具,就能完成一个具有动画效果、实时数据处理、历史数据和曲线并存、具有多媒体功能和网络功能的工程,不受行业限制。
但由于用户需求越来越复杂,组态软件很难通过纯组态实现用户的所有需求,为此组态软件通常会提供脚本功能,让用户自己编写实现特殊需求的脚本代码。而传统的脚本编程方案要么由组态软件自己定义一套脚本编写的语法规则,要么虽然使用标准语言的语法规则,但是是在运行时解释执行的。前者增加了用户的学习难度,用户需要重新学习新的脚本编写规则,而且由组态软件自定义的语法规则通常功能比较简单,很难和标准语言提供的功能相提并论;而后者虽然也使用标准语言提供的语法规则,但其问题在于用户脚本是运行时解释执行的,这样运行效率通常较低,无法满足一些对速度要求比较高的工业控制应用。
发明内容
针对上述存在的技术问题,本发明针对工业组态软件,提出了一种极具灵活性和可扩展型的、使用编译器的脚本实现方法。
为解决上述技术问题,本发明采用如下的技术方案:
一种使用编译器的脚本实现方法,包含以下步骤:
步骤1,对用户编写的脚本进行预处理,生成临时文件,所述的临时文件为每段脚本所对应的脚本函数,及脚本名称和脚本函数的映射表,该步骤进一步包括子步骤:
1-1采用特殊标记对脚本中用户自定义的数据进行标记;
1-2为每段脚本定义一个唯一的脚本名称和脚本函数;
1-3根据特殊标记,将脚本转化成符合标准语言语法规则的函数体,并得到脚本函数;
1-4建立可被外部程序访问的脚本名称和脚本函数映射表;
步骤2,使用编译器对步骤1所得临时文件进行编译,得到可被主程序调用的动态链接库;
步骤3,在主程序运行时,加载步骤2所得动态链接库。
上述子步骤1-3中将脚本转化成符合标准语言语法规则的函数体具体为:
a)根据特殊标记提取脚本中用户自定义的数据;
b)为每个用户自定义数据生成一个对应的临时变量,并将用户自定义数据的初始值保存到其对应的临时变量中;
c)在每段脚本的开始,将脚本中的用户自定义数据替换为各自对应的临时变量;
d)在每段脚本的结束,将临时变量的值写入用户自定义数据,即得到符合标准语言语法规则的函数体。
上述步骤3具体为:
主程序运行时,当需要调用脚本时,首先查找动态链接库中的脚本名称和脚本函数的映射表,然后,根据脚本名称找到其对应的脚本函数后,执行该脚本函数。
本发明将用户脚本直接编译成可执行代码,相比传统的对脚本进行解释执行的方案,提高了程序的执行效率;而且在脚本中还允许用户直接使用标准语言的各种语法规则,这样在保持组态软件简单易用的同时,极大的提高了软件的灵活性和可扩展性。
附图说明
图1是本发明实施例的整体流程示意图;
图2是本发明实施例中脚本预处理流程的示意图;
图3是本发明实施例中对每段用户脚本预处理过程的示意图;
图4是本发明实施例中运行阶段程序流程示意图;
具体实施方式
以下结合附图和实施例详细说明本发明技术方案。
本发明提供了一种使用编译器的脚本实现方法,该方法首先对用户编写的脚本进行预处理,生成临时文件;然后,使用编译器对脚本生成的临时文件进行编译,生成可被主程序调用的动态链接库;最后,在主程序运行时,加载该动态库,当主程序需要调用脚本时,从动态链接库中找到该脚本对应的脚本函数。
为便于实施参考起见,下面的实施例以C语言作为脚本语言,以gcc编译器作为脚本编译器加以介绍,但本发明对脚本语言和编译器并没有限制,即不只限于C语言和gcc编译器。实施例具体步骤如图1所示:
步骤1,对用户编写的脚本进行预处理,生成临时文件。
预处理过程可分为两个阶段,如图2所示:
第一阶段,对用户编写的每段脚本进行处理:首先为每段脚本定义一个唯一的脚本名称,并针对每段脚本产生一个脚本函数,然后将脚本转化成符合标准语法规则的函数体。图3详细说明了这一处理过程:
1)用户在组态阶段,由于是将标准语言作为脚本编程语言,因此在编写脚本时,具有很大的灵活性,不仅可以使用标准语言提供的各种语法规则,而且还可以调用标准语言提供的强大的库函数。而脚本编程作为组态软件的一部分,必然要能够访问用户在组态软件中定义的数据,这些数据由于不是标准语言的一部分,因此不能为编译器所识别,如果不经过处理直接由编译器进行编译,会出现编译错误。所以用户在编写脚本时,需要用一种特殊的标记来指明脚本中哪些是用户在组态软件中自定义的数据。
为描述方便,下面以一个具体的实例来加以说明。在该实例中,假定在用户脚本中,使用在用户自定义数据的数据名前加“$”符号的方式来标识该数据来自用户自定义数据。
假设用户编写两段脚本,第一段脚本是画面window1中的按钮控件button1的“按下时”事件脚本,脚本内容如下:
if ($data1 > 10)
$data2++;
其中$data1和$data2都是用户在组态软件中自定义的数据。
第二段脚本是画面window2中的矩形控件rectangle1的“填充色”属性脚本,脚本内容如下:
if ($data3 < 100)
return 0xFF0000;
else
return 0xFF0000;
其中$data3为用户在组态软件中自定义的数据。
2)为用户编写的每段脚本定义一个唯一的脚本名称和脚本函数:
为每段脚本定义一个唯一的脚本名称,比较容易的实现方式是以“画面名+控件名+属性名”方式来表示脚本名。以上面的例子加以说明,对于第一段脚本,其脚本名称可以定义为“window1_button1_click”,对于第二段脚本,其脚本名称可以定义为“window2_ rectangle1_fillcolor”。同样脚本函数名也可以采用类似的命名方式,如第一段脚本的脚本函数名为“window1_button1_click_func”,第二段脚本的脚本函数名为“window2_ rectangle1_set_fillcolor_func”。
3)根据特殊标记,将脚本转化成符合标准语言语法规则的函数体,并得到脚本函数,具体步骤为:
3.1扫描每段用户脚本,根据特殊标记,提取出脚本中用户自定义的数据:
以上面的例子加以说明,对于第一段脚本,用户自定义数据为data1,data2;对于第二段脚本,用户自定义数据为data3。
3.2为每个用户自定义数据生成一个对应的临时变量,并将用户自定义数据的初始值保存到其对应的临时变量中;
3.3在每段脚本的开始,将脚本中的用户自定义数据替换为各自对应的临时变量;
3.4在每段脚本的结束,将临时变量的值写入用户自定义数据,即得符合标准语言语法规则的函数体。以上面的例子加以说明,对于第一段脚本,经过预处理后的得到的脚本函数为:
static void window1_button1_click_func (void)
{
/* 脚本开始时,用临时变量保存用户自定义数据初始值 */
short __temp_var1 = (*(short *)hmidb_get_data_value("data1"));
short __temp_var2 = (*(short *)hmidb_get_data_value("data2"));
/*将每段脚本中的用户自定义数据替换为各自对应的临时变量*/
if (__temp_var1 > 10)
__temp_var2++;
/*在脚本结束时,将临时变量的值写到用户自定义数据中*/
hmidb_set_data_value("data1",&__temp_var1);
hmidb_set_data_value("data2",&__temp_var2);
}
第二阶段,将第一阶段的输出作为第二阶段的输入,为第一阶段产生的脚本名称和脚本函数建立一个映射表,并让该映射表可被外部程序访问,外部程序通过查找该映射表,可以由脚本名称找到该脚本名对应的脚本函数。
以上面的例子加以说明,在C语言里,可以用一个结构数组来实现脚本名称和脚本函数的映射表:
typedef struct _script_map_table_t
{
char *script_name;
void *script_func;
} script_map_table_t;
script_map_table_t g_script_map_table[]={
{“window1_button1_click”, (void*) window1_button1_click_func},
“window2_ rectangle1_fillcolor”, (void*) window2_ rectangle1_set_fillcolor_func},
{NULL, NULL}
};
通过步骤1得到的临时文件为每段脚本所对应的脚本函数,及脚本名称和脚本函数的映射表。
步骤2,使用gcc编译器对生成的临时文件进行编译,生成可被主程序调用的动态链接库;主程序指调用脚本的程序。
步骤3,主程序运行阶段的流程如图4所示:主程序在运行时,加载上述动态链接库;当需要调用用户编写的脚本时,首先查找动态链接库中的脚本名称和脚本函数的映射表,根据脚本名称找到其对应的脚本函数后,然后执行该脚本函数。
“由脚本名称查找其对应的脚本函数”,这一过程用C语言实现,代码如下:
void *get_script_func_by_name(const char *script_name)
{
script_map_table_t *script_table = g_script_map_table;
while (script_table->script_name != NULL)
{
if (strcmp(script_table-> script_name, script_name) == 0)
return script_table->script_func;
script_table++;
}
return NULL;
}
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
Claims (3)
1.一种使用编译器的脚本实现方法,其特征在于,包含以下步骤:
步骤1,对用户编写的脚本进行预处理,生成临时文件,所述的临时文件为每段脚本所对应的脚本函数,及脚本名称和脚本函数的映射表,该步骤进一步包括子步骤:
1-1采用特殊标记对脚本中用户自定义的数据进行标记;
1-2为每段脚本定义一个唯一的脚本名称和脚本函数;
1-3根据特殊标记,将脚本转化成符合标准语言语法规则的函数体,并得到脚本函数;
1-4建立可被外部程序访问的脚本名称和脚本函数映射表;
步骤2,使用编译器对步骤1所得临时文件进行编译,得到可被主程序调用的动态链接库;
步骤3,在主程序运行时,加载步骤2所得动态链接库。
2.根据权利要求1所述的使用编译器的脚本实现方法,其特征在于:
所述的子步骤1-3中将脚本转化成符合标准语言语法规则的函数体具体为:
a)根据特殊标记提取脚本中用户自定义的数据;
b)为每个用户自定义数据生成一个对应的临时变量,并将用户自定义数据的初始值保存到其对应的临时变量中;
c)在每段脚本的开始,将脚本中的用户自定义数据替换为各自对应的临时变量;
d)在每段脚本的结束,将临时变量的值写入用户自定义数据,即得符合标准语言语法规则的函数体。
3.根据权利要求1所述的使用编译器的脚本实现方法,其特征在于:
所述的步骤3具体为:
主程序运行时,当需要调用脚本时,首先查找动态链接库中的脚本名称和脚本函数的映射表,然后,根据脚本名称找到其对应的脚本函数后,执行该脚本函数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210202809.3A CN102750177B (zh) | 2012-06-19 | 2012-06-19 | 一种使用编译器的脚本实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210202809.3A CN102750177B (zh) | 2012-06-19 | 2012-06-19 | 一种使用编译器的脚本实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102750177A true CN102750177A (zh) | 2012-10-24 |
CN102750177B CN102750177B (zh) | 2014-12-31 |
Family
ID=47030396
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210202809.3A Expired - Fee Related CN102750177B (zh) | 2012-06-19 | 2012-06-19 | 一种使用编译器的脚本实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102750177B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104240167A (zh) * | 2014-09-09 | 2014-12-24 | 苏州柯乐思医学科技有限公司 | 一种基于外部程序的动态控制放疗计划系统的方法 |
CN104423986A (zh) * | 2013-09-02 | 2015-03-18 | 北京亿阳信通科技有限公司 | 一种应用系统内嵌脚本的方法和装置 |
CN106250199A (zh) * | 2016-07-26 | 2016-12-21 | 北京北森云计算股份有限公司 | 一种多语言云编译的动态微服务调用方法及装置 |
CN107024900A (zh) * | 2015-10-21 | 2017-08-08 | Ls 产电株式会社 | 最优编译plc命令的方法 |
CN109308182A (zh) * | 2018-08-13 | 2019-02-05 | 深圳市奥拓电子股份有限公司 | 函数编译方法、编译系统及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1763717A (zh) * | 2005-11-24 | 2006-04-26 | 北京中星微电子有限公司 | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 |
CN101561884A (zh) * | 2009-05-25 | 2009-10-21 | 北大方正集团有限公司 | 一种可变数据印刷过程中的脚本实现方法及装置 |
US20120005661A1 (en) * | 2010-06-30 | 2012-01-05 | Bioproduction Group, Inc. | Method for Just-in-Time Compilation and Execution of Code Blocks within Discrete Event Simulations |
-
2012
- 2012-06-19 CN CN201210202809.3A patent/CN102750177B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1763717A (zh) * | 2005-11-24 | 2006-04-26 | 北京中星微电子有限公司 | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 |
CN101561884A (zh) * | 2009-05-25 | 2009-10-21 | 北大方正集团有限公司 | 一种可变数据印刷过程中的脚本实现方法及装置 |
US20120005661A1 (en) * | 2010-06-30 | 2012-01-05 | Bioproduction Group, Inc. | Method for Just-in-Time Compilation and Execution of Code Blocks within Discrete Event Simulations |
Non-Patent Citations (1)
Title |
---|
李新等: "构建基于DLLs的可扩展软件结构", 《河北工业科技》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104423986A (zh) * | 2013-09-02 | 2015-03-18 | 北京亿阳信通科技有限公司 | 一种应用系统内嵌脚本的方法和装置 |
CN104423986B (zh) * | 2013-09-02 | 2018-12-14 | 山东亿阳信通信息技术有限公司 | 一种应用系统内嵌脚本的方法和装置 |
CN104240167A (zh) * | 2014-09-09 | 2014-12-24 | 苏州柯乐思医学科技有限公司 | 一种基于外部程序的动态控制放疗计划系统的方法 |
CN104240167B (zh) * | 2014-09-09 | 2017-09-12 | 宁波江东晟创工业产品设计有限公司 | 一种基于外部程序的动态控制放疗计划系统的方法 |
CN107024900A (zh) * | 2015-10-21 | 2017-08-08 | Ls 产电株式会社 | 最优编译plc命令的方法 |
US10445074B2 (en) | 2015-10-21 | 2019-10-15 | Lsis Co., Ltd. | Method of optimally compiling PLC command |
CN106250199A (zh) * | 2016-07-26 | 2016-12-21 | 北京北森云计算股份有限公司 | 一种多语言云编译的动态微服务调用方法及装置 |
CN106250199B (zh) * | 2016-07-26 | 2019-06-21 | 北京北森云计算股份有限公司 | 一种多语言云编译的动态微服务调用方法及装置 |
CN109308182A (zh) * | 2018-08-13 | 2019-02-05 | 深圳市奥拓电子股份有限公司 | 函数编译方法、编译系统及存储介质 |
CN109308182B (zh) * | 2018-08-13 | 2022-05-24 | 深圳市奥拓电子股份有限公司 | 函数编译方法、编译系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN102750177B (zh) | 2014-12-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108027722A (zh) | 在编译和部署中动态更新应用 | |
US20030200533A1 (en) | Method and apparatus for creating software objects | |
CN114841326B (zh) | 深度学习框架的算子处理方法、装置、设备和存储介质 | |
CN103714129A (zh) | 基于条件规则的动态数据结构和关系的构建装置和构建方法 | |
US20050108684A1 (en) | Method and system for generating an application object repository from application framework metadata | |
CN102750177A (zh) | 一种使用编译器的脚本实现方法 | |
CN101859244A (zh) | 多工具链工程构建方法及系统 | |
CN103136406A (zh) | 可视化应用程序自动生成仿真用函数代码的方法 | |
CN100561476C (zh) | 一种基于asn类型对象的代码生成方法 | |
CN103049251A (zh) | 一种数据库持久层装置及数据库操作方法 | |
CN102929682A (zh) | 自动扩展tcl语言的预处理方法和装置 | |
CN102779044B (zh) | 表达式的解析处理系统和解析处理方法 | |
CN110196720A (zh) | 一种Simulink生成动态链接库的优化方法 | |
CN101980546A (zh) | 智能网平台、业务执行方法和分析业务异常的方法 | |
CN109753281B (zh) | 一种基于图形化编程的微电网能量管理策略可视化开发工具 | |
CN101231590A (zh) | 基于脚本和com组件控制的ivr流程编辑解析模型 | |
Muller et al. | Components@ work: Component technology for embedded systems | |
CN112148271B (zh) | 一种装配工艺代码自动生成与注入的方法 | |
US8356290B2 (en) | Conversion of a class oriented data flow program with inheritance to a structure oriented data flow program | |
CN103714035B (zh) | 一种用于集成环境的多层软件总线结构 | |
Allison et al. | A generic model of execution for synthesizing interpreted domain-specific models | |
CN204360367U (zh) | 代码自动生成装置 | |
US8458682B2 (en) | Conversion of a class oriented data flow program to a structure oriented data flow program with dynamic interpretation of data types | |
Teiniker et al. | A test-driven component development framework based on the CORBA component model | |
Krawczyk et al. | Hamilton: a modular open source declarative paradigm for high level modeling of dataflows. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20141231 |
|
CF01 | Termination of patent right due to non-payment of annual fee |