謝宸浩,黎德波,羅賜麟,徐黃飛,魯峻麟
(1.廣州市突發(fā)事件預(yù)警信息發(fā)布中心,廣東廣州 511430;2.廣東省氣象數(shù)據(jù)中心,廣東廣州 510640)
廣州CINRAD/SA新一代天氣雷達(dá)(以下簡(jiǎn)稱(chēng)“廣州雷達(dá)”)于1999年籌建,2001年開(kāi)始正式運(yùn)行。廣州雷達(dá)在2016年完成雙偏振升級(jí),2018年完成技術(shù)升級(jí)及技術(shù)狀態(tài)統(tǒng)一后,在一定程度上實(shí)現(xiàn)了雷達(dá)系統(tǒng)的優(yōu)化配置,提高了雷達(dá)技術(shù)性能,進(jìn)一步提升廣州雷達(dá)設(shè)備整體質(zhì)量。同時(shí),廣州雷達(dá)在完成一系列的升級(jí)改造后,數(shù)據(jù)格式以及業(yè)務(wù)上傳方式也發(fā)生了明顯的改變。而目前廣州雷達(dá)站在用的監(jiān)控軟件已無(wú)法應(yīng)對(duì)當(dāng)前雷達(dá)發(fā)展的新情況,陳舊且簡(jiǎn)單的底層架構(gòu)造成軟件容錯(cuò)性差,技術(shù)升級(jí)困難,長(zhǎng)時(shí)間不更新造成軟件對(duì)目前主流的windows系統(tǒng)版本兼容差,已無(wú)法滿(mǎn)足網(wǎng)絡(luò)安全要求。全國(guó)多個(gè)臺(tái)站在這方面也做了嘗試,郭春輝等[1]通過(guò)讀取RDA計(jì)算機(jī)的RadarMonitor文件夾下的.dat二進(jìn)制文件,獲取雷達(dá)設(shè)備運(yùn)行時(shí)的各種參數(shù),并將異常參數(shù)及結(jié)果通知值班人員,但是雷達(dá)虛警比較多,虛警在雷達(dá)下一次體掃標(biāo)定后會(huì)自動(dòng)消除,因此監(jiān)控.dat文件容易造成誤報(bào)過(guò)多;吳少峰等[2]是利用監(jiān)控log文件完成對(duì)雷達(dá)報(bào)警信息的監(jiān)控,但log文件不同臺(tái)站文件的個(gè)數(shù)、類(lèi)型及格式不盡相同,且RDA計(jì)算機(jī)系統(tǒng)升級(jí)也將改變log文件的格式,不利于長(zhǎng)期使用和推廣,而且同一個(gè)log文件每天產(chǎn)生一個(gè),文件信息量大,占用資源較大,客戶(hù)端在臺(tái)站運(yùn)行時(shí)偶爾會(huì)由于信息量過(guò)大而發(fā)生癱瘓現(xiàn)象。
隨著雙偏振天氣雷達(dá)進(jìn)行業(yè)務(wù)上傳的數(shù)據(jù)量越來(lái)越大,業(yè)務(wù)考核越來(lái)越嚴(yán)格,雙偏振天氣雷達(dá)資料的及時(shí)傳輸變得越來(lái)越重要,按照2018年12月中國(guó)氣象局綜合觀(guān)測(cè)司審定的新一代天氣雷達(dá)觀(guān)測(cè)規(guī)定,必須按有關(guān)規(guī)定向國(guó)家、省級(jí)信息業(yè)務(wù)部門(mén)傳送新一代天氣雷達(dá)探測(cè)資料[3]。為提高雙偏振天氣雷達(dá)系統(tǒng)的可用性,特別是保障重大天氣過(guò)程中雷達(dá)的正常運(yùn)行,是雷達(dá)機(jī)務(wù)保障人員的重要職責(zé),因此開(kāi)發(fā)新的廣州新一代雙偏振天氣雷達(dá)運(yùn)行監(jiān)控軟件(以下簡(jiǎn)稱(chēng)“監(jiān)控軟件”)并應(yīng)用于業(yè)務(wù)具有非常重要的意義。
監(jiān)控軟件的開(kāi)發(fā)平臺(tái)采用了Python3.10+Pyside2+VSCode,軟件整體進(jìn)行模塊化獨(dú)立設(shè)計(jì),各功能模塊集成于主程序模塊中,子模塊可獨(dú)立操作,從而降低了程序的復(fù)雜度,使程序的設(shè)計(jì)操作簡(jiǎn)單化。監(jiān)控軟件的整體架構(gòu)由展示層、控制層、業(yè)務(wù)層以及數(shù)據(jù)層組成,如圖1所示。展示層的界面開(kāi)發(fā)采用PySide2,并通過(guò)CSS樣式表進(jìn)行修飾。PySide2提供了對(duì)Qt5.12+Designer完整框架的訪(fǎng)問(wèn),因此使用PySide2既能開(kāi)發(fā)出完美的界面,又能享受Python的便捷開(kāi)發(fā)。同時(shí)PySide2是開(kāi)源的,使用不受限制,與傳統(tǒng)Qt的C++相比,使用PySide2能大大減少代碼量,更便于軟件的維護(hù)升級(jí)??刂茖油ㄟ^(guò)Python3.10與界面庫(kù)構(gòu)建操作控件響應(yīng)用戶(hù)需求,并與業(yè)務(wù)層進(jìn)行實(shí)時(shí)交互。數(shù)據(jù)層負(fù)責(zé)對(duì)軟件的監(jiān)控信息、監(jiān)控參數(shù)、報(bào)警配置以及用戶(hù)信息等關(guān)鍵參數(shù)進(jìn)行存儲(chǔ)。業(yè)務(wù)層則依據(jù)控制層的指令來(lái)調(diào)用數(shù)據(jù)層的關(guān)鍵參數(shù),進(jìn)行雷達(dá)運(yùn)行狀態(tài)數(shù)據(jù)的采集、緩存、處理、比對(duì)。監(jiān)控軟件的運(yùn)行環(huán)境可同時(shí)兼容Windows 10以及Windows 7操作系統(tǒng)。
圖1 軟件架構(gòu)設(shè)計(jì)示意圖
雷達(dá)系統(tǒng)主要由3部分組成,分別是雷達(dá)產(chǎn)品生成子系統(tǒng)(radar products generator,RPG)、主用戶(hù)終端子系統(tǒng)(principal user processor,PUP)和雷達(dá)數(shù)據(jù)采集子系統(tǒng)(radar date acquisition,RDA)[4]。雷達(dá)約6 min完成1次體掃,RDA將標(biāo)準(zhǔn)格式雷達(dá)基數(shù)據(jù)向省級(jí)和RPG軟件的逐徑向分發(fā),RPG軟件解析基數(shù)據(jù)并將解析后的數(shù)據(jù)分發(fā)到PUP,PUP將RPG處理后的數(shù)據(jù)進(jìn)行二次處理,生成雷達(dá)產(chǎn)品并上傳至省局[5]。廣州雷達(dá)在2016年完成雙偏振升級(jí)后需同時(shí)上傳單雙偏振兩種雷達(dá)產(chǎn)品共計(jì)57種。同時(shí),廣州雷達(dá)在2018年完成技術(shù)升級(jí)及技術(shù)狀態(tài)統(tǒng)一后,新增了雷達(dá)標(biāo)準(zhǔn)輸出控制器,雷達(dá)的狀態(tài)文件通過(guò)標(biāo)準(zhǔn)輸出控制器上傳至省局。為了更好地保障廣州雙偏振雷達(dá)正常運(yùn)行并完成廣州雙偏振雷達(dá)資料的業(yè)務(wù)上傳,監(jiān)控軟件主要實(shí)現(xiàn)以下功能:雷達(dá)資料生成和傳輸?shù)谋O(jiān)控、雷達(dá)狀態(tài)文件傳輸?shù)谋O(jiān)控、雷達(dá)報(bào)警信息的本地化存儲(chǔ)和多種報(bào)警方式,軟件的功能結(jié)構(gòu)如圖2所示。
圖2 軟件功能結(jié)構(gòu)示意圖
1)監(jiān)控模塊。
(1)雷達(dá)基數(shù)據(jù)生成監(jiān)控。
雷達(dá)約6 min生成一個(gè)基數(shù)據(jù)文件,為了保證雷達(dá)數(shù)據(jù)的完整性,雷達(dá)基數(shù)據(jù)在上傳省局的同時(shí)也會(huì)進(jìn)行本地化存儲(chǔ)[6],通過(guò)定時(shí)檢查本地FTP雷達(dá)共享的基數(shù)據(jù)目錄中最新時(shí)次的雷達(dá)基數(shù)據(jù)文件的寫(xiě)入時(shí)間,與計(jì)算機(jī)系統(tǒng)時(shí)間進(jìn)行比對(duì),兩者時(shí)間差值若是大于軟件設(shè)置的基數(shù)據(jù)生成報(bào)警門(mén)限,則可判斷為雷達(dá)基數(shù)據(jù)生成異常,并向值班人員發(fā)出告警。
(2)雷達(dá)產(chǎn)品生成監(jiān)控。
PUP生成雷達(dá)產(chǎn)品上傳至省局后,默認(rèn)會(huì)在本地保存7 d的雷達(dá)產(chǎn)品文件[7]。與基于FTP的雷達(dá)基數(shù)據(jù)生成監(jiān)控模塊的設(shè)計(jì)思路一致,定時(shí)檢查FTP雷達(dá)產(chǎn)品共享目錄中最新時(shí)次的雷達(dá)產(chǎn)品文件的寫(xiě)入時(shí)間,與計(jì)算機(jī)系統(tǒng)時(shí)間進(jìn)行比對(duì),兩者時(shí)間差值若是大于軟件設(shè)置的產(chǎn)品生成報(bào)警門(mén)限,則可判斷為雷達(dá)產(chǎn)品生成異常,并向值班人員發(fā)出告警。由于每種雷達(dá)產(chǎn)品生成的時(shí)間間隔不一樣,如VWP每6 min生成一個(gè)產(chǎn)品文件,PPI每1 min生成一個(gè)產(chǎn)品文件,因此雷達(dá)產(chǎn)品生成報(bào)警門(mén)限需要根據(jù)所監(jiān)控的雷達(dá)產(chǎn)品種類(lèi)進(jìn)行設(shè)置。
(3)雷達(dá)狀態(tài)傳輸監(jiān)控。
雷達(dá)標(biāo)準(zhǔn)輸出控制器的運(yùn)行情況會(huì)按照月份生成log文件,存儲(chǔ)在根目錄下的WRSOC文件夾中,當(dāng)標(biāo)準(zhǔn)輸出控制器成功上傳雷達(dá)狀態(tài)信息至省局后,會(huì)記錄在log文件中,內(nèi)容包括上傳時(shí)間、狀態(tài)文件名和省局服務(wù)器地址,只需定時(shí)讀取標(biāo)準(zhǔn)輸出控制器中yyyymm.log文件中關(guān)于雷達(dá)狀態(tài)文件上傳的信息的最新修改時(shí)間,與計(jì)算機(jī)系統(tǒng)時(shí)間進(jìn)行比對(duì),兩者時(shí)間差值若是大于軟件設(shè)置的報(bào)警門(mén)限,則可判斷為雷達(dá)狀態(tài)文件傳輸異常,并向值班人員發(fā)出告警。
(4)雷達(dá)產(chǎn)品傳輸監(jiān)控。
廣州雷達(dá)目前按照省局要求在PUP業(yè)務(wù)機(jī)上傳57種雷達(dá)產(chǎn)品至省局服務(wù)器,當(dāng)雷達(dá)存在網(wǎng)絡(luò)延遲太大或暫時(shí)中斷等問(wèn)題時(shí),PUP上傳不成功的雷達(dá)產(chǎn)品會(huì)存儲(chǔ)至根目錄下的archive文件夾中[8-10]。定時(shí)檢查FTP雷達(dá)產(chǎn)品緩存共享目錄中是否有新的雷達(dá)產(chǎn)品文件產(chǎn)生,當(dāng)雷達(dá)產(chǎn)品緩存目錄存在文件時(shí),讀取該目錄中最舊時(shí)次的雷達(dá)產(chǎn)品文件的寫(xiě)入時(shí)間,與計(jì)算機(jī)系統(tǒng)時(shí)間進(jìn)行比對(duì),兩者時(shí)間差值就是該未成功上傳的產(chǎn)品文件的存留時(shí)間,若是存留時(shí)間大于軟件設(shè)置的產(chǎn)品傳輸報(bào)警門(mén)限,則可判斷為雷達(dá)產(chǎn)品文件傳輸異常,并向值班人員發(fā)出告警。
2)報(bào)警模塊。
雷達(dá)報(bào)警模塊實(shí)現(xiàn)了聲音、微信、短信3種報(bào)警方式,可確保值班人員及時(shí)掌握雷達(dá)故障。
(1)多媒體聲音報(bào)警模塊:通過(guò)調(diào)用系統(tǒng)音頻格式文件,讓音響輸出設(shè)備播報(bào)雷達(dá)報(bào)警信息。
(2)短信報(bào)警模塊:利用各手機(jī)運(yùn)營(yíng)商自帶郵箱能開(kāi)啟手機(jī)短信推送郵件提醒的特點(diǎn),在開(kāi)啟郵箱的SMTP服務(wù)后,即可通過(guò)python中的smtplib進(jìn)行請(qǐng)求郵件服務(wù),實(shí)現(xiàn)軟件自動(dòng)給值班人員發(fā)送報(bào)警短信。
(3)微信報(bào)警模塊:微信是最為常用的手機(jī)APP之一,通過(guò)微信報(bào)警可以提高監(jiān)控軟件的實(shí)用性。在微信APP中開(kāi)啟“QQ郵箱提醒”功能,同時(shí)將微信與QQ郵箱關(guān)聯(lián),通過(guò)向值班人員的QQ郵箱發(fā)送報(bào)警郵件來(lái)實(shí)現(xiàn)值班人員的微信提醒。
3)報(bào)警日志模塊。
該系統(tǒng)報(bào)警記錄全部實(shí)現(xiàn)本地化保存,用于雷達(dá)發(fā)生故障后快速查詢(xún)和統(tǒng)計(jì)。該模塊有3個(gè)功能,分別是寫(xiě)入、查詢(xún)以及清除。當(dāng)系統(tǒng)監(jiān)控到雷達(dá)故障發(fā)生報(bào)警時(shí),系統(tǒng)會(huì)將發(fā)生報(bào)警的時(shí)間及類(lèi)型本地存儲(chǔ)在A(yíng)larm.log文件中,值班人員可以在軟件中的監(jiān)控信息界面右鍵進(jìn)行快速查詢(xún)。
4)其他模塊。
軟件還集成了參數(shù)管理模塊、軟件狀態(tài)監(jiān)控模塊以及軟件注冊(cè)模塊,其中參數(shù)管理模塊主要用于統(tǒng)一管理雷達(dá)資料路徑、監(jiān)控頻率、報(bào)警門(mén)限、報(bào)警方式、值班人員信息等參數(shù)。軟件對(duì)參數(shù)類(lèi)型做了分類(lèi),存儲(chǔ)時(shí)只存儲(chǔ)編號(hào),顯示時(shí)再轉(zhuǎn)換成對(duì)應(yīng)的字符顯示。軟件狀態(tài)監(jiān)控模塊主要用于對(duì)軟件的運(yùn)行狀態(tài)如開(kāi)始、暫停、報(bào)警等進(jìn)行監(jiān)控,并實(shí)時(shí)顯示在軟件監(jiān)控信息界面中的狀態(tài)圖標(biāo)中,幫助值班人員快速掌握軟件的運(yùn)行狀態(tài)。同時(shí),軟件會(huì)根據(jù)當(dāng)下的運(yùn)行狀態(tài)判斷用戶(hù)的操作是否符合規(guī)范,并進(jìn)行相對(duì)應(yīng)的彈窗提醒。
為了解決監(jiān)控.dat文件以及l(fā)og文件造成的誤報(bào)過(guò)多、信息量過(guò)大導(dǎo)致軟件崩潰等問(wèn)題,軟件通過(guò)監(jiān)控雷達(dá)資料生成及傳輸?shù)哪繕?biāo)目錄來(lái)判斷雷達(dá)的運(yùn)行狀態(tài)。同時(shí),由于雷達(dá)部分資料如雷達(dá)產(chǎn)品ppi生成速度快,資料目錄的文件數(shù)量多,采用listdir()方法讀取此類(lèi)雷達(dá)資料目錄時(shí),會(huì)返回包含目錄中所有文件的列表,類(lèi)型為list。這種方法耗時(shí)較長(zhǎng),設(shè)置的監(jiān)控門(mén)限較小的情況下容易造成誤報(bào)。為了解決這個(gè)問(wèn)題,軟件使用scandir()方法代替listdir(),讀取雷達(dá)資料目錄時(shí)返回的是包含文件類(lèi)型或文件屬性信息的os.DirEntry迭代器,通過(guò)循環(huán)讀取迭代器就能快速定位到最新生成的雷達(dá)資料。關(guān)鍵代碼如下:
線(xiàn)程也叫輕量級(jí)進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,也是進(jìn)程中的實(shí)際運(yùn)作單位。進(jìn)程在執(zhí)行過(guò)程之中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大的提升了程序的運(yùn)行效率。本監(jiān)控軟件把4個(gè)雷達(dá)資料監(jiān)控模塊、報(bào)警測(cè)試模塊以及主程序分別放在獨(dú)立線(xiàn)程中運(yùn)行,每個(gè)線(xiàn)程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流,通過(guò)多線(xiàn)程監(jiān)控能避免當(dāng)其中一類(lèi)雷達(dá)資料監(jiān)控耗時(shí)過(guò)長(zhǎng)時(shí),整個(gè)主程序都會(huì)等待這個(gè)操作,主程序就不能及時(shí)響應(yīng)用戶(hù)的其他操作。同時(shí),為了解決并發(fā)訪(fǎng)問(wèn)的沖突問(wèn)題,軟件將主程序線(xiàn)程設(shè)置為守護(hù)線(xiàn)程,并通過(guò)創(chuàng)建線(xiàn)程列表來(lái)監(jiān)控子線(xiàn)程的運(yùn)行狀態(tài),子線(xiàn)程沖突時(shí)用遞歸鎖RLock進(jìn)行阻塞,子線(xiàn)程完成監(jiān)控任務(wù)后會(huì)自動(dòng)結(jié)束進(jìn)程,釋放內(nèi)存,保證主程序的運(yùn)行效率。關(guān)鍵代碼如下:
單例模式是一種軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類(lèi)只有一個(gè)實(shí)例存在。當(dāng)希望在整個(gè)軟件不會(huì)存在多個(gè)相同的實(shí)例對(duì)象,從而避免嚴(yán)重浪費(fèi)內(nèi)存資源時(shí),單例對(duì)象就能派上用場(chǎng)。軟件把需要反復(fù)調(diào)用的線(xiàn)程開(kāi)啟、銷(xiāo)毀函數(shù)以及監(jiān)控狀態(tài)信號(hào)觸發(fā)的回調(diào)函數(shù)放在命名為SCHEDULER的單例模式中,這樣可以節(jié)約內(nèi)存和計(jì)算,SCHEDULER單例模式作為計(jì)數(shù)器還可以保證多個(gè)線(xiàn)程的協(xié)調(diào)性。此外,還方便軟件的管理,對(duì)于后續(xù)的升級(jí)也有很大的便捷性。關(guān)鍵代碼如下:
廣州新一代雙偏振天氣雷達(dá)運(yùn)行監(jiān)控軟件的界面功能明了、操作便捷,在軟件界面的設(shè)計(jì)上使用了stackedWidget,在軟件界面上將軟件的4個(gè)功能模塊全部列出,其中監(jiān)控信息功能模塊主要用于顯示監(jiān)控的信息流以及報(bào)警信息,并提供了監(jiān)控開(kāi)始、暫停、報(bào)警方式測(cè)試的軟件基礎(chǔ)操作;參數(shù)設(shè)置、報(bào)警配置、軟件注冊(cè)功能模塊則用于修改系統(tǒng)的配置文件,如設(shè)置ftp監(jiān)控路徑、監(jiān)控頻率、報(bào)警時(shí)間門(mén)限等系統(tǒng)參數(shù)。
為了讓值班人員能實(shí)時(shí)掌握雷達(dá)資料最新的生成以及傳輸情況,軟件會(huì)在監(jiān)控信息功能模塊中滾動(dòng)顯示當(dāng)前的監(jiān)控情況。為了保證雷達(dá)異常清晰顯目,異常狀態(tài)及異常結(jié)果顯示為紅色字體;同時(shí),監(jiān)控信息框左下方圖標(biāo)用于指示當(dāng)前雷達(dá)的運(yùn)行狀態(tài),以便于值班人員能做到快速定位異常內(nèi)容(黃色圖標(biāo)代表軟件等待開(kāi)始監(jiān)控,綠色圖標(biāo)代表軟件正在運(yùn)行且雷達(dá)狀態(tài)正常,紅色表示軟件正在運(yùn)行且雷達(dá)異常),如圖3所示。
圖3 軟件監(jiān)控信息界面
該功能模塊主要用于設(shè)置軟件監(jiān)控的系統(tǒng)參數(shù),其中包括ftp監(jiān)控路徑、監(jiān)控頻率、報(bào)警時(shí)間門(mén)限、值班人員的選擇等。同時(shí),為了保證軟件的通用性,考慮到部分臺(tái)站未完成技術(shù)升級(jí)及技術(shù)狀態(tài)統(tǒng)一,以及部分臺(tái)站所使用的監(jiān)控電腦性能較差,軟件僅默認(rèn)開(kāi)啟雷達(dá)基數(shù)據(jù)和產(chǎn)品生成監(jiān)控,雷達(dá)狀態(tài)信息傳輸和產(chǎn)品傳輸監(jiān)控則可根據(jù)臺(tái)站需求選擇是否需要開(kāi)啟,如圖4所示。
圖4 參數(shù)設(shè)置界面
軟件多媒體聲音報(bào)警為默認(rèn)選項(xiàng),值班人員可根據(jù)需求在參數(shù)設(shè)置界面選擇是否開(kāi)啟短信報(bào)警功能。同時(shí),可在報(bào)警配置分界面進(jìn)行配置用于發(fā)送報(bào)警信息的郵箱,以及對(duì)站內(nèi)值班人員的信息進(jìn)行刪增減改。如需通過(guò)微信接收雷達(dá)報(bào)警信息,可將站內(nèi)值班人員的郵箱地址設(shè)置為QQ郵箱,并在微信APP中開(kāi)啟“QQ郵箱提醒”功能。
業(yè)務(wù)上,及時(shí)準(zhǔn)確地了解雷達(dá)的運(yùn)行狀態(tài)和模式,及時(shí)采取措施處理系統(tǒng)運(yùn)行故障,減少停機(jī)時(shí)間,更好地發(fā)揮天氣雷達(dá)在災(zāi)害性天氣中的作用,是雷達(dá)值班機(jī)務(wù)人員的重要職責(zé)。廣州新一代雙偏振天氣雷達(dá)運(yùn)行監(jiān)控軟件實(shí)現(xiàn)了對(duì)技術(shù)升級(jí)后的雙偏振天氣雷達(dá)運(yùn)行狀態(tài)、資料傳輸情況和網(wǎng)絡(luò)連接狀態(tài)的自動(dòng)監(jiān)控,軟件兼容目前主流的windows操作系統(tǒng)版本。廣州雷達(dá)站對(duì)該軟件進(jìn)行了3個(gè)月的試運(yùn)行,期間利用雷達(dá)的周和月維護(hù)停機(jī)時(shí)間進(jìn)行多次測(cè)試,證明軟件對(duì)于雷達(dá)停機(jī)響應(yīng)及時(shí)。自正式投入業(yè)務(wù)運(yùn)行以來(lái),軟件運(yùn)行穩(wěn)定,軟件發(fā)生告警12次,告警均為基數(shù)據(jù)生成異常,后經(jīng)值班人員排查,是由于廣州雷達(dá)RPG被植入挖礦病毒后造成RPG計(jì)算機(jī)性能大幅度下降,從而導(dǎo)致雷達(dá)基數(shù)據(jù)本地保存延時(shí)嚴(yán)重。軟件故障提醒及時(shí)準(zhǔn)確,成功協(xié)助值班人員及時(shí)發(fā)現(xiàn)并解決了該次故障,極大地縮短值班人員的故障響應(yīng)時(shí)間。