(哈爾濱工業(yè)大學(xué)航天學(xué)院,黑龍江 哈爾濱 150001)
在工業(yè)自動化檢測系統(tǒng)中,為了實(shí)現(xiàn)對現(xiàn)場作業(yè)的遠(yuǎn)程監(jiān)控,大量的現(xiàn)場傳感器數(shù)據(jù)和狀態(tài)信息需要通過網(wǎng)絡(luò)傳輸給遠(yuǎn)程監(jiān)控站;監(jiān)控站發(fā)出的控制指令也需要通過網(wǎng)絡(luò)發(fā)送給現(xiàn)場控制站,進(jìn)行遠(yuǎn)程控制。因此,網(wǎng)絡(luò)通信在工業(yè)自動化檢測系統(tǒng)中有著廣泛的應(yīng)用。為了實(shí)現(xiàn)現(xiàn)場控制站和遠(yuǎn)程監(jiān)控站之間的數(shù)據(jù)快速、高效和可靠傳輸,需要針對具體的應(yīng)用場合設(shè)計相應(yīng)的網(wǎng)絡(luò)通信模塊,不同的檢測系統(tǒng)需要設(shè)計不同的網(wǎng)絡(luò)通信模塊。這無疑加大了工作量,增加了檢測系統(tǒng)軟件開發(fā)的周期[1]。現(xiàn)有的一些網(wǎng)絡(luò)通信模塊在數(shù)據(jù)傳輸效率和可靠性方面均存在問題,如數(shù)據(jù)丟失和傳輸錯誤等[2]。
本文設(shè)計了一種通用網(wǎng)絡(luò)通信模塊,能實(shí)現(xiàn)兩種通信協(xié)議,可在多種自動化檢測系統(tǒng)中實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的遠(yuǎn)程傳輸。將該網(wǎng)絡(luò)通信模塊在電池極板厚度檢測系統(tǒng)中進(jìn)行實(shí)際測試,測試結(jié)果表明,該網(wǎng)絡(luò)通信模塊能適應(yīng)不同應(yīng)用背景需要,保證數(shù)據(jù)高效可靠傳輸。
通信協(xié)議是客戶端與服務(wù)器進(jìn)行會話的語言,因此它必須承載雙方都能識別的通信信息,實(shí)現(xiàn)二者之間的信息交互。網(wǎng)絡(luò)通信中最主要的工作是制定合理的通信協(xié)議,以便使客戶端與服務(wù)器之間通過簡潔、清晰和明確的語言實(shí)現(xiàn)順暢的通信功能[3]。
網(wǎng)絡(luò)數(shù)據(jù)的交互通常是按照數(shù)據(jù)幀的形式發(fā)送的。數(shù)據(jù)幀可以分為可擴(kuò)展標(biāo)記語言(extensible markup language,XML)形式和二進(jìn)制形式。XML形式的數(shù)據(jù)幀每個字符均采用ASCII編碼,這使得傳輸相同數(shù)據(jù)量的數(shù)據(jù)時占用的空間大,通信效率低;而二進(jìn)制形式的數(shù)據(jù)幀則將數(shù)據(jù)按字節(jié)發(fā)送。因此,在相同的數(shù)據(jù)幀長度條件下,后者能攜帶更多的數(shù)據(jù)信息,通信效率高。
XML通過使用一系列簡單的標(biāo)記符對數(shù)據(jù)進(jìn)行描述,而這些標(biāo)記符可以用簡便的方式來建立[4]。XML形式的網(wǎng)絡(luò)通信協(xié)議的格式設(shè)計如下[5]。
……
二進(jìn)制方式的網(wǎng)絡(luò)通信,數(shù)據(jù)以字節(jié)為單位傳輸,一幀數(shù)據(jù)幀包含幀頭、幀類型、數(shù)據(jù)字節(jié)數(shù)、數(shù)據(jù)部分、校驗(yàn)字節(jié)和幀尾。幀頭和幀尾表示一幀數(shù)據(jù)的開始和結(jié)束,幀類型表示該數(shù)據(jù)幀的含義和用途。數(shù)據(jù)字節(jié)部分表示該數(shù)據(jù)幀攜帶的數(shù)據(jù)字節(jié)數(shù)。此外,為防止數(shù)據(jù)在發(fā)送和接收過程中由于網(wǎng)絡(luò)異常導(dǎo)致的傳輸錯誤,設(shè)置了校驗(yàn)字節(jié)。通過在數(shù)據(jù)幀發(fā)送時填充檢驗(yàn)字節(jié)、接收時檢驗(yàn)校驗(yàn)字節(jié),防止數(shù)據(jù)傳輸錯誤。在數(shù)據(jù)幀中,有效信息是數(shù)據(jù)部分,數(shù)據(jù)部分的含義依賴于網(wǎng)絡(luò)通信應(yīng)用的具體場合,由用戶指定。在實(shí)際制定通信協(xié)議時,可以將幀頭字節(jié)、幀尾字節(jié)、需要用到的幀類型、數(shù)據(jù)字節(jié)數(shù)、幀類型數(shù)、是否有校驗(yàn)字節(jié)等信息寫入配置文件,供網(wǎng)絡(luò)通信模塊讀取。
本文運(yùn)用面向?qū)ο蟮乃枷朐O(shè)計網(wǎng)絡(luò)通信模塊。首先,需要了解功能性需求,進(jìn)行需求分析。網(wǎng)絡(luò)通信模塊統(tǒng)一建模語言(unified modeling language,UML)用例圖如圖1所示。各用例之間的關(guān)系為包含關(guān)系。

