熊肖磊,王春偉,趙 炯,周奇才
(同濟(jì)大學(xué)機(jī)械與能源工程學(xué)院,上海201804)
對(duì)于大型設(shè)備運(yùn)行數(shù)據(jù)采集并加以處理運(yùn)用,進(jìn)而實(shí)現(xiàn)設(shè)備生命周期管理是目前設(shè)備管理的研究重點(diǎn),而本文以盾構(gòu)設(shè)備為例,探討其數(shù)據(jù)處理運(yùn)用系統(tǒng)設(shè)計(jì)方案與實(shí)現(xiàn)。隨著地鐵隧道掘進(jìn)技術(shù)的逐漸發(fā)展完善,一條隧道的掘進(jìn)過程往往伴隨著多臺(tái)盾構(gòu)機(jī)施工,如此會(huì)出現(xiàn)多臺(tái)盾構(gòu)分散施工而管理維護(hù)困難的問題,于是在管理成本的制約下,需要建立某種系統(tǒng)對(duì)盾構(gòu)設(shè)備及施工進(jìn)程數(shù)據(jù)進(jìn)行有效運(yùn)用,從而實(shí)現(xiàn)對(duì)盾構(gòu)有效的監(jiān)控管理。對(duì)此,國內(nèi)外的盾構(gòu)生產(chǎn)商,諸如鐵建、海瑞克和小松等,都對(duì)自家盾構(gòu)配置了數(shù)據(jù)采集系統(tǒng),但大多數(shù)無法滿足多盾構(gòu)數(shù)據(jù)處理運(yùn)用,多用戶訪問的情況。文獻(xiàn)[1]利用方便開發(fā)的組態(tài)軟件實(shí)現(xiàn)監(jiān)控管理,但不利于后期擴(kuò)展,其系統(tǒng)需要特定運(yùn)行環(huán)境。文獻(xiàn)[5]以C/S結(jié)構(gòu)實(shí)現(xiàn)了多臺(tái)盾構(gòu)的集中監(jiān)控與數(shù)據(jù)運(yùn)用,并成功應(yīng)用在大連地鐵103和201標(biāo)項(xiàng)目,但隨數(shù)據(jù)量增大,會(huì)使數(shù)據(jù)庫訪問壓力增大。文獻(xiàn)[8]實(shí)現(xiàn)了網(wǎng)絡(luò)化盾構(gòu)自動(dòng)監(jiān)控系統(tǒng),并未滿足集中監(jiān)控目的。文中給出了一種嵌入式網(wǎng)絡(luò)化盾構(gòu)自動(dòng)監(jiān)控及報(bào)表系統(tǒng),著重闡述了硬件結(jié)構(gòu)與網(wǎng)絡(luò)協(xié)議移植,并未滿足多盾構(gòu)監(jiān)控目的。
基于B/S架構(gòu)來構(gòu)建盾構(gòu)監(jiān)控與數(shù)據(jù)運(yùn)用系統(tǒng)既可實(shí)現(xiàn)多臺(tái)盾構(gòu)集中監(jiān)控,數(shù)據(jù)處理,分析等工作,且無需安裝專用客戶端,只需通過瀏覽器即可訪問,實(shí)現(xiàn)了多盾構(gòu)多用戶的互聯(lián)網(wǎng)監(jiān)控管理目的[2]。因此本文則采用B/S模式構(gòu)建盾構(gòu)機(jī)的數(shù)據(jù)處理運(yùn)用系統(tǒng),以SSM(Spring MVC、Spring、Mybatis)框架作為B/S實(shí)現(xiàn)的基礎(chǔ)與開發(fā)輔助。同時(shí)考慮到數(shù)據(jù)量快速增長,采用數(shù)據(jù)緩存技術(shù)實(shí)現(xiàn)較快速的數(shù)據(jù)處理能力,同時(shí)提供快速的并發(fā)訪問。本文利用Redis作為內(nèi)存數(shù)據(jù)庫進(jìn)行盾構(gòu)實(shí)時(shí)數(shù)據(jù)緩存,并以MySQL進(jìn)行數(shù)據(jù)同步,將盾構(gòu)歷史數(shù)據(jù)與固有信息持久化,并且圍繞SSM框架技術(shù),以分層方式設(shè)計(jì)系統(tǒng),實(shí)現(xiàn)多盾構(gòu)快速高效的數(shù)據(jù)處理運(yùn)用。
Redis作為一種NoSQL類型的數(shù)據(jù)庫,具備了NoSQL靈活的數(shù)據(jù)模型;可存儲(chǔ)處理非結(jié)構(gòu)化及半結(jié)構(gòu)化數(shù)據(jù);良好的可擴(kuò)展性;快速的讀寫能力和低廉的成本等特點(diǎn)[3]。NoSQL(Not Only SQL)泛指非關(guān)系型數(shù)據(jù)庫,常用于超大規(guī)模和高并發(fā)的數(shù)據(jù)存儲(chǔ)處理場景中,其根據(jù)數(shù)據(jù)庫存儲(chǔ)類型分為鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫、列式存儲(chǔ)數(shù)據(jù)庫、文檔性數(shù)據(jù)庫和圖形數(shù)據(jù)庫[3]。而Redis作為一種開源的Key-Value數(shù)據(jù)存儲(chǔ)系統(tǒng),支持存儲(chǔ)的Value類型包括了字符串、鏈表、集合及哈希等類型,并且均支持push/pop、add/remove及取交集并集和差集等操作,同時(shí)Redis會(huì)周期性地把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)Master-Slave同步[4,10]。
SSM(Spring+SpringMVC+Mybatis)框架集由Spring、SpringMVC、Mybatis三個(gè)開源框架整合而成,常作為數(shù)據(jù)源較為簡單的web項(xiàng)目的開發(fā)框架[6,9]。其中SpringMVC分離了控制器、模型對(duì)象、分派器以及處理器程序?qū)ο蟮慕巧?,使其更容易進(jìn)行定制;Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,供表現(xiàn)層調(diào)用,充當(dāng)了表現(xiàn)層與持久層間的接口;而Mybatis則進(jìn)行數(shù)據(jù)的持久化操作,支持普通SQL查詢、存儲(chǔ)過程和高級(jí)映射,通過對(duì)象關(guān)系映射將Java對(duì)象與數(shù)據(jù)庫中的數(shù)據(jù)記錄相互轉(zhuǎn)換。通過在開源框架配置文件中的引用與項(xiàng)目中依賴包的導(dǎo)入,即可將三個(gè)框架整合起來,實(shí)現(xiàn)完整的前后端通信流程[6]。
本文旨在利用數(shù)據(jù)緩存Redis和SSM集成框架搭建一種適用于盾構(gòu)機(jī)數(shù)據(jù)處理運(yùn)用的系統(tǒng),對(duì)此在盾構(gòu)機(jī)數(shù)據(jù)采集的基礎(chǔ)上對(duì)系統(tǒng)進(jìn)行結(jié)構(gòu)的分層設(shè)計(jì)。整個(gè)系統(tǒng)基于B/S模式進(jìn)行開發(fā),而盾構(gòu)數(shù)據(jù)通過機(jī)載的數(shù)據(jù)采集器用PLC采集得來,需要解包、轉(zhuǎn)換、緩存和持久化。因此整個(gè)系統(tǒng)的工作流程是先將機(jī)載系統(tǒng)采集的數(shù)據(jù)解析后進(jìn)入Redis,然后按照前端請(qǐng)求進(jìn)行實(shí)時(shí)的數(shù)據(jù)請(qǐng)求響應(yīng),同時(shí)將盾構(gòu)固有數(shù)據(jù)和實(shí)時(shí)數(shù)據(jù)同步存儲(chǔ)到MySQL中,為后續(xù)的故障預(yù)測、數(shù)據(jù)分析等大量數(shù)據(jù)運(yùn)用處理過程事務(wù)提供數(shù)據(jù)源。所以根據(jù)數(shù)據(jù)流動(dòng)和功能劃分,本文將整個(gè)系統(tǒng)軟件結(jié)構(gòu)分為數(shù)據(jù)層、應(yīng)用層和表示層[9],如圖1。
圖1 系統(tǒng)框架結(jié)構(gòu)圖
如圖1所示,數(shù)據(jù)層將底層盾構(gòu)機(jī)載系統(tǒng)采集的數(shù)據(jù)在傳輸?shù)綌?shù)據(jù)中心的服務(wù)器后進(jìn)行解析和存儲(chǔ),提供更加結(jié)構(gòu)化的數(shù)據(jù)源;應(yīng)用層則是利用數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)進(jìn)行模塊化的功能處理,諸如狀態(tài)監(jiān)測顯示、設(shè)備關(guān)系、故障分析預(yù)測等,并使用SSM框架進(jìn)行設(shè)計(jì)解耦,獨(dú)立封裝各模塊功能,對(duì)客戶端的數(shù)據(jù)請(qǐng)求給予正確響應(yīng);而表示層通過瀏覽器頁面對(duì)盾構(gòu)數(shù)據(jù)的諸多處理運(yùn)用結(jié)果進(jìn)行可視化的顯示。
在前面提到數(shù)據(jù)層主要對(duì)后續(xù)應(yīng)用層功能表現(xiàn)提供數(shù)據(jù)支持,即數(shù)據(jù)層是系統(tǒng)的基礎(chǔ)環(huán)節(jié),該層通過對(duì)底層機(jī)載系統(tǒng)采集傳輸?shù)臄?shù)據(jù)進(jìn)行解析和存儲(chǔ),并在存儲(chǔ)之前做一定程度的預(yù)處理,使存儲(chǔ)的數(shù)據(jù)更具有結(jié)構(gòu)性。本文將數(shù)據(jù)層實(shí)現(xiàn)分為兩個(gè)部分:Redis實(shí)時(shí)緩存與MySQL持久化,以分別應(yīng)對(duì)實(shí)時(shí)監(jiān)測與大數(shù)據(jù)量分析運(yùn)用的功能實(shí)現(xiàn)。
盾構(gòu)機(jī)在掘進(jìn)隧道的過程中,需要將采集監(jiān)測的量按類型分為數(shù)字量和模擬量。其中數(shù)字量對(duì)應(yīng)某個(gè)限位開關(guān)的開閉或者千斤頂?shù)纳炜s,而模擬量則對(duì)應(yīng)千斤頂壓力、電機(jī)電壓、旋轉(zhuǎn)速度以及注漿壓力等具有數(shù)值意義的量。同時(shí)數(shù)據(jù)遵循一定的協(xié)議格式傳輸,因此接收到數(shù)據(jù)之后,同樣按照此種協(xié)議格式進(jìn)行解析,通過數(shù)據(jù)包的起始地址加上偏移量的方法,得出各個(gè)測點(diǎn)或者數(shù)據(jù)量的真實(shí)數(shù)據(jù),解析過程如圖2。
圖2 源數(shù)據(jù)解析流程
源數(shù)據(jù)進(jìn)行解析后按照是否超過上下限進(jìn)行緩存,對(duì)于實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)則按照測點(diǎn)配置表中的信息進(jìn)行對(duì)號(hào)入座,根據(jù)底層數(shù)據(jù)采集的約定協(xié)議生成各個(gè)測點(diǎn)的配置表,如表1與圖3。
表1 各測點(diǎn)的偏移量對(duì)應(yīng)關(guān)系
圖3 測點(diǎn)信息配置表
如表1所列測點(diǎn)偏移量對(duì)應(yīng)關(guān)系,解析程序即按此進(jìn)行數(shù)據(jù)包解析,同時(shí)生成一項(xiàng)測點(diǎn)信息的配置表存儲(chǔ)在數(shù)據(jù)庫中,便于之后作為某臺(tái)盾構(gòu)的特征信息查看。在生成測點(diǎn)信息配置表過程中,以各測點(diǎn)所屬盾構(gòu)機(jī)子系統(tǒng)分組,如此在后續(xù)對(duì)盾構(gòu)機(jī)子系統(tǒng)部件進(jìn)行分析時(shí)提供便利,如圖3。
如此實(shí)時(shí)數(shù)據(jù)經(jīng)解析之后便可以進(jìn)行Redis緩存了,在Redis緩存中以Key-Value的數(shù)據(jù)形式存儲(chǔ)[10],對(duì)于實(shí)時(shí)數(shù)據(jù)而言,每一個(gè)時(shí)刻的數(shù)據(jù)均是有區(qū)別的,這種區(qū)別存在于每一個(gè)傳輸?shù)臄?shù)據(jù)包上帶有的時(shí)間戳(TIMESTAMP),于是對(duì)于兩個(gè)實(shí)時(shí)數(shù)據(jù)包即可通過TIMESTAMP進(jìn)行區(qū)分,并可作為Key來標(biāo)識(shí)緩存中的Value。結(jié)合Key-Value存儲(chǔ)無表概念的特點(diǎn),實(shí)時(shí)數(shù)據(jù)的存儲(chǔ)時(shí),以盾構(gòu)ID為Key,以hash作為Value存儲(chǔ)此臺(tái)盾構(gòu)的數(shù)據(jù),如此便可以Key區(qū)分不同盾構(gòu)的數(shù)據(jù)。對(duì)于Value部分的hash,以TIMESTAMP作為Key,以數(shù)據(jù)list作為Value,如此便可區(qū)分同一盾構(gòu)不同時(shí)刻的數(shù)據(jù),在數(shù)據(jù)list中,以Key-Value的形式存儲(chǔ)各個(gè)測點(diǎn)的名稱及對(duì)應(yīng)的數(shù)值[4]。因此存儲(chǔ)結(jié)構(gòu)如表2所示。從表2中可以看出,根據(jù)盾構(gòu)的標(biāo)識(shí)ID及某個(gè)時(shí)刻的TIMESTAMP即可以唯一的確定某臺(tái)盾構(gòu)某一時(shí)刻的各個(gè)測點(diǎn)的實(shí)時(shí)數(shù)據(jù),根據(jù)底層數(shù)據(jù)發(fā)送的時(shí)間間隔進(jìn)行實(shí)時(shí)數(shù)據(jù)的解析緩存,并將一段時(shí)間內(nèi)的舊數(shù)據(jù)同步至MySQL中,而后刪除,保證內(nèi)存不被占滿。
表2 實(shí)時(shí)數(shù)據(jù)緩存結(jié)構(gòu)
通過前面內(nèi)容所述,盾構(gòu)實(shí)時(shí)數(shù)據(jù)在經(jīng)過Redis緩存之后,同步持久化至MySQL中,用于后續(xù)的數(shù)據(jù)分析工作,而且盾構(gòu)機(jī)的某些固有特征數(shù)據(jù)也要存儲(chǔ)到數(shù)據(jù)庫中,由于這些數(shù)據(jù)一般是結(jié)構(gòu)化數(shù)據(jù),所以可直接利用MySQL存儲(chǔ)。對(duì)于盾構(gòu)機(jī)特征數(shù)據(jù)和故障記錄等并不會(huì)由底層數(shù)據(jù)采集系統(tǒng)傳輸,而是訪問特定的接口得到,而此種訪問是以JSON字符串作為數(shù)據(jù)傳輸?shù)母袷?,因此在訪問特定接口獲得盾構(gòu)機(jī)特征數(shù)據(jù)和故障記錄信息的處理流程如圖4。
圖4 接口數(shù)據(jù)處理存儲(chǔ)流程
對(duì)于實(shí)時(shí)數(shù)據(jù)的持久化存儲(chǔ)時(shí)需要考慮盾構(gòu)機(jī)組成特點(diǎn)和系統(tǒng)的功能需求,然后設(shè)計(jì)存儲(chǔ)的表結(jié)構(gòu)。盾構(gòu)機(jī)是一種集機(jī)械、電氣和液壓系統(tǒng)與一體的大型設(shè)備,其結(jié)構(gòu)復(fù)雜,系統(tǒng)眾多,每個(gè)大的部件或者子系統(tǒng)中包含諸多零部件,并且零部件之間存在某種父子關(guān)系。所以在設(shè)計(jì)表結(jié)構(gòu)時(shí)考慮零部件的父子關(guān)系將其按照樹形結(jié)構(gòu)存儲(chǔ),即一臺(tái)設(shè)備包含多個(gè)子系統(tǒng),一個(gè)子系統(tǒng)包含多個(gè)部件,一個(gè)部件包含多個(gè)零件或測點(diǎn),即它們之間是1∶n的關(guān)系;同時(shí)考慮到多臺(tái)盾構(gòu)的集中監(jiān)控與數(shù)據(jù)運(yùn)用,所有數(shù)據(jù)存儲(chǔ)在一張數(shù)據(jù)表中會(huì)因?yàn)橛涗浱鄬?dǎo)致查詢某臺(tái)盾構(gòu)的運(yùn)行數(shù)據(jù)時(shí)緩慢,因此采用單盾構(gòu)單表的形式,即單張數(shù)據(jù)表中只存儲(chǔ)一臺(tái)盾構(gòu)的運(yùn)行數(shù)據(jù),并使用配置表維護(hù),使各臺(tái)盾構(gòu)名稱與數(shù)據(jù)表名關(guān)聯(lián)起來,從而將多臺(tái)盾構(gòu)的運(yùn)行數(shù)據(jù)分散到多張表中存儲(chǔ),減輕了單張表存儲(chǔ)記錄過多的壓力。于是綜合信息后得出其中的關(guān)聯(lián)如圖5。
圖5 盾構(gòu)運(yùn)行數(shù)據(jù)存儲(chǔ)表關(guān)聯(lián)示意
如圖5(a),通過配置表中表名字段與盾構(gòu)數(shù)據(jù)表名關(guān)聯(lián),實(shí)現(xiàn)數(shù)據(jù)分散至多表存儲(chǔ),而圖5(b)則是對(duì)某臺(tái)盾構(gòu)而言的設(shè)備、部件、測點(diǎn)和數(shù)據(jù)的關(guān)聯(lián)示意,如此則實(shí)現(xiàn)了樹形存儲(chǔ)。
應(yīng)用層主要是以數(shù)據(jù)層為基礎(chǔ),通過調(diào)用數(shù)據(jù)層向上提供的接口,對(duì)該層提供的盾構(gòu)運(yùn)行數(shù)據(jù)和特征數(shù)據(jù)進(jìn)行對(duì)應(yīng)的加工處理,實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)邏輯,并向表示層提供接口,將實(shí)現(xiàn)的業(yè)務(wù)邏輯通過表示層可視化表現(xiàn)。如此處于系統(tǒng)中間層的應(yīng)用層是系統(tǒng)核心,起著承上啟下的作用,系統(tǒng)的功能實(shí)現(xiàn)則主要在這層實(shí)現(xiàn)。
對(duì)于盾構(gòu)機(jī)而言,其在運(yùn)行過程中積累大量的工程數(shù)據(jù),包括關(guān)鍵部件測點(diǎn)的監(jiān)測參數(shù)、掘進(jìn)隧道的地質(zhì)數(shù)據(jù)、設(shè)備故障信息和維護(hù)信息等,這些數(shù)據(jù)是監(jiān)測管理盾構(gòu)的重要依據(jù)。因此對(duì)于盾構(gòu)管理而言,應(yīng)該是全周期的,即對(duì)盾構(gòu)施工前期、施工中期和施工后期的信息都需要進(jìn)行管理。而盾構(gòu)機(jī)工作環(huán)境較為惡劣,如果出現(xiàn)零件損壞,則勢必會(huì)影響整個(gè)盾構(gòu)的運(yùn)行,因此對(duì)于盾構(gòu)數(shù)據(jù)的處理運(yùn)用包含了實(shí)時(shí)數(shù)據(jù)監(jiān)測、測點(diǎn)歷史統(tǒng)計(jì)、故障信息記錄以及基于歷史運(yùn)行數(shù)據(jù)的故障預(yù)測與診斷等,便可以時(shí)刻關(guān)注盾構(gòu)的健康狀態(tài),使得在零部件出現(xiàn)損壞前給出預(yù)警,及時(shí)更換,從而不會(huì)影響整個(gè)系統(tǒng)的正常運(yùn)行。在這些功能的實(shí)現(xiàn)上,利用SSM框架進(jìn)行應(yīng)用系統(tǒng)解耦,以模塊獨(dú)立化的方式開發(fā),簡化了開發(fā)流程,達(dá)到在模塊內(nèi)部可以更加專注于邏輯實(shí)現(xiàn),高度內(nèi)聚,而在模塊之間專注于接口調(diào)用,低度耦合的目的。應(yīng)用層結(jié)構(gòu)如圖6。
圖6 應(yīng)用層結(jié)構(gòu)示意圖
如圖6,應(yīng)用層中包含多個(gè)功能模塊,并且各模塊之間相互獨(dú)立,通過Spring MVC向表示層提供統(tǒng)一的訪問接口,在接收到表示層請(qǐng)求之后,根據(jù)Spring MVC的控制器分發(fā)請(qǐng)求,直接調(diào)用對(duì)應(yīng)的模塊進(jìn)行其中的業(yè)務(wù)邏輯處理,同時(shí)這一過程有著Spring的管理與Mybatis對(duì)象關(guān)系映射,從而能夠完成接收請(qǐng)求,分發(fā)請(qǐng)求,業(yè)務(wù)處理,訪問數(shù)據(jù)源,模型生成,視圖填充以及給予響應(yīng)的完整過程[9]。
在過程實(shí)現(xiàn)中,Spring整合Mybatis,進(jìn)行數(shù)據(jù)通道、映射與事務(wù)的管理,通過在Spring容器中注冊(cè)DataSource、SqlSessionFactory和MapperScannerConfigurer的實(shí)例bean,將數(shù)據(jù)源屬性文件載入,從而加載數(shù)據(jù)通道和關(guān)系映射原則,并制定Mapper接口的掃描路徑,使得在訪問數(shù)據(jù)庫時(shí)自動(dòng)掃描Mapper接口進(jìn)行數(shù)據(jù)的持久化操作,把Java對(duì)象與數(shù)據(jù)表記錄映射起來,從而完成在應(yīng)用層中的對(duì)象傳遞。而Spring MVC則主要加載了請(qǐng)求映射器和適配器的驅(qū)動(dòng),配置了基于注解@Controller的控制器掃描路徑,使得Spring MVC在攔截請(qǐng)求之后,根據(jù)攔截路徑,自動(dòng)掃描@Controller類,匹配攔截路徑,從而可以執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯,調(diào)用對(duì)應(yīng)的接口方法,訪問對(duì)應(yīng)的數(shù)據(jù)庫表[6]。
之后則是在項(xiàng)目啟動(dòng)文件中設(shè)置Spring及Spring MVC的入口文件,從而在系統(tǒng)啟動(dòng)時(shí),框架功能也隨之準(zhǔn)備就緒,即在web.xml中設(shè)置Spring配置文件applicationContext.xml路徑以及Spring MVC的請(qǐng)求控制分發(fā)器DispatcherServlet和Spring-mvc.xml的路徑,并在web.xml中配置好請(qǐng)求攔截HTTP請(qǐng)求的基礎(chǔ)路徑[9]。
表示層作為系統(tǒng)頂層,主要是將盾構(gòu)數(shù)據(jù)處理應(yīng)用后的結(jié)果以某種方式呈現(xiàn)出來,即通過文字、圖片、表格和視頻等元素構(gòu)成的網(wǎng)頁顯示在用戶的瀏覽器上,從而使用戶更加直觀的感受各種數(shù)據(jù)處理后的結(jié)果。對(duì)于表示層而言,其通過應(yīng)用層取得業(yè)務(wù)邏輯處理后的結(jié)果數(shù)據(jù),填充到經(jīng)過HTML、CSS和JavaScript美化過的頁面中,形成最終的網(wǎng)頁。但是這樣在結(jié)果數(shù)據(jù)變化時(shí),為了體現(xiàn)這種變化,前端表示頁面也需要不斷刷新載入,這對(duì)于實(shí)時(shí)數(shù)據(jù)監(jiān)控顯示或者根據(jù)條件查詢的應(yīng)用來說很不友好,每次整體頁面刷新不僅體驗(yàn)不好,同時(shí)也對(duì)系統(tǒng)資源造成了浪費(fèi),所以就使用AJAX進(jìn)行頁面的局部刷新。通過AJAX[7]向服務(wù)端請(qǐng)求數(shù)據(jù)時(shí),一般有長輪詢和短輪詢兩種方式,其中長輪詢就是建立瀏覽器與服務(wù)器之間的鏈接持續(xù)保持下去,多次請(qǐng)求使用同一個(gè)連接,而短輪詢則是每次請(qǐng)求都會(huì)建立新的鏈接,請(qǐng)求結(jié)束后鏈接也隨之中斷;但由于長輪詢需要服務(wù)器維持鏈接,導(dǎo)致系統(tǒng)資源多余耗費(fèi),同時(shí)實(shí)時(shí)數(shù)據(jù)監(jiān)控顯示間隔在秒級(jí)單位,因此本文采用短輪詢的方式請(qǐng)求數(shù)據(jù)。
對(duì)于實(shí)時(shí)監(jiān)測數(shù)據(jù)顯示,每次AJAX請(qǐng)求為盾構(gòu)機(jī)標(biāo)識(shí)ID和當(dāng)前時(shí)間戳TIMESTAMP,服務(wù)器端接收參數(shù)之后,從Redis數(shù)緩存中查詢出數(shù)據(jù),并以AJAX請(qǐng)求中常用的JSON數(shù)據(jù)傳輸格式返回?cái)?shù)據(jù),對(duì)實(shí)時(shí)監(jiān)測頁面進(jìn)行局部的數(shù)據(jù)更新,從而達(dá)到盾構(gòu)運(yùn)行數(shù)據(jù)實(shí)時(shí)變化的目的。AJAX數(shù)據(jù)請(qǐng)求流程如圖7。
圖7 實(shí)時(shí)數(shù)據(jù)監(jiān)測顯示頁面AJAX請(qǐng)求流程
如圖7所示,前端瀏覽器獲取盾構(gòu)標(biāo)識(shí)ID和當(dāng)前時(shí)間戳TIMESTAMP之后作為參數(shù)發(fā)起AJAX請(qǐng)求,服務(wù)器接收AJAX請(qǐng)求后解析出盾構(gòu)標(biāo)識(shí)和時(shí)間戳參數(shù),并按此查詢Redis數(shù)據(jù)緩存,并將查詢結(jié)果以JSON格式返回至瀏覽器,瀏覽器解析JSON數(shù)據(jù),填充頁面實(shí)現(xiàn)局部刷新。而實(shí)現(xiàn)代碼如下[7]:
$.ajax({ type : "POST",url : "xxx",dataType : "json",
data : {"shieldID" : ID,"Timestamp" : Timestamp},
success : function (data) { …//更新頁面部分},
error : function () { …//異常處理部分代碼}});
實(shí)時(shí)數(shù)據(jù)監(jiān)測頁面示意如圖8,圖中通過純數(shù)據(jù)顯示方式將盾構(gòu)各子系統(tǒng)關(guān)鍵參量的數(shù)據(jù)變化直接表示,包括了千斤頂系統(tǒng)、刀盤系統(tǒng)、螺旋機(jī)系統(tǒng)和注漿與泡沫系統(tǒng),并結(jié)合折線圖和儀表板插件強(qiáng)調(diào)某些參量的變化趨勢與變動(dòng)情況。
而對(duì)于盾構(gòu)固有特征信息查詢或者統(tǒng)計(jì)分析、故障統(tǒng)計(jì)、地表沉降預(yù)測等結(jié)果顯示同樣是基于AJAX短輪詢實(shí)現(xiàn),即通過不同業(yè)務(wù)邏輯處理或根據(jù)模塊配置即可同樣原理實(shí)現(xiàn)。諸如圖9所示的故障統(tǒng)計(jì),通過柱狀圖顯示數(shù)量,表格顯示詳細(xì)記錄。
圖8 盾構(gòu)運(yùn)行數(shù)據(jù)實(shí)時(shí)監(jiān)測顯示示意圖
圖9 盾構(gòu)故障信息統(tǒng)計(jì)
本文使用Redis數(shù)據(jù)緩存和MySQL持久化,對(duì)盾構(gòu)運(yùn)行數(shù)據(jù)和結(jié)構(gòu)化特征數(shù)據(jù)進(jìn)行存儲(chǔ),并通過SSM框架搭建了基于B/S模式的盾構(gòu)數(shù)據(jù)處理運(yùn)用系統(tǒng)。系統(tǒng)總體結(jié)構(gòu)分為三層,分別是數(shù)據(jù)層、應(yīng)用層和結(jié)構(gòu)層,在數(shù)據(jù)層中使用Redis對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行緩存,以滿足實(shí)時(shí)監(jiān)控的要求,并且將歷史數(shù)據(jù)及時(shí)同步至MySQL中,對(duì)后續(xù)一系列的數(shù)據(jù)處理應(yīng)用提供數(shù)據(jù)源。雖然目前可以實(shí)現(xiàn)多臺(tái)盾構(gòu)的集中監(jiān)控,但為了提供數(shù)據(jù)處理能力和系統(tǒng)交互能力,后續(xù)可進(jìn)一步搭建Redis集群,以應(yīng)對(duì)高并發(fā)系統(tǒng)訪問;同時(shí)在數(shù)據(jù)處理方面應(yīng)用機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘等方法進(jìn)一步增強(qiáng)對(duì)盾構(gòu)數(shù)據(jù)的處理效果,從而能夠完整的實(shí)現(xiàn)盾構(gòu)的全生命周期管理。