CN105116800B - 一种编译函数类型pou对象的方法 - Google Patents
一种编译函数类型pou对象的方法 Download PDFInfo
- Publication number
- CN105116800B CN105116800B CN201510489434.7A CN201510489434A CN105116800B CN 105116800 B CN105116800 B CN 105116800B CN 201510489434 A CN201510489434 A CN 201510489434A CN 105116800 B CN105116800 B CN 105116800B
- Authority
- CN
- China
- Prior art keywords
- function
- parameter
- class example
- example area
- function object
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G05—CONTROLLING; REGULATING
- G05B—CONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
- G05B19/00—Programme-control systems
- G05B19/02—Programme-control systems electric
- G05B19/04—Programme control other than numerical control, i.e. in sequence controllers or logic controllers
- G05B19/042—Programme control other than numerical control, i.e. in sequence controllers or logic controllers using digital processors
- G05B19/0426—Programming the control sequence
-
- G—PHYSICS
- G05—CONTROLLING; REGULATING
- G05B—CONTROL OR REGULATING SYSTEMS IN GENERAL; FUNCTIONAL ELEMENTS OF SUCH SYSTEMS; MONITORING OR TESTING ARRANGEMENTS FOR SUCH SYSTEMS OR ELEMENTS
- G05B2219/00—Program-control systems
- G05B2219/20—Pc systems
- G05B2219/23—Pc programming
- G05B2219/23266—Compiler
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Automation & Control Theory (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种编译函数类型POU对象的方法,包括:分配一片固定内存作为函数类实例区,类实例区用于编译函数对象时使用的模拟堆栈空间;分配函数对象的参数到类实例区;调用已编译的函数对象。本发明通过分配一片固定内存作为函数的类实例区,用于编译函数对象时使用的模拟堆栈空间,使得函数对象的参数的分配以及调用已编译的函数对象均在分配的类实例区中完成,因此能够降低与真实控制器之间的耦合,不依赖于控制器本身堆栈,去除控制器本身堆栈空间的大小对编译的影响,降低堆栈溢出的风险。
Description
技术领域
本发明涉及程序编译技术领域,尤其涉及一种编译函数类型POU(ProgramOrganization Unit,程序组织单元)对象的方法。
背景技术
在工业控制领域经常涉及到将用户使用标准的编程语言编写的控制程序转换成工业设备(例如工业控制器等)能够执行的程序指令,即所谓的程序编译过程。所使用的高级语言一般为工业控制领域的相关标准确定的编程语言,例如广泛适用的IEC 61131-3规定的FBD、LD、SFC、ST、IL等编程语言。用户使用这些面向应用的编程语言编写适合特定工业场景的控制逻辑和其它相关逻辑,通过编译器的编译生成目标代码,并通过通信等手段将其载入至工业设备进行执行。
在编译器将用户使用工业标准编程语言编写的控制程序进行编译翻译成工业设备直接执行的目标代码时,关注程序逻辑的同时,更应根据不同的工业设备产生不同的目标代码。特别是当编译函数以及函数调用程序逻辑时,编译器需要依赖实际面对的工业设备的加载或执行环境以及提供的指令结构。在控制器中调用程序时,需要进行入栈与出栈的动作,程序中调用函数对象时,需要再次进行入栈与出栈的动作,更甚至当函数允许嵌套调用时,入栈与出栈的动作进行的更频繁。故而导致对控制系统堆栈空间的影响较大,存在溢出的风险,对现场存在安全隐患。
发明内容
本发明提供了一种编译函数类型POU对象的方法,能够降低与真实控制器之间的耦合,不依赖于控制器本身堆栈,去除控制器本身堆栈空间的大小对编译的影响,降低堆栈溢出的风险。
本发明提供了一种编译函数类型POU对象的方法,包括:
分配一片固定内存作为函数类实例区,所述类实例区用于编译函数对象时使用的模拟堆栈空间;
分配函数对象的参数到所述类实例区;
调用已编译的函数对象。
优选地,所述类实例区为由控制器固定分配的或编译时分配的一片固定内存或由编译器分配的一片固定内存。
优选地,所述分配一片固定内存作为函数类实例区包括:
依据函数允许的最大调用层数,分配相应数量的函数类实例区;
依据函数语句的最大复杂度确定每个函数类实例区的大小。
优选地,所述依据函数语句的最大杂度确定每个函数类实例区的大小具体为:
以所述函数语句的输入、输出引脚的最大数目和最长表达式包含的操作符数目之和确定每个函数类实例区的大小。
优选地,不同调用层数的函数分配于不同的类实例区。
优选地,所述分配函数对象的参数到所述类实例区具体为:
函数对象的参数按照参数描述表的顺序分配类实例区中的内存。
优选地,所述调用已编译的函数对象包括:
将函数对象的引脚参数入栈;
翻译函数对象的执行语句;
将函数对象的引脚参数出栈,生成赋值语句。
优选地,所述将函数对象的引脚参数入栈包括:
将函数对象输入参数关联的数据通过模拟入栈的方式,赋值到函数相关引脚参数的内存;
将函数对象输出参数关联的数据通过模拟入栈的方式,赋值到函数相关引脚参数的内存。
优选地,所述将函数对象的引脚参数出栈,生成赋值语句具体为:
将输出参数赋值给函数调用语句的变量。
由上述方案可知,本发明提供的一种编译函数类型POU对象的方法,通过分配一片固定内存作为函数的类实例区,用于编译函数对象时使用的模拟堆栈空间,使得函数对象的参数的分配以及调用已编译的函数对象均在分配的类实例区中完成,因此能够降低与真实控制器之间的耦合,不依赖于控制器本身堆栈,去除控制器本身堆栈空间的大小对编译的影响,降低堆栈溢出的风险。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明公开的一种编译函数类型POU对象的方法的流程图;
图2为本发明公开的调用已编译的函数对象的流程图;
图3为本发明公开的程序调用函数的编译过程示意图;
图4为本发明公开的建立的函数类实例区的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为本发明公开的一种编译函数类型POU对象的方法,包括:
S101、分配一片固定内存作为函数类实例区,所述类实例区用于编译函数对象时使用的模拟堆栈空间;
在编译的过程中,首先为函数分配一片固定内存的全局数据区,作为函数的类实例区,用于在编译函数对象时作为模拟堆栈空间使用,代替控制器本身的堆栈空间。
S102、分配函数对象的参数到所述类实例区;
当分配好函数的类实例区后,将函数对象的参数分配到类实例区中。
S103、调用已编译的函数对象。
编译程序中通过模拟入栈和模拟出栈的方式调用已编译的函数对象。
综上所述,本发明提供的一种编译函数类型POU对象的方法,通过分配一片固定内存作为函数的类实例区,用于编译函数对象时使用的模拟堆栈空间,使得函数对象的参数的分配以及调用已编译的函数对象均在分配的类实例区中完成,因此能够降低与真实控制器之间的耦合,不依赖于控制器本身堆栈,去除控制器本身堆栈空间的大小对编译的影响,降低堆栈溢出的风险。
具体的,上述实施例中,函数的类实例区可以是由控制器分配的一片固定内存,或者是由编译器分配的一片固定内存。类实例区的个数由当前允许的函数的最大调用层数决定,例如,函数最大的调用层数为3层,则分配3个类实例区。每个类实例区的大小以允许的函数语句的复杂度为参照,一般的,每个类实例区的大小等于函数语句的输入、输出引脚的最大数目和最长表达式包含的操作符数目之和,如图3所示的C1,包含3个引脚(IN1\IN2\OUT),以及表达式“IN1+IN2”包含1个操作符+,所以它实际使用的类实例区的长度为4。在编译时,由调用层级低的函数开始编译,例如如图4所示,先编译函数C,然后是B,再编译函数A,函数A允许调用函数B,函数B允许调用函数C,相同层级内的函数不允许调用,层级低的函数不允许调用层级高的函数,如函数B不允许调用A。每个调用层级独立分配唯一的类实例区,编译每个函数时,传递相应的类实例区供函数编译时使用。
具体的,上述实施例中,分配函数对象的参数到所述类实例区时,为每个函数的引脚分配内存,由于相同调用层级的函数共用同一片内存,故多个函数的实例的引脚内存地址会分配于相同的地址。如图3所示,分配所有函数的引脚参数后,类实例区中存在所有参数的划分情况,在函数实体中,参数值的获取,则可以直接通过参数在类实例区中的绝对地址获取参数的值。此类实例区中的参数数据,由程序在调用函数之前,将函数的引脚参数关联的数值通过模拟入栈的过程赋值到类实例区。
具体的,上述实施例中,如图2所示,调用已编译的函数对象包括以下步骤:
S201、将函数对象的引脚参数入栈;
S202、翻译函数对象的执行语句;
S203、将函数对象的引脚参数出栈,生成赋值语句。
程序中调用函数对象时,将输入参数关联的数据通过模拟入栈的方式,赋值到函数相关引脚参数的内存,此内存即是前面分配的类实例区空间。同时将输出参数也一同入栈,入栈的数据为0。存在多个输入参数时,需根据函数的参数描述表提供的顺序依次入栈。入栈完后,跳转到函数实际的执行代码执行函数本体逻辑。等待返回后,按照以参数描述表描述的顺序相反的顺序将所有引脚参数出栈,在出栈的同时,如果存在函数计算结果的赋值动作,即将函数赋值到其他表达式,则需要在出栈时,将输出参数出栈到指定地址,形成赋值语句。
下面结合图3和图4对本发明的具体实现方式进行详细描述。
如图4所示,首先划分全局数据区中一片固定内存作为函数类实例区。考虑调用层数为最多3级时,则固定全局分配3片固定大小的数据区内存作为函数类实例区,分别对应3个调用层级的函数。函数的编译顺序由最低调用层级的函数开始,这里编译顺序为C、B、A。函数C编译时使用类实例区C,依次类推。
其次,为所编译的函数的参数分配内存。如图3所示,编译函数时,函数的参数按照参数描述表的顺序分配类实例区中的空间。
最后,编译程序中调用的函数对象。如图3所示,考虑类似ADD这样的函数对象,输入参数为IN1、IN2,输出参数为OUT,输入参数传递数值分别为1和2。
将函数对象的引脚参数值入栈:输入引脚IN1、IN2与输出引脚OUT采用统一的或固定的顺序依次入栈,入栈的顺序需要依据实际函数的参数描述表决定,可以通过配置文件等方式传递参数描述表。输入引脚入栈后,将翻译成将引脚关联的参数值赋值给引脚地址的赋值语句。同样的输出引脚入栈时,翻译引脚赋值语句,所赋值为初始值0。
如图3所示,例子中的“1”和“2”数据,入栈后,将赋值到函数对象的引脚。
入栈的逻辑可以由编译器本身通过全局的push函数得以实现。生成引脚的赋值语句后,挪动栈指针,以备后面的继续压栈动作。
调用函数对象执行语句:翻译函数对象的执行语句,跳转到函数的代码地址。
函数对象的计算结束后,所有引脚参数出栈:出栈时按照函数参数描述表的逆顺序出栈,只对输出引脚生成一条内存赋值语句,即将输出引脚参数赋值给函数调用语句的变量,如图3中的TEMP变量。出栈的逻辑可以由编译器本身通过全局的pop函数得以实现。
本实施例方法所述的功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算设备可读取存储介质中。基于这样的理解,本发明实施例对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一台计算设备(可以是个人计算机,服务器,移动计算设备或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (9)
1.一种编译函数类型POU对象的方法,其特征在于,包括:
分配一片固定内存作为函数类实例区,所述类实例区用于编译函数对象时使用的模拟堆栈空间;其中,所述分配一片固定内存作为函数类实例区包括:依据函数允许的最大调用层数,分配相应数量的函数类实例区;
分配函数对象的参数到所述类实例区;
调用已编译的函数对象。
2.根据权利要求1所述的方法,其特征在于,所述类实例区为由控制器固定分配的或编译时分配的一片固定内存或由编译器分配的一片固定内存。
3.根据权利要求1所述的方法,其特征在于,所述分配一片固定内存作为函数类实例区还包括:
依据函数语句的最大复杂度确定每个函数类实例区的大小。
4.根据权利要求3所述的方法,其特征在于,所述依据函数语句的最大复杂度确定每个函数类实例区的大小具体为:
以所述函数语句的输入、输出引脚的最大数目和最长表达式包含的操作符数目之和确定每个函数类实例区的大小。
5.根据权利要求3所述的方法,其特征在于,不同调用层数的函数分配于不同的类实例区。
6.根据权利要求4或5所述的方法,其特征在于,所述分配函数对象的参数到所述类实例区具体为:
函数对象的参数按照参数描述表的顺序分配类实例区中的内存。
7.根据权利要求6所述的方法,其特征在于,所述调用已编译的函数对象包括:
将函数对象的引脚参数入栈;
翻译函数对象的执行语句;
将函数对象的引脚参数出栈,生成赋值语句。
8.根据权利要求7所述的方法,其特征在于,所述将函数对象的引脚参数入栈包括:
将函数对象输入参数关联的数据通过模拟入栈的方式,赋值到函数相关引脚参数的内存;
将函数对象输出参数关联的数据通过模拟入栈的方式,赋值到函数相关引脚参数的内存。
9.根据权利要求8所述的方法,其特征在于,所述将函数对象的引脚参数出栈,生成赋值语句具体为:
将输出参数赋值给函数调用语句的变量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510489434.7A CN105116800B (zh) | 2015-08-11 | 2015-08-11 | 一种编译函数类型pou对象的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510489434.7A CN105116800B (zh) | 2015-08-11 | 2015-08-11 | 一种编译函数类型pou对象的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105116800A CN105116800A (zh) | 2015-12-02 |
CN105116800B true CN105116800B (zh) | 2018-04-20 |
Family
ID=54664818
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510489434.7A Active CN105116800B (zh) | 2015-08-11 | 2015-08-11 | 一种编译函数类型pou对象的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105116800B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108733365B (zh) * | 2018-04-13 | 2021-10-01 | 南京南瑞继保电气有限公司 | 一种功能函数的数据区复用处理方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000284815A (ja) * | 1999-03-30 | 2000-10-13 | Fuji Electric Co Ltd | プログラム作成装置 |
CN101266540A (zh) * | 2008-04-24 | 2008-09-17 | 北京中星微电子有限公司 | 信号处理算法中的动态内存处理操作的方法及装置 |
CN101369143A (zh) * | 2007-08-17 | 2009-02-18 | 台达电子工业股份有限公司 | 可编程控制器程序编辑方法 |
CN101872184A (zh) * | 2010-06-04 | 2010-10-27 | 南大傲拓科技江苏有限公司 | 可编程控制器的顺序控制图编程及控制方法 |
CN104267999A (zh) * | 2014-09-26 | 2015-01-07 | 浙江中控技术股份有限公司 | 一种对控制程序进行编译的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8799880B2 (en) * | 2011-04-08 | 2014-08-05 | Siemens Aktiengesellschaft | Parallelization of PLC programs for operation in multi-processor environments |
-
2015
- 2015-08-11 CN CN201510489434.7A patent/CN105116800B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000284815A (ja) * | 1999-03-30 | 2000-10-13 | Fuji Electric Co Ltd | プログラム作成装置 |
CN101369143A (zh) * | 2007-08-17 | 2009-02-18 | 台达电子工业股份有限公司 | 可编程控制器程序编辑方法 |
CN101266540A (zh) * | 2008-04-24 | 2008-09-17 | 北京中星微电子有限公司 | 信号处理算法中的动态内存处理操作的方法及装置 |
CN101872184A (zh) * | 2010-06-04 | 2010-10-27 | 南大傲拓科技江苏有限公司 | 可编程控制器的顺序控制图编程及控制方法 |
CN104267999A (zh) * | 2014-09-26 | 2015-01-07 | 浙江中控技术股份有限公司 | 一种对控制程序进行编译的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105116800A (zh) | 2015-12-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104267999B (zh) | 一种对控制程序进行编译的方法和装置 | |
US8752031B2 (en) | Compiling method and processor using the same | |
CN106415495A (zh) | 用于应用开发的编程系统和语言 | |
WO2016189689A1 (ja) | プログラム生成装置、プログラム生成方法及びプログラム生成プログラム | |
US10884715B2 (en) | Method for generating source code | |
CN106648681A (zh) | 一种可编程语言编译装载系统及方法 | |
CN115686527A (zh) | 基于算子的编译方法、装置、计算机设备和存储介质 | |
US20160063164A1 (en) | Method for determining by optimization a multi-core architecture | |
CN105116800B (zh) | 一种编译函数类型pou对象的方法 | |
CN110968308A (zh) | 一种用于改变用于生成源代码的模型的方法 | |
CN108121285B (zh) | 基于连续功能图的应用软件协同编译方法及装置 | |
CN112214978A (zh) | 一种数据处理方法及相关设备 | |
US10126726B2 (en) | Apparatus and method for generating program | |
CN108170953B (zh) | 一种电路图迁移方法和装置 | |
CN104572134B (zh) | 一种优化方法及装置 | |
WO2021047662A1 (en) | Method and apparatus for enabling autonomous acceleration of dataflow ai applications | |
EP3712733A1 (en) | Method and system of preparing engineering data for industrial control systems | |
CN110333870B (zh) | Simulink模型变量分配的处理方法、装置及设备 | |
CN110286909B (zh) | Simulink模型资源使用数据的统计方法及装置 | |
CN110059062A (zh) | 一种文件系统的条带设置方法、系统及相关组件 | |
CN110209397A (zh) | 一种数据处理方法、装置及系统 | |
CN110134687A (zh) | 一种通过表字段的动态增改控制清单要素的方法及系统 | |
JP6295914B2 (ja) | プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ | |
CN109002984A (zh) | 数字资产的管理方法、装置、介质和计算设备 | |
Nikseresht et al. | A Multi-objective Task Scheduling Method for Embedded System Design |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |