一种基于注释的仿真代码同步生成方法

文档序号:6625808阅读:733来源:国知局
一种基于注释的仿真代码同步生成方法
【专利摘要】一种基于注释的仿真代码同步生成方法,包括:设计一个仿真描述模型;将该仿真描述模型导出为底层仿真代码;将导出的仿真代码放入实际仿真机中进行执行,并根据执行结果对仿真代码进行修改,然后将修改结果同步到仿真描述模型。通过上述方法,就能完成仿真描述模型与仿真代码之间的同步生成。利用本发明,可充分利用软件仿真的优势,将仿真软件应用到实时仿真领域中,能够缩短仿真模型设计周期、减少人为失误、减少重复工作量、降低对仿真人员编程知识的要求。
【专利说明】一种基于注释的仿真代码同步生成方法

【技术领域】
[0001]本发明提供了一种基于代码生成实现软件仿真与实时仿真之间实现设计复用、缩短工作周期的方法。具体涉及使用一种基于注释和特殊标注规则的自动化代码导出和代码逆向方法,实现软件的非实时仿真和实时仿真之间使用代码工程进行同步沟通。

【背景技术】
[0002]仿真技术是一门多学科的综合性技术,它以控制论、系统论、信息技术和相似原理为基础,以专用设备和计算机为工具,利用系统的模型对实际的或设想的系统进行动态试验。通过对现实系统的模仿,获取某些必要信息,然后解决现实生活中出现的问题。随着科技的飞速发展,仿真技术在诸多领域中发挥着日益重要的作用,其理论与方法的研究也在不断深化发展着。软件仿真技术也在这个过程中得到了长足的发展,软件仿真具有建模快速、对仿真人员编程知识要求不高、调参方便等优点。软件仿真也被应用到军事和民用领域的方方面面。
[0003]在传统的控制理论研究中,一般都可以利用上述提到的仿真软件的功能方便地进行控制规律的设计和仿真,但是这些仿真大部分为非实时仿真,模型中的硬件环节由数学模型来替代。但对于一些如串口通信等对于仿真实时性要求高的场合,往往达不到预期的控制效果;而且离线仿真往往不能对内存、接口和通信等实时参量进行评价,从而设计者必须不断对自身的设计做出调整,开发周期相对较长。在一般的仿真研究院中,仿真人员往往都会采用专门的仿真机进行实时仿真测试,这是使用仿真软件所替代不了的。而这些仿真机接收的模型语言有很大一部分是以C/C++为主的。而传统的仿真研究院工作方式是仿真人员先自己设计并开发C/C++的仿真底层代码,根据测试结果重新修改代码。由于仿真机的运行耗费较高,且直接对代码进行修改容易产生差错,并且在编写代码时会产生许多重复工作,因此这种方式的仿真往往效率低下而且人力、物力成本较高。
[0004]目前的主流仿真软件往往也会提供方法支持软件仿真向实时仿真的过渡,最大限度地利用软件仿真的优势,减少仿真人员的重复性劳动,并且尽可能地智能化处理非实时仿真描述模型转换成实时仿真底层代码的流程,实现模型的校验、模型模板的导出等工作。
[0005]但是目前的软件仿真与实时仿真之间的过渡往往是一次性的,仿真软件只提供一次性的将仿真描述模型导出为实时仿真底层代码,往往对导出的实时仿真底层代码没有后续的跟踪,用户随后在实时仿真底层代码上的操作就与仿真软件没有关系了,用户对于模型的后续调试也无法继续使用软件仿真所带来的便利;如果仿真人员在软件模型上进行了修改,只能重新导出为新的实时仿真模型,原有的在实时仿真模型上的修改也不会得到保留;即软件仿真与实时仿真之间并没有同步关系,一旦生成实时仿真模型之后,就与软件仿真没有关联了,后续在仿真机上的模型修改和调参不可在仿真软件里进行维护。


【发明内容】

[0006]本发明的目的是使仿真平台能将非实时仿真的灵活高效性和实时仿真的有效性相结合。仿真人员能够在仿真软件上对模型进行测试和修改,同时系统可以自动生成适用于实时仿真的代码工程或者是代码框架。
[0007]本发明提供的技术方案如下:
[0008]一种基于注释的仿真代码同步生成方法,其特征是,利用代码工程作为软件仿真与实时仿真之间的通信方式;利用代码生成使仿真描述模型可以应用到实时仿真系统中,利用代码逆向使对于实时仿真系统中模型的修改调参可以反馈到仿真描述模型中,从而继续应用软件仿真;通过基于注释的方式组织代码工程,从而实现代码工程的增量修改、智能扫描和动态反馈。
[0009]一种基于注释的仿真代码同步生成方法,其特征是,包括以下步骤:
[0010]第I步:设计一个仿真描述模型;
[0011]第2步:将该仿真描述模型导出为底层仿真代码,以下简称仿真代码;
[0012]第3步:将导出的仿真代码放入实际仿真机中进行执行,并根据执行结果对仿真代码进行修改,然后将修改结果同步到仿真描述模型。
[0013]通过上述方法,就能完成仿真描述模型与仿真代码之间的同步生成。
[0014]优选的技术方案:
[0015]所述的仿真代码同步生成方法,其特征是,所述的仿真描述模型用XML进行描述。
[0016]所述的仿真代码同步生成方法,其特征是,第2步的实现方法为:
[0017]2.1)将仿真描述模型中的每个模块转换为一个底层仿真代码类;
[0018]2.2)模块中的变量定义转为类的变量定义,内部变量转为类的私有成员,对外变量转为类的公有成员;
[0019]2.3)模块间的值以公共数组方式存放;系统维护一个大的枚举类型列表,每个模块的每个变量根据特殊的构造规则可以与这个列表里的枚举项一一对应;而每个变量通过对应的枚举项的值即可以找到在公共数组里的位置,从而完成向数组中写入数据或者读取数据;模块的数据交互便是以此来实现;
[0020]2.4)仿真代码中的可变部分由注释标记对来标记。
[0021]所述的仿真代码同步生成方法,其特征是,步骤2.1中,所述的仿真代码类为C++类或Java类。
[0022]所述的仿真代码同步生成方法,其特征是,步骤2.4中,所述的可变部分包括初始变量、输入变量、内部变量、输出变量、参数变量、模块内容区域。
[0023]所述的仿真代码同步生成方法,其特征是,第3步的实现方法为,在加载所述的仿真代码后,执行:
[0024]3.1)根据注释标记对,分块读取仿真代码内容;
[0025]3.2)每种注释标记对表示一种类型的元素,比如变量声明、变量赋值、变量映射等;
[0026]3.3)比对仿真描述模型与仿真代码中提取的信息,更新仿真描述模型。
[0027]所述的仿真代码同步生成方法,其特征是,利用基于组件的方式构建仿真描述模型,使用仿真软件的模型校验功能对设计的模型进行初步检查,排查在设计阶段可能的错误和一些变量映射等方面的错误;使用软件进行数据采集和数据分析,使用软件进行快速地仿真运行和初步调试。
[0028]所述的仿真代码同步生成方法,其特征是,采用自动同步的方式,对导出的代码持续追踪,在设计层面上将仿真软件与实时仿真代码之间完成整个生命周期的同步化,仿真人员能够自由地在两种模式下切换,这点不同于现有仿真软件将代码导出后就不继续管理的方式。利用此特点,仿真人员能够对实时仿真代码进行持续的跟踪和调参。
[0029]本发明的有益效果:
[0030]软件仿真一般针对的是非实时仿真,实时仿真一般是需要专门的仿真机,以特定的实现语言(C++)的代码模型进行运行。软件仿真具有建模快速、用户无需掌握太多编程知识的特点。但是对于一些如串口通信等对于仿真实时性要求高的场合,非实时仿真往往达不到预期的控制效果;而现在实时仿真和非实时仿真之间缺少关联,很难利用非实时仿真去节省实时仿真的时间,或者说实时仿真的方案在非实时仿真的模型里也难以有反馈。而利用本发明,则可充分利用软件仿真的优势,将仿真软件应用到实时仿真领域中,能够缩短仿真模型设计周期、减少人为失误、减少重复工作量、降低对仿真人员编程知识的要求。
[0031]开发平台基于状态机和流程图构建组合和时序逻辑决策模型,以此进行仿真。从需求、原型设计、建模、模型细化、控制算法的开发和模型的离线测试调优,仿真人员在设计阶段将精力集中到模型本身,由系统去自动构建代码,可以极大地降低对仿真工程技术人员的编程门槛,并可以在编码、调试、测试和验证等开发阶段缩短工作周期,加速效率,并且提闻广品质量。

【专利附图】

【附图说明】
[0032]图1是代码导出顶层数据流图。
[0033]图2是代码导出流程图。
[0034]图3是代码同步流程图。
[0035]图4是代码生成流程图。

