閆海卿 李宥謀 李延峰 李曉俊
(西安郵電大學計算機學院 西安 710100)
LXI是成熟的以太網技術在測控自動化領域應用的擴展,是將成熟的以太網技術應用到自動測控系統中,以替代傳統的測試總線技術,隨著信息技術的發展,儀器儀表的測控技術[2]發生了翻天覆地的變化,因此,LXI總線應運而生,LXI測試總線技術是信息化、網絡化發展的必然趨勢,在網絡化的測控系統中,數據通過網絡傳輸到用戶終端,而用戶可以不受時間和空間的限制對系統內的測量儀器進行遠程操控、獲取測量信息[3],LXI網絡儀器是一種以LXI作為儀器內部總線的由不同功能的LXI模塊所組成的新型儀器[4],傳統儀器測量技術存在很多缺陷,容易受到地域或者其他條件的影響,監管和測控不方便,并且儀器不能單獨使用,無法實時監測到數據,如果儀器設備發生故障的時候,無法快速準確定位故障點,還需要人工進行排查,并且也無法對之前采集的數據進行分析與統計。
LXI網絡儀器可以實現遠程實時測控[5]、監管與維護,因此設計一個用戶感覺良好、功能完善的LXI網絡儀器系統的測控平臺具有深遠意義[6],通過該平臺可以將主界面和其他界面相互協作完成對LXI網絡儀器的測量、監管和維護。
該測控平臺在Windows操作系統下完成的,使用C#語言在.NET Framework4.5平臺、Microsoft Vi?sual Studio 2012環境下開發的,在測控平臺主界面中,左側為樹形圖,右側為拓撲圖,本文中的樹形結構[7]主要是利用控件TreeView動態將代理和儀器設備加載到樹形圖,樹形圖和拓撲圖都可以直觀地看到代理和儀器設備的連接情況,但是樹形圖可以直觀地看到父子關系,和書的目錄相似,功能完善,代理和儀器設備都可以通過樹形結構進行動態顯示,連接好的遠端代理和設備的信息都可以通過測控平臺的后臺模塊傳送到測控界面中的MIB信息管理界面進行顯示。
LXI網絡儀器樹形圖,在TreeView控件的基礎上進行設計,樹形圖的設計分為三層,層次結構明確,如圖1所示,左側為樹形圖,右側為拓撲圖[8],本文重點介紹樹形圖,拓撲圖只是簡單說明,樹形圖第一級為根節點,無實際意義,用于連接代理開發板,第二級是代理開發版,用于連接儀器、儀表或者傳感器等設備,第三級就是儀器、儀表或者傳感器等設備,整個三層結構顯示了網路儀器的拓撲層次結構。