圖1 網(wǎng)絡(luò)通信模塊UML用例圖
網(wǎng)絡(luò)通信模塊設(shè)計步驟如下。
首先,完成網(wǎng)絡(luò)消息數(shù)據(jù)的接收。在客戶端服務(wù)器模式下,一個服務(wù)器可以連接多個客戶端。為了將來自不同客戶端的網(wǎng)絡(luò)數(shù)據(jù)區(qū)分開,需要為每一個連接上的客戶端創(chuàng)建一個存儲單元,稱為消息受體類。消息受體類的一個對象對應(yīng)一個連接的客戶端。當(dāng)該客戶端連接時,創(chuàng)建消息受體;客戶端斷開時,銷毀消息受體。而對客戶端而言,由于客戶端只能接收服務(wù)器的消息,因此只需要一個消息受體即可。
其次,建立和維護(hù)消息隊列。在服務(wù)器端,由于同時接收不同客戶端(用IP地址和端口號標(biāo)志)的網(wǎng)絡(luò)消息,需要從不同客戶端對應(yīng)的消息受體中取出消息進(jìn)行解析后再放到消息隊列中。服務(wù)器消息隊列的每一條消息不僅包含了消息類型和消息內(nèi)容,也包含了該消息的源IP地址和源端口號。在客戶端,消息隊列僅存放其所連接的服務(wù)器發(fā)送的消息類型和消息內(nèi)容,不再存放服務(wù)器的IP地址和端口號。存儲在消息隊列中的網(wǎng)絡(luò)消息由上層模塊取出并進(jìn)行數(shù)據(jù)處理或其他動作。
最后,完成網(wǎng)絡(luò)消息的封裝和解析。在數(shù)據(jù)的發(fā)送端,需要對發(fā)送的數(shù)據(jù)按照指定的網(wǎng)絡(luò)協(xié)議進(jìn)行封裝,然后發(fā)送到網(wǎng)絡(luò)中;在數(shù)據(jù)的接收端,收到的數(shù)據(jù)需要按照網(wǎng)絡(luò)通信協(xié)議進(jìn)行解析,提取出消息體、消息類型、消息子類型和數(shù)據(jù)。在模塊設(shè)計時,通過消息文本封裝和解析類實(shí)現(xiàn)消息的封裝和解析,實(shí)現(xiàn)消息提取、消息解析和消息打包等功能[6]。
在數(shù)據(jù)的發(fā)送端,需要將待發(fā)送的數(shù)據(jù)按照上述通信協(xié)議進(jìn)行打包,封裝成數(shù)據(jù)幀。合理的打包方式可以大大緩解網(wǎng)絡(luò)通信的負(fù)荷量。通信協(xié)議的打包方式一般可以分為固定長度打包和動態(tài)長度打包兩種方式。這兩種方式具體介紹如下。
固定長度打包方式對于協(xié)議的解析來說比較方便,按照固定的位置獲取相應(yīng)的信息即可,但是,包的長度要以最長的那條協(xié)議為基準(zhǔn)。這使得每條協(xié)議的傳輸都要占用最大的網(wǎng)絡(luò)通信量,大大增加了網(wǎng)絡(luò)通信的負(fù)荷壓力,而且不具備通用性。
動態(tài)長度打包方式能夠根據(jù)當(dāng)前所需的協(xié)議長度進(jìn)行打包,可以占用最少的空間,大大緩解了網(wǎng)絡(luò)通信的負(fù)荷壓力。但是對于協(xié)議的解析比較麻煩,必須根據(jù)協(xié)議的格式對每個協(xié)議包進(jìn)行動態(tài)解析,從而也就具備了通用性[7]。
綜合考慮,采用動態(tài)打包方式,在保證模塊通用性的同時,提高網(wǎng)絡(luò)通信的效率。
可擴(kuò)展標(biāo)記語言(XML)通信協(xié)議的數(shù)據(jù)幀打包流程圖如圖2所示,打包的過程主要是將數(shù)據(jù)轉(zhuǎn)化為字符串的過程。首先,加入數(shù)據(jù)幀頭和幀尾標(biāo)志符;然后,在它們中間加入消息類型、子類型標(biāo)志符,并設(shè)置消息參數(shù);最后,填充數(shù)據(jù)部分,數(shù)據(jù)的含義用數(shù)據(jù)頭標(biāo)志符和數(shù)據(jù)尾標(biāo)志符表示。