【具体实施方式】
[0036]图1描述了本发明的顶层数据流图,由图1可以看出本发明主要包括三个主要的部分,包括仿真模型构建、仿真模型导出和代码工程逆向,并且这三个部分通过模型文件和代码工程进行持久化和相互之间的交互。用户进行仿真描述模型设计,并且将仿真描述模型持久化到模型文件中;之后可以将仿真模型导出为实时仿真所需要的仿真代码;同时在导出的仿真代码中也可以进行修改,同时将在代码中的相关修改内容更新到仿真描述模型的模型文件中,从而实现同步。
[0037]图2为代码导出功能的流程图。用户首先进行建模设计和关联信息配置。接着用户进行仿真运行的配置,如仿真步长、仿真全局变量等。接下来进行预处理和模型校验,在预处理过程结束后可以进行非实时的仿真模拟,通过数据监控和数据分析,仿真人员可以对仿真结果进行初步的判断,检查是否达到自己的预期。如果与预期效果不符合,则可以继续调参,重新进行仿真模拟。如果达到预期效果,会对模型文件进行代码导出前的预处理,包括代码功能块的自动划分接着本发明就将模型文件导出为实时仿真所需要的仿真代码。
[0038]图3描述了模型文件和导出的实时仿真代码工程之间的同步流程。系统会将用户对于模型文件的修改存放在一个模型修改队列中。本发明会定期扫描这个队列,当发现队列非空的时候,本发明会提取出所有的修改,同时去扫描代码工程结构,加载每一个代码块,与模型的修改进行匹配。找到每一个修改地方对应的代码块进行替换,从而实现增量的导出。同样系统也会定期扫描仿真代码的每一个代码块里的内容,发现有修改之后,会将修改内容加载到软件模型中。接收这些修改内容,本发明找出对应的修改位置,进行替换,从而实现了仿真描述模型与仿真代码文件之间的同步。
[0039]下面为具体的实施方式:
[0040]仿真描述模型
[0041]我们的仿真描述模型以XML作为描述语言,方便进行扩展和阅读。最顶层的元素称为工程,工程之下的结构单元称为组件,每个组件描述一个结构单位,组件之下还有模块,模块是描述功能的最基本单位,一般用于具体描述某种算法。在工程、组件和模块之下都可以定义变量作为它们的数据。组件或者模块之间可以有关联关系;在关联关系上可以定义具体的关联数据。
[0042]通过这种方式,能够将模型语言的各个成分与建模软件的各个建模元素相对应,同时可以灵活的添加、删除属性;简单易读,对于仿真人员的计算机知识要求不高,比较容易看懂。
[0043]基于注释的代码结构划分方式
[0044]仿真代码同步会根据设计的模型生成仿真代码,从而应用于实时仿真系统中。用户在后续测试中可能会有需求对模型的参数、算法、结构进行修改,而这些修改有可能是通过模型修改然后重新导出的代码来进行;也可能是直接在仿真代码上操作。在实际操作中,往往在一次模型验证的过程中用户视具体情况两种方式均会采用,这就要求建立一套机制,能够统一这两种操作方式对代码产生的修改。即产生的仿真代码应该是这两种方式的合集,用户在仿真代码中的修改不会因为软件重新导出代码而被覆盖掉,并且代码中的修改也能反馈到仿真模型中,使仿真模型与代码始终保持同步。
[0045]为了实现这个功能,本发明使用注释来对模型代码进行结构划分。代码中往往包含两种注释:一种是具有明确格式的,比如javadoc的标签、TODO, FIXME等特殊字符标记,用于一些特殊作用,比如生成文档的注释、标记用户行为等,可以用一些具有固定格式的标记或者符号来区分它们;另一种即普通的注释,只包含注释和文本,在代码中会大量存在。本发明只关注前一种注释,通过定义一些固定格式的注释,将代码划分成不同的模块,区分哪些模块是需要每次在代码生成中进行更新的,哪些模块是一经生成就不会重新刷新,用户可以自由进行改动的。
[0046]代码与模型同步方式
[0047]组件输入变量定义的代码区间会分别使用INPUT_VARIABLES_BEGIN和INPUT_VARIABLES_END来进行标识,在这两个标识中间的部分进行组件的输入变量定义,每次重新导出代码都会刷新这片区域。同理,将需要系统反复导出的部分用特定的注释标识出来,在标识外的部分只会生成一次,用户可以随意修改,本发明不会进行覆盖;在标识内部的代码区域每次导出代码时都会被刷新。
[0048]代码逆向是指仿真描述模型与仿真底层代码之间的逆向。提供检索模型源码的功能,检索工具会检查代码里在上文提到的自定义注释标识的区域,提取这部分区域里的模型信息,比如用户定义的变量等,并整合到仿真描述模型中,同时更新模型文件,达成代码与软件模型的一致。
[0049]为了便于代码逆向功能的实现,需要对组件、模型的属性进行明确并分类管理。将模块的初始变量、输入变量、内部变量、输出变量、参数变量、模块内容通过前缀分开,并且由特定的注释进行区分,统一定义在某些注释所标识的范围内。进而在仿真描述模型与仿真代码之间实现一一对应关系。
[0050]实施例
[0051 ] 代码生成流程如图4所示。
[0052]用户可以使用仿真软件进行快速的原型搭建,通过对仿真描述模型上进行离线仿真,对模型的结构和参数进行调整。当模型比较成熟后可以生成仿真代码部署到仿真机或者其它实时仿真系统上。如图4所示,用户可以对代码生成功能进行一些必要的配置,如代码生成路径、是否覆盖现有工程等,接着根据仿真模型、载入模型参数等信息,通过代码转换器生成仿真代码文件。
[0053]生成的代码为了方便用户查看、编辑和管理,可以导出为一个VC工程。具体实现技术如下:
[0054]I)系统维护一个VC空白工程的模板,模板中一个完整VC工程的工程文件。
[0055]2)当系统导出一个新的模型时,使用空白工程模板,复制一份到新的工程下。
[0056]3)根据生成的代码重新编辑工程文件,主要是.dsp文件,从而形成新的工程文件;vc会通过这些工程文件去导入源码.
[0057]代码导出的相应文件夹包括:
[0058]I) InitData(用于存放初始数据的文件夹);
[0059]2) OutputData (用于存放模型运行的结果数据);
[0060]3) ModelClass (用于存放各组件的.h及.cpp文件);
[0061]4)初始化文件 ModelInitData.txt ;
[0062]5)MathModel_Interface 组件对应的代码文件;
[0063]6) CommonFunc 文件夹等。
[0064]其中CommonFun文件夹用于存放算法库中导出的代码,其中插值算法库导出为LookUpTable.h/.cpp ;积分算法库导出为StateVar.h/.cpp ;基础算法库对应生成GlobalFunct1n.h/.cpp ;坐标转换对应生成Tram_Coordinate.h/.cpp ;自定义算法库对应生成UserFunct1n.h/.cpp等文件(常用算法库文件)及常量变量配置ConstVarDefine.h文件。
[0065]ModelClass除了定义组件导出的代码文件,还还包括SharedMemory相关文件、PKUSimuProcess相关文件等。具体介绍如下:
[0066]组件定义
[0067]组件级的代码在仿真描述模型代码化过程中起到承上启下的作用,它是仿真模型工作的核心计算组成部分,也是各功能模块、算法模块的调用者。组件定义在ModelClass文件夹下,每个组件包含一个.h文件和一个.cpp文件;所有组件继承自MathModel类。基类MathModel包括以下五个特定成员函数:
[0068]I)初始化函数:Initial() ;//初始化模型内部成员变量、模型内所有模块初始化变量
[0069](PKU_INIT_C++支持的所有数据类型)及控制参数(PKU_PAPA_C++支持的所有数据类型);
[0070]2)输入函数:Input() ;//用于模型内所有模块输入变量的获取;
[0071]3)模型解算函数=MathModelCal O ;//根据信号流关系依次调用模型内所有弹上模拟对象功能单元级别的函数;
[0072]4)运行函数:Run() ;//完成时间控制、信号流操作及模型解算;
[0073]5)输出函数=OutputO ;//完成模型内所有模块输出变量的信号传递。
[0074]子类继承并实现MathModel里定义的这些方法,并且在子类中进行组件的输入参数和输出参数的定义。
[0075]>模块定义
[0076]模块在导出的代码中作为所属组件的一个内部方法,当组件要解算时在MathModelCal中分别调用各个子模块所对应的方法进行解算。
[0077]>全局变量和初始化变量
[0078]全局变量在一个单独的.h文件中定义,本文称为Define, h。如PI值、地球半径等。每个组件的初始化变量在组件的InitialO方法里进行赋值。
[0079]>参数定义和数据映射
[0080]整体将组件的参数定义为三种类型:输入、输出和初始化。将这些参数各自统一放在一个数组里进行管理,并且生成一个专门负责数据共享的类SharedMemory来对这些参数进行存取和管理。在这个类中定义三个数组,如下所示:
[0081]doubleSimu_FB_RTDataIn[500] -J/input data
[0082]doubleSimu_FB_RTDataInit[500] -J/initial data
[0083]doubleSimu_FB_RTDataOut[500] ;//output data
[0084]由名字可以看出它们分别是输入参数、初始化参数和输出参数的数组。其中输入与输出存储的是同一份数据。每一轮仿真过程中,组件从输入数组中获取需要的数据,然后把自己的输出参数存取到输出数组中,在这一轮仿真结束后,SharedMemory将输出数组中的数据复制到输入数组中。
[0085]组件中的参数和输入输出数组中所在的下标有一套特殊的映射规则,对于每个参数,都有一个特定的前缀,通过特定的前缀规则与组件和参数名称结合形成一个名称,这个名称会对应到SharedMemory中的一个枚举值,通过这个枚举值索引到这个参数在数组里对应到的下标。规则如下:
[0086]a)初始化参数:_所属组件名称_参数名称Init
[0087]b)输入或者输出参数:_所属组件名称_参数名称_
[0088]同时在SharedMemory里维护了两个枚举,如下所示:
[0089]

