楊 豪,胡利軍,樓成武
1(寧波市氣象網(wǎng)絡(luò)與裝備保障中心,寧波 315012)
2(溫州市氣象局,溫州 325027)
新一代天氣雷達(dá)在強(qiáng)對流、暴雨等突發(fā)災(zāi)害性的中小尺度天氣系統(tǒng)監(jiān)測和預(yù)警中發(fā)揮著重要的作用,有“千里眼”之稱[1].隨著現(xiàn)代氣象業(yè)務(wù)和氣象服務(wù)的不斷深化,雷達(dá)系統(tǒng)運(yùn)行可靠性和穩(wěn)定性的要求越來越高.
雷達(dá)系統(tǒng)含機(jī)內(nèi)自動測試設(shè)備(Built-In Test Equipment,BITE),但是需要近距離監(jiān)測和集中控制.業(yè)務(wù)人員通過雷達(dá)發(fā)射機(jī)機(jī)柜上的操控面板來判斷發(fā)射機(jī)各組件工作情況,通過功能鍵實(shí)現(xiàn)切換發(fā)射機(jī)的工作模式等操作[2].在雷達(dá)處于無人值守的情況下,業(yè)務(wù)人員只能從雷達(dá)自身的運(yùn)行軟件獲得簡單的報警文字提示,很多情況下無法通過遠(yuǎn)程監(jiān)控和控制來判斷、處理問題,達(dá)不到快速運(yùn)維、及時保障的要求.
針對雷達(dá)監(jiān)控和維護(hù)中存在的不足,開發(fā)了一套無人值守的雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng),實(shí)現(xiàn)運(yùn)行狀態(tài)遠(yuǎn)程監(jiān)測和控制.采用ZigBee 通信方式實(shí)現(xiàn)監(jiān)控組網(wǎng)通信,利用語言集成查詢LINQ (Language INtegrated Query)技術(shù)、Entity Framework 技術(shù)、多線程技術(shù)編寫數(shù)據(jù)采集處理和控制軟件.
遠(yuǎn)程監(jiān)控系統(tǒng)監(jiān)控80 路故障信號、19 路電壓電流信號及8 路運(yùn)行狀態(tài)信號,另外還有8 路輸出控制信號,同時需要對外部供電電源、運(yùn)行環(huán)境參數(shù)進(jìn)行監(jiān)控.數(shù)據(jù)采集硬件電路的設(shè)計需要滿足快速運(yùn)算和大量存儲的要求,同時又要避免對雷達(dá)原有系統(tǒng)產(chǎn)生干擾.通過定義一個通信協(xié)議將采集到的數(shù)據(jù)按照指定的通信方式發(fā)送到上位機(jī),上位機(jī)軟件將接收到的數(shù)據(jù)解析出來后進(jìn)行存儲、展示,提供故障報警、遠(yuǎn)程控制、數(shù)據(jù)查詢分析等功能.
總體系統(tǒng)結(jié)構(gòu)框圖如圖1 所示.
圖1 總體系統(tǒng)結(jié)構(gòu)框圖
可選的監(jiān)控組網(wǎng)通信主要有LAN、RS232、ZigBee等方式,實(shí)際的硬件電路中預(yù)留了這些通信方式.通過比較它們各自的特點(diǎn),根據(jù)各站的實(shí)際情況選擇需要的通信方式,幾種可選通信方式的主要特點(diǎn)如表1.
在實(shí)際應(yīng)用中主要采用ZigBee 通信方式[3],不僅可以滿足系統(tǒng)機(jī)房內(nèi)的通信,也可滿足不同機(jī)房或樓層間的可靠通信.ZigBee 通信優(yōu)勢在于:1)可實(shí)現(xiàn)自行組網(wǎng)通信,個別傳感器出現(xiàn)異常不影響整個組網(wǎng)通信.2)穩(wěn)定性高,在長時間的連續(xù)運(yùn)行中能滿足監(jiān)測和控制的要求.3)可擴(kuò)展性好,可任意增加相同通信協(xié)議的其他采集電路或傳感器[4].4)無線通信,通信方式不需布線,可有效避免布線帶來的問題,不必改變機(jī)房環(huán)境和雷達(dá)系統(tǒng)結(jié)構(gòu).外部電源及溫濕度數(shù)據(jù)采集硬件電路中的每一個電壓電流互感器、運(yùn)行環(huán)境溫濕度傳感器位置分布分散,因此選擇ZigBee 這種無線通信方式進(jìn)行組網(wǎng)優(yōu)勢明顯.寧波雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng)采用ZigBee 無線通信方式來獲取雷達(dá)的運(yùn)行狀態(tài),實(shí)時掌握雷達(dá)各組件的運(yùn)行情況,以及在必要時刻通過該方式控制雷達(dá).
表1 通信方式的主要特點(diǎn)
信息采集硬件電路以單片機(jī)為核心,由電平信號輸入接口電路、電壓電流信號轉(zhuǎn)換電路、輸出控制接口電路、以太網(wǎng)通信接口電路、RS485 通信接口電路、RS232 通信接口電路、ZigBee 無線通信接口電路等電路模塊組成.
數(shù)據(jù)采集及運(yùn)算電路是整個電路的核心部分,由單片機(jī)及附屬電路組成.單片機(jī)采用美國德州儀器公司生產(chǎn)的16 位單片機(jī) MSP430F5438A.該單片機(jī)包括3 個16 位定時器、一個高性能12 位AD 轉(zhuǎn)換模塊、多達(dá)4 個通用串行通信接口(USCI)、一個硬件乘法器、DMA、具有報警功能的RTC 模塊和多達(dá)87 個I/O 引腳,具有外圍接口多、程序容量大,功能強(qiáng)、功耗低等特點(diǎn)[5].其內(nèi)部集成14 個外部通道的12 位AD轉(zhuǎn)換模塊可直接用于雷達(dá)電壓電流等參數(shù)的采集.其中4 路串口通信接口可與上位機(jī)通信.其自身所帶的FLASH 存儲器可存儲標(biāo)定參數(shù)及其他運(yùn)行參數(shù),完全滿足采集與運(yùn)算電路要求.
為了盡量避免對雷達(dá)自身電路的影響,采用DCDC 隔離電源電路設(shè)計,信號采樣接口進(jìn)行光耦隔離,保證在自身線路出現(xiàn)問題情況下不影響雷達(dá)系統(tǒng)正常運(yùn)行,平時電路工作中不會對雷達(dá)設(shè)備本身造成影響[6].
根據(jù)需要采集的物理量設(shè)計指令格式,不同的設(shè)備地址分別對應(yīng)采集和控制雷達(dá)系統(tǒng)運(yùn)行狀態(tài),以及采集雷達(dá)外部供電情況和環(huán)境參數(shù),如表2.采集和控制雷達(dá)系統(tǒng)運(yùn)行狀態(tài)只有一個采集器,因此指令格式中的設(shè)備地址定義為1 個字節(jié),將0xFF 地址作為廣播地址.在實(shí)際應(yīng)用中,一套雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng)對應(yīng)一部雷達(dá),不可能用到0xFF 這個地址.采集供電、環(huán)境參數(shù)等外部物理量的指令格式的設(shè)備地址定義為2 個字節(jié),低字節(jié)表示傳感器地址,高字節(jié)表示節(jié)點(diǎn)地址.
小蟲的心情極好與風(fēng)無關(guān),而是受了姑父的鼓舞。能被姑父器重,是小蟲到凌州以來最大的心愿。平時,小蟲和姑父之間像隔著一座高大的山坡,姑父在山巔,小蟲在山谷。這些年小蟲一直懷著無比崇敬的心情,就這么仰視著姑父。小蟲非常希望自己能干件漂亮的活兒,讓姑父瞧瞧。現(xiàn)在,機(jī)會來了。
表2 雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng)的指令格式
無論是節(jié)點(diǎn)地址還是傳感器地址,設(shè)置范圍均為0x00-0xFE,0xFF 為廣播地址.作為約定,當(dāng)指令中設(shè)備地址低字節(jié)為0xFF,高字節(jié)非0xFF 時,則按照一定時延讀取指定節(jié)點(diǎn)的所有傳感器的數(shù)據(jù);當(dāng)指令中設(shè)備地址低字節(jié)非0xFF,高字節(jié)為0xFF 時,考慮到實(shí)際應(yīng)用中讀取所有節(jié)點(diǎn)某一指定傳感器的數(shù)據(jù)意義不大,則交換高低字節(jié),仍讀取指定節(jié)點(diǎn)的所有傳感器的數(shù)據(jù);當(dāng)指令中設(shè)備地址低字節(jié)和高字節(jié)均為0xFF 時,則按照一定時延讀取所有指定節(jié)點(diǎn)的所有傳感器的數(shù)據(jù);當(dāng)指令中設(shè)備地址低字節(jié)和高字節(jié)均非0xFF 時,則讀取指定節(jié)點(diǎn)中指定傳感器的數(shù)據(jù).
遠(yuǎn)程監(jiān)控軟件實(shí)現(xiàn)對雷達(dá)運(yùn)行狀態(tài)及外部供電的智能化和遠(yuǎn)程化監(jiān)控,實(shí)時掌握雷達(dá)的運(yùn)行狀態(tài),迅速采取有效的措施.上位機(jī)的軟件主要是下發(fā)采集指令采集雷達(dá)的運(yùn)行狀態(tài)、報警、組件供電的信息和外部供電、運(yùn)行環(huán)境溫濕度的信息,并將數(shù)據(jù)進(jìn)行解析、存儲和實(shí)時報警.在雷達(dá)系統(tǒng)異常時,可通過軟件下發(fā)控制指令進(jìn)行故障信息復(fù)位等操作.監(jiān)控軟件主界面如圖2 所示.
軟件系統(tǒng)采用基于.Net Framework 開發(fā)平臺的C/S 架構(gòu)和Windows Forms 技術(shù)進(jìn)行開發(fā),Windows Forms 有很多成熟的控件,可信手拈來,就算需要重構(gòu)也易于上手[7,8].以Visual Studio 為開發(fā)工具,整個軟件系統(tǒng)包括串口通信、數(shù)據(jù)解析、數(shù)據(jù)存儲、數(shù)據(jù)顯示、閾值報警、遠(yuǎn)程控制、數(shù)據(jù)查詢等功能模塊,監(jiān)控系統(tǒng)的軟件架構(gòu)、軟件流程如圖3、圖4 所示.
系統(tǒng)開發(fā)中由于一次性需要處理的數(shù)據(jù)量較大,技術(shù)難點(diǎn)之一在于串口通信編程.微軟提供的.Net Framework 中自帶SerialPort 組件,可以直接使用,但是該組件有一定缺點(diǎn)和局限性.自帶的SerialPort 是窗體控件類型,內(nèi)部缺少委托和回調(diào)函數(shù),對多線程的支持不夠友好.另外,默認(rèn)情況下下位機(jī)發(fā)送上來的數(shù)據(jù)到達(dá)緩沖區(qū),可一次性讀取緩沖區(qū)中的數(shù)據(jù),或是按照小于緩沖區(qū)大小的指定字節(jié)長度進(jìn)行讀取,或是讀取到NewLine 標(biāo)志位.在本文的應(yīng)用場景中,有些返回數(shù)據(jù)包含大量數(shù)據(jù)信息,需要分多次上傳,導(dǎo)致緩沖區(qū)一有數(shù)據(jù)就連續(xù)上傳.此時進(jìn)行校驗(yàn)就有可能因每組數(shù)據(jù)不完整導(dǎo)致校驗(yàn)失敗而直接拋棄數(shù)據(jù),所以需要等待數(shù)據(jù)接收完整后才能進(jìn)行校驗(yàn).因此為了避免線程阻塞和數(shù)據(jù)接收未完整就校驗(yàn)的問題,不直接使用開發(fā)環(huán)境工具箱中自帶的SerialPort 組件,而是自行封裝一個串口操作類,包含自定義數(shù)據(jù)發(fā)送和接收處理方法、完整數(shù)據(jù)接收后委托、回調(diào)函數(shù)等.
接收數(shù)據(jù)時,考慮到下位機(jī)響應(yīng)一次命令所上傳的數(shù)據(jù)量巨大,當(dāng)超過串口默認(rèn)一次能容納的數(shù)據(jù)緩沖區(qū)大小時,需要自定義一個二級緩存,用于讀取和存放數(shù)據(jù);同時增加一個定時器,用于檢驗(yàn)在指定時間內(nèi)數(shù)據(jù)是否已經(jīng)全部接收完成;在向下位機(jī)發(fā)送獲取數(shù)據(jù)的指令時,如果短時間內(nèi)出現(xiàn)大量的請求,應(yīng)當(dāng)拋出異常,提示上一條數(shù)據(jù)尚未處理完成,從而避免犧牲CPU 性能,導(dǎo)致系統(tǒng)卡頓.
圖2 遠(yuǎn)程監(jiān)控系統(tǒng)軟件
圖3 遠(yuǎn)程監(jiān)控系統(tǒng)的軟件架構(gòu)
串口編程是本系統(tǒng)上位機(jī)監(jiān)控軟件的關(guān)鍵,封裝的串口操作類既要完整地接收到下位機(jī)每一次發(fā)上來的數(shù)據(jù),又要最大化地響應(yīng)上位機(jī)下發(fā)的指令,同時做到不錯過每一條請求指令.在實(shí)際應(yīng)用中,封裝好的串口類很好地達(dá)到了預(yù)期的目的,可快速響應(yīng)每一次數(shù)據(jù)采集請求,數(shù)據(jù)接收準(zhǔn)確可靠.
數(shù)據(jù)是雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng)的核心,所有的監(jiān)控都是針對數(shù)據(jù)的監(jiān)控.本系統(tǒng)的數(shù)據(jù)持久化采用SQL Server 數(shù)據(jù)庫和XML 文件形式,采用Entity Framework技術(shù)路線.Entity Framework 利用抽象化數(shù)據(jù)結(jié)構(gòu)的方式,將每個數(shù)據(jù)庫對象都轉(zhuǎn)換成應(yīng)用程序?qū)ο?數(shù)據(jù)字段則轉(zhuǎn)換為屬性類型,關(guān)系則轉(zhuǎn)換為結(jié)合屬性,便于在開發(fā)中使用自己最為熟悉的編程語言來完成數(shù)據(jù)的訪問和存儲.
考慮到每個臺站配置傳感器數(shù)量不確定,其中傳感器表中的數(shù)據(jù)字段采用XML 類型數(shù)據(jù).XML 具有很好的擴(kuò)充性、彈性和易讀性,而且在數(shù)據(jù)文件存儲時也采用XML 文件,可以很好地和該字段保持一致.
系統(tǒng)開發(fā)中充分利用了LINQ 特性,通過LINQ to Entities 和LINQ to XML 連接對象模型和數(shù)據(jù)模型.充分結(jié)合LINQ 中查詢語法、擴(kuò)展方法以及Lambda 表達(dá)式實(shí)現(xiàn)數(shù)據(jù)的快速操作,達(dá)到編碼快速、代碼可讀性強(qiáng)、數(shù)據(jù)訪問性能高、后期代碼維護(hù)方便的目的[9].
數(shù)據(jù)查詢導(dǎo)出Excel 文件版本設(shè)定為至少是2007 版本以上.2007 版本以上的Excel 文件采用Open Office XML 文檔格式存儲,可以用Zip 管理工具打開,Zip 包內(nèi)包含一系列的XML,因此在實(shí)際開發(fā)中同樣可以采用LINQ to XML 對Office 文件進(jìn)行操作[10].
在軟件多線程開發(fā)技術(shù)中,采用了Task 和委托的方式.與Background Worker、Thread、Invoked 等方式相比,Task 和委托優(yōu)勢明顯.
圖4 遠(yuǎn)程監(jiān)控系統(tǒng)的軟件流程
1)Task 新增了兩個異步關(guān)鍵詞async 和await,彌補(bǔ)了很多早期多線程技術(shù)上的不足.在數(shù)據(jù)接收、處理、存儲等多處采用Task 的方式對任務(wù)進(jìn)行調(diào)度,確保了程序每一個功能得到高效執(zhí)行.
2)在跨線程和跨窗體操作的編程中,還大量采用了委托(delegate)的方式.通過接口、委托確保線程間和類型安全,同時保證異步并發(fā).例如在串口操作類中定義了一個完整數(shù)據(jù)接收完成后的委托,一個數(shù)據(jù)操作回調(diào)函數(shù).在完整數(shù)據(jù)接收完成后啟動一個新線程對數(shù)據(jù)進(jìn)行運(yùn)算處理.在串口初始化時就將數(shù)據(jù)處理的子線程事件綁定到串口操作類的數(shù)據(jù)接收完成的回調(diào)函數(shù)上.
3)采用SynchronizationContext 為UI 主線程添加同步上下文,通過Task 開啟多線程同時采集不同節(jié)點(diǎn)數(shù)據(jù),在數(shù)據(jù)處理完畢后利用SynchronizationContext 的Post 方法將數(shù)據(jù)綁定到相關(guān)界面,從而保證異步并發(fā)避免出現(xiàn)未響應(yīng)的狀態(tài).
在使用多線程技術(shù)時也要注意“死鎖”問題,確保某些數(shù)據(jù)的獨(dú)占訪問,注意區(qū)分什么時候用異步什么時候用同步,避免程序運(yùn)行時導(dǎo)致數(shù)據(jù)損壞、程序崩潰.
通過設(shè)計軟硬件結(jié)合的雷達(dá)遠(yuǎn)程監(jiān)控系統(tǒng),達(dá)到了智能監(jiān)控、實(shí)時預(yù)警、及時處理的目的.ZigBee 的通信方式使得散落的物理量數(shù)據(jù)得到便捷有效地歸集;自行封裝串口編程解決了大數(shù)據(jù)情況下線程阻塞和數(shù)據(jù)不完整接收問題;Entity Framework 和LINQ 技術(shù)的采用達(dá)到了數(shù)據(jù)訪問性能高、后期代碼維護(hù)方便的目的;多線程開發(fā)技術(shù)確保程序的每個功能得到高效執(zhí)行,確保線程間和類型安全以及異步并發(fā).
系統(tǒng)在寧波市氣象雷達(dá)站得到應(yīng)用,運(yùn)行期間,曾多次通過遠(yuǎn)程監(jiān)控軟件及時發(fā)現(xiàn)雷達(dá)運(yùn)行異常,并得到及時處理.異常情況涉及雷達(dá)設(shè)備機(jī)房環(huán)境溫度過高、發(fā)射機(jī)溫度過高、UPS 故障、產(chǎn)品數(shù)據(jù)中斷、通信線路故障等.其中有一次因雷暴天氣導(dǎo)致市電突然中斷,而柴油機(jī)發(fā)電系統(tǒng)的自啟動控制模塊因電池沒電不能自啟發(fā)電.遠(yuǎn)程監(jiān)控系統(tǒng)及時告警,提供供電告警信息、故障原因,問題在第一時間內(nèi)得到處理.后續(xù)將在報警呈現(xiàn)方式、豐富監(jiān)控內(nèi)容方面開展相關(guān)工作.結(jié)合網(wǎng)絡(luò)技術(shù)、無線通信技術(shù)增加報警的輸出方式,在短信貓或微信訂閱號等方面做嘗試;增加雷達(dá)性能相關(guān)物理量的監(jiān)控,實(shí)時掌握雷達(dá)的性能動態(tài).