圖1 樹形圖的生成
1)當點擊樹形圖上的根節點的時候,會彈出相應的菜單欄,包含刪除和添加菜單項,根節點無實際意義,只起到連接作用,可以在根節點進行添加,將代理節點添加到根節點下,代理最多可添加32個,每個代理下最多可添加四個儀器設備,同時將添加的代理和儀器設備存入數據庫,也可以在根節點處進行刪除操作,刪除根節點下的所有代理節點,同時,數據庫中的信息也進行變化,除了根節點之外,所有數據都將刪除,樹形圖和拓撲圖都動態變化。
2)當右擊代理節點的時候,會彈出相應的菜單欄,包括查看代理信息、配置代理、MIB信息管理、添加組件和刪除組件,對于添加組件和刪除組件項,添加的是代理節點(代理節點最多32個),刪除的是選中的該代理以及該代理下所連接的所有儀器設備,查看代理信息是將數據庫[9~11]中已經存放好的該代理的詳細信息進行顯示,配置代理是將代理的ID編號和MAC地址進行添加,MIB信息管理界面是對MIB節點進行管理,可以獲得代理以及帶代理對應的詳細信息,包括IP地址,可以將儀器設備端的數據通過代理,然后經過后臺處理之后在MIB界面進行顯示。
3)當右擊設備節點的時候,彈出相應的菜單項,包含設備屬性、MIB信息管理、設備配置、刪除節點,因為最多三級節點,因此沒有添加選項,設備屬性是將設備的基本信息顯示出來,設備配置是將設備的基本信息進行保存和刪除,還包括該設備的上一級節點的信息,MIB信息管理可以對儀器設備節點進行管理并將采集的數據通過該節點進行顯示,在TreeView屬性圖上進行添加和刪除組件的操作都會影響數據庫中的數據記錄,操作結果的相關信息會在主界面的運行窗口進行顯示,同時也會影響主界面中的ListView控件中所顯示的信息,與此同時還會影響LXI網絡儀器拓撲圖區域中的拓撲圖的信息顯示,這幾個部分的信息彼此相關聯,無論是樹形圖還是拓撲圖的改變,數據庫和ListView控件中的信息都需要立即進行更新,從而保持數據的一致性。
2.2.1 樹形圖的生成
TreeView樹形圖的生成是監管平臺主控界面的核心功能,實現過程是首先從數據庫t_Running?TreeView表中讀取數據,而該表中的數據來自于中間交互處理模塊對代理開發板的自動發現,然后根據該表的所有信息以及表中節點的ID和PID遞歸的調用自定義的額add_tree()方法,執行該方法的過程中,樹形節點就會逐級的被添加到TreeView控件上,同時也會統計代理和儀器設備的數目。樹形圖的生成過程是首先從數據庫中t_RunningTree?View表中讀取數據并存入DataTable內存數據表中,利用DataTable類對象的Select方法,即Da?taRow[]dr=dt.Select(“pid=”+pid),從根節點開始遞歸,即pid=0的節點開始遍歷dr,每次遍歷實例化新的node對象,用于在樹形圖TreeView中添加新節點,即TreeNode node=new TreeNode(),將 dr對象的每行值與node的相關屬性綁定,再把node節點通過Add方法添加到TreeView控件上,在此過程中要對本局域網中代理總數和儀器設備數目進行統計。生成樹形圖的關鍵代碼為
string ostring=“select*from t_RunningTreeView”;DataSet ds=new DataSet();//實例化數據集
ds=MyMysqlMeans.getDataSet(ostring,“RunningTree?View”);//調用自定義的數據庫公共類的靜態數據方法,返回DataSet對象
DataTable dt=ds.Tables[“RunningTreeView”];//創建DataTable對象
//將t_RunningTreeView表中的代理以及儀器設備動態添加到TreeView控件
add_tree(dt,0,(TreeNode)null,random);//將根節點添加到樹形圖中
private void add_tree(DataTable dt,int pid,TreeNode pNode,Random random)
{//獲取與篩選條件相匹配的所有DataRow對象的數組
DataRow[]dr=dt.Select(“pid=”+pid);
foreach(DataRow row in dr)//遍歷數組dr
{
TreeNode node=new TreeNode();//實例化一個TreeNode節點對象
if(pNode==null)//如果父節點為空,則為根節點root
{
//設置樹節點標簽中顯示的文本,即名稱
node.Text=row[“name”].ToString();
node.Tag=row[“id”].ToString();//設置樹節點的ID編號屬性
node.ImageIndex=0;
node.SelectedImageIndex=0;//選定狀態時的圖像列表索引值
treeView1.Nodes.Add(node);//將創建的節點添加到樹節點集合的末尾
//調用自定義的方法將row行表示的節點項添加到ListView列表控件中
add_listview(row);
//再次遞歸調用自定義的方法,遞歸創建并添加根節點的子節點
add_tree(dt,int.Parse(row[“id”].ToString()),node,ran?dom);
count_nodes++;//節點總數累加
}
else{
//添加當前節點的子節點
node.Text=row[“name”].ToString();
node.Tag=row[“id”].ToString();
int imageIndex=random.Next(1,33);//隨機數
node.ImageIndex=imageIndex;//
node.SelectedImageIndex=imageIndex;
//node.ToolTipText=row[“notes”].ToString();
pNode.Nodes.Add(node);
add_listview(row);
add_tree(dt,int.Parse(row[“id”].ToString()),node,random);
if(node.Level==1)//一級節點
{
agentNum++;//統計代理數目
}
else if(node.Level==2)//節點深度為2,表示代理下面的設備節點
{
devNum++;//儀器設備數目統計
}
count_nodes++;//節點總數累加
}
}
}
2.2.2 樹形圖的動態刷新生成
樹形圖的動態生成實質上是清除已有的樹狀圖和拓撲圖,再將它們重新生成,是根據數據庫表t_RunningTreeView中的數據生成TreeView目錄樹狀圖,再根據TreeView節點的數據繪制樹狀圖和拓撲圖,這樣的缺點是無論樹狀圖和拓撲圖是否發生變化,都要人工去刷新,消耗體力,程序輪詢控制時,在時間間隔上有局限性,要實現動態刷新,更新數據庫表t_RunningTreeView,再進行程序控制的刷新,在動態刷新的時候,樹形圖和拓撲圖自動動態更新,獲取本局域網中動態樹形圖的方法有兩種,方法之間相互協調,共同完成任務,動態樹形圖如圖2所示,具體工作流程[12~13]如下。
1)IP地址自動發現:測控平臺加載之后調用后臺模塊,后臺模塊調用開源DHCP模塊,為代理開發板分配動態分配IP地址,然后后臺將IP地址和MAC地址通過進程間通信socket通信推送到測控平臺,測控平臺創建線程[14]去接收,將接收到的消息通過主界面的運行欄進行顯示,同時將其寫入日志文件,以備后來查看,同時,測控平臺主界面自定義函數getDHCPInfo()中將接收到的MAC地址在數據庫表t_AgentIdMac中進行查詢,如果不存在此MAC地址,則說明該代理不存在,則將該代理添加到此表中,然后在表t_RunningTreeView中通過代理名稱來查詢編號ID,如果不存在,則將該代理的名稱、pid、ip和mac地址添加到此表中,點擊刷新,樹形圖和拓撲圖都發生改變。
2)掃描代理:代理通過DHCP模塊為代理進行IP地址的分配,在主界面創建一個線程scanAgentIp(),測控平臺每隔一定時間去讀取數據庫表t_Run?ningTreeView中所有代理的ID和IP地址,然后通過Ping類和PingReply類與代理的IP地址進行Ping操作,即發送ICMP請求,并獲取ICMP應答狀態,如果應答狀態失敗,則表明此代理不存在,則應該將該代理從數據庫表中刪除,并且將該代理下面的儀器設備進行刪除,如果Ping操作成功,則在數據庫中讀取下一條ID和IP地址的記錄,然后進行和上面同樣的操作。