圖2 XML協(xié)議網(wǎng)絡(luò)消息打包流程圖
二進(jìn)制協(xié)議的消息打包流程為:加入幀頭數(shù)據(jù),添加幀類型和數(shù)據(jù)字節(jié)數(shù),填充數(shù)據(jù)部分;根據(jù)協(xié)議中有無校驗(yàn)字節(jié)填寫校驗(yàn)字節(jié),添加幀尾字節(jié)。這樣即完成網(wǎng)絡(luò)數(shù)據(jù)打包操作。
客戶端或者服務(wù)器收到對方發(fā)來的消息包后,除明白對方要傳達(dá)的信息外,還必須對網(wǎng)絡(luò)消息進(jìn)行解析。
XML協(xié)議的網(wǎng)絡(luò)消息解析的主要步驟如下:首先,從消息受體中提取一條完整的消息;然后,進(jìn)行消息格式轉(zhuǎn)化;最后,提取出消息類型、子類型、消息內(nèi)容等信息,并存入消息隊列。
XML協(xié)議網(wǎng)絡(luò)消息解析流程如圖3所示。

圖3 XML協(xié)議網(wǎng)絡(luò)消息解析流程圖
在服務(wù)器端,來自不同客戶端的網(wǎng)絡(luò)消息分別存儲在與之對應(yīng)的消息受體里。在該消息受體里,定義了一個原始消息隊列。由于TCP/IP協(xié)議的數(shù)據(jù)分片、網(wǎng)絡(luò)擁塞和路由差異等,使得同一個消息包可能分幾次到達(dá),也可能造成消息包的丟失,因此,在從消息受體里讀取一條完整的消息時,需要考慮如下情況[8-9]。
① 存在有效的消息包頭標(biāo)志符,但是不存在消息包尾標(biāo)志符。這可能是消息包在傳輸過程中丟失了部分內(nèi)容或者是消息包分成了兩條網(wǎng)絡(luò)消息進(jìn)行傳輸。判斷是哪種情況需要接著從原始消息隊列中讀取下一條信息。將讀取的下一條信息和前一條不存在消息包尾標(biāo)志符的信息合并,然后對合并后的消息信息進(jìn)行解析,直到根據(jù)協(xié)議格式找到有效的消息包。
② 存在有效的消息包尾標(biāo)志符,但是不存在消息包頭標(biāo)志符。這說明該條消息不是完整的消息包,因此不對此條信息進(jìn)行進(jìn)一步處理,直接從消息隊列中刪除即可,接著讀取下一條信息并進(jìn)行解析。
③ 既存在有效的消息包頭標(biāo)志符,又存在有效的消息包尾標(biāo)志符。此時還需根據(jù)協(xié)議內(nèi)容判斷該消息包實(shí)際的大小是否等于協(xié)議中指定的大小。若不相等,說明在傳輸過程中消息包的部分內(nèi)容已經(jīng)丟失,直接拋棄該消息包,繼續(xù)等待新消息的到來。
④ 如果不存在上述情況,則接收該數(shù)據(jù)包并存入消息受體;并根據(jù)通信協(xié)議對收到的數(shù)據(jù)包內(nèi)容進(jìn)行進(jìn)一步解析,從消息體中解析出消息類型、子類型和數(shù)據(jù)部分。
二進(jìn)制協(xié)議的消息解析,也需要進(jìn)行同樣的處理,即從消息受體中提取出一條完整的消息并實(shí)現(xiàn)消息的解析。二進(jìn)制協(xié)議網(wǎng)絡(luò)消息解析流程圖如圖4所示。流程簡要說明如下。
首先,檢查消息受體中的數(shù)據(jù)字節(jié)數(shù)是否大于幀頭字節(jié)數(shù),如果字節(jié)數(shù)不足,則停止解析,繼續(xù)接收新的數(shù)據(jù)。如果幀頭解析正確,則檢查幀類型是否為給定的幀類型。如果幀類型未定義,則擦除消息受體中的一個字節(jié)的數(shù)據(jù),并重新尋找?guī)^字節(jié)。如果幀類型合法,則根據(jù)協(xié)議中的數(shù)據(jù)幀長度字節(jié)指定的數(shù)據(jù)字節(jié)數(shù)接收數(shù)據(jù),并接收校驗(yàn)字節(jié)和幀尾字節(jié)。如果校驗(yàn)字節(jié)出錯或幀尾出錯,則擦除消息受體中的一個字節(jié)的數(shù)據(jù)后重新尋找?guī)^字節(jié)。如果檢查無誤,則完成一幀數(shù)據(jù)的解析,將幀類型、數(shù)據(jù)字節(jié)數(shù)、數(shù)據(jù)部分、客戶端IP地址和端口號組合成消息對象,壓入消息隊列,由上層程序取出作進(jìn)一步處理。
在二進(jìn)制協(xié)議的網(wǎng)絡(luò)消息解析過程中,一旦出現(xiàn)錯誤,則擦除消息受體中的一個字節(jié)的數(shù)據(jù),然后從幀頭開始重新解析,這樣最大限度地降低了數(shù)據(jù)幀的丟失。同時,通過設(shè)置檢驗(yàn)字節(jié)和幀頭幀尾字節(jié),以較小的附加傳輸代價保證了數(shù)據(jù)傳輸?shù)目煽啃訹10]。

