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


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

超時(shí)處理的關(guān)鍵部分實(shí)現(xiàn)程序如下:


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

圖1 監(jiān)控測(cè)試界面
在實(shí)際測(cè)試中對(duì)不同的參數(shù)環(huán)境下做了測(cè)試,以下是其中比較具有代表性的一組測(cè)試。采樣時(shí)間間隔為1s,傳送的數(shù)據(jù)包大小為6000字節(jié),測(cè)試時(shí)間長(zhǎng)達(dá)二十小時(shí)左右。這樣,板卡的網(wǎng)絡(luò)負(fù)載遠(yuǎn)遠(yuǎn)大于實(shí)際工作時(shí)實(shí)時(shí)傳輸數(shù)據(jù)包的大小,測(cè)試的通信周期次數(shù)為八百多萬(wàn)次,得到八萬(wàn)多個(gè)采樣時(shí)間點(diǎn),能夠從所得數(shù)據(jù)來(lái)分析評(píng)估板卡的通信質(zhì)量和通信穩(wěn)定性。通過(guò)每?jī)煞昼姡s120個(gè)采樣數(shù)據(jù)點(diǎn))取平均數(shù),每小時(shí)采取30個(gè)平均時(shí)間點(diǎn),做出的二十張曲線圖,以下摘取的是第一小時(shí)和最后一小時(shí)的兩張圖。
第1小時(shí)數(shù)據(jù)記錄分析圖如圖2所示。

圖2 第1小時(shí)數(shù)據(jù)分析圖
第20小時(shí)左右的數(shù)據(jù)記錄分析圖,如圖3所示。

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