劉春光,張亞寧
(92124 部隊(duì),遼寧 大連 116023)
在海上進(jìn)行目標(biāo)飛行試驗(yàn)時(shí),需要對(duì)海上航區(qū)內(nèi)的船舶、漂浮物等進(jìn)行實(shí)時(shí)監(jiān)控,以確保目標(biāo)飛行器鎖定預(yù)定目標(biāo)靶。目標(biāo)飛行器鎖定了非靶目標(biāo)時(shí)需要指揮所安全控制人員及時(shí)進(jìn)行干預(yù),將目標(biāo)飛行器在空中引爆,以此確保非靶目標(biāo)的安全。目前,海上監(jiān)視系統(tǒng)可以將掃海雷達(dá)、AIS 等艦船信息報(bào)告給指揮所并在指揮所安全控制監(jiān)視軟件上實(shí)時(shí)顯示。但當(dāng)海上監(jiān)視系統(tǒng)發(fā)生通信鏈路故障時(shí),就需要通過人工方式向指揮所實(shí)時(shí)匯報(bào)目標(biāo)靶信息,此時(shí)通過人工方式向安全控制監(jiān)視軟件添加目標(biāo)靶信息就顯得尤為重要。
艦船信息一般包含船名、經(jīng)度、緯度、操作類別等4 項(xiàng)內(nèi)容。本文軟件設(shè)計(jì)流程為:首先通過通信設(shè)備獲取艦船的位置、速度等信息,然后將艦船信息的格式轉(zhuǎn)換為安全控制軟件支持的格式,最后將此信息發(fā)送到安全控制軟件進(jìn)行顯示。程序信號(hào)流程如圖1所示。
圖1 程序信號(hào)流程
為了實(shí)現(xiàn)人工添加目標(biāo)靶信息的功能,需要完成人機(jī)交互界面設(shè)計(jì)、轉(zhuǎn)換船舶信息數(shù)據(jù)格式、向安全控制監(jiān)視軟件發(fā)送數(shù)據(jù)包等環(huán)節(jié)。
本文基于MFC 平臺(tái),采取對(duì)話框模式設(shè)計(jì)程序界面,程序界面如圖2所示。此程序界面中包含有船名、經(jīng)度、緯度、發(fā)送地址等信息,同時(shí)設(shè)置了3 個(gè)按鍵“清空”“刪除目標(biāo)”“增加目標(biāo)”,用戶可通過按鍵實(shí)現(xiàn)相應(yīng)的功能。此界面中,共有“靶船”“經(jīng)度”“緯度”等標(biāo)簽控件11 項(xiàng),船名、經(jīng)緯度數(shù)值信息輸入控件9 項(xiàng),此外還有“清空”“刪除目標(biāo)”“增加目標(biāo)”等按鍵控件3 項(xiàng)。
圖2 程序界面圖
界面設(shè)計(jì)完成之后,就需要從界面中獲取人工添加的船名、經(jīng)緯度等參數(shù)信息。以獲取船名和經(jīng)度信息為例,具體實(shí)現(xiàn)代碼為:
GetDlgItemText(IDC_targetname,targetname,10);//獲取船名
m_jd_degree =GetDlgItemInt(IDC_jd_degree);//獲取經(jīng)度度信息
m_jd_minute =GetDlgItemInt(IDC_jd_minute);//獲取經(jīng)度分信息
m_jd_second =GetDlgItemInt(IDC_jd_second);//獲取經(jīng)度秒信息
在此功能實(shí)現(xiàn)上,通過調(diào)用相應(yīng)的MFC 函數(shù)實(shí)現(xiàn)程序界面參數(shù)的讀取工作,將船名按照字符數(shù)組保存,將經(jīng)緯度信息的度、分、秒按照整型保存。
所獲取的程序界面參數(shù)信息并不能直接被安全控制監(jiān)視軟件識(shí)別出來,需要統(tǒng)一成安全控制監(jiān)視軟件所支持的格式后才能被其識(shí)別。安全控制監(jiān)視軟件所支持的數(shù)據(jù)格式為:
#pragma pack(1)// 網(wǎng)絡(luò)包中無邊界對(duì)齊填充
struct TarInf {
char Action;// ‘A’=新增,’D’=刪除
char key[5];// 船名
double X;// 經(jīng)度
double Y;// 緯度
};
#pragma pack(pop)
在此數(shù)據(jù)格式中,采取網(wǎng)絡(luò)包中無邊界對(duì)齊填充的方式構(gòu)建數(shù)據(jù),其中Action 表明此數(shù)據(jù)包的功能,字符A 表示新增目標(biāo),字符D 表示刪除目標(biāo);船名key 采取字符數(shù)組的方式保存;經(jīng)度和緯度統(tǒng)一成雙浮點(diǎn)型變量。與本文程序界面參數(shù)格式相比,船名均為字符數(shù)組,不需要轉(zhuǎn)換,但經(jīng)緯度信息需要由原來的“度—分—秒”形式轉(zhuǎn)換成“浮點(diǎn)型”單一變量。經(jīng)緯度信息轉(zhuǎn)換的實(shí)現(xiàn)代碼為:
m_jd_degree_all=m_jd_degree+m_jd_minute/60+m_jd_second/60/60;
m_wd_degree_all=m_wd_degree+m_wd_minute/60+m_wd_second/60/60;
通過此環(huán)節(jié),將程序界面中所輸入經(jīng)度和緯度的度分秒信息轉(zhuǎn)換成統(tǒng)一格式的位置信息,為下一步的數(shù)據(jù)打包發(fā)送提供了數(shù)據(jù)基礎(chǔ),方便了后續(xù)的數(shù)據(jù)發(fā)送。
為了實(shí)現(xiàn)最終的數(shù)據(jù)發(fā)送,還需要按照發(fā)送數(shù)據(jù)TarInf結(jié)構(gòu)進(jìn)行數(shù)據(jù)打包,將相關(guān)的船舶信息封裝在相應(yīng)的數(shù)據(jù)包中。為了實(shí)現(xiàn)此功能,本文定義了TarInf 結(jié)構(gòu)變量tarinf,并通過賦值的方式實(shí)現(xiàn)數(shù)據(jù)打包,具體分為目標(biāo)增加、目標(biāo)刪除。
2.4.1 增加目標(biāo)靶信息
TarInf tarinf;//定義目標(biāo)靶信息數(shù)據(jù)包
for(int i=0;i<=4;i++){tarinf.key[i]=targetname[i];}// 目標(biāo)靶名
tarinf.X=m_jd_degree_all;//經(jīng)度
tarinf.Y=m_wd_degree_all;//緯度
tarinf.Action =’A’;//增加目標(biāo)
在此環(huán)節(jié)中,首先定義了TarInf 格式的數(shù)據(jù)tarinf,然后依次對(duì)tarinf 的各個(gè)變量進(jìn)行賦值。首先對(duì)目標(biāo)靶名進(jìn)行賦值,然后對(duì)經(jīng)度信息和緯度信息進(jìn)行賦值,最后按下“增加目標(biāo)”按鍵將tarinf 變量的Action 值賦為字符“A”,最終實(shí)現(xiàn)“添加目標(biāo)”的任務(wù)。
2.4.2 刪除目標(biāo)靶信息
TarInf tarinf;//定義目標(biāo)靶信息數(shù)據(jù)包
for(int i=0;i<=4;i++){tarinf.key[i]=targetname[i];}// 目標(biāo)靶名
tarinf.X=m_jd_degree_all;//經(jīng)度
tarinf.Y=m_wd_degree_all;//緯度
tarinf.Action =’D’;//刪除目標(biāo)
在此環(huán)節(jié)中,與“增加目標(biāo)”功能實(shí)現(xiàn)相似,首先對(duì)目標(biāo)靶名進(jìn)行賦值,然后對(duì)經(jīng)度信息和緯度信息進(jìn)行賦值,最后按下“刪除目標(biāo)”按鍵將tarinf 變量的Action 值賦為字符“D”,最終實(shí)現(xiàn)“刪除目標(biāo)”的任務(wù)。
2.4.3 清空界面功能
為便于操作人員輸入不同的目標(biāo)靶信息,為此程序設(shè)置了“清空”功能,當(dāng)按下“清空”按鍵時(shí)系統(tǒng)會(huì)將“船名”“經(jīng)度”“緯度”“發(fā)送IP”“發(fā)送PORT”等信息清空,方便操管人員在此輸入信息。此功能的實(shí)現(xiàn)比較簡(jiǎn)單,在此不再贅述。
封裝完數(shù)據(jù)包后,需要將數(shù)據(jù)包發(fā)送到指定的地址,發(fā)送地址IP 和端口信息的獲取方式與船舶信息的獲取方式相同,IP 地址使用字符數(shù)組IP 保存,端口號(hào)使用整型變量PORT 保存。獲取發(fā)送地址信息后,調(diào)用“Winsock2.h”庫中的sendto 函數(shù)實(shí)現(xiàn)數(shù)據(jù)發(fā)送功能,具體實(shí)現(xiàn)代碼為:
SOCKADDR_IN addr;//構(gòu)建發(fā)送地址結(jié)構(gòu)
addr.sin_family=AF_INET;//發(fā)送模式采取UDP
addr.sin_addr.S_un.S_addr=inet_addr(IP);//發(fā)送地址
addr.sin_port=htons(PORT);//發(fā)送端口號(hào)
sendto(m_socket,(char *)lp_tarinf,sizeof(tarinf),0,(SOCKA DDR*)&addr,sizeof(SOCKADDR));//數(shù)據(jù)發(fā)送
此環(huán)節(jié)是發(fā)送封裝好的數(shù)據(jù)最終實(shí)現(xiàn)目標(biāo)顯示,在此環(huán)節(jié)中首先定義SOCKADDR_IN 結(jié)構(gòu)的數(shù)據(jù)addr,然后對(duì)addr 的各個(gè)成員變量進(jìn)行賦值,由于本文程序基于UDP 協(xié)議,addr 的sin_family 成員變量賦值為AF_INET,這樣可以實(shí)現(xiàn)UDP 信息的發(fā)送,程序根據(jù)程序界面的“發(fā)送IP”和“發(fā)送PORT”信息,分別將其賦值給addr 的sin_addr 和sin_port 兩個(gè)成員變量,最后調(diào)用sendto 函數(shù)最終實(shí)現(xiàn)數(shù)據(jù)的發(fā)送。
通過以上5 個(gè)步驟完成了程序的界面設(shè)計(jì)、界面參數(shù)獲取、參數(shù)格式轉(zhuǎn)換、數(shù)據(jù)打包、數(shù)據(jù)發(fā)送等功能。
最后,針對(duì)本文設(shè)計(jì)的人工添加目標(biāo)靶信息軟件進(jìn)行了機(jī)房實(shí)驗(yàn),實(shí)驗(yàn)中設(shè)置船名為“G201”,經(jīng)度為121 度50分42 秒,緯度為38 度43 分13 秒,目標(biāo)地址為組播地址“232.168.5.112”,目標(biāo)端口為5150,然后點(diǎn)擊“增加目標(biāo)”按鍵實(shí)現(xiàn)新增目標(biāo)功能,實(shí)驗(yàn)界面如圖3所示。
圖3 人工報(bào)靶軟件參數(shù)設(shè)置
在安全控制監(jiān)視軟件中效果如圖4所示,在遼寧南部海域出現(xiàn)了新增目標(biāo)“G201”,通過坐標(biāo)讀取工具得到目標(biāo)的經(jīng)度為121.845169 度、緯度為38.720315 度,由計(jì)算結(jié)果可知此值與實(shí)驗(yàn)中設(shè)置的經(jīng)緯度一致。通過真實(shí)環(huán)境下的實(shí)驗(yàn)驗(yàn)證可以看出,本文設(shè)計(jì)的軟件實(shí)現(xiàn)了人工手動(dòng)“添加目標(biāo)”信息的功能,同時(shí)本文還驗(yàn)證了“刪除目標(biāo)”“清空”等功能,可以在無法自動(dòng)接收目標(biāo)靶信息的情況下實(shí)現(xiàn)手動(dòng)添加目標(biāo)信息的功能,且經(jīng)過目標(biāo)位置的比對(duì)驗(yàn)證了本文設(shè)計(jì)軟件的精確性。
圖4 安全控制監(jiān)視軟件顯示情況
本文基于在海上目標(biāo)飛行試驗(yàn)中某些特殊情況下需要人工報(bào)靶的情況,利用MFC 平臺(tái)從信號(hào)流程規(guī)劃、界面設(shè)計(jì)、功能實(shí)現(xiàn)等方面詳細(xì)論述了人工添加目標(biāo)靶信息軟件的設(shè)計(jì)流程,最后通過機(jī)房實(shí)驗(yàn)驗(yàn)證了本文設(shè)計(jì)軟件的可行性,對(duì)于彌補(bǔ)海面監(jiān)視系統(tǒng)通信鏈路故障時(shí)無法自動(dòng)獲取目標(biāo)靶信息這一缺陷具有一定的現(xiàn)實(shí)意義。