王程崢 李文魁 宋衛(wèi)紅 黎海雪
(1. 海軍工程大學(xué)電氣與信息工程學(xué)院,武漢 430033;2. 92823部隊(duì)三中隊(duì),三亞 572021;3. 92853部隊(duì),遼寧 興城 125106)
艦船綜合導(dǎo)航系統(tǒng)作為導(dǎo)航系統(tǒng)的核心,對(duì)來自各種導(dǎo)航傳感器的導(dǎo)航信息進(jìn)行處理,并向操舵系統(tǒng)、指控系統(tǒng)等外部用戶發(fā)送。為滿足岸基條件下某型艦船操舵系統(tǒng)維修調(diào)試的需要,開發(fā)了艦船綜合導(dǎo)航模擬器,用于模擬艦船操縱運(yùn)動(dòng)時(shí)綜合導(dǎo)航系統(tǒng)輸出的艦艇航向、航速、縱橫傾等導(dǎo)航信息,并通過1553B總線向操舵系統(tǒng)發(fā)送。1553B采用一種串行、異步和半雙工式總線結(jié)構(gòu)[1],具有高可靠性、高實(shí)時(shí)性、高效率、抗干擾能力強(qiáng)等特點(diǎn)。
本文就 Windows環(huán)境下如何使用 C++Builder編譯平臺(tái)實(shí)現(xiàn) 1553B總線控制器通信的方法進(jìn)行了研究,同時(shí)在綜合導(dǎo)航系統(tǒng)模擬器設(shè)計(jì)中進(jìn)行了成功應(yīng)用。
1553B總線由傳輸介質(zhì)、總線控制器(BC)、遠(yuǎn)程終端(RT)和總線監(jiān)視(BM)器等四部分組成。BC的作用是組織信息傳輸,完成數(shù)據(jù)字的收/發(fā)、字/消息的處理[2]。針對(duì)總線上遠(yuǎn)程終端的數(shù)量和通信復(fù)雜程度,BC發(fā)送消息的設(shè)計(jì)方法主要有兩種[3]:
(1)簡單方式?;舅枷霝镽T回復(fù)消息的控制權(quán)完全在 BC。實(shí)現(xiàn)方法為:對(duì)周期消息采用固定周期來定時(shí)傳輸,對(duì)事件消息采用命令插入的方式。當(dāng)BC要求RT 返回?cái)?shù)據(jù)時(shí),BC可向RT的子地址下達(dá)命令字,并通過采用查詢方式來獲取數(shù)據(jù)。該方法編程簡單,適用于總線結(jié)構(gòu)單一、通信數(shù)據(jù)量較少的情況,對(duì)多個(gè) RT總線,通信實(shí)時(shí)性相對(duì)下降。
(2)矢量字方式?;舅枷胧菍⒒貜?fù)消息的主動(dòng)權(quán)交還給RT。實(shí)現(xiàn)方法為:RT接收BC命令完成相應(yīng)動(dòng)作,將數(shù)據(jù)字寫到相應(yīng)子地址緩存中,然后按照協(xié)議構(gòu)造矢量字,把矢量字發(fā)送到RT 的0/31 號(hào)子地址BUF中。BC在發(fā)送完一次性消息后,可向0/31子地址發(fā)命令字從而讀出其中存放的矢量字,根據(jù)協(xié)議解析矢量字得到相應(yīng)的子地址,并向該子地址發(fā)送命令從而得到 RT數(shù)據(jù)。該方法適合多RT的復(fù)雜通信,編程靈活,通訊數(shù)據(jù)量小。
如圖1所示,綜合導(dǎo)航模擬器接收操舵系統(tǒng)輸出的當(dāng)前舵角,按照艦艇運(yùn)動(dòng)模型,實(shí)時(shí)計(jì)算出艦船運(yùn)動(dòng)參數(shù)。并采用2個(gè)1553B通道無應(yīng)答地定周期連續(xù)向操舵系統(tǒng)發(fā)送艦船的航向、航速、縱傾、橫傾等導(dǎo)航參數(shù)。
硬件平臺(tái)采用研華工控機(jī)。1553B通信卡采用北京神州飛航開發(fā)的基于 PCI接口的AEC1553-PCI- SBC31RT-S2型1553B通信卡。該1553B卡采用 FPGA設(shè)計(jì),可分時(shí)工作在 BC、RT、BM模式下,雙冗余通道數(shù)據(jù)發(fā)送和接收,支持大容量的數(shù)據(jù)存儲(chǔ)。
圖1 艦艇綜合導(dǎo)航模擬器的原理框圖
該1553B板卡提供了豐富的驅(qū)動(dòng)函數(shù),其中與BC通信相關(guān)的函數(shù)約有20多個(gè),常用BC函數(shù)[4]見表 1。
表1 常用BC通信函數(shù)列表
隨卡附帶的驅(qū)動(dòng)函數(shù)庫文件為基于 Visual C++的coff格式的M1553CSC.lib。若采用其它軟件進(jìn)行開發(fā),則需要對(duì)庫函數(shù)進(jìn)行格式轉(zhuǎn)換。如采用C++Builder,需用coff2omf命令轉(zhuǎn)換為omf格式的庫文件。相應(yīng)命令為:coff2omf M1553CSC.lib M1553CSCB.lib。
在 Windows XP操作系統(tǒng)下,我們采用C++Builder開發(fā)軟件進(jìn)行綜合導(dǎo)航信號(hào)模擬器總線控制器軟件設(shè)計(jì)。C++ Builder是由Borland公司推出的一款快速開發(fā)Win32應(yīng)用程序的可視化開發(fā)工具,利用它可以實(shí)現(xiàn)高性能的執(zhí)行效率和出色的底層控制。
對(duì)綜合導(dǎo)航模擬器,總線結(jié)構(gòu)較為簡單,因此采用簡單方式進(jìn)行 BC設(shè)計(jì)。程序流程如圖 2所示。主要程序代碼說明如下:
圖2 BC通信軟件流程圖
(1)板卡初始化
M1553_Open(&hCard, CardId);
打開板卡。hCard為板卡句柄,CardId為板卡編號(hào),按板卡所在插槽離CPU的距離由近到遠(yuǎn)依次編號(hào)0、1…、7。這里取為0、1。
M1553_WorkMode(hCard, ModeSel);
設(shè)置工作模式。工作模式 ModeSel可取為0(BC)、1(RT)、2(BM),這里取 0。
M1553_AddTimeTag(hCard,true);
開啟時(shí)間標(biāo)簽。用于觀察消息周期和間隔。分辨率 1 μs。
M1553_SetIntMaskReg(hCard,&IntMask);
設(shè)置中斷屏蔽寄存器。由于實(shí)時(shí)性要求較高,采用單消息觸發(fā)一次中斷,將中斷屏蔽寄存器結(jié)構(gòu)體 IntMask中的 BC_MsgOver(BC消息結(jié)束中斷使能位)和BC_STOP (BC消息出錯(cuò)停止中斷使能位)使能。
(2)數(shù)據(jù)加載
SMsg.MsgBlock.Datablk[0]=StrToFloat(Form 1->Edit1->Text);
將待發(fā)送數(shù)據(jù)字存放在BC消息描述結(jié)構(gòu)體成員Datablk[32]中。
BC_WriteDataBlock(hCard,MsgId,WordCnt,SMsg.MsgBlock.Datablk);
修改運(yùn)行中的BC發(fā)送的數(shù)據(jù)字,MsgId為消息 ID號(hào),WordCnt為寫入數(shù)據(jù)字個(gè)數(shù)(取值0~32)。
由于實(shí)時(shí)性要求較高,而C++Builder自帶計(jì)時(shí)器的定時(shí)精度最高只能達(dá)到55ms[5],故采用Microsoft Win32 API 提供的一項(xiàng)多媒體定時(shí)器服務(wù)來實(shí)現(xiàn)數(shù)據(jù)定時(shí)加載[6],定時(shí)精度最高能達(dá)到1 ms[7]。程序需包含定時(shí)器函數(shù)頭文件"mmsystem.h",實(shí)現(xiàn)方法如下:
①設(shè)定定時(shí)器分辨率
建立最小定時(shí)器分辨率。uPeriod為最小分辨率,由設(shè)定的最小分辨率與計(jì)算機(jī)的硬件配置決定。
使定時(shí)器定時(shí)精度回到系統(tǒng)的默認(rèn)值。
② 設(shè)置定時(shí)事件
uDelay 為事件周期,這里與BC發(fā)送消息的周期一致;uResolution 為延時(shí)分辨率;LpTimeProc 指向一個(gè)自定義的回調(diào)函數(shù),該函數(shù)用來設(shè)置定時(shí)事件,調(diào)用時(shí)應(yīng)指定對(duì)應(yīng)的事件標(biāo)識(shí)符,并提供用戶數(shù)據(jù),在中斷時(shí)間內(nèi)被訪問;DwUser 存放用戶提供的回調(diào)數(shù)據(jù);FuEvent 為事件類型,TIME_ONESHOT為一次性事件,TIME_PERIODIC為周期性事件。
調(diào)用任務(wù)完成后取消定時(shí)器回調(diào)事件,及時(shí)出讓珍貴的CPU 資源。
(3)消息配置與發(fā)送
SMsg.CtlWord.ChanSel=1;//消息發(fā)送時(shí)的通道選擇 0:Channel B 1:Channel A
BC_WriteMsg(hCard, MsgId, &SMsg); //消息發(fā)送
BC_AddEndOfListFlag(hCard, MsgId+1); //添加消息鏈表結(jié)束符
(4)消息讀取
數(shù)據(jù)的讀取顯示采用C++Builder自帶的計(jì)時(shí)器Timer定時(shí)觸發(fā)。
硬件方面,傳輸距離小于30 cm時(shí),采用短截線實(shí)現(xiàn)總線和終端設(shè)備的直接耦合;否則,采用變壓器耦合[8,9],連接時(shí)需要注意耦合器的位置。在總線兩端匹配電阻,消除信號(hào)反射。調(diào)試過程中若發(fā)現(xiàn)問題應(yīng)首先判定是否為硬件問題,發(fā)送已知數(shù)據(jù),將板卡輸出腳接示波器上觀察電平,若正確則基本排除硬件問題。需要注意的是1553B總線上的消息是調(diào)制成雙極性碼的曼徹斯特碼[10]。
圖3 艦艇綜合導(dǎo)航模擬器BC運(yùn)行界面圖
軟件方面,采用隨卡附帶的應(yīng)用程序作為RT接收數(shù)據(jù)。調(diào)試時(shí)應(yīng)遵循先易后難原則。先嘗試簡單通信模式,如 BC發(fā)送一個(gè)數(shù)據(jù)字測試 RT能否正確接收,RT返回的狀態(tài)字是否正常等,成功后再嘗試較復(fù)雜的通信模式。軟件運(yùn)行界面如圖3所示。
本文討論了1553B總線控制器軟件設(shè)計(jì)的方法,根據(jù)艦船綜合導(dǎo)航模擬器的實(shí)際需求,詳細(xì)介紹了 Windows環(huán)境下基于 C++Builder如何實(shí)現(xiàn)數(shù)據(jù)發(fā)送的具體方法及系統(tǒng)調(diào)試中的注意事項(xiàng)。試驗(yàn)表明該系統(tǒng)運(yùn)行可靠,達(dá)到了預(yù)定要求。
[1]楊武志, 李敏勇. 基于艦船 1553B總線系統(tǒng)監(jiān)控測試軟件的設(shè)計(jì)[J].艦船電子工程, 2009, 29(1):190-192.
[2]李志剛. 1553B總線測試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 西安西北工業(yè)大學(xué), 2005.
[3]丁明亮, 魏志剛. 1553B總線遠(yuǎn)程終端仿真軟件設(shè)計(jì)[J]. 計(jì)量與測試技術(shù), 2008, 35(1): 43-47.
[4]AEC1553-PCI-SBC31RT/S2 用戶手冊(cè)[Z]. 北京: 北京神州飛航科技有限責(zé)任公司, 2011.
[5]Mark Nelson. 串行通信開發(fā)指南[M]. 北京: 中國水利水電出版社, 2001: 43.
[6]Microsoft 公司. MICROSOFT WIN32 程序員參考大全(一)[M]. 北京: 電子科技出版社, 1994: 90-95.
[7]李文魁, 陳永冰, 周永余等. 多任務(wù)實(shí)時(shí)系統(tǒng)提高實(shí)時(shí)性的方法及其在導(dǎo)航綜合信號(hào)源系統(tǒng)中的應(yīng)用[J]. 中國慣性技術(shù)學(xué)報(bào), 2003, 11(4): 11-15
[8]GJB 289A-1997, 數(shù)字式時(shí)分制指令/響應(yīng)型多路傳輸數(shù)據(jù)總線[s]. 中國軍用標(biāo)準(zhǔn), 1997.
[9]MIL-STD-1553,飛機(jī)內(nèi)部時(shí)分制指令/響應(yīng)式多路傳輸數(shù)據(jù)總線[s]. 美國軍用標(biāo)準(zhǔn), 1978.
[10]武鵬, 畢君懿. 1553B總線中曼徹斯特編碼器的設(shè)計(jì)[J]. 現(xiàn)代電子技術(shù), 2011, 34(4): 61-64.