利用MODBUS提高多CPU協(xié)同開發(fā)效率
表1 MODBUS協(xié)議中的標準功能碼
由功能碼的定義可以看出,傳送的報文對象主要分為模擬量和數(shù)字量兩類,由報文頭的功能碼來確定報文的內容。在實際應用中,主要使用02、04、05和06這四種功能碼,完成對數(shù)字量和模擬量的讀取及設置。
數(shù)據(jù)起始地址和數(shù)據(jù)量是報文的主要內容。MODBUS規(guī)定的數(shù)據(jù)量是從通信對象的器件中讀取的數(shù)據(jù)或是往通對象的器件中寫入的數(shù)據(jù)。每個通信對象器件都有自己的地址。在保護裝置的內部通信中,指定各通信對象器件為主機板的RAM中保存的數(shù)字量和模擬量,以及EEPROM中設定的保護配置和定值。在處理通信報文時,由報文的數(shù)據(jù)起始地址和對應的數(shù)據(jù)量長度進行讀取或發(fā)送任務。當傳送數(shù)字量時,不同地址的數(shù)據(jù)值用報文中數(shù)據(jù)量不同的位來表示,這樣就能傳送更多的數(shù)據(jù)信息,從而高效地利用通信報文。由于每幀數(shù)據(jù)不定長,方便靈活,因而避免了固定幀長造成的對CPU時間和內存空間的浪費。另外,MODBUS通信協(xié)議規(guī)定在通信字符串中的地址比實際地址小“1”,這對數(shù)組進行操作時是一個方便之處。
報文末的兩個字節(jié)為校驗字節(jié)。RTU方式通信采用CRC-16位循環(huán)碼冗余校驗,即將整個字符串(不包括最后兩個字節(jié))按規(guī)定的方式進行位移并進行異或計算,計算結果存在字符串的最后兩個字節(jié)內,并由接收方按同樣的計算方法進行校驗是否一致。這種校驗方法對隨機或突發(fā)差錯造成的幀破壞有很好的校驗效果。
3 提高通信效率的措施
在確立硬件平臺和通信協(xié)議后的軟件設計過程中,筆者采用了很多方法提高通信的效率和可靠性。
3.1 將通信分為接收和發(fā)送兩個獨立的任務[3]
80C196單片機可以使用查詢和中斷兩種方法通過串行口發(fā)送和接收數(shù)據(jù)。對于中斷方式,80C196單片機提供了兩種串口中斷方式:第一種方式為一個單獨的串口中斷,由中斷屏蔽寄存器INT_MASK的D6位控制,對應中斷向量200CH,串行口狀態(tài)寄存器SP_STAT(11H)的D5(發(fā)送完標志TI)和D6(接收完標志RI)置位都將觸發(fā)該中斷;第二種方式為接收、發(fā)送分別設置了中斷號,使用INT_MASK1的D0位對應發(fā)送中斷,中斷向量2030H,TI置位觸發(fā)該中斷;INT_MASK1的D1位對應收中斷,中斷向量2032H,RI置位觸發(fā)該中斷。筆者采用了第二種通信方式。這樣每接收完或發(fā)送完一個字節(jié)后就觸發(fā)相應的中斷,直接進行下一輪的接收、發(fā)送任務,而不必判斷串口控制/狀態(tài)寄存器SP_CON/SP_STAT(11H),使得中斷子程序更為簡練、高效。
3.2 盡量縮短中斷時間
由于設計軟件結構時使用了多個中斷,為了保證程序的可靠運行,減少不同不斷間互沖突的機率,在編制軟件時盡可能簡練各種中斷的任務,縮短中斷執(zhí)行時間。在通信中斷子程序中,進入中斷后執(zhí)行必要的任務,如:清串行口狀態(tài)寄存器SP_STAT中相應的狀態(tài)位,將剛接收到的字符或需要發(fā)送的字符從緩沖區(qū)內讀出或寫入緩沖區(qū),已接收或發(fā)送字符數(shù)增1等,之后便立即退出中斷。其它任務如判斷幀的有效性、對接收幀命令(遙測、遙控命令)的應答,準備發(fā)送幀等,都放在主程序中完成。
3.3 可靠地判斷幀結束,防止通信停滯
利用單獨的軟件定時器,來判斷一幀接收報文結束,可以防止若報文接收不完整,該幀通信任務無法結束而影響下一幀的接收。
由于一幀報文中字節(jié)與字節(jié)之間的時間間隔和幀與幀之間的時間間隔相比要小得多,因此每當接收一個新字節(jié),就啟動軟件定時器開始計時,定時器的時間設定為幀與幀的最小時間間隔。波特率不同,該時間間隔也不同。若不到預定的時間內又接收到下一個字節(jié),則說明一幀報文未結束,定時器重新計時;若定時器順利計數(shù)到預定時間,就會觸發(fā)相應的中斷號,在該定時器中斷子程序中設定幀結束標志字節(jié),表明一幀報文接收完畢。當主程序內檢測到一幀報文接收完畢后,會通過核查從方地址及循環(huán)冗余校驗字節(jié)是否正確來判斷該幀的有效性。若確定接收到的是一幀發(fā)送給已方的正確報文,則會根據(jù)報文內的功能碼對該幀命令進行相應的處理,并準備發(fā)送幀。
MODBUS協(xié)議還規(guī)定了從方接收報文不正確時發(fā)回的出錯幀??紤]到裝置內部通信的過程不很復雜,在實際應用中如果從方收到的報文校驗不正確,采取不作應答的方式。主方若在規(guī)定時間內未收到從方的應答報文時,將重發(fā)請求報文;若多次未收到從方應答報文,則報通訊故障。
3.4 通信速率的確定
由于所開的裝置都在同一機箱內,模塊與模塊之間的間距很短,而MODBUS是基于RS485的長距離通信,可以不考慮距離對通信波特率的影響,并且由于采用主從式通信模式,不會出現(xiàn)線路堵塞現(xiàn)象。因此,僅從通信效率來看,只要不超過模塊所使用芯片對最高波特率的限制,則設定的波特率越高,信息交互越快,通信效率也越高。但是,對于實時多任務系統(tǒng),必須注意各任務的協(xié)調。MODBUS通信協(xié)議中只對各種通信報文格式作了規(guī)定,對通信波特率和奇偶校驗等不作硬性規(guī)定。當一幀報文的長度較長,而波特率又很高,會導致CPU忙于處理通信而可能丟失其它實時性任務,如實時采樣等。因此,選擇通信波特率時必須注意與其它任務相協(xié)調,而不是越高越好。在實際應用中,將波將率設置到19200bps,系統(tǒng)調調運作。由于設定通信雙方波特率完全一致,可以使接收端對每一個數(shù)據(jù)位的采樣都發(fā)生在位周期的中點,實現(xiàn)可靠通信。另外,在字符傳送時不使用奇偶校驗位,以此相對提高了有效字節(jié)傳遞的速率。
3.5 合理的調試方法
在開發(fā)初期,使用仿真器等工具只能對單一CPU模塊進行實時監(jiān)測,而無法同時監(jiān)測串行通信雙方,難以確定問題所在,使調試效率受到很大影響。因此先將各CPU模塊分別通過RS485/RS232數(shù)據(jù)轉換模塊與微機進行通信測試,成功后再進行模塊間聯(lián)調,大大提高了聯(lián)調的效率。在調試各模塊與微機通信的過程中,微機使用MODBUS調試軟件,模仿主方的通信過程,主動向從方(各CPU模塊)索要信息。整個接收、發(fā)送過程都是透明、清晰的,使得模塊中存在的絕大多數(shù)問題都能在與微機通信的過程發(fā)現(xiàn)并及時解決。CPU模塊間聯(lián)調時,可以利用總線監(jiān)控軟件,觀察雙方發(fā)送的數(shù)據(jù)。當遇到通信問題的時候,就能比較容易地確定是哪一個模塊發(fā)送數(shù)據(jù)不正確,從而確定問題所在。采用這樣的調試方法,大大增強了不同開發(fā)人員、不同CPU之間的協(xié)調性,提高了裝置研發(fā)的效率和進度。
評論