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