一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种代码封装方法及装置与流程

2022-07-09 21:36:41 来源:中国专利 TAG:


1.本发明涉及数据处理技术领域,具体涉及一种代码封装方法及装置。


背景技术:

2.多个部门承接系统的不同模块时,各个部门所使用的建模工具可能不统一,例如某些部门的算法是通过c代码或c 代码实现的。用户在希望将各个模块联合仿真以验证整体运行情况时,由于各个部门所使用的建模工具不统一,会导致无法进行联合仿真。


技术实现要素:

3.有鉴于此,本发明实施例提供一种代码封装方法及装置,以解决由于各个部门所使用的建模工具不统一,而导致无法进行联合仿真的问题。
4.为实现上述目的,本发明实施例提供如下技术方案:
5.本发明实施例第一方面公开一种代码封装方法,所述方法包括:
6.确定待封装的仿真模型,其中,所述仿真模型包含模型层、中间层和功能模拟接口fmi层,所述模型层包含基于用户代码封装得到的第一接口,所述中间层包含用于调用所述第一接口的第二接口,所述fmi层包含用于调用所述第二接口的第三接口,所述中间层和所述fmi层基于指定版本的fmi标准构建;
7.利用符合所述fmi标准的描述文件模板和所述中间层对应的中间层文件,生成描述文件;
8.将所述中间层文件、所述fmi层对应的fmi层文件和所述用户代码添加到指定文件夹;
9.调用编译器对所述指定文件夹中的内容进行编译以生成动态链接库文件;
10.响应于用户的操作指令,对所述描述文件和所述动态链接库文件进行打包以得到fmu。
11.优选的,利用符合所述fmi标准的描述文件模板和所述中间层对应的中间层文件,生成描述文件,包括:
12.获取所述中间层对应的中间层文件的文件名,以及获取所述中间层文件中的变量信息;
13.分别将所述文件名和所述变量信息添加至符合所述fmi标准的描述文件模板中,以生成描述文件。
14.优选的,调用编译器对所述指定文件夹中的内容进行编译以生成动态链接库文件,包括:
15.以所述指定文件夹中的所述中间层文件作为编译入口,调用微软cl编译器对所述指定文件夹中的内容进行编译,以生成dll文件,其中,所述fmi层文件和所述用户代码被所述中间层文件引用;
16.或者,
17.以所述中间层文件作为编译入口,调用gcc编译器对所述指定文件夹中的内容进行编译,以生成so文件。
18.优选的,响应于用户的操作指令,对所述描述文件和所述动态链接库文件进行打包以得到fmu,包括:
19.在用户的操作指令未选中其它待打包文件的情况下,响应所述操作指令,对所述描述文件和所述动态链接库文件进行打包以得到fmu;
20.在用户的操作指令选中其它待打包文件的情况下,响应所述操作指令,对所述其它待打包文件、所述描述文件和所述动态链接库文件进行打包以得到fmu。
21.优选的,指定版本的fmi标准为第二版本的fmi标准。
22.本发明实施例第二方面公开一种代码封装装置,所述装置包括:
23.确定单元,用于确定待封装的仿真模型,其中,所述仿真模型包含模型层、中间层和功能模拟接口fmi层,所述模型层包含基于用户代码封装得到的第一接口,所述中间层包含用于调用所述第一接口的第二接口,所述fmi层包含用于调用所述第二接口的第三接口,所述中间层和所述fmi层基于指定版本的fmi标准构建;
24.处理单元,用于利用符合所述fmi标准的描述文件模板和所述中间层对应的中间层文件,生成描述文件;
25.添加单元,用于将所述中间层文件、所述fmi层对应的fmi层文件和所述用户代码添加到指定文件夹;
26.编译单元,用于调用编译器对所述指定文件夹中的内容进行编译以生成动态链接库文件;
27.打包单元,用于响应于用户的操作指令,对所述描述文件和所述动态链接库文件进行打包以得到fmu。
28.优选的,所述处理单元包括:
29.获取子单元,用于获取所述中间层对应的中间层文件的文件名,以及获取所述中间层文件中的变量信息;
30.添加子单元,用于分别将所述文件名和所述变量信息添加至符合所述fmi标准的描述文件模板中,以生成描述文件。
31.优选的,所述编译单元具体用于:
32.以所述指定文件夹中的所述中间层文件作为编译入口,调用微软cl编译器对所述指定文件夹中的内容进行编译,以生成dll文件,其中,所述fmi层文件和所述用户代码被所述中间层文件引用;
33.或者,
34.以所述中间层文件作为编译入口,调用gcc编译器对所述指定文件夹中的内容进行编译,以生成so文件。
35.优选的,所述打包单元包括:
36.第一打包子单元,用于在用户的操作指令未选中其它待打包文件的情况下,响应所述操作指令,对所述描述文件和所述动态链接库文件进行打包以得到fmu;
37.第二打包子单元,用于在用户的操作指令选中其它待打包文件的情况下,响应所述操作指令,对所述其它待打包文件、所述描述文件和所述动态链接库文件进行打包以得
到fmu。
38.优选的,指定版本的fmi标准为第二版本的fmi标准。
39.基于上述本发明实施例提供的一种代码封装方法及装置,该方法为:确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层;利用符合fmi标准的描述文件模板和中间层对应的中间层文件,生成描述文件;将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹;调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件;响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。利用模板自动化地生成描述文件,减轻了封装工作量,同时模板还可以重复使用,减少了开发和学习成本;实现了能将用户代码封装成fmu,fmu可以被多个仿真软件导入,使得多个模块能够实现联合仿真以验证整体运行情况。
附图说明
40.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
41.图1为本发明实施例提供的一种代码封装方法的流程图;
42.图2为本发明实施例提供的待封装的仿真模型示意图;
43.图3为本发明实施例提供的中间层文件定义变量的代码格式示意图;
44.图4为本发明实施例提供的变量封装成fmu2.0的示意图;
45.图5为本发明实施例提供的符合fmi标准的描述文件模板示意图;
46.图6为本发明实施例提供的fmu文件结构示意图;
47.图7为本发明实施例提供的一种代码封装装置的结构框图。
具体实施方式
48.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
49.在本技术中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
50.由背景技术可知,多个部门承接系统的不同模块时,各个部门所使用的建模工具可能不统一,例如某些部门的算法是通过c代码或c 代码实现的。用户在希望将各个模块联合仿真以验证整体运行情况时,由于各个部门所使用的建模工具不统一,会导致无法进行联合仿真。
51.因此,本发明实施例提供一种代码封装方法及装置,该方法为:确定待封装的仿真
模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层;利用符合fmi标准的描述文件模板和中间层对应的中间层文件,生成描述文件;将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹;调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件;响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。仿真模型可以使用符合fmi标准的描述文件模板,自动生成描述文件,用户只需要关注自身的代码即可。实现了能将用户代码封装成fmu,fmu可以被多个仿真软件导入,使得多个模块能够实现联合仿真以验证整体运行情况。
52.可以理解的是,本发明实施例提供的一种代码封装方法可用于将用户的c/c 代码转换成具有fmi标准的fmu文件,fmu文件是使用fmi标准封装出的压缩包文件,fmu文件的后缀名为“*.fmu”;前述所提及的fmi标准可以是fmi2.0标准,符合该fmi2.0标准的fmu(可称之为fmu2.0)可以同时支持cs(co_simulation)和me(model_exchange)两种模式。
53.参见图1,示出了本发明实施例提供的一种代码封装方法的流程图,该代码封装方法包括:
54.步骤s101:确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层。
55.需要说明的是,仿真模型可以是用户业务(由用户代码构成);模型层包含基于用户业务封装得到的第一接口,中间层包含用于调用第一接口的第二接口,fmi层包含用于调用第二接口的第三接口,其中,中间层和fmi层基于指定版本的fmi标准构建,指定版本为第二版本的fmi标准(例如fmi2.0标准)。
56.结合图2所示的待封装的仿真模型示意图,下面分别对模型层、中间层以及fmi层做简单介绍:
57.首先,模型层(图2所示usermodel层)对用户业务做简单的接口封装,得到第一接口。第一接口至少包括:例如用来对用户业务的资源进行初始化的initial接口(图2中的“initial()”)、用来设置变量值的setvalue接口(图2中的“setvalue()”)和用来获取变量值的getvalue接口(图2中的“getvalue()”)以及用来执行函数的dostep接口(图2中的“dostep()”)。
58.可以理解的是,模型层文件中至少包含用户代码。
59.其次,中间层(图2所示middle层)按照fmi2.0标准编写描述文件(例如modeldescription.xml),中间层包含中间层文件,中间层文件中定义了用于调用第一接口的第二接口。第二接口至少包括:例如负责对用户定义的输入、输出和参数变量进行初始化的setstartvalues接口(图2中的“setstartvalues()”);负责对用户业务的资源进行初始化的initialize接口(图2中的“initialize()”),initialize接口调用模型层的initial接口;mid_dostep接口(图2中的“mid_doste p()”),mid_dostep接口调用模型层的dostep接口。
60.其中,需要在中间层文件中定义用户业务用到的变量(输入变量、输出变量和参数等),具体定义变量的格式参见图3所示的中间层文件定义变量的代码格式示意图。结合图3,定义了输入变量x和输入变量y以及输出变量z,将这三个变量封装成fmu2.0,当第三方工具(例如simulink或simulationx)使用这个fmu2.0时,其呈现的样子参见图4所示的变量封装成fmu2.0的示意图,具体封装方式详见以下各步骤的说明。
61.需要说明的是,在定义变量时,必须加上定义语句下面的注释语句,这些注释语句可以在中间层编写描述文件时被识别,并在描述文件中写入注释语句中相应的内容。
62.可以理解的是,图3所示的描述语句中,description为变量描述;type为变量类型;variability用于说明变量是连续型还是阶跃型;causality用于说明变量是输入变量、输出变量还是参数等。
63.最后,fmi层(图2所示fmi层)负责重写官方提供的fmi2.0标准接口,是待封装的仿真模型的最外层。fmi层包含用于调用第二接口的第三节接口。第三接口包括最重要的几个接口,例如:负责对用户业务进行初始化并开辟内存空间的fmi2instantiate接口(图2中的“fmi2instantiate()”),fmi2instanti ate接口调用中间层的setstartvalues接口;用于用户业务的初始化需求的fmi2e nterinitializationmode接口(图2中的“fmi2enterinitializationmode()”),fmi2enterinitializationmode接口调用中间层的initialize接口;负责主代码循环,每一步仿真都会被调用一次的fmi2dostep接口(图2中的“fmi2dostep()”),f mi2dostep接口调用中间层的mid_dostep接口。除此之外,第三接口还包括但不限于用于重置的fmi2reset接口和用于资源释放的fmi2freeinstance接口等。
64.步骤s102:利用符合fmi标准的描述文件模板和中间层对应的中间层文件,生成描述文件。
65.在具体实现步骤s102的过程中,获取中间层对应的中间层文件的文件名,和中间层文件的变量信息,分别将文件名和变量信息添加至符合fmi标准的描述文件模板中,生成描述文件。
66.可以理解的是,描述文件(例如modeldescription.xml)至少包括fmu的信息,fmu的模式,变量信息等内容。
67.结合图5所示的符合fmi标准的描述文件模板示意图,生成描述文件的过程包括:在cosimulation字段中说明fmu的模式(cs模式或me模式);将中间层文件的文件名写到sourcefiles字段内的name属性中;将中间层文件的变量信息自定解析后,添加到modelvariables节点内。
68.需要说明的是,中间层文件中使用例如“#include”的引用方式,将模型层文件和fmi文件全部引用在中间层文件中,使中间层文件全部包含其它文件的内容。
69.步骤s103:将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹。
70.在具体实现步骤s103的过程中,将中间层对应的中间层文件、fmi层对应的fmi层文件和包含用户代码的模型层文件添加到指定文件夹中。
71.步骤s104:调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件。
72.需要说明的是,在window系统中,调用微软cl编译器对指定文件夹中的内容进行编译,以生成dll文件,也就是说,dll文件是window系统的动态链接库文件。
73.在linux系统中,调用gcc编译器对指定文件夹中的内容进行编译,以生成so文件,也就是说,so文件是linux系统的动态链接库文件。
74.可以理解的是,调用微软cl编译器对指定文件夹中的内容进行编译,或,调用gcc编译器对指定文件夹中的内容进行编译时,以指定文件夹中的中间层文件为编译入口,对指定文件夹中的内容进行编译。其中,在中间层文件中以“#include”引用的方式,引用了
fmi层文件和用户代码。
75.需要说明的是,用户代码包含在模型层文件中,具体的,中间层文件通过“#include”的方式,引用模型层文件来引用用户代码。
76.在具体实现步骤s104的过程中,根据不同系统选择不同的编译器对指定文件夹中的内容进行编译以生成动态链接库文件。
77.步骤s105:响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。
78.具体的,结合图6所示的fmu2.0文件结构示意图,fmu2.0文件中包括:modeldescription.xml文件(即描述文件)、binnaries文件夹,该文件夹包括动态链接库文件、model.png文件,用于fmu显示图片、documentation文件,为fmu的说明文档、sources文件,即fmu的源代码,以及resources文件,即fmu用到的资源文件。
79.可以理解的是,在fmu2.0中,必须包括描述文件和动态链接库文件,但是用户也可以选择其它待打包文件一起打包到fmu2.0中。
80.其它待打包文件可以是:model.png文件、documentation文件、sources文件和resources文件。
81.需要说明的是,在用户的操作指令未选中其它待打包文件的情况下,响应操作指令,对描述文件和动态链接库文件进行打包以得到fmu2.0。
82.在用户的操作指令选中其它待打包文件的情况下,响应操作指令,对其它待打包文件、描述文件和动态链接库文件进行打包以得到fmu2.0。
83.在具体实现步骤s105的过程中,响应于用户的操作指令,将描述文件和动态链接库文件按照指定结构使用指定打包工具(例如7z打包工具)进行压缩打包成.fmu文件,从而得到fmu2.0。
84.本发明实施例中,确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层;利用符合fmi2.0标准的描述文件模板和中间层对应的中间层文件,生成描述文件;将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹;调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件;响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。使用分层的待封装的仿真模型,使得用户免于处理fmi2.0标准接口,用户只需要关注自身的代码即可。实现了能将用户代码封装成fmu,fmu可以被多个仿真软件导入,使得多个模块能够实现联合仿真以验证整体运行情况。
85.与上述本发明实施例提供的一种代码封装方法相对应,参见图7,本发明实施例还提供了一种代码封装装置的结构框图,该代码封装装置包括:确定单元701、处理单元702、添加单元703、编译单元704和打包单元705。
86.确定单元701,用于确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层,模型层包含基于用户代码封装得到的第一接口,中间层包含用于调用第一接口的第二接口,fmi层包含用于调用第二接口的第三接口,中间层和fmi层基于指定版本的fmi标准构建。
87.处理单元702,用于利用符合fmi标准的描述文件模板和中间层对应的中间层文件,生成描述文件。
88.在具体实现中,处理单元702包括获取子单元和添加子单元:
89.获取子单元,用于获取中间层对应的中间层文件的文件名,以及获取中间层文件中的变量信息。
90.添加子单元,用于分别将文件名和变量信息添加至符合fmi标准的描述文件模板中,以生成描述文件。
91.添加单元703,用于将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹。
92.编译单元704,用于调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件。
93.在具体实现中,编译单元704具体用于,以指定文件夹中的中间层文件作为编译入口,调用微软cl编译器对指定文件夹中的内容进行编译,以生成dll文件,其中,fmi层文件和用户代码被中间层文件引用;
94.或者,
95.以中间层文件作为编译入口,调用gcc编译器对指定文件夹中的内容进行编译,以生成so文件。
96.打包单元705,用于响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。
97.在具体实现中,打包单元705包括第一打包子单元和第二打包子单元:
98.第一打包子单元,用于在用户的操作指令未选中其它待打包文件的情况下,响应操作指令,对描述文件和动态链接库文件进行打包以得到fmu。
99.第二打包子单元,用于在用户的操作指令选中其它待打包文件的情况下,响应操作指令,对其它待打包文件、描述文件和动态链接库文件进行打包以得到fmu。
100.在一些具体实施例中,指定版本的fmi标准为第二版本的fmi标准。
101.本发明实施例中,确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层;利用符合fmi标准的描述文件模板和中间层对应的中间层文件,生成描述文件;将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹;调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件;响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。在仿真模型中自动化生成描述文件,减轻了封装的工作量。仿真模型中,中间层对应的中间层文件可以形成模板,供反复使用,减少了开发和学习的成本。由此,实现了能将用户代码封装成fmu,fmu可以被多个仿真软件导入,使得多个模块能够实现联合仿真以验证整体运行情况。
102.综上所述,本发明实施例提供一种代码封装方法及装置,确定待封装的仿真模型,其中,仿真模型包含模型层、中间层和功能模拟接口fmi层;利用符合fmi2.0标准的描述文件模板和中间层对应的中间层文件,生成描述文件;将中间层文件、fmi层对应的fmi层文件和用户代码添加到指定文件夹;调用编译器对指定文件夹中的内容进行编译以生成动态链接库文件;响应于用户的操作指令,对描述文件和动态链接库文件进行打包以得到fmu。使用分层的待封装的仿真模型,使得用户免于处理fmi2.0标准接口,用户只需要关注自身的代码即可。在仿真模型中自动化生成描述文件,减轻了封装的工作量。仿真模型中,中间层对应的中间层文件可以形成模板,供反复使用,减少了开发和学习的成本。实现了能将用户代码封装成fmu,fmu可以被多个仿真软件导入,使得多个模块能够实现联合仿真以验证整
体运行情况。
103.本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
104.专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
105.对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献