ModBus協(xié)議在工業(yè)控制系統(tǒng)中的應(yīng)用
3.2 系統(tǒng)的軟件設(shè)計
本系統(tǒng)的軟件設(shè)計是基于軟件開發(fā)平臺μC/OS-II,它是由Labrosse先生編寫的一個開放式內(nèi)核,最主要的特點就是源碼公開,清晰明了。在單片機系統(tǒng)中嵌入μC/OS-II將增強系統(tǒng)的可靠性,并使得調(diào)試程序變得簡單起來。但由于它沒有功能強大的軟件包,基于具體應(yīng)用需要自己編寫驅(qū)動程序,對內(nèi)核進行擴充。為使其能夠正常工作,要根據(jù)具體的硬件平臺完成相應(yīng)的移植工作。μC/OS-II是一個占先式的內(nèi)核,即已經(jīng)準(zhǔn)備就緒的高優(yōu)先級任務(wù)可以剝奪正在運行的低優(yōu)先級任務(wù)的CPU使用權(quán)。這個特點使得它的實時性比非占先式的內(nèi)核要好。根據(jù)要實現(xiàn)的功能,我將系統(tǒng)劃分為如下6個任務(wù):按鍵處理、LCD顯示、串行通信、輸出任務(wù)、控制運算、信號采集處理。這里只介紹和ModBus總線協(xié)議相關(guān)的部分。
當(dāng)選用的是ModBus的RTU模式時,一幀報文中字節(jié)與字節(jié)之間的時間間隔比幀與幀之間的時間間隔小得多,因此主要的難點在于如何判斷一幀報文接收結(jié)束與否,這可以利用單片機內(nèi)置的定時器來進行判斷。若實際實現(xiàn)時,我們選擇了19200的傳輸速率,那么空閑間隔時間T≥1/19200*8*3.5=1.5ms。每當(dāng)接收到一個新的字節(jié),就啟動定時器開始計時,定時器的時間設(shè)定為幀與幀之間的最小時間間隔(上面提到的例子中是1.5ms)。波特率不同,該時間的間隔也不同。若不到預(yù)定時間又接收到下一個字節(jié),則說明一幀報文尚未結(jié)束,定時器重新開始計數(shù);若定時器順利計數(shù)到預(yù)定時間,就會觸發(fā)相應(yīng)的中斷,在該定時中斷服務(wù)程序中設(shè)定幀結(jié)束標(biāo)志字節(jié),表明一幀報文接收完畢。這樣就可以防止報文接收不完整,導(dǎo)致該幀通訊任務(wù)無法結(jié)束而影響下一幀的接收。
如圖3所示,在一個幀開始接收時判斷接收的第一個字節(jié)是否為本機地址,如果是則保存到接收緩沖區(qū)中,不是則繼續(xù)等待下一幀報文的到來,這樣節(jié)省了保存數(shù)據(jù)的時間,接收中斷服務(wù)程序只是保存數(shù)據(jù)而不處理數(shù)據(jù),只是在一幀新的報文接收結(jié)束后,通知系統(tǒng)(通過發(fā)出信號量來實現(xiàn));ModBus協(xié)議還規(guī)定了從方接收報文不正確時發(fā)問的出錯幀??紤]到裝置內(nèi)部通信的過程不是很復(fù)雜,在實際應(yīng)用中如果從方收到的報文校驗不正確,采取不作應(yīng)答的方式。主方若在規(guī)定時間內(nèi)未收到從方的應(yīng)答報文時,將重發(fā)請求報文;若多次末收到從方應(yīng)答報文,則報通訊故障。上面的措施大大縮短了中斷服務(wù)程序的執(zhí)行時間,防止了系統(tǒng)資源的無謂浪費。
在數(shù)據(jù)處理方面設(shè)計了一個環(huán)形的緩沖區(qū),用來存放接收到的數(shù)據(jù),這個緩沖區(qū)是一個兩維數(shù)組。假設(shè)一個幀不超過12個字節(jié),可以定義了一個5*12的二維數(shù)組。數(shù)組的第一個元素是標(biāo)志位,前四位用來表示數(shù)據(jù)是否已經(jīng)處理,后四位存放接收的數(shù)據(jù)的個數(shù);每接收一個幀的數(shù)據(jù),數(shù)組下移一個。當(dāng)接收的數(shù)據(jù)要覆蓋未處理數(shù)據(jù)時系統(tǒng)報警,這種情況一般不會發(fā)生,因為數(shù)據(jù)處理程序在本系統(tǒng)中被設(shè)成優(yōu)先級最高。
在ModBus協(xié)議中另外一個問題就是CRC校驗和的計算問題,一般情況下它是由硬件電路直接產(chǎn)生的,這樣速度比較快,系統(tǒng)負(fù)載小;但是在本文中介紹的單片機中沒有這種專用電路,而且一般的中低端的單片機一般也不具有這種專用電路。這里我們只有充分利用現(xiàn)有的資源,如果直接計算的話,單片機負(fù)載很大,而且浪費了大量的系統(tǒng)時間,影響系統(tǒng)的實時性,考慮到我所使用的MCU的Flash ROM比較大,可以存儲大量的常量線性表數(shù)據(jù),利用查表方式可以非常方便的計算出CRC校驗碼。
四、結(jié)束語
在本文中比較詳細(xì)地介紹了ModBus總線協(xié)議,并最終設(shè)計了一個實現(xiàn)多點溫度測量和控制的使用系統(tǒng),希望本系統(tǒng)對類似的通訊應(yīng)用有所幫助。
參考資料
1. Modicon ModBus Protocol Reference Guide.PI一MBUS一300 Rev. J
2. Mark Nelson著.串行通訊開發(fā)指南. 北京:中國水利水電出版社,2000
3. 王田苗主編.嵌入式系統(tǒng)設(shè)計與實例開發(fā). 北京:清華大學(xué)出版社,2002
評論