面向对象及面向过程语言的modelica仿真组件生成方法
技术领域
1.本发明属于计算机仿真领域,具体涉及一种面向对象及面向过程语言的modelica仿真组件生成方法。
背景技术:2.modelica是一种开源的多领域统一建模语言,该语言具有面向对象特点和非因果关系建模能力,具有较好的交互性和较强的模型表达力,在多领域仿真领域有广泛的应用。
3.采用modelica进行系统仿真时,可以使用modelica语言建模,也可以使用由c语言或fortran语言编写的外部语言函数建模。外部语言函数建模时,常用的方法是按照modelica语言规范编写一个与原外部语言函数有相同接口的modelica函数,按照参数映射规则进行参数类型映射,modelica函数的实现部分通过external关键字通过动态库方式调用外部语言函数实现。目前这种人工进行的方法存在二方面的问题:一是由于这种做法需要具备专业知识的程序员编写代码,操作难度较大,效率较低;二是由于modelica语言自身可以采用mingw或vs编译器对c语言源代码进行编译,当选择的编译器和制作外部函数动态库使用的编译器不同时,此时常规方法是必须获得外部函数的源码,然后使用与modelica相同的编译器重新生成外部函数动态库,否则将会建模失败。
技术实现要素:4.本发明的目的是针对上述问题,提供面向对象及面向过程语言的modelica仿真组件生成方法,自动将面向对象语言或面向过程语言编写的外部函数利用二次封装方法转换、生成modelica组件,代替人工,并解决非mingw编译器编译的外部函数动态库在选择mingw编译器的modelica环境下不能使用问题,避免必须获取源代码;转换过程批量进行,大大提高转换效率。
5.本发明结合动态库转换和mo文件描述方式实现将以动态库方式提供的外部函数制作成modelica组件,通过生成新的动态库对原始动态库函数进行封装,实现编译器兼容和接口转换。
6.本发明的技术方案是面向对象及面向过程语言的modelica仿真组件生成方法,包括以下步骤:步骤1:从指定的文件夹中逐一获取待转换的动态库及外部函数;步骤2:分析得到每个外部函数的返回值类型、函数名称、函数参数列表;步骤3:生成项目文件和源代码文件;步骤4:为每一个外部函数在代码文件中生成符合modelica使用规范的外部函数;步骤4.1:在源代码文件中增加对原始动态库头文件的include包含;步骤4.2:对由步骤2输出的每一个原始动态库导出函数原型,在源代码中生成一个新的函数原型,新函数返回值为整数;新函数名称由原始动态库对应的导出函数的名称转换得到;新函数的参数列表由原函数的参数列表的基础上增加原函数的返回值参数形
成;步骤4.3:生成由大括号对构成的函数体;步骤4.4:在函数体内,根据原始动态库采用的不同编写语言类型生成不同的执行语句;步骤5:将步骤3生成的项目编译成动态库文件;步骤6:建立外部语言函数对应的mo文件,将外部函数引入到modelica函数中,生成modelica组件。
7.步骤1采用默认模式或配置文件模式获取待转换的动态库及外部函数。采用默认模式时,遍历指定文件夹中扩展名为dll的动态库文件,对每一个动态库文件,在当前文件夹中查找与动态库文件主文件名相同且扩展名为h的头文件,没有则记录错误,处理下一个动态库文件,直到所有动态库文件处理完后结束;采用配置文件模式时,读取配置文件,根据配置文件中的记录的文件名,依次读取动态库文件和对应的头文件,对每一个头文件采用文本分析方式去掉注释,然后按照标识符提取状态转换图方式分析得到标识符列表,然后从列表中倒序读取获取外部函数原型。
8.步骤2具体包括以下子步骤:步骤2.1:首先从标识符列表中获取函数的返回值类型和函数名称;步骤2.2:由左括号开始,按照函数参数分析状态转换图确定函数包括参数类型和参数名称的参数列表。函数参数分析状态转换图包括状态集合{0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 13, 22},状态0为初始状态,状态9为终止状态。
9.步骤3具体包括以下子步骤:步骤3.1:用程序方式生成mingw规范的项目文件;步骤3.2:生成c语言源代码文件,源代码文件文件名由原始动态库文件名转换得到;并将该源代码文件加入到步骤3.1生成的项目中。
10.步骤6具体包括以下子步骤:步骤6.1:根据外部函数名生成modelica语言函数名,按照一定规则生成函数名前缀,避免重名;步骤6.2:根据参数的输入、输出类型和数据类型,按照语言规范映射成modelica语言的输入input、输出output及对应的数据类型;步骤6.3:生成external引用的函数名称、动态库文件路径与头文件路径,并生成xml格式的组件安装引导文件,相关的动态库文件、静态库文件、mo文件、xml文件统一输出到相同的文件夹并根据应用需要决定是否压缩打包。
11.步骤4.4中,对c或fortran语言编写的动态库,在函数体内用新生成函数的参数列表中的参数名称作为参数,按照调用约定和参数次序对原始动态库函数进行调用;对c++语言编写的动态库,在函数体内,首先对原始动态库中的类进行实例化,然后根据导出的方法的参数次序,用新生成函数参数列表中的参数名称作为参数对方法进行调用。
12.相比现有技术,本发明的有益效果包括:1)本发明提供了将c、fortan等面向过程语言以及c++等面向对象语言编写的动态库批量生成modelica组件的自动转化方法,便于计算机执行,代替人工,省时省力,大大提
高了转换效率,便于在modelica仿真平台上进行跨语言的建模仿真;2)本发明解决了受modelica自身接口限制,modelica仿真系统选择的编译器和制作外部函数动态库使用的编译器不同时难以转化的问题;3)本发明将c语言、fortan语言、c++语言等多种语言编写的动态库同时转化,实现了多种程序语言外部函数在modelica仿真系统的集成仿真。
附图说明
13.下面结合附图和实施例对本发明作进一步说明。
14.图1为本发明实施例的modelica组件批量生成系统的示意图。
15.图2为本发明实施例的modelica组件批量生成系统的输入输出示意图。
16.图3为本发明实施例的标识符提取状态转换图。
17.图4为本发明实施例的函数参数分析状态转换图。
18.图5为本发明实施例的配置文件示意图。
19.图6为本发明实施例的头文件内容示意图。
具体实施方式
20.如图1所示,实施例的modelica组件批量生成系统包括:批量提取部件,从文件夹中批量获取待处理的动态库和头文件等原始文件;函数分析部件,从待处理的头文件中分析得到对应动态库的每个导出函数的返回值类型、函数名称、函数参数列表,函数参数列表包括参数的输入输出类型、参数数据类型、参数名称;项目生成部件,生成一个新的符合modelica规范的外部动态库项目,该项目实现对原始动态库的封装调用;函数生成部件,生成一个符合modelica使用规范的外部函数,将根据原始动态库采用的不同的语言,生成的外部函数具有不同的原型和函数实现代码;项目编译部件,自动调用系统编译器将新生成的项目及源代码文件编译成符合modelica使用规范的动态库,完成对动态库工程和源码的编译;modelica组件生成部件,为外部函数建立对应的mo文件,生成modelica组件。
21.上述系统的面向对象及面向过程语言的modelica仿真组件生成方法,包括以下步骤:步骤1:从指定的文件夹中逐一获取待转换的动态库及外部函数;采用默认模式获取待转换的动态库及外部函数。用户指定的文件夹中包含一个或多个待处理的动态库文件及其对应头文件。默认模式下,遍历文件夹中扩展名为dll的动态库文件,对每一个动态库文件,在当前文件夹中查找与动态库文件主文件名相同,扩展名为h的头文件,头文件内容如图6所示,没有则记录错误,处理下一个动态库文件,直到所有动态库文件处理完后结束;步骤2:分析得到每个外部函数的返回值类型、函数名称、函数参数列表;步骤2.1:首先从标识符列表中获取函数的返回值类型和函数名称;步骤2.2:由左括号开始,按照图4所示的函数参数分析状态转换图确定函数包括
参数类型和参数名称的参数列表。
22.步骤3:生成项目文件和源代码文件;步骤3.1:用程序方式生成mingw规范的项目文件;步骤3.2:生成c语言源代码文件,源代码文件文件名由原始动态库文件名转换得到;并将该源代码文件加入到步骤3.1生成的项目中。
23.步骤4:为每一个外部函数在代码文件中生成符合modelica使用规范的外部函数;步骤4.1:在源代码文件中增加对原始动态库头文件的include包含;步骤4.2:对由步骤2输出的每一个原始动态库导出函数原型,在源代码中生成一个新的c语言函数原型,新函数返回值类型为整数int类型;当原函数调用成功返回0;调用不成功返回一个指示错误代码的整数值;新函数名称由原始动态库对应的导出函数的名称转换得到;功能有关的输入和输出参数统一放入新函数的参数列表中,其中对输入参数在变量前加const修饰;步骤4.3:生成由大括号对构成的函数体;步骤4.4:在函数体内,根据原始动态采用的编写语言类型如c、fortran、c++等,生成不同的执行语句;步骤5:调用mingw编译器,对新建的项目和源代码文件进行编译,生成新的动态库文件和静态库文件;步骤6:建立外部语言函数对应的mo文件,将外部函数引入到modelica函数中,生成modelica组件,组件文件通过annnotation实现通过新建的动态库函数实现对原始动态库函数的调用;步骤6.1:根据外部函数名生成modelica语言函数名,为避免重名,按照一定规则生成函数名前缀;步骤6.2:根据参数的输入、输出类型和数据类型,按照语言规范映射成modelica语言的输入input、输出output及对应的数据类型;步骤6.3:生成external引用的函数名称、动态库文件路径与头文件路径;将新的动态库文件,静态库文件、头文件和原始动态库文件与mo文件放在一起,即可以实现在modelica语言模型中使用。
24.实施例中指定的文件夹下有c语言编写的动态库a.dll, b.dll, c.dll和对应的头文件cheadfora.h, cheadforb.h, cheadforc.h。cheadfora.h文件中有afun1, afun2, afun3等函数的声明。类似的cheadforb.h, cheadforc.h文件中有bfun1, bfun2,cfun1,cfun2等函数声明。a.dll, a.lib, b.dll, b.lib, c.dll, c.lib, cheadfora.h, cheadforb.h, cheadforc.h以及相关的文件均存放在目录dir中。实施例基于modelica建模仿真平台的仿真系统中需要使用函数afun1, afun2, afun3, bfun1, bfun2, cfun1, cfun2等。
25.如图2所示,将指定文件夹的目录dir作为输入参数传递给本发明的modelica组件批量生成系统,modelica组件批量生成系统批量生成modelica组件,在每个modelica组件中以外部函数的方式使用原动态库中c语言函数。modelica组件可以在modelica仿真系统中和原生函数一样使用。
26.实施例二实施例二采用和实施例一相同的modelica组件批量生成系统。
27.面向对象及面向过程语言的modelica仿真组件生成方法包括以下步骤:步骤1:从指定的文件夹中逐一获取待转换的动态库及外部函数;采用配置文件模式获取待转换的动态库及外部函数,在配置文件模式下,读取配置文件,根据配置文件中的记录的文件名,依次读取动态库文件和对应的头文件。对每一个头文件采用文本分析方式去掉注释,然后按照图3所示的标识符提取状态转换图方式分析得到标识符列表,然后从列表中倒序读取获取外部函数原型。
28.步骤2:分析得到每个外部函数的返回值类型、函数名称、函数参数列表;步骤2.1:首先从标识符列表中获取函数的返回值类型和函数名称;步骤2.2:由左括号开始,按照图4所示的函数参数分析状态转换图确定函数包括参数类型和参数名称的参数列表。函数参数分析状态转换图包括状态集合{0, 1, 2, 3, 5, 7, 8, 9, 11, 12, 13, 22},状态0为初始状态,状态9为终止状态。
29.函数参数分析的状态处理流程包括:1)状态0下,输入空格继续保持状态0;状态0下输入字母,进入状态1;状态0下输入“)”,进入状态8;状态0下其它情况进入状态9;2)状态1下,输入字母、数字继续保持状态1;状态1下输入空格,进入状态2;状态1下输入“*”,进入状态3;状态1下输入“,”,进入状态5;状态1下输入“)”,进入状态8;状态1下输入“(”、“;”或其它字符,进入状态9;3)状态2下,输入空格继续保持状态2;状态2下输入字母,进入状态11;状态2下输入“*”,进入状态3;状态2下输入“,”进入状态5;状态2下输入“)”,进入状态8;状态2下输入其它字符,进入状态9;4)状态3下,输入“*”、空格继续保持状态3;状态3下输入“,”,进入状态5;状态3下输入“)”,进入状态8;状态3下输入字母,进入状态12;状态3下输入其它字符,进入状态9;5)状态5下,输入空格继续保持状态5;状态5下输入字母,进入状态1;状态5下输入其它字符,进入状态9;6)状态7下,输入空格继续保持状态7;状态7下输入其它字符,进入状态9;7)状态8下,输入空格继续保持状态8;状态8下输入“;”,进入状态7;状态8下输入其它字符,进入状态9;8)状态9下,返回-1,结束状态处理流程;9)状态11下,输入字母、数字继续保持状态11;状态11下输入空格,进入状态22;状态11下输入“,”,进入状态5;状态11下输入“)”,进入状态8;状态11下输入其它字符,进入状态9;10)状态12下,输入字母、数字继续保持状态12;状态12下输入空格,进入状态13;状态12下输入“,”,进入状态5;状态12下输入“)”,进入状态8;状态12下输入其它字符,进入状态9;11)状态13下,输入空格继续保持状态13;状态13下输入“,”,进入状态5;状态13下输入“)”,进入状态8;状态13下输入其它字符,进入状态9;12)状态22下,输入空格继续保持状态22;状态22下输入字母,进入状态11;状态22
下输入“,”,进入状态5;状态22下输入“)”,进入状态8;状态22下输入其它字符,进入状态9。
30.步骤3:生成项目文件和源代码文件;步骤3.1:用程序方式生成mingw规范的项目文件;步骤3.2:生成c语言源代码文件,源代码文件文件名由原始动态库文件名转换得到;并将该源代码文件加入到步骤3.1生成的项目中。
31.步骤4:为每一个外部函数在代码文件中生成符合modelica使用规范的外部函数;步骤4.1:在源代码文件中增加对原始动态库头文件的include包含;步骤4.2:对由步骤2输出的每一个原始动态库导出函数原型,在源代码中生成一个新的c语言函数原型,新函数返回值类型为整数int类型;当原函数调用成功返回0;调用不成功返回一个指示错误代码的整数值;新函数名称由原始动态库对应的导出函数的名称转换得到;功能有关的输入和输出参数统一放入新函数的参数列表中,其中对输入参数在变量前加const修饰;步骤4.3:生成由大括号对构成的函数体;步骤4.4:在函数体内,根据原始动态采用的编写语言类型,生成不同的执行语句,具体如下:对c或fortran语言编写的动态库,在函数体内用新生成函数的参数列表中的参数名称作为参数,按照调用约定和参数次序对原始动态库函数进行调用。根据具体应用可以约定若调用成功,新生成函数的返回值为0,否则返回值错误代码。
32.对c++语言编写的动态库,在函数体内,首先对原始动态库中的类进行实例化,然后根据导出的方法的参数次序,用新生成函数参数列表中的参数名称作为参数对方法进行调用。
33.步骤5:调用mingw编译器,对新建的项目和源代码文件进行编译,生成新的动态库文件和静态库文件;步骤6:建立外部语言函数对应的mo文件,将外部函数引入到modelica函数中,生成modelica组件,组件文件通过annnotation实现通过新建的动态库函数实现对原始动态库函数的调用;步骤6.1:根据外部函数名生成modelica语言函数名,为避免重名,按照一定规则生成函数名前缀;步骤6.2:根据参数的输入、输出类型和数据类型,按照语言规范映射成modelica语言的输入input、输出output及对应的数据类型;步骤6.3:生成external引用的函数名称、动态库文件路径与头文件路径;将新的动态库文件,静态库文件、头文件和原始动态库文件与mo文件放在一起,即可以实现在modelica语言模型中使用。
34.实施例中,在待封装的原始动态库文件夹下,准备图5所示的文本配置文件,配置文件中按照表1所示的格式写明文件夹下每一个动态库、对应的头文件以及使用的编译器。封装程序通过读取该配置文件,实现对同一文件夹下不同的编译器产生的动态库进行封装。
35.实施结果表明,本发明实现了c语言、fortan语言、c++语言等多种程序语言外部函
数在modelica仿真系统的集成仿真。
36.表1 配置文件格式表
技术特征:1.面向对象及面向过程语言的modelica仿真组件生成方法,其特征在于,将动态库形式的面向对象语言或面向过程语言编写的外部函数制作成modelica仿真组件,通过生成新的动态库对原始动态库函数进行封装,实现编译器兼容和接口转换;所述方法包括以下步骤:步骤1:从指定的文件夹中逐一获取待转换的动态库及外部函数;步骤2:分析得到每个外部函数的返回值类型、函数名称、函数参数列表;步骤3:生成项目文件和源代码文件;步骤4:为每一个外部函数在代码文件中生成符合modelica使用规范的外部函数;步骤4.1:在源代码文件中增加对原始动态库头文件的include包含;步骤4.2:对由步骤2输出的每一个原始动态库导出函数原型,在源代码中生成一个新的函数原型,新函数返回值为整数;新函数名称由原始动态库对应的导出函数的名称转换得到;新函数的参数列表由原函数的参数列表的基础上增加原函数的返回值参数形成;步骤4.3:生成由大括号对构成的函数体;步骤4.4:在函数体内,根据原始动态库采用的不同编写语言类型生成不同的执行语句;步骤5:将步骤3生成的项目编译成动态库文件;步骤6:建立外部语言函数对应的mo文件,将外部函数引入到modelica函数中,生成modelica组件。2.根据权利要求1所述的modelica仿真组件生成方法,其特征在于,步骤1采用默认模式或配置文件模式获取待转换的动态库及外部函数;采用默认模式时,遍历指定文件夹中扩展名为dll的动态库文件,对每一个动态库文件,在当前文件夹中查找与动态库文件主文件名相同且扩展名为h的头文件,没有则记录错误,处理下一个动态库文件,直到所有动态库文件处理完后结束;采用配置文件模式时,读取配置文件,根据配置文件中的记录的文件名,依次读取动态库文件和对应的头文件,对每一个头文件采用文本分析方式去掉注释,然后按照标识符提取状态转换图方式分析得到标识符列表,然后从列表中倒序读取获取外部函数原型。3.根据权利要求2所述的modelica仿真组件生成方法,其特征在于,步骤2包括:步骤2.1:首先从标识符列表中获取函数的返回值类型和函数名称;步骤2.2:由左括号开始,按照函数参数分析状态转换图确定函数包括参数类型和参数名称的参数列表。4.根据权利要求3所述的modelica仿真组件生成方法,其特征在于,步骤3包括:步骤3.1:用程序方式生成mingw规范的项目文件;步骤3.2:生成c语言源代码文件,源代码文件文件名由原始动态库文件名转换得到;并将该源代码文件加入到步骤3.1生成的项目中。5.根据权利要求4所述的modelica仿真组件生成方法,其特征在于,步骤6包括:步骤6.1:根据外部函数名生成modelica语言函数名,按照一定规则生成函数名前缀,避免重名;步骤6.2:根据参数的输入、输出类型和数据类型,按照语言规范映射成modelica语言的输入input、输出output及对应的数据类型;
步骤6.3:生成external引用的函数名称、动态库文件路径与头文件路径,并生成xml格式的组件安装引导文件,相关的动态库文件、静态库文件、mo文件、xml文件统一输出到相同的文件夹并根据应用需要决定是否压缩打包。6.根据权利要求1-5任意一项所述的modelica仿真组件生成方法,其特征在于,步骤4.4中,对c或fortran语言编写的动态库,在函数体内用新生成函数的参数列表中的参数名称作为参数,按照调用约定和参数次序对原始动态库函数进行调用;对c++语言编写的动态库,在函数体内,首先对原始动态库中的类进行实例化,然后根据导出的方法的参数次序,用新生成函数参数列表中的参数名称作为参数对方法进行调用。
技术总结本发明涉及面向对象及面向过程语言的Modelica仿真组件生成方法,包括:从指定的文件夹中逐一获取待转换的动态库及外部函数;分析得到每个外部函数的返回值类型、函数名称、函数参数列表;生成项目文件和源代码文件;为每一个外部函数在代码文件中生成符合Modelica使用规范的外部函数;将生成的项目编译成动态库文件;建立外部语言函数对应的mo文件,将外部函数引入到Modelica函数中,生成Modelica组件。本发明提供了将面向对象语言以及面向过程语言编写的动态库批量生成Modelica组件的自动转化方法,便于计算机执行,代替人工,大大提高了转换效率。大大提高了转换效率。大大提高了转换效率。
技术研发人员:田卫新 徐超
受保护的技术使用者:三峡大学
技术研发日:2021.04.13
技术公布日:2022/7/5