翟永翠
(中国船舶重工集团公司江苏自动化研究所,江苏 连云港 222006)
目前,HLA 带给建模与仿真界的资源重用及仿真系统互操作的好处已成为现实,从基于资源重用的角度出发,如何将现有的仿真系统转换成HLA兼容的联邦成员,如何实现新开发的仿真系统联邦成员软件的快速开发及其重用,对于仿真系统的重用性具有重要意义。美国防部建模与仿真办公室(DMSO)总结了HLA开发的经验,并结合软件工程的要求,颁发了联邦开发与运行过程(FEDEP)规范。HLA联邦成员软件的开发需要通过调用RTI的编程接口(API)来完成,基于RTI API进行联邦成员软件的开发过程是一个繁琐、枯燥而且容易出错的过程,RTI虽然提供了HLA接口规范的所有功能,但是它把联邦成员状态管理的职责留给了开发者,也没有提供可以使联邦成员开发工作更容易完成的高层功能。这样,联邦中各联邦成员状态的管理中存在大量的通用功能都需要在各联邦成员的代码中重复实现,不仅浪费了大量的时间,还将导致系统移植性或互操作性的问题,对于错误的纠正也带来了困难;同时,大量的底层接口编程使联邦开发者不得不在与RTI功能相关的函数调用上花费精力,分散了本该集中到仿真功能实现上的精力。此外,程序的管理和维护也对用户提出了很高的要求。
解决以上问题的方法就是提供一种高层的集成开发环境(IDE),支持HLA兼容的联邦成员软件快速开发。目前已有的HLA联邦开发工具基本都是基于MFC框架结构的,并且固定了其结构和内部调用流程,如果使用这些工具必须要遵循他们的框架结构和规则,这将导致许多已经开发好的仿真应用必须重新开发。为了将那些已经存在的、可以重用的、适合作为联邦成员的仿真应用改造成为与HLA兼容的联邦成员,就必须对这些仿真应用的软件接口进行修改,通过RTI完成系统的集成和交互。
本文基于网络接口的HLA软件开发环境(HLAComGenCode),将那些已经存在的、可以重用的仿真应用改造成为与HLA兼容的联邦成员。为了方便系统中各台位代码的易于维护性,对整个联邦的Rti交互部分代码进行统一设计,由系统中各台位之间的接口文件,自动生成一个联邦的Fed文件和各联邦成员的Rti交互代码文件。
开展HLA软件环境的设计,必需先明确其目标和功能,设计联邦成员调度的通用框架,再针对此通用框架开展通用模块代码生成软件的设计。
HLA通用模块代码生成软件是针对目前所建立的一些仿真系统中采用HLA方式进行通信,由于系统总体详细设计中已经提供了系统中各台位之间的接口关系,为了方便系统中各台位代码的维护,从而使用HLAComGenCode来生成一个仿真测试系统的Fed文件和各个台位通信需要嵌入的HLA代码文件。
HLA通用模块代码生成软件应具有Fed文件自动生成功能、HLA通用模块源代码文件自动生成功能和系统联邦信息存储功能。
1)Fed文件自动生成功能
能根据系统定义的接口报文,自动生成系统构成的联邦运行过程中需要的Fed文件。
2)HLA通用模块源代码文件自动生成功能
该功能的主要任务是能够根据系统已经定义好的接口文件(包括文件名称、接口的结构定义、系统中各台位名称及各台位之间信息交互关系等),自动生成系统各个台位可以共同使用的通用通信模块,即各台位的开发者可以通过通用的接口调用规则就可以完成数据的收发。
3)系统设置信息存储功能
可以将用户通过界面设置的系统的基本信息保存在设置文件中,需要时可以打开原有的设置文件,对其进行编辑,重新生成系统的HLA通用模块代码。
为了实现联邦成员代码的通用化设计,必须设计一个通用的HLA联邦成员调度框架,来实现顶层应用与HLA代码之间的通信,设计的联邦成员通用框架如图1所示。
图1 HLA联邦成员通用框架的组成图
HLA联邦成员接口部分代码以构件形式开发,主要完成HLA体系结构下联邦中各联邦成员之间的数据接收、发送和时间推进等功能,实现从创建联邦、加入联邦、接收/发送数据、退出撤销联邦的全生命周期的联邦管理,主要由成员初始化、数据发送、数据接收、时间推进、成员结束组成,各构件的主要功能及接口形式如下。
1)成员初始化
创建RTI管理线程,在没有联邦存在前提下的,完成各联邦成员创建和加入联邦、初始化成员数据、成员数据公布和订购关系的建立、时间管理策略的设置。接口函数的调用形式为:
void HLAInit(int sendEquipment);
其中,sendEquipment为系统中的台位编号。
2)数据发送
根据数据的类型完成对已公布对象类和交互类数据的发送过程。接口函数的调用形式为:
void HLAUpdate(int MessageType, void *prt);
其中,MessageType为接收数据的类型,prt为接收到数据的内容。
3)数据接收
提供根据数据类型接收数据的回调函数,用户可以在其中接收已经订购的对象类和交互类数据的接口。接口函数的调用形式为:
extern void DoReceive(int MessageType, char*prt);
其中,MessageType为接收数据的类型,prt为接收到数据的内容。
4)时间推进
根据联邦成员的时间推进请求完成各联邦成员的仿真时间的协同推进,并保证正确地实现联邦成员间仿真时间的协调推进和数据交换。
void HLAAdvanceTime(double advTime);
其中,advTime为成员要推进到的仿真时间。
5)成员退出
完成联邦成员在仿真结束时退出和撤销联邦执行。
void HLAClose()。
HLA通用模块代码生成软件应由联邦信息管理、Fed文件生成、HLA代码生成、加载存储等几部分组成。其中,联邦信息管理主要是完成联邦、联邦成员的信息设置和管理,联邦信息包括系统的名称、系统中对象类/交互类信息,联邦成员信息包括联邦成员的名称、时间管理策略、时间步长、成员公布/订购关系,成员公布/订购关系完成每个成员公布对象类、交互类,订购对象类、交互类的设置。
Fed文件生成部分主要根据HLA1.3的联邦执行数据文件的结构、语法规则,将在联邦信息管理中用户设置的信息存储为Fed文件,包括:联邦名称、RTI版本号信息、对象类信息、交互类信息。
HLA代码生成部分主要完成获取联邦的设置信息,生成联邦成员接口文件,包括HLAMaro.h,HLACommLib.h, HLACommLib.cpp, RtiAmbManage.h,RtiAmbManage.cpp, RtiManageTread.cpp, RtiManage FederateAmbassador.h,RtiManageFederateAmbassador.cpp, DoReceive.cpp九个文件。其中,HLAMaro.h包含联邦中对象类、交互类的标识,每个对象类的属性个数、交互类的参数个数信息;HLACommLib.h 、HLACommLib.lib完成成员初始化、数据发送、数据接收、时间推进、成员结束的接口(2.2中介绍的五个顶层接口);RtiAmbManage.h、RtiAmbManage.cpp完成联邦成员调用Rti服务的定义,联邦成员初始化、创建和加入联邦、设置时间管理策略、设置公布和订购关系、注册对象实例、更新属性、发送交互、反射属性、发现对象实例、接收交互、时间推进、退出和撤销联邦(2.2中介绍的十二个底层接口);RtiManageTread.cpp完成RtiAmbManage提供的接口的调度;RtiManageFederateAmbassador.h、RtiManageFederateAmbassador.cpp定义回调函数的原型;DoReceive.cpp根据用户定义的接口文件,将用户接收的对象属性和交互参数发送给用户。因此,生成的文件中与用户直接交互的只有HLACommLib.h和DoReceive.cpp两个文件,其中,用户需要调用的接口在HLACommLib.h文件中定义,用户接收的信息在DoReceive.cpp文件中处理。此外,生成的代码也可以使用动态链接库的形式,即提供HLACommLib.h和HLACommLib.lib文件,用户需要重载DoReceive函数即可。
加载存储部分主要文件对用户设置的联邦信息进行有效性检测,并存储到用户指定位置,在以后系统运行时可以自动加载,存储的信息包括联邦设置信息和联邦成员设置信息。
1)联邦信息管理
开发用户输入系统信息的界面,完成联邦信息的设置和管理。用户在联邦信息设置中输入系统的名称、接口定义文件名称、接口类型定义文件名称、台位信息定义文件名称(这些文件可以不止一个,总数目<10),在对象类/交互类信息列表中输入对象类/交互类的结构名、结构内容、对应的报文类型定义,在台位信息设置中可以输入台位的名称、台位的时间策略、台位的推进时间步长、台位发送/接收的对象类/交互类名称,利用这些信息来生成系统的HLA通用模块需要的源文件,联邦信息设置和联邦成员公布订购信息设置的界面如图2、图3所示。
2)Fed文件生成实现
Fed文件生成主要是根据用户在上面设置的联邦信息,生成联邦交互过程中的执行数据文件,图4为用记事本打开的生成后的Fed文件。
图2 联邦信息设置界面
图3 联邦成员公布订购信息设置界面
图4 使用记事本打开的生成后fed文件
3)HLA代码生成实现
HLA代码生成部分主要代码如下:
4)加载存储实现
系统信息存储调用系统的CFileDialog的功能,将HLA联邦信息存储为*.hsf文件。其中存储的信息包括系统名称、接口文件名称、对象类公布订购设置信息、交互类公布订购设置信息、联邦成员设置信息,联邦成员设置信息包括每个成员名称、时间策略、时间步长和公布订购关系。
基于网络的HLA软件开发环境可有效解决仿真模型、仿真系统之间的互操作和可重用等问题,既可用其对已有开发的仿真软件和仿真系统进行HLA改造,也可用于对新的仿真系统的开发。使用HLA软件开发环境开发联邦成员软件,使得开发者不必要理解HLA/RTI的实现机制和API编程,就能够进行成员软件的开发,极大降低了联邦成员软件的开发难度,提高开发效率,使成员软件开发者把精力集中于仿真功能的开发和实现。使用该软件生成的HLA代码,在航空、航天、船舶、兵器及核工业等领域的仿真系统中得到了广泛的应用,如在多项水面、水下仿真系统和仿真测试系统研究与应用周,就采用了HLA和DIS两种体系结构。
本文在分析了HLA外联邦成员开发工具的基础上对HLA软件开发环境展开深入研究,提出了基于网络接口进行HLA改造的方法,并详细描述了联邦成员通用框架和HLA通用模块代码生成软件的设计,在此基础上介绍了软件实现的方法和部分代码,简要概括了该软件的应用情况。
目前,HLA正在向HLA evolve发展,其接口规范与现有的HLA1.3和HLA1516都有一定的修改,并且HLA evolve必将成为HLA未来的标准。因此,在HLA evolve的接口规范的标准公布后,本文介绍HLA软件开发环境也将根据其标准进行适应性修改,支持HLA evolve的标准。
[1]DMSO. High-Level Architecture Rules(Version 1.3)[S]. 5 February ,1998.
[2]DMSO. High-Level Architecture Interface Specification(Version 1.3)[S]. 2 April ,1998.
[3]周彦,戴剑伟. HLA仿真程序设计[M].北京:电子工业出版社,1993.
[4]冯润明. HLA联邦成员软件开发环境研究[J].系统仿真学报,2002,13(3):267-270.
[5]樊巍. 基于HLA/RTI盟员开发环境的研究[J].计算机仿真,2005,22(12):245-247.