圖2 代理和儀器連接
LXI網絡儀器測控平臺主界面中的樹形圖和拓撲圖都可以動態顯示代理以及儀器設備,也可以實現動態添加、刪除、查看對應屬性信息,遠端代理和儀器設備的信息獲取是使用的 SNMP[15~16]的 Get和Set操作,用戶可以將遠端數據通過MIB界面進行正確顯示,實現遠程監控和數據查看。
1)當加載此窗體時,窗體在加載的過程中會對DataGridView控件進行自定義設置,例如在該控件中創建復選框列,從數據庫中加載信息,顯示在該控件的指定位置,并進行分頁顯示,在圖3中的MIB表中,可以單擊某行后面的“獲取”或者“設置”按鈕,從而實現對選定行中的OID進行SNMP的“Get”和“Set”操作,也可以在復選框中選擇一個起始的OID,單擊“批量獲取”按鈕進行連續四個OID符號表示的信息的獲取,當點擊“獲取”時,會彈出一個小窗口,需要填充該OID對應的代理的IP地址,可以通過單擊該小窗口上的“自動獲取”按鈕進行快速獲取,然后點擊“提交”按鈕之后,通過中間交互處理模塊即后臺處理模塊向代理發送Get或者Set請求,對于“獲取”、“設置”和“批量設置”操作實現比較復雜,用到數據庫技術、多線程、內存映射文件、socket套接字以及序列化與反序列化操作等,這里不做詳細說明。
2)在實驗中用到的有基于Linux操作系統的開發板、基于μC/OS-II[17]操作系統的開發板、示波器、信號發生器和溫度傳感器等設備,本測試用Linux操作系統的開發板進行測試,5號代理將示波器和傳感器分別接在代理的USB和UART接口上,上圖2中device-5-1和device-5-3分別代表示波器和傳感器分別接入到5號代理的接口1和接口3,選擇OID號為1.3.6.1.4.1.1199.5.1.4.0,表示5號代理第一個接口所連接的設備的第4個屬性。

圖3 MIB信息管理界面
3)在MIB信息表中,選中OID號為1.3.6.1.4.1.1199.5.1.4.0所在的行,點擊“獲取”之后,在圖5所示的窗口點擊自動獲取填充此代理的IP地址,可在MIB信息管理界面看到結果,結果如圖4所示。當點擊該行的“設置”(SNMP協議中的Set),表示對示波器device-5-1的操作,設置其無效值為“5.1E1”,并在信息顯示窗口查看顯示結果,然后再對其設置有效值“5.0E0”,查看設置結果,當點擊“獲取”的時候,兩次設置對比圖分別如圖6和圖7所示。

圖4 “獲取”屬性值

圖5 “設置”屬性值

圖6 第一次設置結果

圖7 第二次設置結果
本文主要研究的是局域網內樹形圖的生成及遠程管理和測量,屬于LXI網絡儀器測控與管理的系統監管平臺項目的一部分,該項目是陜西省重大科技創新專項資助項目,實現了儀器設備的遠程測量與監控,具有創新性和開發的價值,該項目已經成功驗收,測控界面直觀、易操作,達到預期目標。