【权利要求】
1.一种基于注释的仿真代码同步生成方法,其特征是,利用代码工程作为软件仿真与实时仿真之间的通信方式;利用代码生成使仿真描述模型可以应用到实时仿真系统中,利用代码逆向使对于实时仿真系统中模型的修改调参可以反馈到仿真描述模型中,从而继续应用软件仿真;通过基于注释的方式组织代码工程,从而实现代码工程的增量修改、智能扫描和动态反馈。
2.一种基于注释的仿真代码同步生成方法,其特征是,包括以下步骤: 第I步:设计一个仿真描述模型; 第2步:将该仿真描述模型导出为底层仿真代码,以下简称仿真代码; 第3步:将导出的仿真代码放入实际仿真机中进行执行,并根据执行结果对仿真代码进行修改,然后将修改结果同步到仿真描述模型。
3.如权利要求2所述的仿真代码同步生成方法,其特征是,所述的仿真描述模型用XML进行描述。
4.如权利要求2所述的仿真代码同步生成方法,其特征是,第2步的实现方法为: 2.1)将仿真描述模型中的每个模块转换为一个底层仿真代码类; 2.2)模块中的变量定义转为类的变量定义,内部变量转为类的私有成员,对外变量转为类的公有成员; 2.3)模块间的值以公共数组方式存放;系统维护一个大的枚举类型列表,每个模块的每个变量根据特殊的构造规则可以与这个列表里的枚举项一一对应;而每个变量通过对应的枚举项的值即可以找到在公共数组里的位置,从而完成向数组中写入数据或者读取数据;模块的数据交互便是以此来实现; 2.4)仿真代码中的可变部分由注释标记对来标记。
5.如权利要求4所述的仿真代码同步生成方法,其特征是,步骤2.1中,所述的仿真代码类为C++类或Java类。
6.如权利要求4所述的仿真代码同步生成方法,其特征是,步骤2.4中,所述的可变部分包括初始变量、输入变量、内部变量、输出变量、参数变量、模块内容区域。
7.如权利要求2所述的仿真代码同步生成方法,其特征是,第3步的实现方法为,在加载所述的仿真代码后,执行: 3.1)根据注释标记对,分块读取仿真代码内容; 3.2)每种注释标记对表示一种类型的元素; 3.3)比对仿真描述模型与仿真代码中提取的信息,更新仿真描述模型。
8.如权利要求2所述的仿真代码同步生成方法,其特征是,利用基于组件的方式构建仿真描述模型,使用仿真软件的模型校验功能对设计的模型进行初步检查,排查在设计阶段可能的错误和一些变量映射等方面的错误;使用软件进行数据采集和数据分析,使用软件进行快速地仿真运行和初步调试。
9.如权利要求2所述的仿真代码同步生成方法,其特征是,采用自动同步的方式,对导出的代码持续追踪,在设计层面上将仿真软件与实时仿真代码之间完成整个生命周期的同步化,仿真人员能够对实时仿真代码进行持续的跟踪和调参。
【文档编号】G06F9/455GK104199664SQ201410445887
【公开日】2014年12月10日 申请日期:2014年9月3日 优先权日:2014年9月3日
【发明者】黄雨, 黄舒志, 张世琨 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1