何俊杰,蔣知峰,方江龍
HE Jun-jie1, JIANG Zhi-feng2, FANG Jiang-long2
(1. 上海理工大學 機械工程學院,上海 200090;2. 上海開通數控有限公司,上海 200233)
以太網在信息網絡中得到了廣泛的應用。將以太網應用到工控領域,首先要求數據傳輸具有更好的實時性,其次還強調在工業環境下數據傳輸的正確性和穩定性。目前在工控嵌入式領域,網絡通信通常采用UDP或TCP協議。UDP與TCP相比,UDP使用非連接的、不可靠的通信方式,因此網絡傳輸速度快,實時性相對較好[1]。實際上,在控制現場級的工業以太網中,只要沒有硬件錯誤,非連接的數據通信通常能夠順利完成,并且與TCP 相比具備更好的實時性。當UDP不能通信時,TCP 同樣面臨通信中斷[2]。本文采用UDP通信協議編程,通過對丟包率、出錯率和長時間工作下板卡網絡的穩定性來分析判斷嵌入式網絡通信質量的高低。
選用兩塊相同型號的嵌入式主板作為測試平臺,兩塊主板采用相同的嵌入式操作系統,一塊作為服務器,另一塊作為客戶端;客戶端循環發送指定的報文到服務器,服務器接收到正確的報文后給客戶端以確認報文。通過循環檢測通信的質量判斷網絡通信質量。
實際測試的研華PCM-3343主板是應用在機床數控系統的核心板卡,軟件環境是嵌入式的Windows CE操作系統并且移植了.NET環境。具體的測試方法是取同一型號相同軟件環境的兩塊嵌入式板卡,一塊作為客戶端,一塊作為服務器。網絡負載通過發送數據包的大小來控制,負載越大通信周期越長。通過測試主機和客戶端在一定的網絡負載下,板卡長時間工作下的穩定性、丟包率和出錯率的高低來檢測評估被測板卡網絡通信質量的高低。
在具體實際測試中,由于嵌入式Windows CE系統和.NET環境已經移植在被測板卡上,因此可以使用C#中ms級的timer控件來測量通信周期時間的長短,但在實際應用中卻無法獲得精確的時間。在實驗測試中,發送1400字節大小的數據包時,時間通常記錄為0或是1ms,不能獲得精確的時間。查閱了相關資料,可以采用以下兩個函數QueryPerformanceCounter() 和QueryPerformanceFrequency() 來獲得高精度計時。QueryPerformanceCounter()這個函數返回高精確度性能計數器的值,它可以以微妙為單位計時。但是QueryPerformanceCounter()確切的精確計時的最小單位是與系統有關的,所以,必須要查詢系統以得到QueryPerformanceCounter()返回的嘀噠聲的頻率。QueryPerformanceFrequency()提供了這個頻率值,返回每秒嘀噠聲的個數。這樣就能獲得詳細的時間信息,用時間記錄數值來反應嵌入式板卡的通信質量。實際測試中數值處理以ms為單位,取值保留精確到小數點后三位,能夠滿足測試的時間精度要求。
采樣時間可通過Timer控件來實現。長時間工作下,ms級的精度完全可以滿足采樣時間間隔的要求。
應用在嵌入式環境中,測試通信時間的部分程序代碼如下:


UDP通信協議采用三種通信方式:單播、廣播和組播。因為本實驗只有直連的兩塊板卡,因此采用單播——客戶機/服務器模型。在數據交互通信的過程中,如果發送的數據包丟失或是損壞,導致服務器無法接收到數據包,此時客戶機和服務器均處于等待接收數據包狀態,為了防止出現雙方均等待接收的狀態,采用的超時的思想來處理。當客戶機發出數據包后超過一定的時間沒有收到返回的數據包時,客戶機重新發送數據包,以此來防止出現雙方都等待接收數據包的狀態。在嵌入式的.NET環境中,所能用的API有限,超時的編程不能通過.NET環境的類庫來實現,因此本實驗通過使用調用動態鏈接庫的思想來對底層的超時通信所用的函數做封裝。底層超時編程具體實現是通過select()函數和一些宏定義如FD_ISSET、FD_SET等函數來實現。select()函數用于確定套接口的狀態,超時則返回0;出錯返回SOCKET_ERROR錯誤,可通過WSAGetLastError獲取相應錯誤代碼;依舊是1的位就是準備好的描述符,可以通過函數FD_ISSET來檢測。動態鏈接庫底層的函數的導出編程如下:

