王金璐,劉 杰,李 強,陳新華,韓博志
(1.武漢理工大學 能源與動力工程學院,湖北 武漢 430063;2.中船黃埔文沖船舶有限公司,廣東 廣州 510715)
在船舶軸系試驗臺架的試驗過程中,需要長時間地接收傳感器發(fā)送的數(shù)據(jù)信息。數(shù)據(jù)采集軟件在長時間的連續(xù)運行中,可能出現(xiàn)一些異常情況,例如程序運行緩慢卡頓、程序運行崩潰或操作系統(tǒng)運行卡頓崩潰等,需要進行相應的異常處理,保證監(jiān)測數(shù)據(jù)的完整性,并向監(jiān)控人員發(fā)出警報。同時,由于數(shù)據(jù)采集軟件需要長時間進行數(shù)據(jù)接收和處理,需要使用較多的計算機資源,采用傳統(tǒng)的網(wǎng)絡通訊方式已經(jīng)無法滿足任務需求[1],本文設計使用Netty網(wǎng)絡編程框架來提高數(shù)據(jù)采集效率,從而降低計算機資源使用率。
在船舶軸系試驗臺架的試驗過程中,可能會發(fā)生某一部分的硬件連接異常而導致監(jiān)測數(shù)據(jù)丟失的情況。為了解決此問題,此設計的數(shù)據(jù)采集方法需要保證主機和備用機都可以接收到監(jiān)測數(shù)據(jù)信息,在主機無法接收到數(shù)據(jù)信息時,備用機可以立即接替主機繼續(xù)執(zhí)行監(jiān)測數(shù)據(jù)接收任務,保證監(jiān)測數(shù)據(jù)完整。船舶軸系試驗臺架監(jiān)測數(shù)據(jù)采集的硬件連接方式主要有使用采集卡、串口和可編程邏輯控制器(PLC)3種。
1)使用采集卡接收數(shù)據(jù)。由于采集卡需要內(nèi)嵌到計算機內(nèi)部,則需要多個采集卡,每一臺計算機配一個采集卡。傳感器發(fā)送數(shù)據(jù)時,需要同時向所有的采集卡發(fā)送數(shù)據(jù),以此來保證主機和備用機都能接收到監(jiān)測數(shù)據(jù)信息。
2)使用串口接收數(shù)據(jù)。可以使用一拖二的串口數(shù)據(jù)線,輸入端為單一接口,連接傳感器發(fā)送數(shù)據(jù)。輸出端為2個接口,分別連接2臺計算機,以此來保證數(shù)據(jù)完整性。
3)使用PLC接收數(shù)據(jù)。PLC可以使用網(wǎng)線連接多臺計算機,通過網(wǎng)絡通訊協(xié)議傳輸數(shù)據(jù)信息。只需要一個PLC就可連接多臺計算機。
在3種連接方案中,采集卡和串口連接的優(yōu)化主要靠提高設備硬件本身能力,PLC由于其使用網(wǎng)絡通訊協(xié)議傳輸數(shù)據(jù)信息,可以在軟件層面對接收程序進行優(yōu)化設計。本文設計一種新的船舶軸系試驗臺架監(jiān)測數(shù)據(jù)采集軟件,在接收監(jiān)測數(shù)據(jù)信息時,使用Netty網(wǎng)絡編程框架優(yōu)化網(wǎng)絡通訊,來減少計算機資源消耗率;在進行軟件異常情況處理和報警時,采用主機和備用機相互監(jiān)視的方法,獲取異常信息并處理,可以保證接收數(shù)據(jù)信息的完整性,并降低人工監(jiān)視難度。
為了解決船舶軸系試驗臺架監(jiān)測數(shù)據(jù)采集效率低、消耗高的問題,設計了一種船舶軸系試驗臺架監(jiān)測數(shù)據(jù)優(yōu)化采集方法。該方法主要是使用PLC接收數(shù)據(jù),以網(wǎng)絡通訊傳輸控制協(xié)議/網(wǎng)際協(xié)議(TCP/IP)為基礎,利用Netty網(wǎng)絡編程框架中的非阻塞輸入/輸出(NIO)編程原理,優(yōu)化數(shù)據(jù)采集軟件。其中包括監(jiān)測數(shù)據(jù)采集部分和異常報警處理部分。監(jiān)測數(shù)據(jù)采集部分主要是將數(shù)據(jù)采集程序設計為Netty網(wǎng)絡編程框架的服務端,減少每一個網(wǎng)絡響應的時間,提高計算機處理效率。異常報警處理部分需要使用Netty網(wǎng)絡編程框架的服務端和客戶端,能夠使用極少的計算機資源,就可以把采集軟件的運行狀態(tài)傳輸?shù)絺溆脵C上,進而判斷采集軟件運行狀態(tài),有異常時會立刻使用備用機來進行監(jiān)測數(shù)據(jù)采集并報警,保證監(jiān)測數(shù)據(jù)的完整性。數(shù)據(jù)優(yōu)化采集的整體設計流程圖見圖1。
圖1 數(shù)據(jù)優(yōu)化采集的整體設計流程圖
網(wǎng)絡通信是本文進行監(jiān)測數(shù)據(jù)信息傳輸?shù)幕痉椒?,其利用相關接口和協(xié)議通過網(wǎng)絡線路傳輸數(shù)據(jù)信息到網(wǎng)絡計算機上,從而實現(xiàn)不同計算機的遠程信息交互。本文使用最廣泛的就是TCP/IP協(xié)議,以其來完成數(shù)據(jù)交互[2]。TCP/IP協(xié)議通常可以概括為4層:運用層、傳輸層、網(wǎng)絡層和網(wǎng)絡接口層。TCP/IP協(xié)議按照層次由上到下,層層包裝。最上面的是應用層,是直接為應用進程提供服務的,包括郵件傳輸應用使用的簡單郵件傳輸協(xié)議(SMTP)、萬維網(wǎng)應用使用的超文本傳輸協(xié)議(HTTP)、遠程登錄服務應用使用的遠程終端協(xié)議(TELNET)。應用層還能加密、解密、格式化數(shù)據(jù)。第二層是傳輸層,其中的傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報協(xié)議(UDP)就在這個層次,在整個協(xié)議中起到中流砥柱的作用。第三層是網(wǎng)絡層,網(wǎng)際互連協(xié)議(IP)就在這里,它負責對數(shù)據(jù)加上IP地址和其他的數(shù)據(jù)以確定傳輸?shù)哪繕?。第四層是網(wǎng)絡接口層,兼并了物理層和數(shù)據(jù)鏈路層,所以網(wǎng)絡接口層既是傳輸數(shù)據(jù)的物理媒介,也可以為網(wǎng)絡層提供一條準確無誤的線路[3]。
由于監(jiān)測數(shù)據(jù)采集軟件需要進行長時間的運行,會使用較多的計算機資源。在使用傳統(tǒng)的網(wǎng)絡通訊時,有2種使用方式。
1)一直建立客戶端與服務端的網(wǎng)絡連接,進行數(shù)據(jù)信息傳輸。優(yōu)點是不需要頻繁地進行資源的創(chuàng)建和銷毀,缺點是程序大部分時間處在阻塞狀態(tài)中,增加系統(tǒng)負擔。
2)在需要數(shù)據(jù)傳輸時,再進行網(wǎng)絡連接。優(yōu)點是無信息發(fā)送時可節(jié)省計算機資源,缺點是需要進行頻繁的網(wǎng)絡連接創(chuàng)建和銷毀。
在傳統(tǒng)的網(wǎng)絡通訊中,每一個網(wǎng)絡連接都需要一個單獨的線程進行處理,因此會消耗較多的計算資源。傳統(tǒng)的網(wǎng)絡通訊方式的流程為套接字→讀/寫→線程。
服務端監(jiān)聽時接收(Accept)函數(shù)阻塞,有新連接時Accept函數(shù)會有返回,主線程才能繼續(xù)運行。讀寫套接字(Socket)時讀是阻塞的,只有接收到請求消息后,讀才能返回,子線程才能繼續(xù)處理;讀寫Socket時寫是阻塞的,只有客戶端接收消息后,寫才能返回,子線程才能繼續(xù)讀取下一個請求[4]。
無論使用以上哪種方式,都有一個嚴重的問題,從頭到尾都有線程處于阻塞狀態(tài),會浪費計算資源,原因是由其輸入/輸出(I/O)模型決定的。傳統(tǒng)通訊方式的阻塞I/O模型示意圖見圖2。
圖2 傳統(tǒng)通訊方式的阻塞I/O模型示意圖
當用戶線程發(fā)出I/O請求后,會進行系統(tǒng)調(diào)用,內(nèi)核就會去查看數(shù)據(jù)是否就緒,如果沒有,會等待數(shù)據(jù)就緒,從而使用戶線程處于阻塞狀態(tài),用戶線程交出中央處理器(Central Processing Unit,CPU)。當數(shù)據(jù)就緒后,內(nèi)核會將數(shù)據(jù)拷貝到用戶線程,并返回結(jié)果給用戶線程,用戶線程才解除阻塞狀態(tài)。在內(nèi)核準備數(shù)據(jù)和數(shù)據(jù)從內(nèi)核拷貝到進程內(nèi)存地址的這2個過程中,都是阻塞的。
此種網(wǎng)絡通訊設計會占用較多計算資源,已經(jīng)不能滿足任務需求,需要對傳統(tǒng)的網(wǎng)絡通訊方式進行優(yōu)化,以適應接收軟件對于快速低消耗的需求。
Netty是一款基于NIO的網(wǎng)絡應用程序框架。Netty框架基于Reactor模型,根據(jù)自身的 I/O 模型和線程處理模式實現(xiàn)高性能的開發(fā),其中 I/O 模型負責數(shù)據(jù)的輸入和輸出[5]。較傳統(tǒng)的通訊方式有了很大的提升。Netty框架的NIO模型見圖3。
圖3 Netty框架的NIO模型
Netty框架的NIO 模型由 I/O 復用模型改進而來,可并發(fā)進行多個連接的讀寫操作,提升了I/O線程的運行效率。使用Reactor單線程模型進行連接處理。Reactor線程是個多面手,負責多路分離套接字,運用“接收”函數(shù)新連接,并分配請求到處理器鏈中,Reactor線程模型圖如圖4所示。該模型適用于處理器鏈中業(yè)務處理組件能快速完成的場景。
圖4 Reactor線程模型圖
使用Netty網(wǎng)絡編程框架中的NIO模型,對客戶端和服務端進行優(yōu)化設計[6]。其優(yōu)點為:①使用NIO的零拷貝特性,在Netty接收和發(fā)送數(shù)據(jù)時,會使用堆外直接內(nèi)存進行Socket讀寫,不需要進行字節(jié)緩沖區(qū)的二次拷貝,提高了傳輸速度;②使用內(nèi)存池,為了減少堆外直接內(nèi)存的分配和回收產(chǎn)生的資源損耗問題,可以在計算機資源較少的情況下仍能完成狀態(tài)信息傳輸?shù)娜蝿铡?/p>
監(jiān)測數(shù)據(jù)采集軟件主要是使用Netty網(wǎng)絡編程框架,提高對網(wǎng)絡連接的響應速度[7]。使用Netty的服務端作為監(jiān)測數(shù)據(jù)采集接收端,與PLC進行網(wǎng)絡通信,接收監(jiān)測數(shù)據(jù)信息。主機和備用機的設計方法一樣。區(qū)別在于主機在任務開始時就進行數(shù)據(jù)接收操作,而備用機會在主機發(fā)生異常時,自動開始代替主機來進行數(shù)據(jù)接收操作。主機和備用機的接收程序?qū)崿F(xiàn)流程如圖5所示。
圖5 主機和備用機的接收程序?qū)崿F(xiàn)流程
使用Netty網(wǎng)絡編程框架可以在極短的時間內(nèi)完成主機和備用機的切換,所以主機和備用機的采集程序不需要同時運行,防止產(chǎn)生重復的監(jiān)測數(shù)據(jù)信息,且可以節(jié)省內(nèi)存資源,降低計算機負荷。
監(jiān)測數(shù)據(jù)采集軟件異常處理程序的設計方法主要分3步來實現(xiàn)。
1)數(shù)據(jù)采集軟件的運行狀態(tài)獲取。設置一定的時間間隔,獲取到軟件的運行狀態(tài)信息。時間間隔可以以配置信息存在,方便操作人員修改。運行狀態(tài)信息設計為2種,運行正常和運行異常。正常情況下,運行狀態(tài)信息為正常,表示接收軟件運行正常。當出現(xiàn)接收軟件運行緩慢或者軟件異常退出或崩潰時,運行狀態(tài)信息則為異常。此外,還有一種特殊情況,就是操作系統(tǒng)因某些未知原因運行崩潰時,所有程序都會崩潰,也不會有運行狀態(tài)信息通過下一步的網(wǎng)絡通訊發(fā)送到備用機中。運行狀態(tài)信息獲取流程圖如圖6所示。獲取監(jiān)測數(shù)據(jù)采集軟件的運行狀態(tài),發(fā)送到備用機中進行判斷。
圖6 運行狀態(tài)信息獲取流程圖
2)運行狀態(tài)信息的發(fā)送和獲取。使用2臺計算機進行網(wǎng)絡通訊,備用機可以通過網(wǎng)絡通訊來監(jiān)視主機采集軟件的運行狀態(tài),以便備用機可以隨時接替主機繼續(xù)執(zhí)行采集任務。主機端設計為客戶端,備用機端設計為服務端,并采用Netty網(wǎng)絡編程框架,提高客戶端和服務的信息發(fā)送和接收能力,降低計算機資源使用率[8]。
3)狀態(tài)信息判斷及報警模塊。解析傳輸過來的數(shù)據(jù)信息,判斷出程序的運行狀態(tài)信息。運行狀態(tài)信息有2種,運行正常和運行異常。當運行狀態(tài)信息為運行異常時,程序會立即啟動備用機并發(fā)出報警,提示操作人員進行人工操作。還有在設置一定的時間間隔內(nèi),沒有接收到客戶端發(fā)送過來的運行狀態(tài)信息時,則判斷為操作系統(tǒng)異常,也需要發(fā)出報警,提示操作人員進行人工操作。運行狀態(tài)信息判斷流程圖如圖7所示。接收到軟件的運行狀態(tài)信息,進行運行狀態(tài)判斷,正常則繼續(xù)接收,異常就立刻啟用備用機的監(jiān)測數(shù)據(jù)軟件接收程序,并進行報警,提醒操作人員。
圖7 運行狀態(tài)信息判斷流程圖
為了在船舶軸系試驗臺架的試驗過程中,保證長時間采集傳感器發(fā)送的數(shù)據(jù)信息,并且降低對計算資源的使用率,設計了以網(wǎng)絡通訊TCP/IP協(xié)議為基礎,基于Netty網(wǎng)絡編程框架的監(jiān)測數(shù)據(jù)采集軟件優(yōu)化方法,并在實際的項目中成功運用。該方法只需要啟動軟件就可以自動采集監(jiān)測數(shù)據(jù)信息。出現(xiàn)異常情況后,可以快速自動地完成主機和備用機的切換,極大地提高了監(jiān)測數(shù)據(jù)接收的完整性,降低了人工操作的難度。經(jīng)過實際工程試驗臺架系統(tǒng)中的應用驗證,完全符合實際要求,可以推廣應用到類似的應用場景,具有一定的工程實用價值。