郭 濤
水文遙測(cè)終端機(jī)是水文水利各類監(jiān)測(cè)站中必不可少的設(shè)備,隨著社會(huì)的發(fā)展和進(jìn)步,各種水文水利遙測(cè)要素不斷更新,對(duì)水文遙測(cè)終端機(jī)的性能指標(biāo)要求也不斷提高。水文監(jiān)測(cè)站點(diǎn)一般無(wú)人值守,實(shí)現(xiàn)遠(yuǎn)程固件升級(jí)及性能提升已成為現(xiàn)代信息化建設(shè)必不可少的功能,為水文工作者帶來(lái)極大的便捷,同時(shí)對(duì)水文遙測(cè)終端機(jī)的發(fā)展進(jìn)步具有重要意義。
水文遙測(cè)終端機(jī)是一種應(yīng)用于水文監(jiān)測(cè)的設(shè)備,主要對(duì)降雨量、水位、墑情等要素進(jìn)行采集,將采集數(shù)據(jù)轉(zhuǎn)發(fā)至服務(wù)器平臺(tái)。該設(shè)備一般應(yīng)用于野外且無(wú)人值守,采用太陽(yáng)能加電池供電,分布范圍廣,站點(diǎn)繁多,數(shù)據(jù)傳輸采用GPRS 通信方式。根據(jù)該設(shè)備的應(yīng)用特點(diǎn),從側(cè)面反映出設(shè)備維護(hù)和固件升級(jí)的繁瑣性,也給工作人員帶來(lái)龐大的工作量。
水文遙測(cè)終端機(jī)是一種新興的物聯(lián)網(wǎng)應(yīng)用產(chǎn)品,目前的水文遙測(cè)終端機(jī)形態(tài)各異,功能強(qiáng)大,但是針對(duì)水文遙測(cè)終端機(jī)的固件升級(jí)往往只停留在本地現(xiàn)場(chǎng)操作。隨著國(guó)家對(duì)水文遙測(cè)終端機(jī)的標(biāo)準(zhǔn)化,產(chǎn)品的性能不斷完善,功能不斷豐富,在原有設(shè)備上通過(guò)遠(yuǎn)程升級(jí)固件成為必備的功能。
本文所述的具有雙模固件升級(jí)的水文遙測(cè)終端機(jī),在基于《水文監(jiān)測(cè)數(shù)據(jù)通信規(guī)約》(SL651-2014)的基礎(chǔ)上實(shí)現(xiàn)遠(yuǎn)程升級(jí)固件及本地升級(jí)固件的雙模式固件升級(jí),同時(shí)支持本地固件存儲(chǔ)及恢復(fù),避免了升級(jí)失敗帶來(lái)的產(chǎn)品不能使用的問(wèn)題,大大提高了水文遙測(cè)終端機(jī)實(shí)用價(jià)值。
水文遙測(cè)終端機(jī)的程序固件由兩部分組成:一是BootLoader 引導(dǎo)程序,在MCU 上電或復(fù)位后率先執(zhí)行;二是用戶程序,是設(shè)備正常工作時(shí)的運(yùn)行程序,也是需要更新升級(jí)的固件。
BootLoader 是一段引導(dǎo)程序,是雙模固件升級(jí)的核心程序,當(dāng)MCU 上電或復(fù)位后執(zhí)行該段引導(dǎo)程序,判斷是否有新固件升級(jí)。如果不需要升級(jí),程序指針直接跳轉(zhuǎn)至用戶程序的起始位置,開始執(zhí)行用戶程序;如果需要更新程序,BootLoader 引導(dǎo)程序會(huì)將用戶程序單元擦除,通過(guò)uart 或SPI 串行接口接收新的用戶程序,寫入MCU指定的用戶程序單元。用戶程序以行為單位,每行程序指令均含有校驗(yàn),確保了寫入程序代碼的正確性。
BootLoader 引導(dǎo)程序一般存放于MCU 的程序空間的前端,從程序空間的0x400 開始,空間大小為0xC00。BootLoader 引導(dǎo)程序比較小,本文所述的雙模固件升級(jí)水文遙測(cè)終端機(jī)充分利用了引導(dǎo)程序設(shè)計(jì)了Uart 和SPI兩種Boot 方式,Uart 方式用于本地固件升級(jí),SPI 用于遠(yuǎn)程固件升級(jí)。用戶程序從0x1000 開始,用于存放用戶正常運(yùn)行的代碼。官方示例程序空間分配見圖1。
水文監(jiān)測(cè)數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議應(yīng)采用《水文監(jiān)測(cè)數(shù)據(jù)通信規(guī)約》(SL651-2014)規(guī)定的上行報(bào)文幀結(jié)構(gòu)框架和下行報(bào)文幀結(jié)構(gòu)框架。無(wú)論傳輸?shù)淖址捎煤畏N編碼,均應(yīng)滿足此幀結(jié)構(gòu)框架規(guī)定。傳輸順序?yàn)楦呶蛔止?jié)在前,低位字節(jié)在后。數(shù)據(jù)傳輸結(jié)構(gòu)如圖2。
圖1 官方示例程序空間分配圖
固件升級(jí)過(guò)程采用M2 發(fā)送方式,由中心站主動(dòng)發(fā)起申請(qǐng),再由遙測(cè)站響應(yīng)申請(qǐng)固件內(nèi)容,直至固件接收完畢后執(zhí)行升級(jí)。
遙測(cè)終端固件升級(jí),功能碼為EAH。由中心站先向遙測(cè)終端發(fā)出固件升級(jí)申請(qǐng),再由遙測(cè)終端依次向中心站申請(qǐng)固件內(nèi)容。固件接收完畢后遙測(cè)終端自動(dòng)復(fù)位,執(zhí)行新固件。傳輸固件過(guò)程中,需水文遙測(cè)終端常在線,確保鏈路上數(shù)據(jù)的正常傳輸。水文遙測(cè)終端將固件數(shù)據(jù)按照行為單位存儲(chǔ)于存儲(chǔ)芯片中,GPRS 模塊切換為透?jìng)髂J奖阌诮邮諗?shù)據(jù)。遙測(cè)終端也可主動(dòng)申請(qǐng)固件升級(jí),再由中心站向遙測(cè)終端機(jī)發(fā)出固件申請(qǐng),確保了遙測(cè)終端機(jī)對(duì)自身固件更新的實(shí)時(shí)性。
PIC 單片機(jī)嵌入式HEX 固件是遵循 Intel HEX 文件格式的 ASCII 文本文件。HEX 由任意數(shù)量的十六進(jìn)制記錄組成。每個(gè)記錄包含5 個(gè)域,按以下格式排列:Start Code、Byte count、Address、Record type、Data、Checksum。
HEX 文件以行為單位。每行以字符 ‘:’ (0x3a)開頭,以回車換行符0x0d, 0x0a 為結(jié)束。每行開始和結(jié)束之間的所有內(nèi)容,都是以字符形式表現(xiàn)的。例如數(shù)據(jù)如果是 0x1A ,那么轉(zhuǎn)換到HEX 格式的行里面就是0x31 0x41。如果數(shù)據(jù)是16bit 的,例如地址,則先顯示高位,后顯示底位。例如 0x1234,轉(zhuǎn)換成HEX 格式文件后變成 0x31 0x32 0x33 0x34,顯示出來(lái)以后就是1234。將數(shù)據(jù)部分內(nèi)容每2個(gè)字符看作一個(gè)HEX 數(shù)據(jù)。
圖2 數(shù)據(jù)傳輸結(jié)構(gòu)圖
例如:“:020000040000FA”把它轉(zhuǎn)換為十六進(jìn)制為 0x02 0x00 0x00 0x04 0x00 0x00 0xFA。
本文所述水文遙測(cè)終端機(jī)的硬件平臺(tái)是基于Microchip 的PIC24FJ 系列MCU,該硬件平臺(tái)性能穩(wěn)定可靠,具有良好的工業(yè)特性。存儲(chǔ)芯片采用64Mbit 大小的Flash 存儲(chǔ)器,用于存儲(chǔ)最新的固件,存儲(chǔ)芯片使用SPI 接口與MCU 連接。無(wú)線數(shù)據(jù)傳輸采用SIMcom 的GPRS 模 塊,采 用Uart 串口與MCU 連接,RS232 接口通過(guò)Uart串口與MCU 連接,用于本地固件升級(jí)。
首先,建立工程項(xiàng)目,設(shè)置.gld配置文件為“program (xr) : ORIGIN = 0x400, LENGTH = 0xC00”分配Boot-Loader 引導(dǎo)程序的程序空間。
編輯Uart 和SPI 串行通信驅(qū)動(dòng)、Flash 芯片的讀寫驅(qū)動(dòng)以及Boot 驅(qū)動(dòng)。
然后進(jìn)行Boot 邏輯構(gòu)建,當(dāng)水文遙測(cè)終端機(jī)上電或復(fù)位后,先MCU通過(guò)串口發(fā)送“>”,如果串口無(wú)任何回復(fù),則進(jìn)入SPI 讀取Flash 內(nèi)容判斷是否有新固件存在需要更新。若都無(wú)需要更新固件,則利用“(*((void(*)(void))APP_START))();”進(jìn)入用戶程序進(jìn)行正常工作。
將RS232 通信線連接電腦和水文遙測(cè)終端機(jī),給終端機(jī)重新上電,電腦串口助手會(huì)收到終端機(jī)發(fā)送的“>”字符,電腦給設(shè)備發(fā)送回車字符,等待設(shè)備返回“Uart>”。
將準(zhǔn)備好的用戶“APP.hex”程序固件利用串口助手,逐行發(fā)送水文遙測(cè)終端機(jī),每行發(fā)送成功后均會(huì)回復(fù)“Y”字符,如果失敗則會(huì)發(fā)送“X”字符。
最后更新完畢后,回復(fù)“Done”,水文遙測(cè)終端機(jī)會(huì)自動(dòng)跳轉(zhuǎn)執(zhí)行新固件。
根據(jù)水文遙測(cè)終端機(jī)應(yīng)用的特殊性,該設(shè)備在工作時(shí)的數(shù)據(jù)傳輸采用GPRS 通信,遙測(cè)終端機(jī)會(huì)定時(shí)向中心站詢問(wèn)固件更新申請(qǐng),如果中心站需要更新固件回復(fù)Hex 固件行數(shù),如果不需要更新固件則回復(fù)Hex固件行數(shù)為0。
當(dāng)需要更新固件時(shí),中心站會(huì)將新固件按內(nèi)容分包,水文遙測(cè)終端會(huì)根據(jù)《水文監(jiān)測(cè)數(shù)據(jù)通信規(guī)約》的固件升級(jí)擴(kuò)展應(yīng)用,進(jìn)行逐包詢要每個(gè)固件包,然后下載至Flash 存儲(chǔ)芯片內(nèi)。每包固件包均含有包號(hào)及CRC 校驗(yàn),確保了Hex 固件的完整性和正確性。
完成固件下載后,水文遙測(cè)終端機(jī),在Flash 芯片內(nèi)放置更新固件標(biāo)志,利用軟件指令“__asm__ volatile ("RESET");”將設(shè)備復(fù)位。
復(fù)位后的MCU 執(zhí)行BootLoader引導(dǎo)程序,在無(wú)串口更新固件的情況下,MCU 利用SPI 通信提取Flash 內(nèi)的更新固件標(biāo)志,確定需要更新固件后,逐行提取新固件并執(zhí)行。最后更新完畢后,水文遙測(cè)終端機(jī)會(huì)自動(dòng)跳轉(zhuǎn)執(zhí)行新固件。
水文遙測(cè)終端機(jī)會(huì)在第一次使用時(shí)利用RS232 向其Flash 的固定存儲(chǔ)位置置入固定的用戶程序。當(dāng)本地固件升級(jí)和遠(yuǎn)程固件升級(jí)失敗后,設(shè)備可提取該用戶程序進(jìn)行固件恢復(fù),確保了設(shè)備工作的可靠性。
雙模升級(jí)固件的水文遙測(cè)終端機(jī)設(shè)計(jì)方案穩(wěn)定可靠,現(xiàn)場(chǎng)使用效果良好,工作運(yùn)行穩(wěn)定。雙模升級(jí)固件的應(yīng)用為水文遙測(cè)終端機(jī)的性能提升了保障,為水文工作者大大節(jié)省了工作量。該固件的應(yīng)用也是工業(yè)物聯(lián)網(wǎng)應(yīng)用的體現(xiàn),在無(wú)人值守的野外環(huán)境下,可穩(wěn)定可靠地實(shí)現(xiàn)自更新固件??傊?,具有雙模升級(jí)固件的水文遙測(cè)終端機(jī)還在不斷改進(jìn),隨著科技的進(jìn)步,防汛理念的創(chuàng)新,該技術(shù)必將作為新技術(shù)變革得到廣泛應(yīng)用■