RTI
2011-01-09 16:54:00 chenke1988 阅读数 552

RTI,是ORG时钟和复位发生模块中的一个功能,一般用它来3秒后启动车子。

初始化它,需要两个寄存器:CRGINT和RTICTL。

CRGINT的第8位:RTIE是RTI的中断使能位,为1使能。


下面来重点说说:而RTICTL的设置。


它的第8位:RTR[8],没用,不管。

6到4位:RTR[6:4],预分频选择位。

3到0位:RTR[3:0],分频系数选择位。

另外,它的分频时钟是外部时钟频率,XS128是16M,与使用PLL与否无关。

公式:T=(RTR[3:0]+1)*2E(RTR[6:4]+9)/osc clock

void RTI_int()

{

RTICTL=0x77;//(7+1)*2E(7+9)/16=32.75ms

CRGINT=0x80;//RTI使能

}

////////////////////////////////////

void interrupt 7 RTI_ISR(void)

{

 CRGFLG|=0x80;//Write 1 to clear RTIF bit

m++;

if(m>=60)

{

  start=1;

  CRGINT=0x00;

}

 

}

 

2017-07-09 21:23:05 dedje 阅读数 3698

本文主要讲解初学者在linux使用rti connext dds运行hello world程序的步骤。

1.    设置环境变量

在/etc/profile最下面添加:

export PATH=”$PATH:/opt/rti_connext_dds-5.2.3/bin”

命令行:vim .bashrc

添加NDDSHOME路径:

set NDDSHOME

export NDDSHOME=/opt/rti_connext_dds-5.2.3


2.    在例子目录下,查看第一步是否设置成功:


3. gmake


4.  重新打开一个终端,运行HelloSubscriber


5.    重新打开一个终端,运行HelloPublisher


6.    运行结果

 

 


2019-03-03 14:12:30 AdokenTorothy 阅读数 342

实时中断并不复杂,简单地说,就是一个定时模块,定时溢出,产生中断。功能跟
PIT差不多,都能用于定时。 对于PIT 时钟电路每固定一段时间都必须更新一次时间信息,这个更新的责任就落到了MCU身上。对于那种比较繁重的系统而言,“进行一次更新”会耗费许多的资源。而RTI只专注于记时工作,使MCU可以空出来处理其它的工作。外部晶振时钟可以直接“驱动”RTI。
RTI定时不会很准,因为它没有经过复杂的时钟处理,经过配置之后,可以变为a2^b
倍数,因为a
2^b不能是任意数整数,不能配成你想要的任何频率,所以说RTI定时不会很准,不过它用起来还是很灵活、方便的。

本例通过用MC9S12XS128MAA来做一个实时中断。
以下为本例所用到的寄存器的介绍:

RTICTL寄存器

在这里插入图片描述
RTDEC(十进制或二进制分频器选择位) = 1 时,为十进制分频器
= 0 时,为二进制分频器

RTR[6:0]为有效分频因子,RTR[3:0]为低4位m ,RTR[6:4]为高3位n,RTI的参考时钟是外部晶振的时钟OSCCLK,即外部物理晶振提供的时钟
当RTDEC=0时,分频系数=(m+1)*2^(n+9)
当RTDEC=1时,分频系数=(m+1)*RTR[6:4]下表对应值
在这里插入图片描述
RTR[6:4]=000时RTI实时中断被禁止,只要当RTR[6:4] 不全为0时,实时中断就开启

CRGINT寄存器
在这里插入图片描述
RTIE = 1 时,实时中断开启
= 0 时,实时中断禁止

LOCKIE = 1 时,LOCKIF置位就会引起中断请求
= 0 时,LOCK中断请求无效

SCMIE = 1 时,SCMIF置位就会引起中断请求
= 0 时,SCM中断请求无效

CRGFLG寄存器
在这里插入图片描述
RTIF = 1 时,产生RTI中断
= 0 时,未发生RTI中断

PORF = 1 时,上电复位中断
= 0 时未产生上电复位中断

LVRF = 1 时,低压复位中断
= 0 时,未发生低压复位中断

LOCKIF = 1 时,LOCK位状态改变
= 0 时,LOCK位没有改变

LOCK = 1 时,VCOCLK在目标频率误差允许范围内
= 0 时,VCOCLK不在目标频率误差允许范围内

