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