陳佳暉 衷衛(wèi)聲 王文海
(南昌大學(xué)信息工程學(xué)院1,江西 南昌 330031;浙江大學(xué)信息學(xué)部2 ,浙江 杭州 310027)
水站監(jiān)控系統(tǒng)的Modbus通信協(xié)議設(shè)計(jì)
陳佳暉1衷衛(wèi)聲1王文海2
(南昌大學(xué)信息工程學(xué)院1,江西 南昌 330031;浙江大學(xué)信息學(xué)部2,浙江 杭州 310027)
針對(duì)水站監(jiān)控系統(tǒng)中存在的可擴(kuò)展性、成本高等問題,將FPGA技術(shù)應(yīng)用于水站監(jiān)控系統(tǒng)。對(duì)水站監(jiān)控系統(tǒng)進(jìn)行了總體結(jié)構(gòu)設(shè)計(jì),控制器與分析儀表的通信采用Modbus協(xié)議,通過仔細(xì)分析該協(xié)議后,用FPGA的模塊化設(shè)計(jì)方法,將該協(xié)議劃分為波特率發(fā)生器模塊、接收模塊、發(fā)送模塊和CRC校驗(yàn)?zāi)K,并用Verilog HDL語言完成了對(duì)各模塊的設(shè)計(jì)和功能仿真。實(shí)驗(yàn)仿真結(jié)果表明,該設(shè)計(jì)滿足Modbus協(xié)議的通信要求,在工業(yè)通信領(lǐng)域具有一定的實(shí)用價(jià)值。
FPGA Modbus 通信協(xié)議 水站監(jiān)控 Verilog HDL
21世紀(jì)以來,我國(guó)的工業(yè)化水平得到了迅速提高,面對(duì)日益嚴(yán)重的水污染及水資源短缺等問題,監(jiān)測(cè)江河、湖泊、水庫(kù)等地表水的水質(zhì)成為當(dāng)今環(huán)境監(jiān)測(cè)的研究熱點(diǎn)[1]。隨著計(jì)算機(jī)技術(shù)及傳感器技術(shù)的快速發(fā)展,監(jiān)控技術(shù)的自動(dòng)化水平越來越高,參數(shù)的測(cè)量精度也越來越高,系統(tǒng)變得更加靈活。由于水站分布在不同地域,工作環(huán)境比較惡劣,并且針對(duì)不同的水環(huán)境有不同的監(jiān)測(cè)指標(biāo),因此,控制中心與現(xiàn)場(chǎng)儀表之間的通信面臨著可擴(kuò)展性及可靠性的問題。
現(xiàn)場(chǎng)可編程門陣列(field-programmable gate array,F(xiàn)PGA),已從最初的一千多個(gè)邏輯門發(fā)展到現(xiàn)在的百萬門以上[2]。用戶可通過編程將內(nèi)部的邏輯單元組成任何復(fù)雜的數(shù)字系統(tǒng),并支持動(dòng)態(tài)可重構(gòu)技術(shù),應(yīng)用領(lǐng)域越來越廣,如SOPC技術(shù)、嵌入式系統(tǒng)開發(fā)、高性能數(shù)字信號(hào)處理系統(tǒng)、可重配置計(jì)算機(jī)系統(tǒng)、基于網(wǎng)絡(luò)的可從配置技術(shù)、IP核的開發(fā)和復(fù)用技術(shù)等。
Modbus以其擴(kuò)展性好、兼容性強(qiáng)、可靠性高和免費(fèi)開放等優(yōu)點(diǎn)得到了廣泛應(yīng)用[3]。目前主要是通過單片機(jī)或PLC實(shí)現(xiàn)Modbus協(xié)議,而本文研究了一種基于FPGA的Modbus通信協(xié)議實(shí)現(xiàn)方案。由于FPGA具備開發(fā)周期短、速度快等優(yōu)點(diǎn),該方案具有很好的通用性和實(shí)用價(jià)值。
水站監(jiān)控系統(tǒng)的總體結(jié)構(gòu)如圖1所示。
圖1 水站監(jiān)控系統(tǒng)的總體結(jié)構(gòu)
取配水單元主要負(fù)責(zé)水樣的采集,并將水樣通過取樣水泵輸送至沉砂分離單元和分析儀器單元;在線監(jiān)測(cè)分析儀器單元的任務(wù)是針對(duì)不同的水質(zhì)參數(shù)檢測(cè)要求,選擇合適的水質(zhì)在線分析儀表,并將測(cè)量結(jié)果及工作狀態(tài)等信息發(fā)送給FPGA。為便于通信,這些儀器都支持Modbus通信協(xié)議[4]。GPRS模塊負(fù)責(zé)數(shù)據(jù)的遠(yuǎn)程傳輸和報(bào)警功能;遠(yuǎn)程數(shù)據(jù)管理中心負(fù)責(zé)對(duì)監(jiān)測(cè)數(shù)據(jù)進(jìn)行實(shí)時(shí)顯示和存儲(chǔ),為工作人員提供可視化的監(jiān)控管理平臺(tái)。
數(shù)據(jù)采集與控制單元是系統(tǒng)的核心部分,與以往的監(jiān)控系統(tǒng)相比,該系統(tǒng)以FPGA作為現(xiàn)場(chǎng)控制單元。它主要負(fù)責(zé)對(duì)各分析儀器的監(jiān)測(cè)數(shù)據(jù)進(jìn)行采集,分析儀器與FPGA之間的通信采用Modbus協(xié)議;FPGA會(huì)將采集的數(shù)據(jù)發(fā)給GPRS模塊,以實(shí)現(xiàn)遠(yuǎn)程通信功能;現(xiàn)場(chǎng)設(shè)備執(zhí)行檢測(cè)、取樣及清洗等功能也是由FPGA實(shí)現(xiàn)的。本系統(tǒng)適用于地表水水域或斷面水質(zhì)的在線檢測(cè),可供有關(guān)環(huán)境監(jiān)測(cè)部門參考和使用。
Modbus協(xié)議是當(dāng)今自動(dòng)化協(xié)議中使用最普遍的一種通信協(xié)議,它是一種主從式點(diǎn)對(duì)點(diǎn)通信協(xié)議,通過該協(xié)議,控制器之間、控制器經(jīng)由網(wǎng)絡(luò)(如以太網(wǎng))和其他設(shè)備之間可以進(jìn)行通信,現(xiàn)在己經(jīng)成為一種通用的工業(yè)標(biāo)準(zhǔn)通信協(xié)議。有了Modbus協(xié)議,不同廠商生產(chǎn)的控制設(shè)備可以組成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。Modbus串行鏈路系統(tǒng)可以使用RS-485、RS-232兩種物理接口,其中RS-485兩線制接口最常用[5]。為了提高通信模塊的穩(wěn)定性和抗干擾性,接口芯片與FPGA核心模塊之間需要采用高速光耦進(jìn)行隔離,并采用屏蔽雙絞線作為通信介質(zhì)。
在標(biāo)準(zhǔn)Modbus通信協(xié)議中,控制器可以使用ACSII或RTU通信模式進(jìn)行通信[6]。當(dāng)控制器使用ASCII模式通信時(shí),消息中的每個(gè)8位字節(jié)都要用2個(gè)ASCII字符發(fā)送,這種方式的主要優(yōu)點(diǎn)是字符間的時(shí)間間隔可以達(dá)到1 s而不會(huì)產(chǎn)生錯(cuò)誤。以RTU模式通信時(shí),消息中的每個(gè)8位字節(jié)包含2個(gè)4位的十六進(jìn)制字符。該模式的優(yōu)點(diǎn)是,在相同的波特率下,可以比ASCII模式發(fā)送更多的數(shù)據(jù)[7]。本設(shè)計(jì)采用RTU模式進(jìn)行通信,其消息幀格式如表1所示。
表1 RTU模式的消息幀格式
在RTU模式中,規(guī)定消息以至少3.5個(gè)字符靜止時(shí)間表示開始,當(dāng)確定了波特率后,很容易計(jì)算得到這個(gè)靜止時(shí)間。各區(qū)發(fā)送的字符均采用十六進(jìn)制,第一個(gè)數(shù)據(jù)區(qū)是從機(jī)的地址,在同一個(gè)網(wǎng)絡(luò)中只允許有1臺(tái)主機(jī)和最多247臺(tái)從機(jī),從機(jī)的地址編碼范圍是1~247(十進(jìn)制)。當(dāng)從設(shè)備接收到第一個(gè)地址數(shù)據(jù)時(shí),每臺(tái)設(shè)備都要立即對(duì)它解碼,以判斷是否是自己的地址;第二個(gè)數(shù)據(jù)區(qū)代表功能碼,Modbus通信協(xié)議定義了255個(gè)功能碼,但大部分功能碼用于異常應(yīng)答;第三個(gè)數(shù)據(jù)區(qū)代表數(shù)據(jù)信息,它包括各種數(shù)據(jù)地址、寄存器數(shù)量、數(shù)據(jù)信息和數(shù)據(jù)的字節(jié)數(shù);第四個(gè)是錯(cuò)誤校驗(yàn)碼區(qū),本系統(tǒng)采用循環(huán)冗余校驗(yàn)CRC16;最后是至少3.5個(gè)字符靜止時(shí)間,代表消息的結(jié)束。整個(gè)消息必須連續(xù)發(fā)送,如果發(fā)送消息時(shí)出現(xiàn)大于1.5個(gè)字符靜止時(shí)間,則接收設(shè)備會(huì)刷新不完整的信息,重新接收消息數(shù)據(jù)。
3.1 整體功能模塊劃分
Modbus通信協(xié)議是通過FPGA來實(shí)現(xiàn)的,根據(jù)Modbus通信協(xié)議的要求,采用自頂向下的設(shè)計(jì)方法,將整個(gè)通信模塊劃分為若干個(gè)功能模塊,如果功能模塊還比較復(fù)雜就再進(jìn)行細(xì)化,以實(shí)現(xiàn)模塊的功能最簡(jiǎn)化,然后用Verilog HDL語言實(shí)現(xiàn)各模塊的功能[8]。采用模塊化的設(shè)計(jì)思想,不僅使設(shè)計(jì)更加簡(jiǎn)單,而且使代碼維護(hù)和升級(jí)變得更加方便。Modbus通信協(xié)議的頂層模塊如圖2所示。
圖2 Modbus協(xié)議的FPGA功能模塊劃分
3.2 波特率發(fā)生器
波特率發(fā)生器其實(shí)就是一個(gè)分頻器,根據(jù)系統(tǒng)的時(shí)鐘頻率和要求的波特率算出波特率分頻因子,并以此作為分頻器的分頻數(shù),它的主要功能是控制Modbus協(xié)議的數(shù)據(jù)傳輸速率。本系統(tǒng)的FPGA控制板使用的是50 MHz的晶振,波特率采用Modbus協(xié)議推薦的19 200 bit/s,這樣就可以得到傳輸一位數(shù)據(jù)需要的時(shí)間長(zhǎng)度為2 604個(gè)時(shí)鐘脈沖周期,半周期為1 302。波特率發(fā)生器的模塊圖如圖3所示。
圖3 波特率發(fā)生器功能模塊圖
3.3 接收模塊
接收模塊由消息幀信號(hào)檢測(cè)模塊、串并轉(zhuǎn)換模塊和數(shù)據(jù)緩存模塊組成。
① 信號(hào)檢測(cè)模塊。信號(hào)檢測(cè)模塊的功能是檢測(cè)消息幀的開始與結(jié)束。當(dāng)模塊檢測(cè)到串口至少有3.5個(gè)字符時(shí)間的停頓間隔,則置位起始信號(hào)標(biāo)志位,如果沒有就接著檢測(cè);當(dāng)數(shù)據(jù)信息全部接收完畢,模塊又檢測(cè)到至少3.5個(gè)字符時(shí)間的停頓間隔,則置位終止信號(hào)標(biāo)志位,表示消息幀已經(jīng)結(jié)束。信號(hào)檢測(cè)模塊的功能圖如圖4所示。其中,RX是串口輸入數(shù)據(jù),CLK_BPS是數(shù)據(jù)傳輸時(shí)鐘,RST_n是復(fù)位信號(hào),KS_EN和JS_EN分別代表起始信號(hào)和終止信號(hào)。
圖4 信號(hào)監(jiān)測(cè)功能模塊圖
② 串并轉(zhuǎn)換模塊。串并轉(zhuǎn)換模塊的功能是接收數(shù)據(jù)的串行比特流,將輸入數(shù)據(jù)轉(zhuǎn)換為8位并行數(shù)據(jù),并將并行數(shù)據(jù)發(fā)送給數(shù)據(jù)緩存模塊和CRC校驗(yàn)?zāi)K[9]。該模塊的功能圖如圖5所示。CLK_BPS是波特率時(shí)鐘信號(hào);RX是串行輸入數(shù)據(jù);當(dāng)KS_EN為1時(shí),模塊開始工作;RX_D是8位并行輸出數(shù)據(jù);WR_EN是寫數(shù)據(jù)寄存器使能信號(hào);當(dāng)JS_EN為1時(shí),該模塊停止工作,表示數(shù)據(jù)轉(zhuǎn)換完畢。
圖5 串并轉(zhuǎn)換功能模塊圖
當(dāng)KS_EN為1時(shí),該模塊開始工作,并檢測(cè)起始位0,當(dāng)串行輸入“00101100101”(首先接收最低位)時(shí),輸出端輸出的8位并行數(shù)據(jù)為“10011010”,因此該模塊正確地完成了串并轉(zhuǎn)換功能。
③ 數(shù)據(jù)緩存模塊。數(shù)據(jù)緩存模塊是將接收端收到的數(shù)據(jù)進(jìn)行緩存,并認(rèn)為緩存的第一個(gè)字節(jié)為從機(jī)地址,第二個(gè)字節(jié)為功能碼,而第三個(gè)字節(jié)及后續(xù)字節(jié)(不包括CRC校驗(yàn)碼)為消息幀的數(shù)據(jù)信息。數(shù)據(jù)緩存模塊的功能圖如圖6所示,RX_D為緩存的8位并行數(shù)據(jù),WR_EN為1時(shí)該模塊開始工作,WRADDR為寫入數(shù)據(jù)的地址,Data為寫入存儲(chǔ)區(qū)的數(shù)據(jù)。
圖6 數(shù)據(jù)緩存功能模塊圖
3.4 發(fā)送模塊
發(fā)送模塊相當(dāng)于接收模塊的逆過程,該模塊由發(fā)送控制模塊、并串轉(zhuǎn)換模塊和讀數(shù)據(jù)模塊組成。發(fā)送控制模塊與接收模塊中的信號(hào)檢測(cè)模塊相似,它產(chǎn)生至少3.5個(gè)字符時(shí)間的停頓間隔;并串轉(zhuǎn)換是將讀取的8位并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù),并將串行數(shù)據(jù)發(fā)送給串口,由TX引腳發(fā)送出去;讀數(shù)據(jù)模塊是根據(jù)處理器的指令讀取數(shù)據(jù)緩存區(qū)的8位并行數(shù)據(jù),每取完一個(gè)字節(jié)后,數(shù)據(jù)長(zhǎng)度寄存器加1。當(dāng)數(shù)據(jù)長(zhǎng)度寄存器的值與數(shù)據(jù)長(zhǎng)度字節(jié)的值相等時(shí),就取出CRC模塊所產(chǎn)生的16位CRC值。當(dāng)CRC校驗(yàn)值發(fā)送完畢,則表示整個(gè)消息幀發(fā)送完畢。由于發(fā)送模塊各子模塊與上述接收模塊相似,這里就不詳細(xì)列出了。
3.5 CRC16校驗(yàn)
CRC校驗(yàn)?zāi)K主要完成兩個(gè)任務(wù),一個(gè)是對(duì)主機(jī)發(fā)送給從機(jī)的消息幀進(jìn)行CRC計(jì)算,并將校驗(yàn)結(jié)果發(fā)給發(fā)送模塊;另一個(gè)是對(duì)從機(jī)返回給主機(jī)的消息幀進(jìn)行CRC校驗(yàn)。CRC校驗(yàn)碼是兩個(gè)字節(jié)、16位的二進(jìn)制數(shù)。CRC校驗(yàn)開始時(shí),將一個(gè)16位的CRC寄存器各位置1;然后將消息幀中的第一個(gè)8位字節(jié)與CRC寄存器的低字節(jié)進(jìn)行異或運(yùn)算(只有每個(gè)字符中的8位數(shù)據(jù)進(jìn)行CRC計(jì)算,而起始位、停止位及校驗(yàn)位不進(jìn)行CRC計(jì)算);接著向最低有效位(LSB)方向移位,并用0填充最高有效位(MSB);檢查L(zhǎng)SB的值,如果LSB=1,則與寄存器的預(yù)置值進(jìn)行異或運(yùn)算,如果LSB=0,則不作異或運(yùn)算。重復(fù)以上處理過程,直到移位8次,當(dāng)?shù)?次移位后,將下一個(gè)8位數(shù)據(jù)與寄存器的當(dāng)前值進(jìn)行異或運(yùn)算,并重復(fù)上面的步驟[10]。當(dāng)整個(gè)消息幀的數(shù)據(jù)都處理完后,CRC寄存器的值就是該消息幀的CRC校驗(yàn)值。
CRC校驗(yàn)的模塊圖如圖7所示。其中,crc_in[7:0]是輸入數(shù)據(jù),load表示開始編碼,d_finish表示編碼結(jié)束,crc_out[15:0]是最后得到的CRC值。
圖7 CRC校驗(yàn)?zāi)K圖
FPGA收到從機(jī)發(fā)來的消息幀“01,03,00,9a,00,07,e0,ef”,其中efe0為該消息幀的CRC校驗(yàn)碼,因?yàn)榘l(fā)生時(shí)是先發(fā)低字節(jié)再發(fā)高字節(jié),因此ef是高8位,CRC模塊對(duì)該幀的計(jì)算結(jié)果為efe0,兩者相等,因此滿足CRC校驗(yàn)的要求。
為了實(shí)現(xiàn)水站監(jiān)控系統(tǒng)中對(duì)各檢測(cè)儀表的數(shù)據(jù)采集,采用Modbus協(xié)議規(guī)范進(jìn)行通信設(shè)計(jì)。采用Verilog HDL語言對(duì)Modbus RTU協(xié)議各個(gè)模塊進(jìn)行編程和功能仿真,并提供了有關(guān)模塊的仿真結(jié)果。實(shí)踐證明,采用FPGA來設(shè)計(jì)Modbus協(xié)議與傳統(tǒng)的單片機(jī)設(shè)計(jì)相比,其傳輸速度更快、可擴(kuò)展性更強(qiáng),并具有一定的可行性。
[1] 肖長(zhǎng)來,梁秀娟.水環(huán)境監(jiān)測(cè)與評(píng)價(jià)[M].北京:清華大學(xué)出版社,2008.
[2] 桂婧.基于FPGA的超聲波探傷儀信號(hào)處理系統(tǒng)分析與設(shè)計(jì)[D].廣州:華南理工大學(xué),2010.
[3] 張明龍,陳鋒,許濤濤.嵌入式水質(zhì)監(jiān)測(cè)系統(tǒng)節(jié)點(diǎn)間MODBUS的協(xié)議設(shè)計(jì)[J].儀表技術(shù),2013(10):1-4.
[4] 王振明.SCADA(監(jiān)控與數(shù)據(jù)采集)軟件系統(tǒng)設(shè)計(jì)與開發(fā)[M].北京:機(jī)械工業(yè)出版社,2008.
[5] 潘悅.Modbus協(xié)議研究及其實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2007.
[6] 陸晶,薛偉.基于MODBUS協(xié)議的溫度采集系統(tǒng)的設(shè)計(jì)[J].電子測(cè)量技術(shù),2009,32(12):25-27.
[7] 張飛,張?jiān)疲n彥嶺,等.基于Modbus遠(yuǎn)程監(jiān)控的水質(zhì)在線監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2014(2):1-4.
[8] 王伶俐,周學(xué)功,王穎.系統(tǒng)級(jí)FPGA設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2012.
[9] 楊大柱.基于FPGA的UART電路設(shè)計(jì)與仿真[J].微計(jì)算機(jī)信息,2007,23(5):200,212-213.
[10] 張?jiān)霾?,陳仲林,肖?基于FPGA的內(nèi)置并行CRC校驗(yàn)的UART[J].自動(dòng)化與儀表,2013,28(2):30-32,40.
Design of the Modbus Communication Protocol for Water Station Monitoring System
In order to solve the problems of poor extensibility and high cost in water station monitoring systems, the FPGA technology is applied in the system. The overall structural design of water station monitoring system is achieved, in the system, the communication between controller and analytical instrument is using Modbus protocol. Through analyzing this protocol in detail, by adopting FPGA modular design method, the protocol is divided into baud rate generator module, receiving module, sending module and CRC checking module; the design and functional simulation of each module are conducted with Verilog HDL language. The results of experimental simulation indicate that the design satisfies the communication requirements of Modbus protocol, and possesses certain practical value in industrial communication field.
FPGA Modbus Communication protocol Water station monitoring Verilog HDL
國(guó)家863計(jì)劃基金資助項(xiàng)目(編號(hào):2013AA040302);
陳佳暉(1990-),男,現(xiàn)為南昌大學(xué)測(cè)試計(jì)量技術(shù)及儀器專業(yè)在讀碩士研究生;主要從事嵌入式系統(tǒng)開發(fā)及信號(hào)監(jiān)測(cè)技術(shù)的研究。
TP336
A
10.16086/j.cnki.issn1000-0380.201509013
江西省科技廳科技成果重點(diǎn)推廣指導(dǎo)項(xiàng)目(編號(hào):2011ZBBI90006)。
修改稿收到日期:2015-04-03。