孫 琦,傅 軍
(海軍工程大學(xué) 電氣工程學(xué)院,湖北 武漢 430033)
氣象預(yù)報(bào)對(duì)當(dāng)今人們合理調(diào)控生產(chǎn)生活起到重要作用,正確的氣象預(yù)報(bào)依賴(lài)于長(zhǎng)期、準(zhǔn)確、實(shí)時(shí)的氣象觀測(cè)數(shù)據(jù)。從20世紀(jì)90年代后期開(kāi)始,我國(guó)大力加強(qiáng)地面氣象觀測(cè)業(yè)務(wù)能力建設(shè),已初步建立了與國(guó)民經(jīng)濟(jì)建設(shè)發(fā)展相適應(yīng)的觀測(cè)網(wǎng)。但是在沙漠、高山、海島等環(huán)境條件惡劣、人煙稀少的地區(qū),交通、供電、通信等基礎(chǔ)設(shè)施薄弱,給人工值守和依賴(lài)地面通信網(wǎng)絡(luò)的氣象觀測(cè)站點(diǎn)帶來(lái)了巨大的建設(shè)和運(yùn)行成本,然而獲取完整翔實(shí)的水文氣象資料是開(kāi)展相關(guān)科研工作和氣象服務(wù)決策的重要基礎(chǔ)。
近幾十年來(lái),隨著電子信息和計(jì)算機(jī)技術(shù)的發(fā)展,逐漸出現(xiàn)了無(wú)人值守、無(wú)需經(jīng)常維護(hù)的自動(dòng)無(wú)人氣象站,解決了傳統(tǒng)氣象站中,部分氣象站人力成本高、難以維護(hù)和數(shù)據(jù)采集困難的問(wèn)題。自動(dòng)氣象站的應(yīng)用和普及,可以很大程度地增加氣象數(shù)據(jù)采集時(shí)空密度,有效地提高氣象觀測(cè)效果以及可靠性,滿(mǎn)足觀測(cè)可比性等方面的要求,減少氣象觀測(cè)站的運(yùn)營(yíng)費(fèi)用[1]。
自動(dòng)氣象觀測(cè)站按照通信方式可以分為兩類(lèi),即有線(xiàn)遙測(cè)氣象站和無(wú)線(xiàn)遙測(cè)氣象站[2]。有線(xiàn)遙測(cè)氣象站是傳統(tǒng)的氣象監(jiān)測(cè)方式,感應(yīng)部分和接收處理部分相隔幾十米或者幾千米,其間用有線(xiàn)通信電路傳輸。傳感器將數(shù)據(jù)通過(guò)數(shù)據(jù)線(xiàn)傳輸?shù)絇C機(jī)上。這種方式適合于有人值守區(qū)。無(wú)線(xiàn)遙測(cè)氣象站大部分采用物聯(lián)網(wǎng)模式,通過(guò)GPRS數(shù)據(jù)傳輸方式,將數(shù)據(jù)上傳至網(wǎng)絡(luò)平臺(tái),凡是有網(wǎng)絡(luò)的地方,都可以隨時(shí)登錄平臺(tái),查看氣象站現(xiàn)場(chǎng)數(shù)據(jù),且有短信預(yù)警提示的功能。這種又被稱(chēng)為無(wú)人氣象站。
在公共移動(dòng)通信網(wǎng)尚未完全覆蓋的人煙稀少地區(qū),使用GPRS體制工作的氣象站因網(wǎng)絡(luò)覆蓋盲區(qū)的問(wèn)題,難以滿(mǎn)足氣象傳輸要求。因此,有必要使用可靠、無(wú)網(wǎng)絡(luò)覆蓋盲區(qū)的北斗短報(bào)文通信技術(shù)作為氣象站的信息通路[3],以提高氣象站的適用性和可靠性。
針對(duì)以上現(xiàn)狀,本文設(shè)計(jì)了基于北斗的無(wú)人值守氣象站。使用太陽(yáng)能蓄電池作為電源,氣象站傳感器和主控單元之間使用RS 485-ModBus協(xié)議,利用北斗系統(tǒng)的短報(bào)文通信功能與北斗/GSM通信服務(wù)網(wǎng)關(guān)結(jié)合使用,在終端用戶(hù)側(cè)可實(shí)現(xiàn)隨時(shí)通過(guò)手機(jī)發(fā)送特定字符獲取遠(yuǎn)端水文氣象數(shù)據(jù)服務(wù)[4],技術(shù)人員也可以遠(yuǎn)程隨時(shí)查詢(xún)氣象水文站的工作狀態(tài),便于及時(shí)進(jìn)行故障處置。
無(wú)人氣象站承擔(dān)在惡劣環(huán)境下的氣象觀測(cè)任務(wù),因此設(shè)備應(yīng)具有以下指標(biāo):
(1)通信質(zhì)量穩(wěn)定、無(wú)通信盲區(qū)、丟包少、可以實(shí)現(xiàn)雙向通信、接收用戶(hù)指令;
(2)設(shè)備應(yīng)該具有寬電壓輸入、供電設(shè)備輸出電壓穩(wěn)定;
(3)通信延遲小、通信帶寬大、傳感器設(shè)備工作可靠;
(4)兩種幀協(xié)議的接收解析與封裝發(fā)送[5]。
依據(jù)要求通信質(zhì)量必須穩(wěn)定,而GPRS/GSM存在通信盲區(qū)及信號(hào)不穩(wěn)定等因素,采用北斗衛(wèi)星通信的數(shù)據(jù)傳輸模式,保證數(shù)據(jù)可靠上傳。北斗衛(wèi)星通信系統(tǒng)覆蓋范圍廣,沒(méi)有通信盲區(qū),信息加密傳輸安全。“北斗三號(hào)”區(qū)域短報(bào)文通信服務(wù),服務(wù)容量提高1 000萬(wàn)次/h以上,單次通信能力[6]1 000漢字(14 000 bit),短報(bào)文通信傳輸時(shí)延[7]約3.8 s。本設(shè)計(jì)中報(bào)文長(zhǎng)度不會(huì)超過(guò)200個(gè)漢字,數(shù)據(jù)采集間隔在分鐘級(jí),因此,“北斗三號(hào)”區(qū)域短報(bào)文服務(wù)完全可以滿(mǎn)足重點(diǎn)服務(wù)區(qū)內(nèi)數(shù)據(jù)傳輸對(duì)通信容量和實(shí)時(shí)性的要求。由于戶(hù)外供電不便,設(shè)計(jì)上采用太陽(yáng)能蓄電池供電方式,保證在陰雨天氣下,系統(tǒng)連續(xù)工作3天以上。
系統(tǒng)硬件主要由北斗模塊及天線(xiàn)、氣象傳感器、單片機(jī)模塊和太陽(yáng)能電源四部分組成。氣象結(jié)構(gòu)如圖1所示。
圖1 氣象站結(jié)構(gòu)
綜合衛(wèi)星報(bào)文處理速度和接口資源的考慮,本設(shè)計(jì)采用基于Cortex-M4內(nèi)核的微控制器STM32F429IGT6作為主控芯片,進(jìn)行通信協(xié)議解析與封裝、數(shù)據(jù)傳輸與控制,利用USART串口和RS 485接口實(shí)現(xiàn)主控單元與各個(gè)模塊的數(shù)據(jù)傳輸,底板電源使用MP2482DN電源管理芯片,支持6~12 V直流電壓輸入,低壓差線(xiàn)性穩(wěn)壓器1086-3.3控制電路輸入電壓為3.3 V,3.3 V過(guò)流保護(hù)防止底板電流過(guò)大。為了防止使用過(guò)程中靜電以及瞬時(shí)大電流對(duì)芯片的影響,在重要芯片、接口、復(fù)位電路等部位采用TVS管和ESD管保護(hù)。
北斗板卡用于與遠(yuǎn)端的各種水文氣象自動(dòng)觀測(cè)設(shè)備進(jìn)行短報(bào)文通信。本設(shè)計(jì)采用海聊科技的T2北斗短報(bào)文板卡,此板卡兼容北斗用戶(hù)終端通用數(shù)據(jù)接口2.1和4.0協(xié)議,集RNSS,RDSS為一體,具有全天候的定位導(dǎo)航和雙向報(bào)文通信功能,工作溫度-40~85 ℃,平均故障間隔≥5 000 h,成功率≥99%,模塊待機(jī)功率約為0.65 W,發(fā)射瞬態(tài)功率約為15 W,支持7~18 V直流供電,使用三級(jí)民用北斗卡,通信頻次60 s。
氣象站要求傳感器可靠性好、使用壽命長(zhǎng)、精度高、傳輸信號(hào)穩(wěn)定。本設(shè)計(jì)采用PR-300BYH-M型系列氣象傳感器。數(shù)據(jù)傳輸采用標(biāo)準(zhǔn)ModBus-RTU通信協(xié)議、RS 485標(biāo)準(zhǔn),通信距離最大可達(dá)2 000 m,可以實(shí)現(xiàn)溫濕度、大氣壓力、光照度的測(cè)量。主要技術(shù)指標(biāo)如圖2所示。
圖2 氣象站主要技術(shù)指標(biāo)
考慮到無(wú)人氣象站在戶(hù)外工作,因此使用太陽(yáng)能電池板作為氣象站的電源。陽(yáng)光充足的條件下保持設(shè)備運(yùn)行并給蓄電池充電,蓄電池充電時(shí)間8~16 h。在無(wú)光狀態(tài)下使用蓄電池內(nèi)的電能,蓄電池最大輸出可達(dá)到12 V/5 A,功率60 W,可以滿(mǎn)足使用要求,電池容量20 A·h。RD0538T1模塊發(fā)射瞬間功率小于15 W,待機(jī)功率小于0.65 W,發(fā)射瞬間持續(xù)時(shí)間小于0.3 s。若每分鐘發(fā)射一條報(bào)文,則模塊平均功率為(15/60)×0.3+0.65=0.725 W,氣象站百葉窗的功率為0.8 W,主控單元功率小于1 W,則在無(wú)光狀態(tài)下,氣象站可以連續(xù)運(yùn)行(12×20)/(0.725+0.8+1)=95 h,實(shí)現(xiàn)了無(wú)人氣象站不斷電運(yùn)行。整個(gè)供電系統(tǒng)通過(guò)太陽(yáng)能控制電路來(lái)控制蓄電池的充放電,主要功能是在夜間電池板電壓輸出為0時(shí),防止電池中的電能回流到電池板中,此外它在防止過(guò)度充電方面同樣發(fā)揮著關(guān)鍵作用。使用FP5139芯片和Π型濾波電路,控制北斗端電壓為恒定值,防止電壓變化過(guò)大而損壞RD芯片。
傳感器的RS 485A/B與單片機(jī)的RS 485A/B分別對(duì)應(yīng)連接,主控底板中RS 485接口部分采用SP3485E芯片,兩線(xiàn)制RS 485是一種半雙工方式,所以需要切換收發(fā)狀態(tài),用PB8引腳的高低電平來(lái)控制接收和發(fā)送。當(dāng)PB8輸出低電平的時(shí)候,控制主控單元RS 485接口為接收狀態(tài),當(dāng)PB8為高電平的時(shí)候,控制主控單元RS 485接口為發(fā)送狀態(tài)。單片機(jī)內(nèi)部連接RS 485的引腳分別是PD5,PD6,PD5是發(fā)送引腳,PD6是接收引腳。單片機(jī)RS 485接口硬件原理圖如圖3所示。系統(tǒng)硬件連接如圖4所示。
圖4 系統(tǒng)硬件連接
圖3 單片機(jī)RS 485接口硬件原理
(1)主控單元作為主機(jī)與氣象站傳感器進(jìn)行通信,使用ModBus-RTU協(xié)議可以獲取溫濕度、大氣壓力、光照度等信息。
(2)RDSS數(shù)據(jù)幀的接收解析與封裝發(fā)送。用戶(hù)向氣象站北斗端發(fā)送查詢(xún)命令,無(wú)人氣象站北斗天線(xiàn)接收到的信號(hào)經(jīng)過(guò)模塊內(nèi)部的處理,轉(zhuǎn)換成串口數(shù)據(jù)并輸出到主控單元。原始串口數(shù)據(jù)經(jīng)過(guò)幀協(xié)議解析后,得到用戶(hù)數(shù)據(jù)。識(shí)別提取其中的特定命令后,主控單元做出響應(yīng)通過(guò)RS 485總線(xiàn)查詢(xún)對(duì)應(yīng)寄存器的數(shù)據(jù)。再封裝成協(xié)議幀輸出到串口,氣象站北斗端將得到的串口數(shù)據(jù)經(jīng)過(guò)內(nèi)部信號(hào)處理后,通過(guò)天線(xiàn)發(fā)射出去,完成整個(gè)工作過(guò)程。
3.2.1 總體設(shè)計(jì)方案
總體設(shè)計(jì)程序分為初始化部分、控制傳感器部分、控制北斗部分,如圖5所示。初始化部分主要進(jìn)行北斗、RS 485通信使用的USART外設(shè)、引腳的初始化、系統(tǒng)時(shí)鐘的使能以及北斗模塊的自檢。這一部分的軟件編寫(xiě)圍繞各種寄存器的操作以及北斗短報(bào)文協(xié)議來(lái)展開(kāi)。
圖5 程序整體設(shè)計(jì)流程
初始化成功之后輸入目標(biāo)的北斗號(hào)碼,為了提高程序的效率,在主函數(shù)中設(shè)置兩層嵌套循環(huán),第一層循環(huán)是判斷北斗信號(hào)強(qiáng)度,直到滿(mǎn)足通信條件為止,第二層循環(huán)是主要的接收和發(fā)送代碼、數(shù)據(jù)處理代碼等。進(jìn)入到第二層后,不會(huì)返回第一層。一二層之間入口是判斷北斗接收置位情況。
對(duì)北斗報(bào)文進(jìn)行解析與遍歷,判斷是否存在特定的字符。程序分支執(zhí)行北斗定位申請(qǐng)和ModBus問(wèn)詢(xún)幀發(fā)送函數(shù),處理從機(jī)發(fā)送過(guò)來(lái)的應(yīng)答幀后,提取寄存器中氣象數(shù)據(jù)以及DWR語(yǔ)句中的經(jīng)緯度、時(shí)間等信息,經(jīng)過(guò)字符串的拼接整合與轉(zhuǎn)換格式,通過(guò)北斗發(fā)送函數(shù),最后回到判斷北斗接收置位處。
3.2.2 單片機(jī)控制傳感器部分
STM32控制氣象站百葉窗,初始化RS 485通信使用的USART外設(shè)及相關(guān)引腳。編寫(xiě)控制SP3485E芯片進(jìn)行收發(fā)數(shù)據(jù)的函數(shù),根據(jù)ModBus通信協(xié)議編寫(xiě)收發(fā)的數(shù)據(jù)幀。
ModBus協(xié)議是基于RS 485物理層來(lái)實(shí)現(xiàn)的,在RS 485通信中信號(hào)頻率越高,越容易產(chǎn)生反射波干擾。通常傳輸速率在1 200~19 200 b/s之間選取。通信距離1 km以?xún)?nèi),從通信效率、節(jié)點(diǎn)數(shù)、通信距離[8]等綜合考慮可選用4 800 b/s;通信距離 1 km 以上時(shí),應(yīng)考慮通過(guò)增加中繼模塊或降低速率的方法提高數(shù)據(jù)傳輸可靠性。綜合可靠性和有效性,本文采用9 600 b/s作為RS 485接口的速率。STM32作為主機(jī)實(shí)現(xiàn)ModBus協(xié)議的核心在于對(duì)數(shù)據(jù)幀結(jié)束的判斷。ModBus協(xié)議沒(méi)有停止位,規(guī)定當(dāng)數(shù)據(jù)之間間隔大于3.5個(gè)字節(jié)的時(shí)間時(shí),代表一個(gè)數(shù)據(jù)幀發(fā)送或者接收的完成。那么延遲時(shí)間大于(1/9 600)×8×3.5≈2.92 ms 時(shí),即代表一個(gè)數(shù)據(jù)幀的結(jié)束,考慮到硬件的延遲,定義時(shí)間大于4 ms時(shí)數(shù)據(jù)幀結(jié)束。因此,初始化定時(shí)器的時(shí)間為4 ms,開(kāi)始處于關(guān)閉狀態(tài)。串口接收中斷函數(shù)中設(shè)置定時(shí)器使能和清0代碼,定時(shí)器溢出中斷函數(shù)中設(shè)置定時(shí)器使能和接收完成置位代碼。
在進(jìn)行串口初始化后,使RS 485常態(tài)處于接收態(tài),中斷函數(shù)接收到第一個(gè)字節(jié)后,開(kāi)啟計(jì)時(shí)器,在不發(fā)生溢出的情況下,每接收一個(gè)字節(jié)都將定時(shí)器清0。當(dāng)定時(shí)器發(fā)生溢出中斷時(shí),表明時(shí)間間隔大于4 ms,即一幀接收完成,ModBus接收標(biāo)志位置位,關(guān)閉定時(shí)器用于下一次幀停止的判斷。幀停止邏輯流程如圖6所示。
圖6 幀停止邏輯流程
為了防止變量混亂,設(shè)計(jì)程序時(shí)將ModBus相關(guān)的變量、數(shù)組、緩存區(qū)都放到一個(gè)結(jié)構(gòu)體之中,方便程序設(shè)計(jì)。
STM32作為主機(jī)需要發(fā)送數(shù)據(jù)時(shí),將主機(jī)端RS 485接口置于發(fā)送態(tài),將發(fā)送緩存區(qū)中的帶有地址碼和功能碼的數(shù)據(jù)通過(guò)串口發(fā)送,通過(guò)RS 485收發(fā)轉(zhuǎn)換器轉(zhuǎn)換成特定的電平信號(hào)在總線(xiàn)上傳輸。ST內(nèi)置的庫(kù)函數(shù)中USART_FLAG_TXE,USART_FLAG_TC這兩個(gè)標(biāo)志位有一定的區(qū)別,USART_FLAG_TXE表示數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)被發(fā)送移位寄存器取走了,但發(fā)送移位寄存器中可能還沒(méi)有啟動(dòng)發(fā)送過(guò)程,發(fā)送移位寄存器中的數(shù)據(jù)往外面發(fā)送的時(shí)間相對(duì)于CPU指令執(zhí)行時(shí)間來(lái)說(shuō)是比較耗時(shí)的。USART_FLAG_TC代表一個(gè)數(shù)據(jù)幀發(fā)送完成事件,由于RS 485標(biāo)準(zhǔn)對(duì)于發(fā)送的時(shí)間要求比較高,因此選擇USART_FLAG_TC作為發(fā)送完成的標(biāo)志位。否則在實(shí)驗(yàn)時(shí)會(huì)出現(xiàn)不能正常發(fā)送的情況。問(wèn)詢(xún)幀結(jié)構(gòu)見(jiàn)表1所列。
表1 問(wèn)詢(xún)幀結(jié)構(gòu) B
3.2.3 單片機(jī)控制北斗部分
使用混合傳輸模式,漢字先轉(zhuǎn)化為GB2312碼,然后每個(gè)字節(jié)的高低4位分別轉(zhuǎn)化為一個(gè)字節(jié),變成可打印字符。
根據(jù)北斗衛(wèi)星導(dǎo)航系統(tǒng)用戶(hù)終端通用數(shù)據(jù)接口2.1協(xié)議來(lái)設(shè)計(jì)建立結(jié)構(gòu)體,用來(lái)存放發(fā)送和接收的數(shù)據(jù)、標(biāo)志位等。由于報(bào)文長(zhǎng)度很長(zhǎng),若單獨(dú)每一種報(bào)文都建立相應(yīng)的結(jié)構(gòu)體就會(huì)占用很多的內(nèi)核內(nèi)存,造成不必要的浪費(fèi),所以可以采用結(jié)構(gòu)體嵌套聯(lián)合體的方式以節(jié)省內(nèi)存資源。
幀協(xié)議解析的核心在于對(duì)接收到的串口數(shù)據(jù)內(nèi)容進(jìn)行分割與提取,由于北斗報(bào)文之中,每一部分之間通過(guò)‘,’或者‘*’分隔開(kāi),有一定的規(guī)律性,想要獲取某一部分的數(shù)據(jù),可以設(shè)計(jì)一個(gè)指針ptr指向北斗報(bào)文,另一個(gè)變量tmpLen用于計(jì)算區(qū)間字符串長(zhǎng)度,當(dāng)遇到‘,’時(shí),字符指針ptr移到區(qū)間字符串的開(kāi)始,并將從ptr開(kāi)始的長(zhǎng)度為tmpLen的字符串復(fù)制到輸出字符串中,最后將tmpLen清0,準(zhǔn)備下一次尋找。
對(duì)于經(jīng)緯度DWR報(bào)文的解析,由于每個(gè)子報(bào)文都有作用,故設(shè)計(jì)采用字符串分割函數(shù)char *strtok(char s[],const char *delim);以‘,*’作為分割條件,在第一次調(diào)用時(shí),strtok()必須給予參數(shù)s字符串,之后的調(diào)用則將參數(shù)s設(shè)置成NULL。每次調(diào)用成功則返回指向被分割出片段的指針。最后將得到的子串通過(guò)switch-case語(yǔ)句分別存儲(chǔ)在相應(yīng)的結(jié)構(gòu)體中,得到經(jīng)緯度和時(shí)間信息。
首先是驗(yàn)證單片機(jī)發(fā)送的北斗報(bào)文格式是否正確以及驗(yàn)證氣象站工作是否正常,采用232轉(zhuǎn)USB線(xiàn)連接到上位機(jī)串口7上,模擬單片機(jī)接收到北斗報(bào)文過(guò)程和數(shù)據(jù)回傳的過(guò)程。測(cè)試情況如圖7所示。串口7(模擬用戶(hù)北斗端)發(fā)送北斗報(bào)文數(shù)據(jù)‘$BDTXR,0247716,1,2,A4424331323350*34 ’。其中含有特定字符‘P’,用于獲取大氣壓力值。
從圖7中可以看到,單片機(jī)與氣象站之間通信正常,得到大氣壓力的值是97.7 Pa。串口7(北斗)收到報(bào)文數(shù)據(jù)段B4F3C6F8D1B9C1A6CAC73A39372E37205061,經(jīng)過(guò)gb2312解碼之后得到字符串:大氣壓力是97.7 Pa,與串口4顯示的傳感器的數(shù)值相同。
圖7 串口調(diào)試助手模擬情況
第二階段,連接好設(shè)備之后,將北斗天線(xiàn)朝南無(wú)遮擋放置,進(jìn)行調(diào)試,輸入氣象數(shù)據(jù)接收端的北斗卡號(hào),進(jìn)行北斗強(qiáng)度測(cè)試,若強(qiáng)度大于等于3,可以實(shí)現(xiàn)通信。利用北斗海聊公司的北斗短報(bào)文入網(wǎng)服務(wù),實(shí)現(xiàn)只有1臺(tái)北斗設(shè)備情況下報(bào)文的發(fā)送和接收(經(jīng)過(guò)上百條實(shí)際測(cè)試該平臺(tái)夏季對(duì)于長(zhǎng)春地區(qū)在16:00以后發(fā)送成功率較高)。接收北斗報(bào)文測(cè)試情況如圖8所示。
圖8 接收北斗報(bào)文測(cè)試情況
當(dāng)接收到特定的字符如H后,主控單元響應(yīng)命令獲取當(dāng)前濕度值,通過(guò)串口向北斗模塊發(fā)送通信申請(qǐng)報(bào)文:$CCTXA,0247716,1,2,A4CAAAB6C8CAC73AB0D9B 7D6D6AE33382E32*00 ,根據(jù)收到的響應(yīng)數(shù)據(jù)‘$BDFKI’來(lái)判斷發(fā)送是否成功。
本文根據(jù)現(xiàn)有的水文氣象觀測(cè)數(shù)據(jù)傳輸?shù)默F(xiàn)實(shí)需求和北斗發(fā)展現(xiàn)狀論述了基于北斗的無(wú)人值守氣象站的設(shè)計(jì),通過(guò)串口調(diào)試和仿真測(cè)試,實(shí)現(xiàn)了氣象數(shù)據(jù)的發(fā)送和北斗報(bào)文的接收。設(shè)計(jì)的無(wú)人氣象站能夠穩(wěn)定、安全可靠地傳輸信息,具有不受距離、地域限制,通信費(fèi)用低,節(jié)省人力的優(yōu)點(diǎn),特別適合在偏遠(yuǎn)等普通信號(hào)無(wú)法覆蓋的地區(qū)的氣象觀測(cè),與目前建成的基于GPRS網(wǎng)絡(luò)的自動(dòng)氣象站互為補(bǔ)充,對(duì)于掌握我國(guó)全域氣象數(shù)據(jù)具有重要意義。