ILAF = 1 时,非法地址重置
= 0 时,未发生非法地址重置

SCMIF = 1 时,SCM位状态改变
= 0 时,SCM位没有改变

SCM = 1 时,MCU在自时钟模式下工作,OSCCLK处于未知状态,所有时钟都是由PLLCLK产生的
= 0 时,MCU正常工作,OSCCLK可用

实时中断设置步骤:
1.设置TRICTL里面设置多少个时钟脉冲中断一次
2.CRGINT里使能RTI中断
3.写中断函数interrupt 7 void rti(void)
{
//这里写中断需要执行的程序
CRGFLG_RTIF=1;//中断标志清零
}

以下是实现RTI中断的完整代码:

#include <hidef.h>            
#include "derivative.h"      
#define LED PORTB_PB0      //定义连接发光二级管的PORTB_PB0口数据寄存
                           //器为LED,写'0'亮,写'1' 灭

#define LED_dir DDRB_DDRB0  //定义连接发光二级管的PORTB_PB0口方向寄存器
                            //为LED_dir,写'0'做输入口,写'1'做输出口

unsigned char times = 0;   //定义定时中间变量


void INIT_RTI(void)    //初始化RTI
{
  CRGINT = 0x80;       // RTIE=1 使能实时中断
                     
  RTICTL = 0x6f;       //设置RTICTL为 0110 1111 溢出周期为 (15+1)*2^(6+9)/(16M)= 16*2^15/(16M)
                       //16M是外部晶振的频率,实时中断以外部晶振时钟为参考时钟
                       //设置实时中断的时间间隔为32.768ms     
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED   //中断函数置于非分页区内

interrupt VectorNumber_Vrti void a(void)     //实时中断函数
{
  if(CRGFLG_RTIF == 1)      //CRGFLG_RTIF实时中断的标志位
    CRGFLG_RTIF = 1;        //向CRGFLG_RTIF 写1,可以清零标志位
  times += 1;              //定时中间变量自加
  if(times == 15)          //定时中间变量等于15时,即定时等于15* 32.768ms=492ms时执行下面程序
  {
    times = 0;             //定时中间变量清零
    LED = ~LED;             //指示灯翻转一次,现象闪烁
  }
}

#pragma CODE_SEG DEFAULT   //后续代码置于默认区域内  



void main(void) {
  DisableInterrupts;   //禁止所有中断打开
  INIT_RTI();          //实时中断模块初始化
  LED_dir = 1;         //设置连接发光二级管的PORTK_PB0口为输出口
  LED = 0;             //初始化发光二极管为亮
  EnableInterrupts;    //开启所有中断打开

  for(;;) {}           //主函数空循环时单片机处于执行状态,程序在rti中断函数中执行
}

将中断里写入LED取反,可以直观的看到RTI中断的效果,可以修改 if(times == 15) 此行代码,如if(times == 30),可以发现指示灯大约1s闪烁一次

2019-03-05 19:57:20 zouxin_88 阅读数 221

1.A电脑(192.168.8.33)
  运行CentralServer.exe


2.B电脑(192.168.8.25)
(1)运行RTIConsole.exe,【配置】【普通配置】,设置【中心服务器IP】为192.168.8.33,保存后关闭程序。


(2)运行rtiexec.exe


(3)编译BH RTI 2.3\demo\Simple工程,如提示缺少MS**.dll文件,将VC6.0下的DLL文件(VC6.0\pvc6\VC98\DEBUG)复制EXE目录下。


(4)运行simpled.exe即可。

最终效果:

2019-06-02 11:30:07 sillysunny 阅读数 295

       基于当前的RTI构建1000个以上成员的仿真系统在一些人看来似乎是极具挑战性的一个问题。如果你对当前的计算机技术、网络技术、仿真技术真正了解的话,其实构建这样的一个大规模仿真系统是完全可行的。本章以聊天程序为例,介绍了基于KY-RTI构建1000个仿真成员的两种方法:基于单个RTI服务器的大联邦;基于桥接程序实现多个RTI服务器的大联邦。从HLA的概念来讲,每个RTI服务器及其所有仿真成员可以称之为一个联邦,联邦之间不会发生数据通信;然而,本章的桥接程序能够实现多个RTI服务器之间的数据通信,也可以理解为多个联邦之间的数据通信;从而为大规模仿真提供了强有力支持。本章最后部分介绍了KY-RTI的桥接程序加入两个RTI服务器并将从一个RTI服务器接收到的数据转发到另外一个RTI服务器的源代码实现方法。另外,本章还简单探讨了以KY-RTI为代表的国产自主软件和DDS的个人看法。

11.1基于单个RTI服务器的大联邦

       单个RTI服务器能否支持1000个成员的仿真系统,这一点与RTI本身的实现技术、仿真精度、仿真步长、网络延时、网络带宽等密切相关。通常,一般的RTI都无法做到这一点。下面是1000个仿真成员基于银河麒麟操作系统加入KY-RTI的示意图。上图是1000个仿真成员加入之前RTI服务器的状态;下图是1000个仿真成员加入RTI服务器之后的状态。从这一点也可以看出KY-RTI的大规模仿真支持能力。

 

                                                图11.1 1000个仿真成员加入单个RTI服务器

       通过单个RTI服务器实现1000个成员的仿真系统,与多个RTI服务器相比似乎具有一定的“瓶颈”特征,即数据集中于单个服务器不如分散于多个服务器。其实,随着网络技术的发展,特别是万兆以太网、5G技术的发展,网络延时大幅降低、网络带宽大幅提高,有些以前不可能实现的技术会成为可能;甚至具有同样计算能力的超级计算机的规模也会因此变小。

11.2基于桥接程序的多个RTI服务器的大联邦

       KY-RTI除了单个RTI服务器支持1000个仿真成员外,也可以基于桥接程序把多个RTI服务器连接起来,从而实现更大规模的仿真系统。该方法特别适合于集群系统和部署于多个仿真应用机构的大规模仿真系统。

       图11.2是基于银河麒麟操作系统进行的两个RTI服务器之间互操作演示示例,图11.3是相应的逻辑结构图。该例涉及到两个RTI服务器(RTI1和RTI2)和3个仿真成员(chat1、bridge、chat2)。两个RTI服务器RTI1、RTI2使用的端口号分别是10000和20000。

       仿真成员chat1和bridge加入到RTI1;仿真成员chat2和bridge加入到RTI2。这3个仿真成员可以实现相互之间的聊天功能。从图11.2可以看到,当chat1说“I’m chat1”,bridge说“I’m bridge”,chat2说“I’m chat2”时,其他两个仿真成员都能够收到该仿真成员的聊天内容。

       在这样的仿真系统中,桥接成员bridge起到了关键的作用,它可以把原本相互隔离的两个RTI服务器连接起来,共同实现更大规模的仿真。

                                                 图11.2 一个桥接程序加入两个RTI服务器的示例

 

                  

                                                 图11.3 一个桥接程序加入两个RTI服务器的逻辑结构图

       按照HLA的概念,每个RTI服务器及其仿真成员可以称之为一个联邦;两个RTI服务器涉及到两个联邦;联邦之间一般是不会通信的。因此,上图所示的联邦之间的通信不仅需要bridge支持,RTI本身也需要进行修改才能够实现。一般的RTI不会支持多联邦通信,除非你对其进行适当的改造。

       在理解了前面两个图之后,使用桥接程序可以将多个RTI服务器以各种各样的方法进行互联,实现更大规模的仿真。

       图11.4是图11.3的另外一种表示形式,一个桥接成员连接了两个RTI服务器,每个RTI服务器拥有1个仿真成员和1个桥接成员。桥接成员其实也是1个仿真成员,只是它的作用与一般的仿真成员不同,这里暂时把它们区分开吧。

                       

                                                  图11.4 图11.3的另外一种表示形式

       在图11.5中,每个RTI服务器拥有32个仿真成员和1个桥接成员。

                   

                                                  图11.5 2个RTI服务器各自拥有32个仿真成员和1个桥接成员

       图11.6是图11.5的简化形式。

                                 

                                                  图11.6 图11.5的简化形式

       图11.7是3个RTI服务器通过桥接程序互联的情形。

                              

                                                  图11.7 3个RTI服务器

       图11.8是1个大联邦,中心是1个RTI服务器,它拥有32个桥接成员,每个桥接成员连接到另外一个RTI服务器;每个这样的RTI服务器除桥接成员外,含有32个仿真成员。这样,如果忽略桥接成员,整个系统共有32*32=1024个仿真成员。

       由1000个以上仿真成员构成的大联邦可以采用各种各样的结构,图11.8只是其中的一种形式。可以采用层次式结构、网状结构、条状结构等。

       图11.8适合集群部署方式,可以采用33个节点,每个节点部署1个RTI服务器。其中,一个节点部署32个桥接成员;其他节点各部署32个仿真成员和1个桥接成员。该图也适合大规模分布式仿真,可以部署于互联网上的多个地点。

     
           

                                                  图11.8 由1024个仿真成员构成的大联邦

11.3关于软件和DDS

       在本文结束之前,就KY-RTI软件和DDS说点儿看法。

       (1)可执行码。正如麒麟、中标、深度等国产操作系统一样,可执行码可以免费提供给大家使用;但不会得到更多的技术支持,并且可能存在部分限制;以麒麟操作系统为例,图11.2中的“[Unauthorized System]”表明这并不是一个得到了技术支持的操作系统,然而通常并不影响用户使用。国产操作系统在推广使用的过程中,得到了国内很多有实力单位的大力支持,包括项目和资金的支持,正是有了你们的支持,以国产操作系统为代表的自主软件才能够更好地发展,这对于研制和使用双方而言是共赢的。

       (2)源代码。源代码不免费提供,需要者请联系作者(walt_lbq@163.com)。对于用户而言,即使获得了国产自主软件的源码,但没有技术支持,你会很难理解并做出本文所说的这么多事情。随着技术的进步,RTI的设计方法和性能都会得到进一步的发展和提高;除了把KY-RTI换个名外,你真的知道怎么做吗? 如果针对你的仿真系统做进一步的功能扩展,或者裁剪RTI功能,你能顺利做到吗?

       (3)DDS(Data Distribution Service,数据分发服务)。DDS定义了一套用于分布式程序基于主题的发布订阅机制,相当于HLA中的公布订购机制。从仿真应用程序接口API角度来看,DDS仅相当于实现了HLA的部分功能;并且需要用户定义自己的API,这样就会导致不同的仿真系统难以集成到一起的问题;而这正是为什么要提出HLA标准的重要原因。当前,国内部分仿真系统采用DDS来取代RTI的实现方法,RTI似乎落后了;其实,DDS从提出到第1个软件实现,比HLA标准的提出还要早好几年,如果DDS能够取代RTI,那么提出HLA的那些DMSO仿真专家难道是一堆傻瓜吗?有人说,DDS似乎在QoS(Quality of Service服务质量)和实时性方面更胜一筹;实际上,这是软件层面的事情,能不能做到这两点,与具体的实现软件有关系,与一个标准有多大关系呢?如果你觉得DDS不错,你可以把它用在RTI的底层;或者在RTI的底层采用DDS软件的一些实现方法。HLA基于已经设定的API实现程序之间的互操作,能够很好地支持仿真应用程序的互联互通;这一点是DDS所不具备的。

11.4桥接程序的源代码实现方法

       大家应该对桥接程序的源代码实现方法比较好奇吧,相信绝大多数人都没有见过。该程序其实非常简单,熟悉HLA/RTI编程的用户一看就懂。本节的桥接程序对应图11.2中的桥接成员,采用GNU C++实现,当然也可以采用其他程序设计语言实现。一个桥接成员可以加入到两个RTI服务器,而这两个RTI服务器可能运行于不同地点的不同操作系统主机上;譬如一个是北京的Windows机器,一个是长沙的银河麒麟机器。

       桥接程序包含3个.cpp文件:Chat.cpp、HwFederateAmbassador1.cpp和HwFederateAmbassador2.cpp。

       (1)Chat.cpp负责在两个RTI服务器上创建联邦、加入联邦、公布和订购数据、像一般仿真成员一样发送数据;仿真完成时退出联邦。

       (2)HwFederateAmbassador1.cpp负责从RTI1服务器接收数据,并将其转发到RTI2服务器。

       (3)HwFederateAmbassador2.cpp负责从RTI2服务器接收数据,并将其转发到RTI1服务器。

                                                           表11.1  大联邦聊天示例:chat.cpp

  1. #include "HwFederateAmbassador1.hh"
  2. #include "HwFederateAmbassador2.hh"
  3.  
  4. #include <RTI.hh>
  5. #include <fedtime.hh>
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. RTI::InteractionClassHandle     hChatClass_1;  
  10. RTI::ParameterHandle             hChatName_1;
  11. RTI::ParameterHandle             hChatSentence_1;
  12.  
  13. RTI::InteractionClassHandle     hChatClass_2;  
  14. RTI::ParameterHandle             hChatName_2;
  15. RTI::ParameterHandle             hChatSentence_2;
  16.  
  17. RTI::RTIambassador       rti1;     
  18. RTI::RTIambassador       rti2;     
  19.  
  20. int hw_main(int argc, char *argv[])
  21. {
  22.     const char *federationExecutionName1 = "chat";
  23.     const char *federationExecutionName2 = "chat";
  24.     const char *FEDfile = "chat.fed";
  25.  
  26.     char federateName[50];
  27.     cout << "Please input your name: ";
  28.     cin >> federateName;
  29.  
  30.     try
  31.     {
  32.         HwFederateAmbassador1    fedAmb1;
  33.         HwFederateAmbassador2    fedAmb2;
  34.  
  35.         RTI::FederateHandle      federateId1;
  36.         RTI::FederateHandle      federateId2;
  37.  
  38.         try
  39.         {
  40.             //若不带IP地址和端口号则从RTI.rid中读取: rti1.createFederationExecution(federationExecutionName, FEDfile);
  41.             //IP地址和端口号由用户自己设置, 用户可以从自己的配置文件或图形窗口中获取.
  42.             rti1.createFederationExecution(federationExecutionName1, FEDfile, "127.0.0.1", "10000");
  43.  
  44.             //2条创建联邦语句不要写在一起.
  45.             //rti2.createFederationExecution(federationExecutionName2, FEDfile, "127.0.0.1", "20000");
  46.         }
  47.         catch ( RTI::Exception& e )
  48.         {
  49.         }
  50.  
  51.         try
  52.         {
  53.             //IP地址和端口号由用户自己设置, 用户可以从自己的配置文件或图形窗口中获取.
  54.             rti2.createFederationExecution(federationExecutionName2, FEDfile, "127.0.0.1", "20000");
  55.         }
  56.         catch ( RTI::Exception& e )
  57.         {
  58.         }
  59.  
  60.         try
  61.         {
  62.             federateId1 = rti1.joinFederationExecution(federateName, federationExecutionName1, &fedAmb1);
  63.             federateId2 = rti2.joinFederationExecution(federateName, federationExecutionName2, &fedAmb2);
  64.         }
  65.         catch ( RTI::Exception& e )
  66.         {
  67.             cerr << "FED_HW: ERROR:" << e << endl;
  68.             return -1;
  69.         }
  70.  
  71.         ///////////////////////////////////////////////////////////////
  72.  
  73.         hChatClass_1 = rti1.getInteractionClassHandle("chat");
  74.         hChatName_1 = rti1.getParameterHandle("name", hChatClass_1);   
  75.         hChatSentence_1 = rti1.getParameterHandle("sentence", hChatClass_1);
  76.  
  77.         hChatClass_2 = rti1.getInteractionClassHandle("chat");
  78.         hChatName_2 = rti1.getParameterHandle("name", hChatClass_2);   
  79.         hChatSentence_2 = rti1.getParameterHandle("sentence", hChatClass_2);
  80.  
  81.         //如果向外发送,则需要公布
  82.         rti1.publishInteractionClass(hChatClass_1);
  83.         rti2.publishInteractionClass(hChatClass_2);
  84.         //如果需要接收,则必须订购
  85.         rti1.subscribeInteractionClass(hChatClass_1);
  86.         rti2.subscribeInteractionClass(hChatClass_2);
  87.  
  88.         string szSentence;
  89.         cin.ignore();
  90.         while (0 != strcmp(szSentence.c_str(), "exit"))
  91.         {
  92.             cout << "Please input a sentence: ";
  93.             getline(cin, szSentence);
  94.             try {
  95.                 RTI::ParameterHandleValuePairSet* pParams = NULL;
  96.                 long numParams(2);
  97.                 pParams = RTI::ParameterSetFactory::create (numParams);
  98.  
  99.                 pParams->add(hChatName_1,(char*)federateName, strlen(federateName)+1);
  100.             pParams->add(hChatSentence_1,(char*)szSentence.c_str(), szSentence.size());
  101.             rti1.sendInteraction(hChatClass_1, *pParams, "");
  102.             pParams->empty();
  103.             delete pParams;
  104.  
  105.             pParams = RTI::ParameterSetFactory::create (numParams);
  106.             pParams->add(hChatName_2,(char*)federateName, strlen(federateName)+1);
  107.             pParams->add(hChatSentence_2,(char*)szSentence.c_str(), szSentence.size());
  108.             rti2.sendInteraction(hChatClass_2, *pParams, "");
  109.  
  110.             pParams->empty();
  111.             delete pParams;
  112.         }
  113.         catch(...)
  114.         {
  115.             cerr << "Error: send interaction" << endl;
  116.         }
  117.     }
  118.  
  119.     try
  120.     {
  121.             rti1.resignFederationExecution( RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  122.             rti2.resignFederationExecution( RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  123.  
  124.             rti1.destroyFederationExecution( federationExecutionName1 );
  125.             rti2.destroyFederationExecution( federationExecutionName2 );
  126.     }
  127.     catch ( RTI::Exception& e )
  128.     {
  129.         cerr << "FED_HW: ERROR:" << e << endl;
  130.         return -1;
  131.     }
  132. }
  133. catch ( RTI::Exception& e )
  134. {
  135.     cerr << "FED_HW: ERROR:" << e << endl;
  136.     return -1;
  137. }
  138.  
  139. return 0;
  140. }
  141.  
  142. int
  143. main(int argc, char** argv)
  144. {
  145.     return hw_main(argc, argv);
  146. }

 

                                              表11.2  大联邦聊天示例:HwFederateAmbassador1.cpp

 

  1. #include "fedtime.hh"
  2. #include "HwFederateAmbassador1.hh"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. extern RTI::InteractionClassHandle  hChatClass_1;
  7. extern RTI::ParameterHandle            hChatName_1;
  8. extern RTI::ParameterHandle            hChatSentence_1;
  9.  
  10. extern RTI::RTIambassador              rti2;
  11.  
  12. void HwFederateAmbassador1::receiveInteraction (
  13.         RTI::InteractionClassHandle       theInteraction,                     // supplied C1
  14.         const RTI::ParameterHandleValuePairSet& theParameters, // supplied C4
  15.         const RTI::FedTime&                   theTime,                               // supplied C4
  16.         const char                                       *theTag,                               // supplied C4
  17.         RTI::EventRetractionHandle       theHandle)                         // supplied C1
  18. throw (
  19.   RTI::InteractionClassNotKnown,
  20.   RTI::InteractionParameterNotKnown,
  21.   RTI::InvalidFederationTime,
  22.   RTI::FederateInternalError)
  23. {
  24.    //call the next service.
  25.    this->receiveInteraction( theInteraction, theParameters, theTag );
  26. }
  27.  
  28. void HwFederateAmbassador1::receiveInteraction (
  29.         RTI::InteractionClassHandle       theInteraction,                         // supplied C1
  30.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  31.         const char                                       *theTag)                                   // supplied C4
  32. throw (
  33.   RTI::InteractionClassNotKnown,
  34.   RTI::InteractionParameterNotKnown,
  35.   RTI::FederateInternalError)
  36. {
  37.    RTI::ParameterHandle paraHandle;
  38.    RTI::ULong           valueLength;
  39.  
  40.    //Usage of char[] and string
  41.    char name[256];   //name of sender
  42.    string sentence;  //sentence of sender
  43.  
  44.    if(theInteraction == hChatClass_1) {
  45.      for ( int i = 0; i < theParameters.size(); i++ )
  46.      {
  47.         paraHandle = theParameters.getHandle( i );
  48.  
  49.         if(paraHandle == hChatName_1) {
  50.           theParameters.getValue(i, (char*)name, valueLength);
  51.  
  52.           /*If name is a double number, you can do this way.
  53.           double name;
  54.           theParameters.getValue(i, (char*)&name, valueLength);
  55.           */
  56.  
  57.         }else if(paraHandle == hChatSentence_1) {
  58.           sentence.resize(theParameters.getValueLength(i));
  59.           theParameters.getValue(i, (char*)sentence.c_str(), valueLength);
  60.  
  61.         }else{
  62.       cout << "Federation1: Receive wrong parameter handle." << endl;
  63.         }
  64.      }
  65.  
  66.      cout << endl << "Federation1: " << name << ": " << sentence << endl;
  67.  
  68.      //转发到rti2
  69.      rti2.sendInteraction(theInteraction, theParameters, theTag);
  70.   }
  71. }

 

                                               表11.3  大联邦聊天示例:HwFederateAmbassador2.cpp

  1. #include "fedtime.hh"
  2. #include "HwFederateAmbassador2.hh"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. extern RTI::InteractionClassHandle   hChatClass_2;
  7. extern RTI::ParameterHandle             hChatName_2;
  8. extern RTI::ParameterHandle             hChatSentence_2;
  9.  
  10. extern RTI::RTIambassador                rti1;
  11.  
  12. void HwFederateAmbassador2::receiveInteraction (
  13.         RTI::InteractionClassHandle       theInteraction,                      // supplied C1
  14.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  15.         const RTI::FedTime&                   theTime,                                // supplied C4
  16.         const char                                       *theTag,                                // supplied C4
  17.         RTI::EventRetractionHandle       theHandle)                          // supplied C1
  18. throw (
  19.   RTI::InteractionClassNotKnown,
  20.   RTI::InteractionParameterNotKnown,
  21.   RTI::InvalidFederationTime,
  22.   RTI::FederateInternalError)
  23. {
  24.    //call the next service.
  25.    this->receiveInteraction( theInteraction, theParameters, theTag );
  26. }
  27.  
  28. void HwFederateAmbassador2::receiveInteraction (
  29.         RTI::InteractionClassHandle       theInteraction,                         // supplied C1
  30.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  31.         const char                                       *theTag)                                   // supplied C4
  32. throw (
  33.   RTI::InteractionClassNotKnown,
  34.   RTI::InteractionParameterNotKnown,
  35.   RTI::FederateInternalError)
  36. {
  37.    RTI::ParameterHandle paraHandle;
  38.    RTI::ULong           valueLength;
  39.  
  40.    //Usage of char[] and string
  41.    char name[256];   //name of sender
  42.    string sentence;  //sentence of sender
  43.  
  44.    if(theInteraction == hChatClass_2) {
  45.      for ( int i = 0; i < theParameters.size(); i++ )
  46.      {
  47.         paraHandle = theParameters.getHandle( i );
  48.  
  49.         if(paraHandle == hChatName_2) {
  50.           theParameters.getValue(i, (char*)name, valueLength);
  51.  
  52.       /*If name is a double number, you can do this way.
  53.           double name;
  54.           theParameters.getValue(i, (char*)&name, valueLength);
  55.       */
  56.  
  57.         }else if(paraHandle == hChatSentence_2) {
  58.           sentence.resize(theParameters.getValueLength(i));
  59.           theParameters.getValue(i, (char*)sentence.c_str(), valueLength);
  60.  
  61.         }else{
  62.       cout << "Federation2: Receive wrong parameter handle." << endl;
  63.         }
  64.      }
  65.  
  66.      cout << endl << "Federation2: " << name << ": " << sentence << endl;
  67.  
  68.      //转发到rti1
  69.      rti1.sendInteraction(theInteraction, theParameters, theTag);
  70.   }
  71. }

 

麒麟RTI软件KY-RTI的Linux、Windows版本和源码请联系作者:walt_lbq@163.com

 

麒麟KY-RTI分布仿真技术:前 言

麒麟KY-RTI分布仿真技术:第一章 简介

麒麟KY-RTI分布仿真技术:第二章 系统安装

麒麟KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

麒麟KY-RTI分布仿真技术:第四章 C++程序设计

麒麟KY-RTI分布仿真技术:第五章 Qt程序设计

麒麟KY-RTI分布仿真技术:第六章 Java程序设计

麒麟KY-RTI分布仿真技术:第七章 Visual C++程序设计

麒麟KY-RTI分布仿真技术:第八章 Visual C#程序设计

麒麟KY-RTI分布仿真技术:第九章 综合演示

麒麟KY-RTI分布仿真技术:附录1 分组聊天(HLA数据分发管理的应用

麒麟KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

麒麟KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

RTI DDS的xml说明

阅读数 20

rti dds 5.0

阅读数 586

没有更多推荐了,返回首页