超時處理的關鍵部分實現程序如下:


用此方法可以達到防止出現服務器和客戶機都處于接收等待狀態的目的。在實際應用測試中,由于設置的超時時間遠遠比數據包傳輸周期要長的多,因此除了監控界面,從時間數據上也很容易區分當時網絡的狀態。
由于已經在嵌入式板卡上移植了Windows CE操作系統和.NET類庫,因此監控測試界面可以利用C#來編寫。IP地址是通過編程直接顯示的,為了能夠達到靈活測試的目的,界面除了使用Label控件來命名標簽外,具體參數均使用TextBox控件來顯示和修改。底層程序通過讀取上層界面的參數來配置底層的參數。這樣做的好處的是編寫好程序后,底層程序不需要修改,只要修改界面參數就能完成不同參數環境的測試。
當在通信過程中出現丟包和數據包出錯情形,除了在界面中“網絡狀態”對應的TextBox控件中實時顯示外,均在文檔中記錄發生的時間、次數等信息。
每次通信周期的時間值都會實時的顯示在界面右下角最大的TextBox控件中。當記錄信息超過二十條時,清空控件重新記錄。當到達采樣時間時,記錄文檔的同時,并計算采樣時間間隔內所有通信周期數值的平均時間值,同時顯示在界面“周期時間顯示”欄對應的TextBox控件中。
編寫的監控測試界面在PC機上模擬運行測試中的截圖如圖1所示。

圖1 監控測試界面
在實際測試中對不同的參數環境下做了測試,以下是其中比較具有代表性的一組測試。采樣時間間隔為1s,傳送的數據包大小為6000字節,測試時間長達二十小時左右。這樣,板卡的網絡負載遠遠大于實際工作時實時傳輸數據包的大小,測試的通信周期次數為八百多萬次,得到八萬多個采樣時間點,能夠從所得數據來分析評估板卡的通信質量和通信穩定性。通過每兩分鐘(約120個采樣數據點)取平均數,每小時采取30個平均時間點,做出的二十張曲線圖,以下摘取的是第一小時和最后一小時的兩張圖。
第1小時數據記錄分析圖如圖2所示。

圖2 第1小時數據分析圖
第20小時左右的數據記錄分析圖,如圖3所示。

圖3 第20小時左右數據分析圖
通過分析長時間工作下采樣時間值的波動、出錯率和丟包率來判斷網絡通信質量的高低。本次實驗在八百多萬次的測試中,丟包9次,出錯2次,正確的穩定傳送率在99.999%以上,通過圖表分析通信周期時間為12.973ms左右,時間波動在0.148ms左右,通信穩定性較好,通過測試得到的數值分析判斷此板卡的通信質量較高。
本文嘗試使用UDP網絡通信協議,通過軟件編程的方法來檢測在一定的網絡負載下,工控嵌入式板卡網絡通信長時間工作下,通信質量的高低。經過對研華PCM-3343板卡的實驗驗證分析,此方法能夠達到測試嵌入式板卡通信質量的目的。
[1]蕭文龍, 林松儒. TCP/IP最佳入門[M]. 北京: 機械工業出版社, 2006.
[2]吉順平, 陸宇平. 基于UDP/IP 的工業以太網絡通信協議的設計[J]. 信息與控制, 2008, 37(5): 562-563.
[3]黃靜, 李銘. C#高級編程(第6版)[M]. 北京: 清華大學出版社, 2008.
[4]陳健, 宋健建. Linux程序設計(第4版)[M]. 北京: 人民郵電出版社, 2010.
[5]呂秀鋒, 黃倩. C語言程序設計現代方法(第2版)[M]. 北京: 人民郵電出版社, 2010.