賀亞楠,朱洪海
(齊魯工業(yè)大學(xué)(山東省科學(xué)院)山東省科學(xué)院海洋儀器儀表研究所 山東省海洋環(huán)境監(jiān)測(cè)技術(shù)重點(diǎn)實(shí)驗(yàn)室 國家海洋監(jiān)測(cè)設(shè)備工程技術(shù)研究中心,山東 青島266061)
海水表層溫度是我國海洋水文常規(guī)觀測(cè)中的重要測(cè)量參數(shù)[1]。基于船載平臺(tái)的海水表層水溫觀測(cè)由于受到船舶和波浪運(yùn)動(dòng)的影響,目前采用的主要手段是人工觀測(cè)。早期的海溫觀測(cè)以直接觀測(cè)為主,包括船舶觀測(cè)、浮標(biāo)觀測(cè)、船體感應(yīng)溫度計(jì)觀測(cè)。船體感應(yīng)海溫測(cè)量是利用船體上安裝的溫度計(jì)直接測(cè)量海溫[2]。溫度計(jì)需要放置在海面水下0.5 m的位置。為了使溫度計(jì)始終在船的吃水線以下,經(jīng)常垂直排列放置3~5個(gè)溫度計(jì)。
為了實(shí)現(xiàn)基于船載平臺(tái)的海水表層水溫自動(dòng)觀測(cè),需要在船體一側(cè)布放水溫傳感器,并且水溫傳感器始終處于船舶吃水線范圍。本文設(shè)計(jì)了基于Libmodbus的走航式海洋表層水溫總線,實(shí)現(xiàn)了表層水溫信息采集和船舶的海水表層水溫自動(dòng)監(jiān)測(cè)。
RS485總線具有設(shè)備簡(jiǎn)單、價(jià)格低廉、控制方便、能進(jìn)行長(zhǎng)距離通信的優(yōu)點(diǎn),其收發(fā)器采用平衡發(fā)送和差分接收,因此具有抑制共模干擾的能力[3]。使用RS485總線和一對(duì)雙絞線就能實(shí)現(xiàn)多站聯(lián)網(wǎng),構(gòu)成分布式系統(tǒng)。因此本系統(tǒng)使用4個(gè)水溫傳感器設(shè)計(jì)RS485作為硬件層協(xié)議,采用主從結(jié)構(gòu),構(gòu)成串行通信系統(tǒng)。
Modbus協(xié)議是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議[4],這是一個(gè)請(qǐng)求/應(yīng)答協(xié)議,并且提供功能碼規(guī)定的服務(wù)。Modbus協(xié)議定義了一個(gè)與基礎(chǔ)通信層無關(guān)的簡(jiǎn)單協(xié)議數(shù)據(jù)單元(PDU),其協(xié)議數(shù)據(jù)單元如圖1所示。

圖1 Modbus協(xié)議數(shù)據(jù)單元
Modbus串行鏈路協(xié)議是單主/多從通信協(xié)議。在同一時(shí)刻,只有一個(gè)主節(jié)點(diǎn)連接于總線,一個(gè)或多個(gè)子節(jié)點(diǎn)(最大編號(hào)為247)連接于同一個(gè)串行總線。在 Modbus 串行鏈路,地址域只含有子節(jié)點(diǎn)地址,主節(jié)點(diǎn)通過將子節(jié)點(diǎn)的地址放到報(bào)文的地址域?qū)ψ庸?jié)點(diǎn)尋址。當(dāng)子節(jié)點(diǎn)返回應(yīng)答時(shí),將自己的地址放到應(yīng)答報(bào)文的地址域以讓主節(jié)點(diǎn)知道哪個(gè)子節(jié)點(diǎn)在回答。Modbus定義了報(bào)文域的位內(nèi)容在線路上串行的傳送,并確定信息如何打包為報(bào)文和解碼。有兩種串行模式即:RTU模式和ASCII模式,區(qū)別見表1。

表1 Modbus-RTU和Modbus-ASCII區(qū)別
Modbus-ASCII模式的一個(gè)子節(jié)需要兩個(gè)字符,在波特率相同時(shí)RTU模式的傳輸數(shù)據(jù)密度以及吞吐率比 ASCII模式的要高。
Modbus總線廣泛應(yīng)用于智能儀器儀表、智能監(jiān)控設(shè)備等諸多領(lǐng)域[5],所以本系統(tǒng)采用Modbus-RTU作為軟件層協(xié)議。為了加強(qiáng)數(shù)據(jù)檢錯(cuò)能力,軟件方面使用CRC16算法校驗(yàn)數(shù)據(jù)。系統(tǒng)整體框圖如圖2所示。

