鐘金波,李湘湘
(中國科學院深??茖W與工程研究所,海南 三亞 572000)
海洋科學調(diào)查工作近幾年有了突飛猛進的發(fā)展,由于海洋環(huán)境的復雜性和多變性,對于后續(xù)樣品的分析,必須附帶有GPS、風速風向、溫鹽深(CTD)等數(shù)據(jù)作為支撐。對于科學家來說,人為記錄數(shù)據(jù)存在以下問題,一是不具備連續(xù)性;二是海洋科考工作強度較大,沒有精力去實現(xiàn)人為記錄;三是采集這些數(shù)據(jù)的傳感器分布在全船各處,對于在甲板或者在實驗室采集數(shù)據(jù)的科學家來說不方便手動記錄?;诖?,迫切需要能在實驗室或者甲板工作區(qū)有實現(xiàn)實時采集相關數(shù)據(jù)的接口,而且能實現(xiàn)數(shù)據(jù)的實時保存。現(xiàn)在大多數(shù)的科考船都配置了信息采集系統(tǒng),在物理架構(gòu)上,可以實現(xiàn)數(shù)據(jù)的采集。從實船實驗室的采集和使用設備來看,具有設備多樣性、接口的需求多樣性、數(shù)據(jù)格式的多樣性、文獻[1]和文獻[2]強調(diào)了數(shù)據(jù)的采集和存儲實現(xiàn)的可行性,側(cè)重整個數(shù)據(jù)包的采集和存儲,沒有有效手段對數(shù)據(jù)包進行針對性的處理,以滿足不同設備對數(shù)據(jù)格式的不同需求?;谶@種需求,“探索一號”船作為國內(nèi)科考船改造的成功典范,自然將該項工作提到了日程,在已有的硬件架構(gòu)上,通過軟件的開發(fā),基于Python編程語言的可擴充性、免費、開源、可移植性、可擴展性、可嵌入性等優(yōu)點,可以有針對性地滿足不同設備對不同數(shù)據(jù)的特殊性需求。
本系統(tǒng)硬件主要包括4個部分。
1)數(shù)據(jù)源設備層。主要包括分布在駕駛臺的導航設備和科學調(diào)查設備。這些設備能夠提供各種數(shù)據(jù)源,其中導航數(shù)據(jù)來自GPS、羅經(jīng)、計程儀、測深儀、風速風向儀等,科學調(diào)查設備數(shù)據(jù)包括CTD、多波束等,通過雙絞線以RS422 或者RS232的串口通訊的數(shù)據(jù)格式接入采集設備。
2)數(shù)據(jù)的采集單元。該設備布置在駕駛臺,由信號轉(zhuǎn)換單元和串口服務器2部分組成。信號轉(zhuǎn)換單元主要是將雙絞線的串口數(shù)據(jù)轉(zhuǎn)換成網(wǎng)線輸出的串口數(shù)據(jù),串口服務器選用的是MOXA 的NPort 563016,其功能是將以雙絞線接入該串口服務器的COM1、COM2……多個串口的數(shù)據(jù),通過該串口服務器轉(zhuǎn)換成對應的網(wǎng)絡端口4001、4002……,該串口服務器可以同時將所需的16 種數(shù)據(jù)傳送給串口服務器,而且還可以選用32 口的串口服務器,對于后續(xù)的數(shù)據(jù)擴展提供了比較方便的路徑。
3)數(shù)據(jù)的轉(zhuǎn)發(fā)單元。該設備布置在數(shù)據(jù)處理中心,由2 部分組成,包括串口服務器、客戶端。串口服務器選用的是MOXA Nport6650-32 服務器,其作用是端口的控制,該服務器選用的是32 端口的服務器,通過參考NPort_6600_Series_QIG_v6 資料,可以配置不同端口的數(shù)據(jù)傳輸形式,既可以選擇RealCom 的數(shù)據(jù)傳輸模式,也可以選擇TCP Server 的傳輸模式,基于該功能,可以在各實驗室獲取所需要的數(shù)據(jù)格式??蛻舳说淖饔镁褪峭ㄟ^安裝的TJ-IDAS 軟件配置上述服務器的32 個不同端口的數(shù)據(jù)源,實現(xiàn)數(shù)據(jù)的采集、轉(zhuǎn)發(fā)。
4)數(shù)據(jù)接收單元。從串口服務器分別布置2條網(wǎng)線到各實驗室和其他處所,通過分布在各實驗室各區(qū)域的網(wǎng)絡接口,科學家可以隨時采集和存儲所需要的數(shù)據(jù)。
系統(tǒng)硬件框架圖如圖1所示。
圖1 系統(tǒng)硬件框架圖
1)通過串口實現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。由于科學考察需求的不同,經(jīng)常會有專業(yè)設備軟件(ADCP、人工地震作業(yè)、Global map 等)需要臨時接入GPS、羅經(jīng)、CTD 等的數(shù)據(jù),所以該系統(tǒng)經(jīng)過2 次重要的升級,第一次是在控制終端實現(xiàn)數(shù)據(jù)的采集和存儲,在控制終端通過TJ-IDAS程序配置不同的端口。
串口轉(zhuǎn)發(fā)程序配置界面圖如圖2 所示,圖2中,串口號即實驗室實際的物理端口號,串口類型選擇發(fā)送,在串口數(shù)據(jù)源端口中,選擇所需要分發(fā)的數(shù)據(jù)源,例如GPS、CTD 等,然后在串口參數(shù)中配置波特率、數(shù)據(jù)位、停止位和校驗位等相應的參數(shù),在對應的實驗室接口就可以獲取實時的串口數(shù)據(jù)。該軟件方案提供了2種工作模式:采集模式和采集并存儲模式。在采集模式下可以實現(xiàn)數(shù)據(jù)的采集和停止,而且可以實時查看所有源端口的數(shù)據(jù)格式和報文。在作業(yè)工況下提供采集并存儲模式,可以實現(xiàn)所有數(shù)據(jù)邊采集邊存儲,也可以實現(xiàn)對某一所需通道數(shù)據(jù)的采集和存儲,可以更高效地利用數(shù)據(jù)和存儲空間。
圖2 串口轉(zhuǎn)發(fā)程序配置界面圖
該次升級的軟件版本問題在于數(shù)據(jù)種類的增加,串口采集服務器可以隨時增加不同的數(shù)據(jù)類型,由于從服務器去各個實驗室采用串口傳輸,一個串口端口只能同時傳輸一種數(shù)據(jù),想要在某一區(qū)域同時接收多種數(shù)據(jù),就需要同時布置多條串口傳輸網(wǎng)線,在實現(xiàn)上存在很大的困難,是軟件需要再次升級的主要原因。
2)Python 程序的實現(xiàn)。串口通信在一條物理鏈路上只能同時傳輸一種數(shù)據(jù)形式。由于對多種類型多路數(shù)據(jù)的需求增加,迫切需要能在一條物理鏈路上同時傳輸多種數(shù)據(jù)形式,而通過網(wǎng)絡通信就可以實現(xiàn)該功能?;谠撃繕诵枰诙诬浖墸ㄟ^使用Python語言開發(fā)了小程序來實現(xiàn)同時獲取多種數(shù)據(jù)形式。MOXA Nport6650-32服務器可以配置其輸出端口的通訊形式,在物理鏈路上實現(xiàn)網(wǎng)絡數(shù)據(jù)的通信,只需要在MOXA Nport6650-32服務器的配置界面上將實驗室的某一端口對應的輸出端口配置成TCP Server 模式,就可以在實驗室訪問該串口服務器。
(1)導入庫。用import語句,導入所需要使用的第三方庫文件,包括網(wǎng)口數(shù)據(jù)的采集socket庫[3-4]、文件讀寫與保存的CSV 庫、datetime 和time庫。socket 是計算機之間進行通信的一種約定或一種方式。通過socket約定,一臺計算機可以接收其他計算機的數(shù)據(jù),也可以向其他計算機發(fā)送數(shù)據(jù)。datetime 庫是Python常用的一個庫,主要用于時間解析和計算。csv 在Python 語言中主要用于文件的讀取與存儲。
①import socket
②import datetime
③import csv
④import time
(2)文件的獲取。通過mysock.connect()命令,可以指定需要訪問的網(wǎng)絡IP 和端口號,用mysock.recv()命令可以獲取端口的數(shù)據(jù)內(nèi)容,并將該端口獲取的內(nèi)容賦值到a,由于端口獲取的數(shù)據(jù)內(nèi)容雜亂,可以利用′ ′將所有的數(shù)據(jù)按換行符來切割成不同的行賦值給a。
⑤mysock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
⑥mysock.connect((′192.168.1.254′,4001))
⑦out_message=[]
⑧out_gga=[]
⑨while True:
⑩a=mysock.recv(512)
?if len(a)<1:
?break
?a=a.decode("utf-8")
?a=a.split() #把a的數(shù)據(jù)按′ ′切割
(3)數(shù)據(jù)的選擇與截取。為了獲取所需要的數(shù)據(jù)內(nèi)容,可以通過判斷語句“if ′GGA/HDT′in text_split”,并將指定的數(shù)據(jù)增加到out_gga,然后每讀取一條內(nèi)容,就在后面增加讀取該內(nèi)容的時間。
?for text_split in a:
?if "GGA" in text_split: # 切割出來一條,判斷一條
?out_gga.append(text_split)
?now_time= datetime.datetime.now().strftime(′%Y-%m-%d%H:%M:%S′)
?out_gga.append(now_time)
(4)數(shù)據(jù)的保存。用withopen()命令,來建立csv 文件,再通過csv.writer ()命令將獲取的內(nèi)容保存在新建立的csv文件里。
?with open(′gps_out.csv′,′a′,newline=′′)as f:
?writer=csv.writer(f)
?writer.writerow(out_gga)
?f.close()
?print(out_gga)
?out_gga=[]
?out_message=[]
?time.sleep(2)
通過該Python 程序,能夠獲取指定的數(shù)據(jù)內(nèi)容,對于不同的網(wǎng)絡端口,只需要更改⑥中的IP地址和網(wǎng)絡端口號,就可以獲取其他數(shù)據(jù)內(nèi)容,比如4002 對應的羅經(jīng)數(shù)據(jù),4003 對應的計程儀數(shù)據(jù)等。同樣,如果需要截取端口內(nèi)的部分內(nèi)容,也可以通過?的判斷語句來截取。
3)程序的封裝。 通過PyCharm 軟件自帶的PyInstaller 庫的功能[5],將該程序封裝成exe 執(zhí)行程序,可以安裝到不同的電腦上,很方便地實現(xiàn)不同實驗室不同數(shù)據(jù)的實時采集和存儲功能。
為了驗證該系統(tǒng)的穩(wěn)定性,“探索一號”科考船的TS21 航次中,在地球物理實驗室實時采集和存儲GPS 數(shù)據(jù),得到比較理想的結(jié)果。在該測試中,選用GPS數(shù)據(jù)作為測試目標,由于GPS發(fā)過來的數(shù)據(jù)包有很多不同類型的數(shù)據(jù)格式,包括GGA、GLL、RMC 等[6],其大部分數(shù)據(jù)都具有重復性。所以在該測試中,只讀取以S GGA 開頭的語句作為存儲GPS的坐標,為實現(xiàn)該目的可以利用在Python編程語句中?的判斷語句“if ′GGA′in text_split”等來實現(xiàn)。也就是說,從socket讀取的數(shù)據(jù)a不是全部采集保存,只有以GGA 開頭的語句才保存在輸出的文檔里。數(shù)據(jù)樣本保存結(jié)果如圖3所示,通過對比圖3,處理后的語句實際已包含經(jīng)緯度、時間、航速等重要的數(shù)據(jù),已刪減無用或者重復的數(shù)據(jù)。只讀取該語句的數(shù)據(jù),不僅滿足科學家對于GPS數(shù)據(jù)利用的需求,也可以大大節(jié)省存儲空間。
圖3 數(shù)據(jù)樣本保存結(jié)果
在“探索一號”科考船上,已經(jīng)寫好了目前所使用的7種數(shù)據(jù)的語言包,并封裝成不同的小軟件。在實際使用中,只需要插上網(wǎng)線,將本地電腦設置成192.168.1.**網(wǎng)段的IP,直接打開對應的小軟件,就可以獲取所需要的數(shù)據(jù),并保存在本地電腦里。
綜合多航次的實際使用情況,該設計的軟硬件的使用在實踐上已經(jīng)獲得了科學家的認可,為他們保存了大量的科學考察數(shù)據(jù)。隨著中國科考事業(yè)的發(fā)展和科考工作的完善,數(shù)據(jù)的采集和存儲將得到更大程度地利用和重視,這種基于Python或者其他語言的數(shù)據(jù)實時采集與存儲系統(tǒng)的便利性和可復制性將得到更廣泛的運用。