在半實物仿真系統中需要實時地傳輸、操作和分析數據,并在此基礎上作出相應的控制,實時網絡技術是半實物仿真系統中必不可少技術之一。基于反射內存的實時網絡技術目前已發展較為成熟的一種性能優異、概念新穎的實時網絡技術[1]。相對于以往基于TCP/IP或UDP/IP實時網絡技術來說,它極大的提高了系統實時通訊、數據反射和信號調試的能力,使分布式仿真系統結構的設計及實現更為簡單。本文介紹了基于VMI-5565反射內存卡組建實時網絡的方法,并就利用VC++6.0實現實時網絡通訊進行了研究。
1反射內存通訊原理及實時網絡構建1.1 反射內存通訊原理反射內存光纖網絡采用了先進特殊的技術,具備了很強的支持分布實時系統的數據傳輸能力[2]。在每個需要實時通訊的節點上插入反射內存網卡(節點卡),每塊節點卡都有自己獨立的局部內存,它通過局部內存映射將網卡上的局部內存映射到主機內存,用戶讀寫網卡上的數據就如同讀寫主機內存上的數據一樣快速方便。另外,每塊反射內存網卡又通過網絡內存映射,將分布節點卡上的局部內存映射到一個虛擬的全局內存,即每個節點在寫入本地節點卡的數據同時也寫入所有其他節點卡的內存。這樣,用戶對本地節點內存的讀寫相當于對全局內存進行讀寫,而這個全局內存是所有分布節點都可見反射的,從而實現分布節點間的數據通訊[3]。通過這種方式,所有的節點能透明并確定地傳送中斷、消息或者數據塊到其他的節點。
1.2??VMI-5565實時網絡產品簡介
VMI-5565反射內存產品是美國VMIC公司于本世紀初推出的網絡通訊產品系列。其特點是通過驅動軟件寫到某一個節點反射內存板上某一地址單元的數據,可同時通過HUB自動映射寫到實時網絡上所有節點的反射內存板上的對應地址單元。同時,也支持直接內存訪問(DMA)方式的數據塊傳輸。每塊反射內存板通過卡上跳線設置在網絡上的唯一ID號。其技術性能指標如下:
(1).實時性能:數據傳輸率可達47.1Mbyte/s到174Mbyte/s;
(2). 負載能力:通過選用兩種不同型號的反射內存板,具有64M字節至128M字節的可選負載能力;
(3). 傳輸距離:支持10km長度的単模光纖300m長度的多模光纖;
(4). 擴展性:単個HUB支持8個節點。通過級聯HUB,最多可支持256個節點。
1.3 基于反射內存的實時網絡構建
實時網絡現行的網絡拓撲結構主要有環型、星型結構等幾種結構。一般來說,環形結構組網簡單。下面以三個節點為例,簡單說明環形結構組網過程。三個節點需要三塊VMI5565卡及3根單股光纖。首先將三塊卡進行統一編址,分別為節點0、節點1、節點2,并將其插入到對應的計算機中,具體編址方式見2.1節。將節點0的反射內存卡的RX端與將節點1的反射內存卡的TX端連接,同時將節點1的RX端與T節點2的TX端連接,節點2的RX與節點0的TX連接,如圖1所示:
圖1環形拓撲實時網絡示意圖
環形結構組網簡單,但是在使用的時候,必須將所有的節點計算機全部打開才能進行通訊,在節點較多時,使用不方便,且容易造成因人為失誤而導致仿真試驗失敗的情況。
星型實時網絡由一個實時網絡HUB和實時節點卡組成。安裝了實時網絡節點卡的計算機通過光纖連接在HUB上。HUB提供了一個共享內存空間,每個節點在本地都有一個該共享內存空間的映射。當任意一個實時處理機在本地節點卡的內存空間中操作時,HUB內共享內存空間的數據就會被更新。同時,其它節點上的共享內存映射空間中的對應數據會被立即更新。這種實時網絡具有低延遲、高傳輸率的優點,確保所有節點數據快速更新。仍以三個節點為例,說明其結構。其結構圖如圖2所示:
圖2 星型拓撲結構實時網示意圖
星型結構則使用時比較方便,只需打開需用的節點計算機并給HUB加電即可,工作穩定、可靠,但相對環形拓撲結構來說,增加了一個實時網絡HUB,相同節點數,需要的光纖也增加了一倍,增加了成本。
在具體使用中,可根據節點數量來進行實時網絡拓撲結構選擇。節點較少時選擇環形拓撲,可有效地節省成本,節點較多時,可選擇星型拓撲,使用更為方便。
筆者參與設計并投入使用的仿真系統采用了星型拓撲結構,該系統共有8個節點,分別對應控制臺計算機、視景計算機、程序解算計算機、設備控制計算機等計算機。該系統目前已經成功應與于某半實物仿真系統中。由于該半實物仿真系統不是本文重點內容,在此不做進一步說明。
2??反射內存存儲空間分配2.1 反射內存編址
在組網前,需要對每塊反射內存卡進行統一編址,以便反射內存網絡形成一致的連續的共享空間而不會發生沖突。在VMI5565反射內存卡上,有一排8個小開關,用這些開關即可完成統一編址。8個小開關全部打開時,內部地址為00000000,對應的反射內存卡為節點0,僅第1個打開時,內部地址為00000001,對應的反射內存卡為節點1,第二個打開為節點2,依次類推,按照二進制編碼方式排列,依次為0,1,2,4,8,16,32,單個HUB支持8個節點。
2.2反射內存地址空間分配
由于實時網絡系統的內存地址空間有限,所以每個節點計算機寫入內存的數據需科學、合理和嚴格規劃。常用的數據寫入方式有兩種,第一種是不進行地址空間分配,而按照具體節點進行數據通訊,即將數據發送端直接將所需的數據打包發送到對應的數據接收端。例如,0號節點需要將名為ff的數據傳遞給1號節點,其語法如下(VC++6.0下):
發送方(0號節點):
……
retstatus=RFM2gWrite(rh,1,(void *)ff,sizeof(float)*9);
……
接收方(1號節點):
……
retstatus=RFM2gRead(rh,1,(void *)ff,sizeof(float)*9);
……
此種方式在數據量大的時候,會引起溢出,無法保證同一幀數據的完整性,另外,當一段數據為多個節點同時需要時,此種方法就不夠方便。因此,目前常用的方式是將反射內存空間進行分配。
反射內存地址空間分配是通過軟件接口控制文件定義好所有須使用內存空間的數據變量地址,同類數據連續分配地址單元,以便其它節點的計算機可以用直接內存訪問方式一次性快速讀取大量數據。同時,由于節點上的計算機在某個時刻寫到某一內存地址段的多個數據會在下一仿真周期以新的結果刷新此段數據,為了保證其它計算機節點讀到該地址段幀的數據是同一幀的數據,需為這段數據定義專門的地址單元標志該段數據的讀寫狀態。用此種方式時,可利用如下句子進行操作(VC++6.0下):
數據寫入節點:
……
retstatus=RFM2gWrite(rh,0x500, (void *)ff,sizeof(float)*9);
……
數據讀取節點:
……
retstatus=RFM2gRead(rh,0x500,
(void *)ff,sizeof(float)*9);
……
數據寫入節點只需將ff數據寫入到固定的地址(0X500),需要用到此段數據的節點均可到該地址進行讀寫,此種方式下,發送法不需關注接受方,而只需按照事先約好的數據存儲地址寫入即可,同樣,接受方也是如此。
2.3 地址空間分配時的注意事項
在反射內存空間地址分配時,須注意所分配的空間應大于所需傳遞的數據長度并有一定的余量,應按照單個數據的字節數和數據段的數據個數來進行仔細計算所需的存儲空間。
在地址空間分配及實時通訊過程中,應有專用的數據記錄空間和節點,做好試驗狀態和實驗結果的記錄。同時在每次仿真開始前應清空射內存中原有的數據,以防造成誤操作,從而對仿真設備造成損壞。
3??在VC++下的實時通訊協議設計在VC++下利用反射內存網實現實時通訊之前,要進行驅動安裝與環境變量設置。具體內容見參考文獻[4]。設置完成后,方可進行相關操作。在筆者完成的實時系統中,采用VC環消息Message方式進行傳遞進行。首先是完成頭文件加載與反射內存卡打開并使之處于使能狀態,隨后是等待觸發。按照反射內存統一編址方式進行通訊協議設計,具體如下。
3.1 反射內存卡初始化及使能
在VC++環境下,首先要完成反射內存卡的頭文家加載與發射內存卡打開及使能,參考代碼如下:
#include "rfm2g.h"http://反射內存頭文件;
……
Main()
{
……
If((retstatus=RFM2gOpen(rfmFn,&rh))!= RFM2G_SUCCESS)
{
printf("Cannot open RFM2G\n");
exit(0);
}??
if(rh == (RFM2GHANDLE) NULL){
printf( "%s>??rh = %x ", me, rh );
}? ?//判斷是否打開成功
retstatus=RFM2gEnableEvent(rh,RFM2GEVENT_INTR1); //使能反射內存卡,等待時間觸發;
……
}
3.2 發送接受協議
初始化完成后,通訊開始。為了確保數據實時傳輸的正確性,數據的發送、接收雙方需要握手協議。這一點在牽扯到仿真設備初始化的半實物仿真過程中尤為重要。設發送方在0X500地址處寫入TX=1,等待接受方應答信號。接受方在0X500處讀到TX并確定TX=1,完成準備工作后在0X1000處寫入RX=1。當發送方收到RX并確認為RX=1時,正式數據開始發送,實時仿真開始。雙方具體操作如下。
3.2.1發送操作發送方首先進行握手信號發送,等待應答成功后,開始發送數據。仿真過程結束后發送TX=2,通知接收方通訊完成,待到對方應答后,關閉反射內存,實時通訊結束。
以發送名為ff數據至0X500為例,整個通訊過程參考代碼如下:
……
RFM2gClear(&rh);
TX=1;
retstatus=RFM2gWrite(rh,0x500, (void *)TX,sizeof(float)*9);//發送TX
retstatus=RFM2gSendEvent(rh,32,
RFM2GEVENT_INTR1,0x0);//發送消息事件;
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);//發送ff
retstatus=RFM2gSendEvent(rh,32,RFM2GEVENT_INTR1,0x0);//發送消息
……
If(stop=start)//仿真完成
{
TX=2;
retstatus=RFM2gWrite(rh,0x500,(void *)TX,sizeof(float)*9);//發送TX
retstatus=RFM2gSendEvent(rh,32,RFM2GEVENT_INTR1,0x0);//發送消息事件;
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);//關閉使能反射內存;
RFM2gClose(&rh);//關閉反射內存;
}//仿真過程結束,關閉反射內存
……
3.2.2 接受操作接受操作類似于發送操作,只需要在初始化完成后,有一個等待事件觸發的命令即可。當收到事件觸發后,即從0X500處讀入數據并判斷數據,當收到的數據同預設一致時,發送應答信號至0X510,并準備接受數據。當接受到數據為Tx=2時,即返回RX=2并停止使能反射內存卡,關閉反射內存卡,通訊結束。等待觸發的代碼如下,其他類似于發送方。
……
RFM2gClear(&rh);
retstatus=RFM2gWaitForEvent(rh,&info);
……
retstatus=RFM2gDisableEvent(rh,RFM2GEVENT_INTR1);//關閉使能反射內存;
RFM2gClose(&rh);//關閉反射內存;
}//仿真過程結束,關閉反射內存
……
利用上述方法即可實現實時通訊過程。
4 在Windows下實現實時通訊由于Windows是多任務操作系統,因此常見的實時系統常采用DOS等單任務系統,或者是購買RTW模塊并實現Windows下的實時性設計。但是,在實時性要求不是很高的情況下(仿真步長>0.5ms)時,可以通過提高進程優先級并強制關閉其他進程的方法來實現強實時計算。同時,可以通過獲取計算機機器時間并以此來進行仿真步長的準確定時。采用此方法,可有效地實現各個節點的時間統一管理,可有效地提高系統的實時性。在實際使用過程中,仿真步長可根據整個系統的單步計算、控制的耗時情況以及仿真對象的實際情況進行選擇,并選擇合適的方式(中斷、查詢)來實現仿真周期的準確定時。
筆者完成的實時系統設計中,通過查詢方式并采用死循環的形式,實現了仿真周期為0.5毫秒的半實物仿真。實際測試(測試環境:CPUP4 2.8GHZ 512M)統計結果表明,在采用實時處理以后,完成一步計算幀周期定時誤差最大為1.2毫秒,采用實時處理以后,平均幀誤差在30微妙,最大為130微妙。采用實時處理后的反射內存網兩個節點之間的數據傳輸時間誤差均值小于80微妙,最大值小于200微妙。經過任務優先級調整后的仿真進程受操作系統影響較小,在所得到的測試結果中,99%在40-50微妙以內,最大值不超過130微妙,實時網數據延時最大值不超過150微妙,完全滿足仿真步長在0.5毫秒以上的系統仿真任務。
5 小結本文主要介紹了基于反射內存卡的實時網絡系統設計方法,并給出了具體的通訊協議及注意事項,同時,就如何在Windows系統下實現實時通訊進行了簡要介紹。利用該方法設計的實時系統已在某半實物仿真實驗室中應用,經驗證,該系統具有通信實時性好,數據傳輸速度快,傳輸可靠性高的特點,滿足實時仿真需要,取得了良好的效果,被實踐證明是一種成熟、有效的方法。
參考文獻:
[1]??胡小江, 錢志博.基于LabVIEW的實時網絡接口開發[J].電子技術應用,2005(3):28~29.
[2]??楊滌,楊旭,系統實時仿真開發環境與應用[M].北京:請華大學出版社,2002,5~8.
[3] VMICPCI-5565 REFLECTIVE MEMORY BOARD PRODUCT MANUAL, VME Microsystems International Corporation.
[4 David .J.Kruglinski, Scot Wingo,George Shepherd著,希望圖書創作室 譯. Visual C++6.0技術內幕(第五版)[M].北京:北京希望電子出版社,2000,395~402
評論
查看更多