圖2 海洋表層水溫采集系統(tǒng)整體框圖
PT100是一種正溫度系數(shù)的熱敏電阻,隨著溫度的升高電阻增大,并且基本呈線性方式,很適合用作連續(xù)測(cè)溫。鉑電阻測(cè)溫工作原理為:鉑金屬材料在不同的溫度下電導(dǎo)率不同,鉑絲的電導(dǎo)率與溫度之間大致成正比的關(guān)系,其可測(cè)量的溫度范圍大致在-200 ℃~600 ℃。PT100溫度傳感器還具有抗振動(dòng)、穩(wěn)定、測(cè)溫精度高、壽命較長(zhǎng)等優(yōu)點(diǎn)[6]。因此,本設(shè)計(jì)采用PT100進(jìn)行測(cè)溫。圖3中電阻R2、R3、R4與PT100組成電橋電路,REF3030為電橋電路提供標(biāo)準(zhǔn)的3.3 V電壓。AD623用一個(gè)2 kΩ的放大反饋電阻精確地把電橋的壓差放大51倍。

圖3 測(cè)溫電路圖
本電路采用MAX485作為RS485總線的驅(qū)動(dòng)芯片,如圖4所示。將RE和DE短接,由單片機(jī)的I/O端口經(jīng)反相器控制半雙工通信時(shí)接收和發(fā)送的狀態(tài)切換。三極管Ql及電阻Rl、R2構(gòu)成反相電路,防止出現(xiàn)總線沖突問題;R3、R4為總線空閑時(shí)的箝位電阻,用于抗干擾;R7為阻抗匹配電阻,以減小信號(hào)反射;R5、R6及4個(gè)快恢復(fù)穩(wěn)壓管Dl~D4可將瞬態(tài)高電壓箝位在一定的電壓范圍之內(nèi),以保護(hù)通信接口,保證通信的可靠性。

圖4 RS485通信接口電路
RS232與RS485轉(zhuǎn)換模塊通過MAX232芯片把RS232標(biāo)準(zhǔn)電平轉(zhuǎn)換為TTL標(biāo)準(zhǔn)電平,然后使用MAX485芯片將TTL電平轉(zhuǎn)換為RS485電平。MAX485芯片包含一個(gè)驅(qū)動(dòng)器和一個(gè)接收器,適合于RS485通信標(biāo)準(zhǔn)的低功率收發(fā)器。MAX485芯片采用單一電源5 V工作,額定電流為300 μA,采用半雙工通信方式,可以將TTL電平轉(zhuǎn)換為RS485電平。RS232與RS485轉(zhuǎn)換電路如圖5所示。

圖5 RS232與RS485轉(zhuǎn)換電路
Libmodbus作為一個(gè)優(yōu)秀而且免費(fèi)開源的跨平臺(tái)庫,支持RTU和TCP模式的Modbus開發(fā)庫。本文利用Libmodbus開源類庫V3.0.6版本,在Win7操作系統(tǒng)下,使用Visual Studio 2013建立MFC工程,利用MFC類庫和Libmodbus類庫進(jìn)行Modbus上位機(jī)開發(fā)。
首先對(duì)Libmodbus庫進(jìn)行編譯,得到Modbus靜態(tài)庫和動(dòng)態(tài)庫。利用VS2013建立MFC應(yīng)用程序,將Modbus靜態(tài)庫(modbus.lib)和動(dòng)態(tài)庫添(modbus.dll)加進(jìn)工程文件。
在本次開發(fā)中需要用到的文件有:modbus.h;modbus-rtu.h;modbus-tcp.h;modbus-version.h;modbus.lib;modbus.dll。在modbus.h文件中,宏定義了Modbus的功能碼,還定義最大可讀/可寫線圈數(shù)量、最大可讀/可寫寄存器數(shù)量及各種錯(cuò)誤碼常量,并提供串口設(shè)置模式、modbus-tcp環(huán)境、釋放modbus環(huán)境、設(shè)置從站ID、讀寫數(shù)據(jù)等一系列MODBUS_API的聲明。modbus-version.h是modbus類庫的版本信息。
完整的Modbus指令支持很多功能碼,但一個(gè)項(xiàng)目里只用到其中的一部分功能碼,因此本文實(shí)現(xiàn)的上位機(jī)包含讀保持寄存器、寫單個(gè)保持寄存器這2個(gè)指令。
首先要檢測(cè)讀取的寄存器數(shù)量是否在允許范圍內(nèi),之后再對(duì)查詢幀報(bào)文進(jìn)行預(yù)處理以實(shí)現(xiàn)查詢幀的構(gòu)造,發(fā)送報(bào)文。對(duì)接收到的報(bào)文進(jìn)行數(shù)據(jù)完整性檢測(cè),比較從設(shè)備地址,并進(jìn)行CRC計(jì)算比較。數(shù)據(jù)完整性檢測(cè)完畢之后,得到的才是各個(gè)寄存器的值。本機(jī)將查詢幀報(bào)文預(yù)處理、查詢幀構(gòu)造、數(shù)據(jù)完整性檢測(cè)、CRC校驗(yàn)這些功能分別封裝成函數(shù)。讀指令由modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t*dest)利用函數(shù)調(diào)用的思想實(shí)現(xiàn)。流程圖如圖6所示。

