發(fā)送方首先進(jìn)行握手信號(hào)發(fā)送,等待應(yīng)答成功后,開始發(fā)送數(shù)據(jù)。仿真過程結(jié)束后發(fā)送TX=2,通知接收方通訊完成,待到對(duì)方應(yīng)答后,關(guān)閉反射內(nèi)存,實(shí)時(shí)通訊結(jié)束。
以發(fā)送名為ff數(shù)據(jù)至0X500為例,整個(gè)通訊過程參考代碼如下:
……
RFM2gClear(&rh);
TX=1;
retstatus=RFM2gWrite(rh,0x500, (void *)TX,sizeof(float)*9);//發(fā)送TX
retstatus=RFM2gSendEvent(rh,32,
RFM2GEVENT_INTR1,0x0);//發(fā)送消息事件;
while(1){
retstatus=RFM2gRead(rh,0x51, (void *)RX,sizeof(float)*9);
if(fabs(RX-1)<0.000001 )
break;
printf("wait RX…%lf\n",fabs(RX-1));
}
printf("RX Readly...\n");//握手成功
retstatus=RFM2gWrite(rh,0x500,(void *)ff,sizeof(float)*9);//發(fā)送ff
retstatus=RFM2gSendEvent(rh,32,RFM2GEVENT_INTR1,0x0);//發(fā)送消息
……
If(stop=start)//仿真完成
{
TX=2;
retstatus=RFM2gWrite(rh,0x500,(void *)TX,sizeof(float)*9);//發(fā)送TX
retstatus=RFM2gSendEvent(rh,32,RFM2GEVENT_INTR1,0x0);//發(fā)送消息事件;
while(1){? ? retstatus=RFM2gRead(rh,0x510,(void *)RX,sizeof(float)*9);
if(fabs(RX-2)<0.000001 )
break;
printf("wait RX…%lf\n",fabs(RX-1));
}
printf("Retaime TR over...\n");
retstatus=RFM2gDisableEvent(rh,
RFM2GEVENT_INTR1);//關(guān)閉使能反射內(nèi)存;
RFM2gClose(&rh);//關(guān)閉反射內(nèi)存;
}//仿真過程結(jié)束,關(guān)閉反射內(nèi)存
……
3.2.2 接受操作接受操作類似于發(fā)送操作,只需要在初始化完成后,有一個(gè)等待事件觸發(fā)的命令即可。當(dāng)收到事件觸發(fā)后,即從0X500處讀入數(shù)據(jù)并判斷數(shù)據(jù),當(dāng)收到的數(shù)據(jù)同預(yù)設(shè)一致時(shí),發(fā)送應(yīng)答信號(hào)至0X510,并準(zhǔn)備接受數(shù)據(jù)。當(dāng)接受到數(shù)據(jù)為Tx=2時(shí),即返回RX=2并停止使能反射內(nèi)存卡,關(guān)閉反射內(nèi)存卡,通訊結(jié)束。等待觸發(fā)的代碼如下,其他類似于發(fā)送方。
……
RFM2gClear(&rh);
retstatus=RFM2gWaitForEvent(rh,&info);
……
retstatus=RFM2gDisableEvent(rh,RFM2GEVENT_INTR1);//關(guān)閉使能反射內(nèi)存;
RFM2gClose(&rh);//關(guān)閉反射內(nèi)存;
}//仿真過程結(jié)束,關(guān)閉反射內(nèi)存
……
利用上述方法即可實(shí)現(xiàn)實(shí)時(shí)通訊過程。
4 在Windows下實(shí)現(xiàn)實(shí)時(shí)通訊由于Windows是多任務(wù)操作系統(tǒng),因此常見的實(shí)時(shí)系統(tǒng)常采用DOS等單任務(wù)系統(tǒng),或者是購(gòu)買RTW模塊并實(shí)現(xiàn)Windows下的實(shí)時(shí)性設(shè)計(jì)。但是,在實(shí)時(shí)性要求不是很高的情況下(仿真步長(zhǎng)>0.5ms)時(shí),可以通過提高進(jìn)程優(yōu)先級(jí)并強(qiáng)制關(guān)閉其他進(jìn)程的方法來實(shí)現(xiàn)強(qiáng)實(shí)時(shí)計(jì)算。同時(shí),可以通過獲取計(jì)算機(jī)機(jī)器時(shí)間并以此來進(jìn)行仿真步長(zhǎng)的準(zhǔn)確定時(shí)。采用此方法,可有效地實(shí)現(xiàn)各個(gè)節(jié)點(diǎn)的時(shí)間統(tǒng)一管理,可有效地提高系統(tǒng)的實(shí)時(shí)性。在實(shí)際使用過程中,仿真步長(zhǎng)可根據(jù)整個(gè)系統(tǒng)的單步計(jì)算、控制的耗時(shí)情況以及仿真對(duì)象的實(shí)際情況進(jìn)行選擇,并選擇合適的方式(中斷、查詢)來實(shí)現(xiàn)仿真周期的準(zhǔn)確定時(shí)。
筆者完成的實(shí)時(shí)系統(tǒng)設(shè)計(jì)中,通過查詢方式并采用死循環(huán)的形式,實(shí)現(xiàn)了仿真周期為0.5毫秒的半實(shí)物仿真。實(shí)際測(cè)試(測(cè)試環(huán)境:CPUP4 2.8GHZ 512M)統(tǒng)計(jì)結(jié)果表明,在采用實(shí)時(shí)處理以后,完成一步計(jì)算幀周期定時(shí)誤差最大為1.2毫秒,采用實(shí)時(shí)處理以后,平均幀誤差在30微妙,最大為130微妙。采用實(shí)時(shí)處理后的反射內(nèi)存網(wǎng)兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸時(shí)間誤差均值小于80微妙,最大值小于200微妙。經(jīng)過任務(wù)優(yōu)先級(jí)調(diào)整后的仿真進(jìn)程受操作系統(tǒng)影響較小,在所得到的測(cè)試結(jié)果中,99%在40-50微妙以內(nèi),最大值不超過130微妙,實(shí)時(shí)網(wǎng)數(shù)據(jù)延時(shí)最大值不超過150微妙,完全滿足仿真步長(zhǎng)在0.5毫秒以上的系統(tǒng)仿真任務(wù)。
5 小結(jié)本文主要介紹了基于反射內(nèi)存卡的實(shí)時(shí)網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)方法,并給出了具體的通訊協(xié)議及注意事項(xiàng),同時(shí),就如何在Windows系統(tǒng)下實(shí)現(xiàn)實(shí)時(shí)通訊進(jìn)行了簡(jiǎn)要介紹。利用該方法設(shè)計(jì)的實(shí)時(shí)系統(tǒng)已在某半實(shí)物仿真實(shí)驗(yàn)室中應(yīng)用,經(jīng)驗(yàn)證,該系統(tǒng)具有通信實(shí)時(shí)性好,數(shù)據(jù)傳輸速度快,傳輸可靠性高的特點(diǎn),滿足實(shí)時(shí)仿真需要,取得了良好的效果,被實(shí)踐證明是一種成熟、有效的方法。
參考文獻(xiàn):
[1]??胡小江, 錢志博.基于LabVIEW的實(shí)時(shí)網(wǎng)絡(luò)接口開發(fā)[J].電子技術(shù)應(yīng)用,2005(3):28~29.
[2]??楊滌,楊旭,系統(tǒng)實(shí)時(shí)仿真開發(fā)環(huán)境與應(yīng)用[M].北京:請(qǐng)華大學(xué)出版社,2002,5~8.
[3] VMICPCI-5565 REFLECTIVE MEMORY BOARD PRODUCT MANUAL, VME Microsystems International Corporation.
[4 David .J.Kruglinski, Scot Wingo,George Shepherd著,希望圖書創(chuàng)作室 譯. Visual C++6.0技術(shù)內(nèi)幕(第五版)[M].北京:北京希望電子出版社,2000,395~402
評(píng)論