(哈爾濱工業(yè)大學(xué)航天學(xué)院,黑龍江 哈爾濱 150001)
在工業(yè)自動(dòng)化檢測(cè)系統(tǒng)中,為了實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)作業(yè)的遠(yuǎn)程監(jiān)控,大量的現(xiàn)場(chǎng)傳感器數(shù)據(jù)和狀態(tài)信息需要通過(guò)網(wǎng)絡(luò)傳輸給遠(yuǎn)程監(jiān)控站;監(jiān)控站發(fā)出的控制指令也需要通過(guò)網(wǎng)絡(luò)發(fā)送給現(xiàn)場(chǎng)控制站,進(jìn)行遠(yuǎn)程控制。因此,網(wǎng)絡(luò)通信在工業(yè)自動(dòng)化檢測(cè)系統(tǒng)中有著廣泛的應(yīng)用。為了實(shí)現(xiàn)現(xiàn)場(chǎng)控制站和遠(yuǎn)程監(jiān)控站之間的數(shù)據(jù)快速、高效和可靠傳輸,需要針對(duì)具體的應(yīng)用場(chǎng)合設(shè)計(jì)相應(yīng)的網(wǎng)絡(luò)通信模塊,不同的檢測(cè)系統(tǒng)需要設(shè)計(jì)不同的網(wǎng)絡(luò)通信模塊。這無(wú)疑加大了工作量,增加了檢測(cè)系統(tǒng)軟件開發(fā)的周期[1]。現(xiàn)有的一些網(wǎng)絡(luò)通信模塊在數(shù)據(jù)傳輸效率和可靠性方面均存在問(wèn)題,如數(shù)據(jù)丟失和傳輸錯(cuò)誤等[2]。
本文設(shè)計(jì)了一種通用網(wǎng)絡(luò)通信模塊,能實(shí)現(xiàn)兩種通信協(xié)議,可在多種自動(dòng)化檢測(cè)系統(tǒng)中實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的遠(yuǎn)程傳輸。將該網(wǎng)絡(luò)通信模塊在電池極板厚度檢測(cè)系統(tǒng)中進(jìn)行實(shí)際測(cè)試,測(cè)試結(jié)果表明,該網(wǎng)絡(luò)通信模塊能適應(yīng)不同應(yīng)用背景需要,保證數(shù)據(jù)高效可靠傳輸。
通信協(xié)議是客戶端與服務(wù)器進(jìn)行會(huì)話的語(yǔ)言,因此它必須承載雙方都能識(shí)別的通信信息,實(shí)現(xiàn)二者之間的信息交互。網(wǎng)絡(luò)通信中最主要的工作是制定合理的通信協(xié)議,以便使客戶端與服務(wù)器之間通過(guò)簡(jiǎn)潔、清晰和明確的語(yǔ)言實(shí)現(xiàn)順暢的通信功能[3]。
網(wǎng)絡(luò)數(shù)據(jù)的交互通常是按照數(shù)據(jù)幀的形式發(fā)送的。數(shù)據(jù)幀可以分為可擴(kuò)展標(biāo)記語(yǔ)言(extensible markup language,XML)形式和二進(jìn)制形式。XML形式的數(shù)據(jù)幀每個(gè)字符均采用ASCII編碼,這使得傳輸相同數(shù)據(jù)量的數(shù)據(jù)時(shí)占用的空間大,通信效率低;而二進(jìn)制形式的數(shù)據(jù)幀則將數(shù)據(jù)按字節(jié)發(fā)送。因此,在相同的數(shù)據(jù)幀長(zhǎng)度條件下,后者能攜帶更多的數(shù)據(jù)信息,通信效率高。
XML通過(guò)使用一系列簡(jiǎn)單的標(biāo)記符對(duì)數(shù)據(jù)進(jìn)行描述,而這些標(biāo)記符可以用簡(jiǎn)便的方式來(lái)建立[4]。XML形式的網(wǎng)絡(luò)通信協(xié)議的格式設(shè)計(jì)如下[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ā)送和接收過(guò)程中由于網(wǎng)絡(luò)異常導(dǎo)致的傳輸錯(cuò)誤,設(shè)置了校驗(yàn)字節(jié)。通過(guò)在數(shù)據(jù)幀發(fā)送時(shí)填充檢驗(yàn)字節(jié)、接收時(shí)檢驗(yàn)校驗(yàn)字節(jié),防止數(shù)據(jù)傳輸錯(cuò)誤。在數(shù)據(jù)幀中,有效信息是數(shù)據(jù)部分,數(shù)據(jù)部分的含義依賴于網(wǎng)絡(luò)通信應(yīng)用的具體場(chǎng)合,由用戶指定。在實(shí)際制定通信協(xié)議時(shí),可以將幀頭字節(jié)、幀尾字節(jié)、需要用到的幀類型、數(shù)據(jù)字節(jié)數(shù)、幀類型數(shù)、是否有校驗(yàn)字節(jié)等信息寫入配置文件,供網(wǎng)絡(luò)通信模塊讀取。
本文運(yùn)用面向?qū)ο蟮乃枷朐O(shè)計(jì)網(wǎng)絡(luò)通信模塊。首先,需要了解功能性需求,進(jìn)行需求分析。網(wǎng)絡(luò)通信模塊統(tǒng)一建模語(yǔ)言(unified modeling language,UML)用例圖如圖1所示。各用例之間的關(guān)系為包含關(guān)系。
圖1 網(wǎng)絡(luò)通信模塊UML用例圖
網(wǎng)絡(luò)通信模塊設(shè)計(jì)步驟如下。
首先,完成網(wǎng)絡(luò)消息數(shù)據(jù)的接收。在客戶端服務(wù)器模式下,一個(gè)服務(wù)器可以連接多個(gè)客戶端。為了將來(lái)自不同客戶端的網(wǎng)絡(luò)數(shù)據(jù)區(qū)分開,需要為每一個(gè)連接上的客戶端創(chuàng)建一個(gè)存儲(chǔ)單元,稱為消息受體類。消息受體類的一個(gè)對(duì)象對(duì)應(yīng)一個(gè)連接的客戶端。當(dāng)該客戶端連接時(shí),創(chuàng)建消息受體;客戶端斷開時(shí),銷毀消息受體。而對(duì)客戶端而言,由于客戶端只能接收服務(wù)器的消息,因此只需要一個(gè)消息受體即可。
其次,建立和維護(hù)消息隊(duì)列。在服務(wù)器端,由于同時(shí)接收不同客戶端(用IP地址和端口號(hào)標(biāo)志)的網(wǎng)絡(luò)消息,需要從不同客戶端對(duì)應(yīng)的消息受體中取出消息進(jìn)行解析后再放到消息隊(duì)列中。服務(wù)器消息隊(duì)列的每一條消息不僅包含了消息類型和消息內(nèi)容,也包含了該消息的源IP地址和源端口號(hào)。在客戶端,消息隊(duì)列僅存放其所連接的服務(wù)器發(fā)送的消息類型和消息內(nèi)容,不再存放服務(wù)器的IP地址和端口號(hào)。存儲(chǔ)在消息隊(duì)列中的網(wǎng)絡(luò)消息由上層模塊取出并進(jìn)行數(shù)據(jù)處理或其他動(dòng)作。
最后,完成網(wǎng)絡(luò)消息的封裝和解析。在數(shù)據(jù)的發(fā)送端,需要對(duì)發(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è)計(jì)時(shí),通過(guò)消息文本封裝和解析類實(shí)現(xiàn)消息的封裝和解析,實(shí)現(xiàn)消息提取、消息解析和消息打包等功能[6]。
在數(shù)據(jù)的發(fā)送端,需要將待發(fā)送的數(shù)據(jù)按照上述通信協(xié)議進(jìn)行打包,封裝成數(shù)據(jù)幀。合理的打包方式可以大大緩解網(wǎng)絡(luò)通信的負(fù)荷量。通信協(xié)議的打包方式一般可以分為固定長(zhǎng)度打包和動(dòng)態(tài)長(zhǎng)度打包兩種方式。這兩種方式具體介紹如下。
固定長(zhǎng)度打包方式對(duì)于協(xié)議的解析來(lái)說(shuō)比較方便,按照固定的位置獲取相應(yīng)的信息即可,但是,包的長(zhǎng)度要以最長(zhǎng)的那條協(xié)議為基準(zhǔn)。這使得每條協(xié)議的傳輸都要占用最大的網(wǎng)絡(luò)通信量,大大增加了網(wǎng)絡(luò)通信的負(fù)荷壓力,而且不具備通用性。
動(dòng)態(tài)長(zhǎng)度打包方式能夠根據(jù)當(dāng)前所需的協(xié)議長(zhǎng)度進(jìn)行打包,可以占用最少的空間,大大緩解了網(wǎng)絡(luò)通信的負(fù)荷壓力。但是對(duì)于協(xié)議的解析比較麻煩,必須根據(jù)協(xié)議的格式對(duì)每個(gè)協(xié)議包進(jìn)行動(dòng)態(tài)解析,從而也就具備了通用性[7]。
綜合考慮,采用動(dòng)態(tài)打包方式,在保證模塊通用性的同時(shí),提高網(wǎng)絡(luò)通信的效率。
可擴(kuò)展標(biāo)記語(yǔ)言(XML)通信協(xié)議的數(shù)據(jù)幀打包流程圖如圖2所示,打包的過(guò)程主要是將數(shù)據(jù)轉(zhuǎn)化為字符串的過(guò)程。首先,加入數(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é)議中有無(wú)校驗(yàn)字節(jié)填寫校驗(yàn)字節(jié),添加幀尾字節(jié)。這樣即完成網(wǎng)絡(luò)數(shù)據(jù)打包操作。
客戶端或者服務(wù)器收到對(duì)方發(fā)來(lái)的消息包后,除明白對(duì)方要傳達(dá)的信息外,還必須對(duì)網(wǎng)絡(luò)消息進(jìn)行解析。
XML協(xié)議的網(wǎng)絡(luò)消息解析的主要步驟如下:首先,從消息受體中提取一條完整的消息;然后,進(jìn)行消息格式轉(zhuǎn)化;最后,提取出消息類型、子類型、消息內(nèi)容等信息,并存入消息隊(duì)列。
XML協(xié)議網(wǎng)絡(luò)消息解析流程如圖3所示。
圖3 XML協(xié)議網(wǎng)絡(luò)消息解析流程圖
在服務(wù)器端,來(lái)自不同客戶端的網(wǎng)絡(luò)消息分別存儲(chǔ)在與之對(duì)應(yīng)的消息受體里。在該消息受體里,定義了一個(gè)原始消息隊(duì)列。由于TCP/IP協(xié)議的數(shù)據(jù)分片、網(wǎng)絡(luò)擁塞和路由差異等,使得同一個(gè)消息包可能分幾次到達(dá),也可能造成消息包的丟失,因此,在從消息受體里讀取一條完整的消息時(shí),需要考慮如下情況[8-9]。
① 存在有效的消息包頭標(biāo)志符,但是不存在消息包尾標(biāo)志符。這可能是消息包在傳輸過(guò)程中丟失了部分內(nèi)容或者是消息包分成了兩條網(wǎng)絡(luò)消息進(jìn)行傳輸。判斷是哪種情況需要接著從原始消息隊(duì)列中讀取下一條信息。將讀取的下一條信息和前一條不存在消息包尾標(biāo)志符的信息合并,然后對(duì)合并后的消息信息進(jìn)行解析,直到根據(jù)協(xié)議格式找到有效的消息包。
② 存在有效的消息包尾標(biāo)志符,但是不存在消息包頭標(biāo)志符。這說(shuō)明該條消息不是完整的消息包,因此不對(duì)此條信息進(jìn)行進(jìn)一步處理,直接從消息隊(duì)列中刪除即可,接著讀取下一條信息并進(jìn)行解析。
③ 既存在有效的消息包頭標(biāo)志符,又存在有效的消息包尾標(biāo)志符。此時(shí)還需根據(jù)協(xié)議內(nèi)容判斷該消息包實(shí)際的大小是否等于協(xié)議中指定的大小。若不相等,說(shuō)明在傳輸過(guò)程中消息包的部分內(nèi)容已經(jīng)丟失,直接拋棄該消息包,繼續(xù)等待新消息的到來(lái)。
④ 如果不存在上述情況,則接收該數(shù)據(jù)包并存入消息受體;并根據(jù)通信協(xié)議對(duì)收到的數(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所示。流程簡(jiǎn)要說(shuō)明如下。
首先,檢查消息受體中的數(shù)據(jù)字節(jié)數(shù)是否大于幀頭字節(jié)數(shù),如果字節(jié)數(shù)不足,則停止解析,繼續(xù)接收新的數(shù)據(jù)。如果幀頭解析正確,則檢查幀類型是否為給定的幀類型。如果幀類型未定義,則擦除消息受體中的一個(gè)字節(jié)的數(shù)據(jù),并重新尋找?guī)^字節(jié)。如果幀類型合法,則根據(jù)協(xié)議中的數(shù)據(jù)幀長(zhǎng)度字節(jié)指定的數(shù)據(jù)字節(jié)數(shù)接收數(shù)據(jù),并接收校驗(yàn)字節(jié)和幀尾字節(jié)。如果校驗(yàn)字節(jié)出錯(cuò)或幀尾出錯(cuò),則擦除消息受體中的一個(gè)字節(jié)的數(shù)據(jù)后重新尋找?guī)^字節(jié)。如果檢查無(wú)誤,則完成一幀數(shù)據(jù)的解析,將幀類型、數(shù)據(jù)字節(jié)數(shù)、數(shù)據(jù)部分、客戶端IP地址和端口號(hào)組合成消息對(duì)象,壓入消息隊(duì)列,由上層程序取出作進(jìn)一步處理。
在二進(jìn)制協(xié)議的網(wǎng)絡(luò)消息解析過(guò)程中,一旦出現(xiàn)錯(cuò)誤,則擦除消息受體中的一個(gè)字節(jié)的數(shù)據(jù),然后從幀頭開始重新解析,這樣最大限度地降低了數(shù)據(jù)幀的丟失。同時(shí),通過(guò)設(shè)置檢驗(yàn)字節(jié)和幀頭幀尾字節(jié),以較小的附加傳輸代價(jià)保證了數(shù)據(jù)傳輸?shù)目煽啃訹10]。
圖4 二進(jìn)制協(xié)議網(wǎng)絡(luò)消息解析流程圖
在激光厚度檢測(cè)系統(tǒng)中,需要對(duì)現(xiàn)場(chǎng)電池極板厚度進(jìn)行遠(yuǎn)程實(shí)時(shí)監(jiān)控,并實(shí)時(shí)調(diào)整涂布機(jī)刮刀位置,以保證涂布厚度的均勻性[11]。為此,需要設(shè)置現(xiàn)場(chǎng)服務(wù)器和遠(yuǎn)程客戶端,通過(guò)網(wǎng)絡(luò)對(duì)現(xiàn)場(chǎng)生產(chǎn)狀況進(jìn)行遠(yuǎn)程監(jiān)控[12]。
現(xiàn)場(chǎng)控制站將激光傳感器厚度數(shù)據(jù)發(fā)送給服務(wù)器,服務(wù)器將數(shù)據(jù)打包后發(fā)送給客戶端??蛻舳诉M(jìn)行數(shù)據(jù)處理,顯示測(cè)量結(jié)果,并將處理后的厚度信息發(fā)送給現(xiàn)場(chǎng)服務(wù)器進(jìn)行存儲(chǔ)。
在制定好通信協(xié)議后,基于上述網(wǎng)絡(luò)通信模塊,編寫了上層程序,從而在客戶端實(shí)現(xiàn)了數(shù)據(jù)的處理和顯示,在服務(wù)器端實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)。
實(shí)際測(cè)試表明,運(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è)計(jì)了一種通用的網(wǎng)絡(luò)通信模塊,在XML和二進(jìn)制不同數(shù)據(jù)傳輸方式下,實(shí)現(xiàn)了網(wǎng)絡(luò)通信協(xié)議的制定、數(shù)據(jù)的打包和解析算法,并在電池極板涂布厚度檢測(cè)系統(tǒng)中加以測(cè)試。該模塊具有以下優(yōu)點(diǎn)。
① 在檢測(cè)系統(tǒng)中運(yùn)用該模塊時(shí),上層程序只需要制定具體的通信協(xié)議即可實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸,不需要考慮底層數(shù)據(jù)傳輸格式。
② 通用性好。能用于不同功能需求的自動(dòng)化檢測(cè)系統(tǒng)中,大大降低了軟件開發(fā)的周期和難度。
③ 數(shù)據(jù)傳輸可靠,丟包率小。該網(wǎng)絡(luò)通信模塊能保證客戶端和服務(wù)器數(shù)據(jù)可靠傳輸,以較小的丟包率實(shí)現(xiàn)雙方數(shù)據(jù)交互,在工業(yè)自動(dòng)化檢測(cè)系統(tǒng)中有著廣泛的應(yīng)用。
[1] 張明杰.遠(yuǎn)程視頻監(jiān)控系統(tǒng)中網(wǎng)絡(luò)通信模塊的設(shè)計(jì)[J].工礦自動(dòng)化,2009(1):88-89.
[2] 徐愛華,全書海.Socket網(wǎng)絡(luò)通信及其在電梯監(jiān)控系統(tǒng)中的應(yīng)用[J].武漢理工大學(xué)學(xué)報(bào),2006,28(11):56-57.
[3] 汪水華.基于C++ Builder的網(wǎng)絡(luò)數(shù)據(jù)傳輸軟件的開發(fā)[J].交通與計(jì)算機(jī),2003,21(2):77-79.
[4] 習(xí)博,方彥軍.工業(yè)以太網(wǎng)中網(wǎng)絡(luò)通信技術(shù)的研究[J].微計(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é)報(bào),2006,18(3):80-81.
[8] 束長(zhǎng)寶,于照,張繼勇.基于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]蔣年德,方志國(guó).基于Visual C++的Windows網(wǎng)絡(luò)通信程序設(shè)計(jì)[J].計(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.