該方法程序通過(guò)C#網(wǎng)絡(luò)編程實(shí)現(xiàn)。通過(guò)加入組播組,接收組播信息,確定信道狀態(tài)并讀取設(shè)備分配頻率值,經(jīng)由該頻率值設(shè)置頻譜模塊中心頻率,采用自動(dòng)跟蹤或手動(dòng)跟蹤方式,將設(shè)備工作信號(hào)置于頻譜中心,從而實(shí)現(xiàn)信號(hào)快速跟蹤。
《當(dāng)代通信》是由信息產(chǎn)業(yè)部主管,中國(guó)通信企業(yè)協(xié)會(huì)主辦,中國(guó)電信博物館承辦的通信類綜合刊物。自1994年創(chuàng)刊以來(lái),因其豐富的內(nèi)容、權(quán)威的報(bào)道,形成了自己的特色和影響。
新型通信裝備,普遍采用網(wǎng)絡(luò)接口集中控制,通過(guò)組播方式定時(shí)播發(fā)狀態(tài)信息,通過(guò)捕獲狀態(tài)信息,可以明確了解設(shè)備工作狀態(tài),通過(guò)單播方式控制設(shè)備工作狀態(tài),從而達(dá)成通信。
本裝置采用捕獲狀態(tài)信息,獲取頻率參數(shù),通過(guò)頻率參數(shù)設(shè)置頻譜模塊中心頻率值,將信號(hào)頻譜置于中心位置觀察,判斷信號(hào)質(zhì)量,達(dá)到檢測(cè)信號(hào)的目的。
1 基本原理
多臺(tái)調(diào)制解調(diào)器的控制網(wǎng)口和頻譜模塊的數(shù)據(jù)網(wǎng)口連接到控制交換機(jī),然后連接到信號(hào)監(jiān)測(cè)計(jì)算機(jī),通過(guò)信號(hào)監(jiān)測(cè)計(jì)算機(jī)程序,捕獲調(diào)制解調(diào)器控制網(wǎng)口的控制信號(hào),解析信號(hào)格式,讀取頻率信息,利用此頻率信息,控制頻譜模塊的中心頻率,將信號(hào)顯示在屏幕中央,以便觀察信號(hào)質(zhì)量。其基本原理如圖1所示。
2 接收組播狀態(tài)信息并提取頻率信息部分關(guān)鍵代碼
通過(guò)定義組播地址和組播端口,加入組播組(注意區(qū)分組播地址端口與單播地址端口的區(qū)別),并接收組播信息[1-3]。
receiveUdpClient = new UdpClient(local_port);
receiveUdpClient.JoinMulticastGroup(multicast_IP);
remoteipendpoint = new IPEndPoint(IPAddress.Any, 0);
Thread threadReceive = new Thread(ReceiveMessage);
threadReceive.Name = "ReceiveThread";
threadReceive.Start();
線程threadReceive中的ReceiveMessage()函數(shù)通過(guò)無(wú)限循環(huán),不斷接收組播信息,并將接收到的十六進(jìn)制信息以ASCII方式顯示出來(lái)。displaytheresult(byte[] test)從接收信息幀中提取信道狀態(tài),顯示在信道狀態(tài)標(biāo)簽中。此處涉及十六進(jìn)制與ASCII碼之間的轉(zhuǎn)換,以及頻率值計(jì)算等幀解析內(nèi)容,是程序的難點(diǎn)之一。
void displaytheresult(byte[] test)
{
if(test[7]==0x93) //幀標(biāo)識(shí)
{ byte tempbyte=test[11]; //信道狀態(tài)
switch( tempbyte)
{ case 0x20:
lbl_status_Text="空閑";
break;
……
}}
if(test[7]==0x97) //幀標(biāo)識(shí)
{ byte[] tempbytes1=new byte[4]; //取接收頻率字節(jié),從15到18字節(jié)
tempbytes1[0] =test[15]; //倒序
tempbytes1[1] =test[16];
tempbytes1[2] =test[17];
tempbytes1[3] =test[18];
uint tempint=System.BitConverter.ToUInt32(tempbytes1,0); //變換為32bits整數(shù)
tempint-=9750000; //頻率變換
lbl_ReceiveFrequency_Text = tempint.ToString();
((Label)(this.Controls.Find(tempstr22, true)[0])).Text = lbl_ReceiveFrequency_Text;
…… //發(fā)送頻率,從19到23字節(jié);通信對(duì)方電話號(hào)碼,從33到36字節(jié)
}}
3 操作頻譜模塊部分關(guān)鍵代碼
第一步、分配頻率組播信息僅僅在分配頻率時(shí)出現(xiàn)一次,因此,頻率信息稍縱即逝,必須持續(xù)監(jiān)聽(tīng)組播信息,獲取分配的頻率值,結(jié)合判斷信道狀態(tài),確定頻率的有效性,如果頻率有效,且獲取了頻率信息,則將頻率值顯示在發(fā)送頻率或接收頻率標(biāo)簽上。
第二、在接收頻率或發(fā)送頻率標(biāo)簽上點(diǎn)擊鼠標(biāo)或設(shè)置為自動(dòng)跟蹤方式,點(diǎn)擊鼠標(biāo)觸發(fā)事件,該事件將標(biāo)簽頻率值設(shè)置為頻譜模塊中心頻率,頻譜模塊的頻譜中心顯示通信信號(hào),通過(guò)該信號(hào)觀察信號(hào)質(zhì)量,從而實(shí)現(xiàn)發(fā)送頻率或接收頻率的快速跟蹤。
頻譜模塊控制采用標(biāo)準(zhǔn)SCPI命令[4-5],但是頻譜控件的操作參考資料少,功能強(qiáng)大,編程使用比較復(fù)雜,是本程序的另一個(gè)難點(diǎn)。
設(shè)置頻譜模塊中心頻率代碼如下。
private void btn_centerfrequency_setup_Click(object sender, EventArgs e)
{double center_freq1 = double.Parse(tbox_centerfrequency.Text);
center_freq1 = center_freq1 * 1000000;
ulong center_freq2 = Convert.ToUInt64(center_freq1);
string center_freq3 = center_freq2.ToString();
string center_freq4 = ":FREQ:CENT " , center_freq3 , '\n';
if (socket != null)
{if (socket.Connected)
{socket.Send(Encoding.ASCII.GetBytes(center_freq4));
readout_x_data();
display_x_data();}}}
設(shè)置頻譜模塊掃寬代碼如下:
private void btn_span_setup_Click(object sender, EventArgs e)
{double span1 = double.Parse(tbox_span.Text);
span1 = span1 * 1000000;
ulong span2 = Convert.ToUInt64(span1);
string span3 = span2.ToString();
string span4 = ":FREQ:SPAN " , span3 , '\n';
if (socket!=null)
{if(socket.Connected)
{ socket.Send(Encoding.ASCII.GetBytes(span4));
readout_x_data();
display_x_data();}}}
參考電平的設(shè)置,沒(méi)有采用設(shè)置頻譜模塊參數(shù)的方式實(shí)現(xiàn),而是直接設(shè)置頻譜控件的Y軸范圍,實(shí)現(xiàn)控制參考電平,其代碼如下所示:
private void btn_reflevel_setup_Click(object sender, EventArgs e)
{int yreflevel = int.Parse(tbox_ref_level.Text);
int ybase = yreflevel - yinterval * 10;
yAxis1.SetMinMax(ybase, yreflevel);}
循環(huán)讀取頻譜模塊頻譜數(shù)據(jù),解析該數(shù)據(jù)并顯示頻譜圖的代碼如下所示:
private void timer1_Tick(object sender, EventArgs e)
{double[] temp_data = new double[601];
if (socket.Connected)
{ socket.Send(Encoding.ASCII.GetBytes(":TRAC:DATA? TRACE1\n"));
temp_data = GetData(); //接收頻譜數(shù)據(jù)
PlotData(temp_data); //繪制頻譜圖
value_display(); //MARKER動(dòng)態(tài)顯示
if(peak_enable) //峰值搜索
{peak_x = getmaxandindex(temp_data);
xyCursor1.XPosition = peak_x;
peak_enable = false; }}}
4 結(jié)論
該方法程序運(yùn)行結(jié)果如圖2所示。
該方法程序還具有存儲(chǔ)頻譜圖片功能、頻譜錄像及回放功能、標(biāo)識(shí)讀數(shù)功能、峰值搜索功能等頻譜模塊常用功能,便于在快速跟蹤信號(hào)頻率的基礎(chǔ)上,達(dá)到快速判斷信號(hào)質(zhì)量的目的。該程序?qū)嶋H使用穩(wěn)定可靠,跟蹤快速,達(dá)到任務(wù)目的。
參考文獻(xiàn):
[1] 張景峰,鄒澎濤.C#中實(shí)現(xiàn)IP組播的關(guān)鍵技術(shù)[J].電腦開(kāi)發(fā)與應(yīng)用,2007(9):67-68.
[2] 陳建華.C#中利用UDP協(xié)議實(shí)現(xiàn)信息的廣播和組播[J].軟件,2011(11):4-6.
[3] 管麗娜.基于C#的IP組播通信應(yīng)用設(shè)計(jì)與實(shí)現(xiàn)[J]. 河北省科學(xué)院學(xué)報(bào),2007(3):12-16.
[4] 秦凡,韋高.基于VISA庫(kù)及SCPI命令的儀器程控測(cè)量[J].現(xiàn)代電子技術(shù),2011(11):118-120.
[5] 徐宙,劉連照,程彥杰,等.基于C#的數(shù)字存儲(chǔ)示波器控制軟件設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)量與測(cè)試技術(shù),2016(2):53-55.
論文指導(dǎo) >
SCI期刊推薦 >
論文常見(jiàn)問(wèn)題 >
SCI常見(jiàn)問(wèn)題 >