以太網(wǎng)現(xiàn)場(chǎng)總線的跨平臺(tái)網(wǎng)絡(luò)通信
3、以太網(wǎng)總線的跨平臺(tái)通信研究
3.1、網(wǎng)絡(luò)通信模式
網(wǎng)絡(luò)中存在多種類型的機(jī)器,這些不同類型的機(jī)器表示數(shù)據(jù)的字節(jié)順序是不同的,即主機(jī)字節(jié)順序不同。而網(wǎng)絡(luò)協(xié)議中的數(shù)據(jù)采用統(tǒng)一的網(wǎng)絡(luò)字節(jié)順序,因?yàn)橹挥胁捎媒y(tǒng)一的字節(jié)順序,才能在不同類型的機(jī)器和不同操作系統(tǒng)間進(jìn)行正確地發(fā)送和接收數(shù)據(jù)。進(jìn)行跨平臺(tái)進(jìn)程間的通信時(shí)必須要將字節(jié)序轉(zhuǎn)變成網(wǎng)絡(luò)字節(jié)序進(jìn)行傳遞,并且套接字的建立需要雙方可見(jiàn)的IP地址和端口號(hào)。上位機(jī)同以太網(wǎng)現(xiàn)場(chǎng)總線控制器的通信在傳輸層可以選用TCP或UDP協(xié)議,TCP提供的是面向連接的、可靠的數(shù)據(jù)流傳輸,而UDP提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。由于EAST極向場(chǎng)電源控制系統(tǒng)具有收發(fā)數(shù)據(jù)多為短消息 ,對(duì)響應(yīng)速度要求較高的特點(diǎn),故采用UDP 面向數(shù)據(jù)報(bào)方式。圖三為UDP協(xié)議傳輸下的客戶端/服務(wù)器示意圖.
3.2、Windows平臺(tái)的軟件實(shí)現(xiàn)
Windows平臺(tái)軟件用Visual C++6.0編程,運(yùn)行在Windows2000環(huán)境下。Visual C++6.0的最大的特色就是提供對(duì)面向?qū)ο蠹夹g(shù)的支持,它利用類把大部分與用戶界面設(shè)計(jì)有關(guān)的Windows API函數(shù)封裝起來(lái),通過(guò)MFC (Microsoft Foundation Class)類庫(kù)的方式提供給開(kāi)發(fā)人員使用,大大提高了程序代碼的重用性,其功能幾乎包括了Windows應(yīng)用的各個(gè)方面。Visual C++6.0還支持多任務(wù)、多線程的編程技術(shù)。
CBlockingSocket 是在Visual C++的Winsock API基礎(chǔ)上的一個(gè)簡(jiǎn)單包裝,為輔助線程中的同步編程而設(shè)計(jì)的,其優(yōu)點(diǎn)就是能進(jìn)行對(duì)錯(cuò)誤的異常處理和發(fā)送、接收數(shù)據(jù)的超時(shí)處理。這一點(diǎn)對(duì)極向場(chǎng)電源的實(shí)時(shí)控制反應(yīng)能力尤為重要,應(yīng)此Windows平臺(tái)軟件網(wǎng)絡(luò)部分程序采用CBlockingSocket編寫(xiě)。采用UDP客戶機(jī)模式與現(xiàn)場(chǎng)總線通信,同時(shí)利用輔助線程進(jìn)行具體的接收和處理數(shù)據(jù);部分UDP客戶機(jī)模式代碼如下:
CBlockingSocket sClient;
CSockAddr saServer;
saServer =CSockAddr(ip,port2);
try{
sClient.Create(SOCK_DGRAM);//建立套接字
sClient.Connect(saServer);//連接服務(wù)器
AfxBeginThread(Server1ThreadProc, GetSafeHwnd());//啟動(dòng)接受線程
}
//異常處理
catch(CBlockingSocketException* e){
AfxMessageBox(" error!");
sClient.Cleanup();//關(guān)閉套接字
e->Delete();
}
3.3、QNX平臺(tái)的軟件實(shí)現(xiàn)
QNX6.20是一個(gè)多任務(wù)、分布式、嵌入式、可擴(kuò)展規(guī)模的符合POSIX標(biāo)準(zhǔn)的微內(nèi)核實(shí)時(shí)操作系統(tǒng);其內(nèi)核提供4種服務(wù):進(jìn)程調(diào)度、進(jìn)程間通信、底層網(wǎng)絡(luò)通信和中斷處理;網(wǎng)絡(luò)服務(wù)程序在內(nèi)核外執(zhí)行,為程序員提供了一個(gè)單一化的編程接口,忽略所涉及到的網(wǎng)絡(luò)結(jié)構(gòu)和數(shù)量;QNX6.20系統(tǒng)可以動(dòng)態(tài)的停止和啟動(dòng)網(wǎng)絡(luò)服務(wù)程序。
QNX平臺(tái)軟件采用ANSI C語(yǔ)言、利用QNX6.20特有的函數(shù)和庫(kù)函數(shù)來(lái)編寫(xiě),運(yùn)行在QNX6.20環(huán)境下。采用BSD Socket API作為套接字應(yīng)用程序接口(Socket API)進(jìn)行TCP/IP通信,部分代碼如下:
sock = socket(AF_INET, SOCK_DGRAM, 0); //得到一個(gè)UDP套接字
server.sin_family = AF_INET;
server.sin_addr.s_addr=inet_addr( HOST_FIELD_CTL );
server.sin_port = htons( PORT_FIELD_CTL ); //填充套接字結(jié)構(gòu)
ioctl( sock, FIONBIO, on );//設(shè)置非阻塞的UDP傳送
填充MODBUS/TCP幀結(jié)構(gòu),并調(diào)用sendto()函數(shù)發(fā)送控制量,recvfrom()函數(shù)接收狀態(tài)量即可。
3.4 最佳通信周期的確定
在EAST極向場(chǎng)電源控制系統(tǒng)中,現(xiàn)場(chǎng)總線總是同時(shí)與QNX控制層和WINDOWS監(jiān)控層進(jìn)行數(shù)據(jù)通信,一方面采集現(xiàn)場(chǎng)模擬量和開(kāi)關(guān)量信號(hào)并轉(zhuǎn)換成數(shù)字信號(hào)傳輸?shù)絈NX實(shí)時(shí)層作為計(jì)算機(jī)的反饋輸入信號(hào),接受來(lái)自QNX實(shí)時(shí)控制層的數(shù)據(jù)包,根據(jù)其內(nèi)容控制現(xiàn)場(chǎng)的諸多開(kāi)關(guān)、變壓器、整流器等器件;另一方面還要將采集到的現(xiàn)場(chǎng)模擬量和開(kāi)關(guān)量信號(hào)并轉(zhuǎn)換成數(shù)字信號(hào)傳輸?shù)絎INDOWS監(jiān)控層,用來(lái)監(jiān)控現(xiàn)場(chǎng)設(shè)備的狀態(tài)。在通信過(guò)程中要保證實(shí)時(shí)通信的穩(wěn)定性,不能出現(xiàn)較大的丟包率。為保證上位機(jī)與現(xiàn)場(chǎng)總線可靠的通信,同時(shí)盡量確保其實(shí)時(shí)性,必須找出適當(dāng)?shù)耐ㄐ胖芷凇?BR>實(shí)驗(yàn)方法:首先讓上位機(jī)分別在QNX與WINDOWS下運(yùn)行通信程序,交替發(fā)送0、1數(shù)據(jù)包
到同一數(shù)字量輸出模塊,用示波器測(cè)量模塊的輸出值,以監(jiān)測(cè)數(shù)據(jù)包丟失的情況。同時(shí)不斷更改發(fā)送周期,找出無(wú)掉包率的最小通信時(shí)間,即為最佳通信周期,測(cè)出QNX與WINDOWS單獨(dú)對(duì)現(xiàn)場(chǎng)總線通信時(shí)各自的最佳通信周期. 接著將兩臺(tái)上位機(jī)通過(guò)交換機(jī)實(shí)現(xiàn)與單個(gè)現(xiàn)場(chǎng)總線模塊的連接,讓一臺(tái)上位機(jī)在WINDOWS下不斷發(fā)送1信號(hào),另一上位機(jī)在QNX下發(fā)送0信號(hào)到同一數(shù)字量模塊,重復(fù)單機(jī)情況下的步驟,找到最佳通信周期.(上位機(jī)均采用Pentium 4 1.8GHz , QNX6.20操作系統(tǒng),WINDOWS2K系統(tǒng),以太網(wǎng)現(xiàn)場(chǎng)總線采用WAGO 750系列,SWITCH采用3COM 17206)。
實(shí)驗(yàn)分析:通過(guò)實(shí)驗(yàn)發(fā)現(xiàn)以太網(wǎng)總線雖然通信速度很高100Mb/s,但由于它采用ISO/OSI標(biāo)準(zhǔn)化模型的七層完整結(jié)構(gòu),其協(xié)議復(fù)雜度比起CAN和PROFIBUS等工業(yè)控制總線要復(fù)雜得多,故其發(fā)送方和接收方開(kāi)銷很大。當(dāng)一臺(tái)上位機(jī)對(duì)總線模塊操作時(shí),通信周期為4ms及以上掉包率為0;周期為3ms時(shí)掉包率小于0.1%;周期為2ms時(shí)統(tǒng)計(jì)掉包率為28.9%;可見(jiàn)通信周期必須在3ms以上才能保證通信正常。當(dāng)兩臺(tái)上位機(jī)同時(shí)與總線模塊通信時(shí),要保證控制量和狀態(tài)量數(shù)據(jù)的可靠性,不出現(xiàn)掉包,必然要加大通信周期,當(dāng)然通信周期也必須盡可能的小以兼顧實(shí)時(shí)性。由于WINDOWS層負(fù)責(zé)監(jiān)控,對(duì)實(shí)時(shí)性要求不如QNX實(shí)時(shí)控制層高,因此我們將QNX下通信周期固定為4ms,通過(guò)不斷調(diào)整WINDOWS下的周期來(lái)
分析總線模塊的丟包情況確定最佳通信周期,WINDOWS下通信周期為10ms以上時(shí)丟包率為0,周期為8ms時(shí)丟包率為2.2%,周期為6ms時(shí)丟包率為19.7%。綜合考慮系統(tǒng)可靠性和實(shí)時(shí)性的因素,將QNX層的最佳通信周期定為4ms,WINDOWS層定為10ms.圖4為最佳通信周期下的示波器監(jiān)測(cè)圖。
4 結(jié)論
利用BSD Socket采用API 建立的套接字,使得QNX平臺(tái)同Windows平臺(tái)能同時(shí)與現(xiàn)場(chǎng)總線在基于TCP/IP協(xié)議的網(wǎng)絡(luò)上進(jìn)行通信,并確定了最佳通信周期,滿足系統(tǒng)提出的實(shí)時(shí)性和可靠性要求,為EAST裝置的建立打下堅(jiān)實(shí)的基礎(chǔ)。
參考文獻(xiàn):
[1] 陽(yáng)憲惠. 現(xiàn)場(chǎng)總線技術(shù)及其應(yīng)用. 北京,清華大學(xué)出版社. 1999.6
[2] Rob krten. QNX Operating System Architecture. QNX Software system Itd.2000.2
[3] W.Richard Stevens. 陸雪瑩等譯.TCP/IP 詳解卷2. 機(jī)械工業(yè)出版社. 2000.
[4] 實(shí)時(shí)操作系統(tǒng)QNX中文網(wǎng). http://hichun.nease.net.
[5] Kruglinski D J 潘愛(ài)民,王國(guó)印. Visual C++技術(shù)內(nèi)幕(第四版).北京:清華大學(xué)出版社
評(píng)論