圖4 二進(jìn)制協(xié)議網(wǎng)絡(luò)消息解析流程圖
在激光厚度檢測系統(tǒng)中,需要對現(xiàn)場電池極板厚度進(jìn)行遠(yuǎn)程實(shí)時監(jiān)控,并實(shí)時調(diào)整涂布機(jī)刮刀位置,以保證涂布厚度的均勻性[11]。為此,需要設(shè)置現(xiàn)場服務(wù)器和遠(yuǎn)程客戶端,通過網(wǎng)絡(luò)對現(xiàn)場生產(chǎn)狀況進(jìn)行遠(yuǎn)程監(jiān)控[12]。
現(xiàn)場控制站將激光傳感器厚度數(shù)據(jù)發(fā)送給服務(wù)器,服務(wù)器將數(shù)據(jù)打包后發(fā)送給客戶端。客戶端進(jìn)行數(shù)據(jù)處理,顯示測量結(jié)果,并將處理后的厚度信息發(fā)送給現(xiàn)場服務(wù)器進(jìn)行存儲。
在制定好通信協(xié)議后,基于上述網(wǎng)絡(luò)通信模塊,編寫了上層程序,從而在客戶端實(shí)現(xiàn)了數(shù)據(jù)的處理和顯示,在服務(wù)器端實(shí)現(xiàn)了數(shù)據(jù)存儲。
實(shí)際測試表明,運(yùn)用該網(wǎng)絡(luò)通信模塊能實(shí)現(xiàn)可靠的網(wǎng)絡(luò)數(shù)據(jù)傳輸,保證了網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)挠行院涂煽啃浴?/p>
本文基于C++ Builder的開發(fā)環(huán)境設(shè)計了一種通用的網(wǎng)絡(luò)通信模塊,在XML和二進(jìn)制不同數(shù)據(jù)傳輸方式下,實(shí)現(xiàn)了網(wǎng)絡(luò)通信協(xié)議的制定、數(shù)據(jù)的打包和解析算法,并在電池極板涂布厚度檢測系統(tǒng)中加以測試。該模塊具有以下優(yōu)點(diǎn)。
① 在檢測系統(tǒng)中運(yùn)用該模塊時,上層程序只需要制定具體的通信協(xié)議即可實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸,不需要考慮底層數(shù)據(jù)傳輸格式。
② 通用性好。能用于不同功能需求的自動化檢測系統(tǒng)中,大大降低了軟件開發(fā)的周期和難度。
③ 數(shù)據(jù)傳輸可靠,丟包率小。該網(wǎng)絡(luò)通信模塊能保證客戶端和服務(wù)器數(shù)據(jù)可靠傳輸,以較小的丟包率實(shí)現(xiàn)雙方數(shù)據(jù)交互,在工業(yè)自動化檢測系統(tǒng)中有著廣泛的應(yīng)用。
[1] 張明杰.遠(yuǎn)程視頻監(jiān)控系統(tǒng)中網(wǎng)絡(luò)通信模塊的設(shè)計[J].工礦自動化,2009(1):88-89.
[2] 徐愛華,全書海.Socket網(wǎng)絡(luò)通信及其在電梯監(jiān)控系統(tǒng)中的應(yīng)用[J].武漢理工大學(xué)學(xué)報,2006,28(11):56-57.
[3] 汪水華.基于C++ Builder的網(wǎng)絡(luò)數(shù)據(jù)傳輸軟件的開發(fā)[J].交通與計算機(jī),2003,21(2):77-79.
[4] 習(xí)博,方彥軍.工業(yè)以太網(wǎng)中網(wǎng)絡(luò)通信技術(shù)的研究[J].微計算機(jī)信息,2005,21(2):147-149.
[5] Anthony L A.Using XML transactions to perform closed-loop diagnostics in network centric support environments[J].Autotestcon,2005,28(4):707-713.
[6] Frantisek B.Optimizing client-server communication for remote spatial database access[D].Washington:University of Maryland,2005.
[7] 朱蓉.基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信模式的實(shí)現(xiàn)[J].嘉興學(xué)院學(xué)報,2006,18(3):80-81.
[8] 束長寶,于照,張繼勇.基于TCP/IP的網(wǎng)絡(luò)通信及其應(yīng)用[J].網(wǎng)絡(luò)與通信,2006,22(12):157-158.
[9] 蔡敬坤.高精度激光在線式厚度系統(tǒng)上位機(jī)軟件開發(fā)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2011.
[10]蔣年德,方志國.基于Visual C++的Windows網(wǎng)絡(luò)通信程序設(shè)計[J].計算機(jī)與現(xiàn)代化,2003(5):30-31.
[11]Babadzhanova L S.Gauges for determining the thickness of thin coatings and their measurement by the method of superimposed profilograph[J].Measurement Techniques,2003,46(4):332-336.
[12]Wang Wei,Dong Zaili,Liu Changyou.The method research of non-contact thickness measurement of transparent object with free-form surface[J].Intelligent Control and Automation,2004,5(12):3837-3841.