該方法程序通過C#網絡編程實現。通過加入組播組,接收組播信息,確定信道狀態并讀取設備分配頻率值,經由該頻率值設置頻譜模塊中心頻率,采用自動跟蹤或手動跟蹤方式,將設備工作信號置于頻譜中心,從而實現信號快速跟蹤。
《當代通信》是由信息產業部主管,中國通信企業協會主辦,中國電信博物館承辦的通信類綜合刊物。自1994年創刊以來,因其豐富的內容、權威的報道,形成了自己的特色和影響。
新型通信裝備,普遍采用網絡接口集中控制,通過組播方式定時播發狀態信息,通過捕獲狀態信息,可以明確了解設備工作狀態,通過單播方式控制設備工作狀態,從而達成通信。
本裝置采用捕獲狀態信息,獲取頻率參數,通過頻率參數設置頻譜模塊中心頻率值,將信號頻譜置于中心位置觀察,判斷信號質量,達到檢測信號的目的。
1 基本原理
多臺調制解調器的控制網口和頻譜模塊的數據網口連接到控制交換機,然后連接到信號監測計算機,通過信號監測計算機程序,捕獲調制解調器控制網口的控制信號,解析信號格式,讀取頻率信息,利用此頻率信息,控制頻譜模塊的中心頻率,將信號顯示在屏幕中央,以便觀察信號質量。其基本原理如圖1所示。
2 接收組播狀態信息并提取頻率信息部分關鍵代碼
通過定義組播地址和組播端口,加入組播組(注意區分組播地址端口與單播地址端口的區別),并接收組播信息[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()函數通過無限循環,不斷接收組播信息,并將接收到的十六進制信息以ASCII方式顯示出來。displaytheresult(byte[] test)從接收信息幀中提取信道狀態,顯示在信道狀態標簽中。此處涉及十六進制與ASCII碼之間的轉換,以及頻率值計算等幀解析內容,是程序的難點之一。
void displaytheresult(byte[] test)
{
if(test[7]==0x93) //幀標識
{ byte tempbyte=test[11]; //信道狀態
switch( tempbyte)
{ case 0x20:
lbl_status_Text="空閑";
break;
……
}}
if(test[7]==0x97) //幀標識
{ byte[] tempbytes1=new byte[4]; //取接收頻率字節,從15到18字節
tempbytes1[0] =test[15]; //倒序
tempbytes1[1] =test[16];
tempbytes1[2] =test[17];
tempbytes1[3] =test[18];
uint tempint=System.BitConverter.ToUInt32(tempbytes1,0); //變換為32bits整數
tempint-=9750000; //頻率變換
lbl_ReceiveFrequency_Text = tempint.ToString();
((Label)(this.Controls.Find(tempstr22, true)[0])).Text = lbl_ReceiveFrequency_Text;
…… //發送頻率,從19到23字節;通信對方電話號碼,從33到36字節
}}
3 操作頻譜模塊部分關鍵代碼
第一步、分配頻率組播信息僅僅在分配頻率時出現一次,因此,頻率信息稍縱即逝,必須持續監聽組播信息,獲取分配的頻率值,結合判斷信道狀態,確定頻率的有效性,如果頻率有效,且獲取了頻率信息,則將頻率值顯示在發送頻率或接收頻率標簽上。
第二、在接收頻率或發送頻率標簽上點擊鼠標或設置為自動跟蹤方式,點擊鼠標觸發事件,該事件將標簽頻率值設置為頻譜模塊中心頻率,頻譜模塊的頻譜中心顯示通信信號,通過該信號觀察信號質量,從而實現發送頻率或接收頻率的快速跟蹤。
頻譜模塊控制采用標準SCPI命令[4-5],但是頻譜控件的操作參考資料少,功能強大,編程使用比較復雜,是本程序的另一個難點。
設置頻譜模塊中心頻率代碼如下。
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();}}}
設置頻譜模塊掃寬代碼如下:
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();}}}
參考電平的設置,沒有采用設置頻譜模塊參數的方式實現,而是直接設置頻譜控件的Y軸范圍,實現控制參考電平,其代碼如下所示:
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);}
循環讀取頻譜模塊頻譜數據,解析該數據并顯示頻譜圖的代碼如下所示:
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(); //接收頻譜數據
PlotData(temp_data); //繪制頻譜圖
value_display(); //MARKER動態顯示
if(peak_enable) //峰值搜索
{peak_x = getmaxandindex(temp_data);
xyCursor1.XPosition = peak_x;
peak_enable = false; }}}
4 結論
該方法程序運行結果如圖2所示。
該方法程序還具有存儲頻譜圖片功能、頻譜錄像及回放功能、標識讀數功能、峰值搜索功能等頻譜模塊常用功能,便于在快速跟蹤信號頻率的基礎上,達到快速判斷信號質量的目的。該程序實際使用穩定可靠,跟蹤快速,達到任務目的。
參考文獻:
[1] 張景峰,鄒澎濤.C#中實現IP組播的關鍵技術[J].電腦開發與應用,2007(9):67-68.
[2] 陳建華.C#中利用UDP協議實現信息的廣播和組播[J].軟件,2011(11):4-6.
[3] 管麗娜.基于C#的IP組播通信應用設計與實現[J]. 河北省科學院學報,2007(3):12-16.
[4] 秦凡,韋高.基于VISA庫及SCPI命令的儀器程控測量[J].現代電子技術,2011(11):118-120.
[5] 徐宙,劉連照,程彥杰,等.基于C#的數字存儲示波器控制軟件設計與實現[J].計量與測試技術,2016(2):53-55.
論文指導 >
SCI期刊推薦 >
論文常見問題 >
SCI常見問題 >