郭翠珍, 郭 剑, 梁颖红,谭方勇
(1.苏州市职业大学 计算机工程系,江苏 苏州 215104; 2.国网电力科学研究院,江苏 南京 210016)
分布式飞行仿真系统是一个基于网络平台的虚拟环境系统,系统在运行阶段会产生大量的数据传输.这些数据包括控制台的控制指令发放、仿真节点模型计算数据、三维显示坐标、姿态指令等.基于反射内存网的分布式飞行仿真系统的设计,解决了传统的以太网通信的不足,大大地提高了网络传输的实时性[1].
反射内存网(reflective memory network)是一种基于高速网络的共享存储器技术的实时网络,它与传统的网络技术相比,除了具有严格的传输确定性和可预测性外,还具有速度高、通信协议简单、宿主机负载轻、软硬件平台适应性强、支持中断信号的传输等特点[2].反射内存网主要由反射内存卡通过光纤等传输介质连接而成.每个反射内存卡都有一段内存地址,目前流行的是64 M和128 M两种.网上的任何一台计算机向本地反射内存写数据时,该数据和相应的内存地址将在极短的时间内传播到网上所有的反射内存卡并存储在相同的偏移位置上,于是网络上的所有计算机都可以访问这个新数据.反射内存使用简单的读写方式,对于CPU来说就相当于标准的RAM,而且反射内存的数据更新是通过硬件操作实现的,其网络延迟仅仅是仿真节点数n和所用宽带比例B%的函数,有=f(n,B%),网络延迟大大减少,保证了实时性要求.
本系统采用VMIC公司的VMIPCI-5565系列实时网卡组建实时网络,使用的反射内存卡具有128 M内存.由于分布式飞行仿真系统的各个节点计算机之间含有大量的仿真数据传输,如何设计合理的通讯协议和有效地利用反射内存地址是系统设计成功与否的关键[3].
本文参考美国国家航海电子协会0183号协议(NMEA-0183协议)—设计仿真系统的通信协议,该通信协议是在为海用电子设备制定的0180号和0182号协议的基础上增加GPS数据内容而完成的.
本文设计的通信语句就是以NMEA-0183协议为蓝本,采用ASCII码字符串的形式,语句是以起始字符串“$START”开始和终止字符串“$END”结束,中间的数据以“,”分割.一条语句的长度不定,但长度有限不会超过某一数值.典型的一条通信语句如:$START,C1,C2,10,2000.0,0.4,$END,表示为总控计算机(C1)发送语句到飞机模型计算机(C2),10表示飞机的状态,2000.0表示飞机初始化高度,0.4表示马赫数.这样做的好处是每条语句都能表示实际的意义,无论是总控计算机监视网络数据传输还是节点解析数据,都可以根据事先预定的通信格式进行解析计算.再根据语句的长度峰值为每条语句分配一段内存,这样每条语句在整个内存中的位置就是固定的,仿真节点只要定时读取目标内存中的语句就可以进行数据传输了.
系统使用的网卡内存有128 M,内存地址从0X0000000到0X07FFFFFF.实际计算表明,每条通信语句的长度不会超过1 024 B,系统总共有50条通信语句,如果为每一条语句分配1 024 B,也就是1 kB的内存空间,才能使用50 kB的内存.板卡内存绰绰有余.实际运用中,是对每个节点进行内存分配的.根据节点通信量的大小,为节点分配1~2 M的内存空间,这样便于以后进行扩展.在内存的最后1 M空间中,为每条语句分配了一个读写标志位.系统实际运行表明,这样的分配无论是数据传输还是增加语句都是很有利的.
由于系统的仿真命令有时需要连续发送,为了避免数据重叠,所以必须确认接收方已经成功读取数据才能进行下一步发送.根据这种情况,本文为每条语句定义一个标志位(1个字节),发送方写入数据前查询当前语句的标志位的状态是否可写,如果可写就将语句写入到内存中,并置标志位为可读;如果不可写,则放弃,等待下一次发送.接收方采用查询方式,读取数据前查询当前语句的标志位的状态是否可读,如果可读就将内存中的语句读取出来,并置标志位为可写;如果不可读,则放弃,等待下一次接收.通信流程如图1所示.
基于反射内存网的通信模块是系统的重要组成部分,负责整个网络中的数据接收和发送工作.在实际的应用程序中只需要加入几条简单的语句,就可以直接访问反射内存卡上的内存.当应用程序打开反射内存卡后,程序会映射反射内存卡上的内存空间到应用程序的虚拟内存空间,应用程序处理反射内存卡上的内存就像是处理普通内存一样.
图1 通信流程图
本文设计一个通用的反射内存卡读写类CRFM2g,负责对反射内存卡进行读写操作.在类的头文件中需要包含反射内存卡的API函数头文件,并要引入库文件.程序首先使用API函数RFM2gOpen打开反射内存卡,打开成功后使用函数RFM2gRead,RFM2gWrite进行读写,读写完毕后调用函数RFM2gClose关闭板卡,释放资源.
程序的运行平台是Windows XP,开发环境是Visual C++ 6.0.
根据本文提出的方案,将反射内存网技术应用到实际的飞行仿真系统中,取得了很好的效果.经检验,系统连续运行时间为10 h以上,节点通信情况依然保持在顺畅运行的状态,达到了设计需求.根据仿真任务,演示了飞机从起飞到着陆的全过程.
整个仿真包括起飞、爬升、平飞、盘旋、大攻角机动、下滑、着陆等过程.控制台计算机完整地记录了本次仿真过程,并将数据发送到数据库存储计算机,以备复现仿真过程,检查存在的问题便于后续改进.仿真结果如图2所示.Ⅰ区表示滑跑起飞阶段;Ⅱ区表示爬升到3 km后,有一段超调,配平到3 km平飞,准备机动;Ⅲ区是机动阶段,进行盘旋和大攻角机动;Ⅳ区表示快速爬升到12 km;Ⅴ区开始调整高度;Ⅵ区表示快速下滑到3 km,并调整高度;Ⅶ区表示寻找机场,预备降落;Ⅷ区是从3 km开始自动降落,直到停在机场上.仿真结果表明,各项指标均达到了要求.
图2 高度随时间变化仿真图
基于反射内存网的分布式飞行仿真系统的设计,解决了传统的以太网通信的不足,大大地提高了网络传输的实时性.本文设计的通信协议简洁明了,易于编程实现,同时具有较好的扩展性.实际运用表明,反射内存网的诸多特点使其成为组建实时网络的理想通信手段,非常适合建立对实时性要求较高的分布式飞行仿真系统.
[1] 郭翠珍,郭剑,谭方勇. 反射内存网在分布式飞行仿真中的应用[J]. 电脑与电信,2010(11):67-69.
[2] 刘志国,王仕成. 基于实时网络的激光制导武器半实物仿真系统设计[J]. 计算机仿真,2003,20(5):20-21.
[3] 顾颖彦. 反射内存网实时通信技术的研究[J]. 计算机工程,2002,28(7):143-144.