圖6 讀指令流程圖
首先創(chuàng)建相對(duì)應(yīng)的Modbus-RTU環(huán)境。在讀指令操作中,查詢幀報(bào)文預(yù)處理、查詢幀構(gòu)造、數(shù)據(jù)完整性檢測(cè)、CRC校驗(yàn)這些功能分別封裝成函數(shù)。同以上讀指令一樣,利用函數(shù)調(diào)用的思想,由modbus_write_registers(modbus_t*ctx, int addr, int nb, const uint16_t*data)函數(shù)實(shí)現(xiàn)寫指令的操作。寫指令模塊運(yùn)行流程圖如圖7所示。

圖7 寫指令流程圖
編寫好的上位機(jī)(圖8)先在實(shí)驗(yàn)室利用虛擬串口軟件VSPD進(jìn)行測(cè)試,可以正確讀寫寄存器。而后在2019年11月,于青島中苑碼頭岸基實(shí)驗(yàn)站進(jìn)行測(cè)試。本機(jī)物理端口為COM3,因此串口設(shè)置為COM3,波特率設(shè)為19 200,校驗(yàn)位設(shè)為無,數(shù)據(jù)位設(shè)為8,停止位設(shè)為1。將傳感器固定在船體側(cè)面,處于船舶吃水線變動(dòng)范圍內(nèi),分別采集海水表層溫度、水下1 m處的溫度、水下2 m處的溫度及氣溫。采集的溫度數(shù)據(jù)由Matlab處理如圖9所示。

圖8 軟件界面
由圖9可知,冬季青島岸基實(shí)驗(yàn)站附近的海水,氣溫要比表層水溫高3 ℃左右,表層水溫相差不多,水下1 m處的水溫基本穩(wěn)定在18.62 ℃,水下2 m處的水溫基本穩(wěn)定在18.60 ℃。溫度鏈與水溫精度為0.05、電導(dǎo)率0.05 mS/cm的亞力克溫鹽傳感器同時(shí)測(cè)量海水表層溫度,其最大標(biāo)準(zhǔn)差約為0.1 ℃。誤差分析如圖10所示。

圖9 溫度曲線圖

圖10 誤差分析
本文設(shè)計(jì)的上位機(jī)經(jīng)測(cè)試,各項(xiàng)功能正常,運(yùn)行穩(wěn)定,操作簡(jiǎn)單方便,并具有可移植性和可擴(kuò)展性。該設(shè)計(jì)可以在計(jì)算機(jī)上實(shí)現(xiàn)Modbus-RTU遠(yuǎn)程監(jiān)測(cè),并擴(kuò)展了Modbus-TCP模塊,設(shè)計(jì)了任務(wù)欄托盤功能,實(shí)現(xiàn)了用戶可視化,方便了用戶的操作與使用。為了能夠在沒有安裝VS的計(jì)算機(jī)上使用,可以生成Release版本。
海洋表層水溫是研究海氣間水汽交換、了解海區(qū)水文及水質(zhì)狀況的重要參數(shù)[7],是海洋科學(xué)研究、海洋環(huán)境監(jiān)測(cè)、海上交通安全、國防軍事建設(shè)的重要參考依據(jù)[8]。基于船舶進(jìn)行海水表層水溫自動(dòng)監(jiān)測(cè),能夠使志愿船自動(dòng)觀測(cè)實(shí)現(xiàn)從氣象觀測(cè)擴(kuò)展到水文觀測(cè),增加了觀測(cè)要素,對(duì)研究、開發(fā)和利用海洋都具有重要意義。