王雪

摘 ? 要:文章針對MODBUS通信協議進行了實踐和教學研究。首先,指出了MODBUS協議的重要性以及地位作用;其次,分析了MODBUS幀的結構和通信原理,再利用一個通信項目分析了MODBUS通信的詳細過程和開發代碼;最后,指出MODBUS通信過程中需要注意的問題,并進行了總結,這對于MODBUS項目的研究與開發有重要的參考價值。
關鍵詞:MODBUS通信協議;STC單片機;485通信;工業物聯網
1 ? ?網絡通信概述
隨著計算機通信技術的發展,越來越多的計算機系統連接到網絡當中,網絡通信成為當前信息科學最為熱點的問題之一,尤其在工業控制與物聯網領域,如何安全、快速、便捷地傳送數據,成為衡量工業發展水平的重要標志之一。與傳統PC機相比,工業領域的信息通信的特點[1]在于:通信主機結構類型不盡相同;通信環境有可能會受到輻射干擾;通信設備成本限制;通信組網信息安全;網絡拓撲結構各異。在這種背景下,選擇什么樣的通信方式和通信協議,就顯得異常關鍵。
2 ? ?MODBUS通信協議
MODBUS[2]是由施耐德電氣(現在的Modicon公司)于1979年為PLC之間的通信而研發的一種串行通信協議,它為連接至不同類型總線或網絡的設備之間提供了C/S通信,目前已經成為工業領域通信協議的業界標準。自1979年以來,使成千上萬的自動化設備能夠通信,很好地解決工業領域面臨的通信難題,成為目前主流的工業物聯網通信協議。
MODBUS協議定義了一個與基礎通信層無關的簡單協議數據單元(Protocol Data Unit,PDU)。特定總線或網絡上的 MODBUS協議映射能夠在應用數據單元(Application Data Unit,ADU)上引入一些附加域。啟動MODBUS事務處理的客戶機創建MODBUS應用數據單元。功能碼向服務器指示將執行哪種操作。MODBUS協議建立了客戶機啟動的請求格式。MODBUS事務處理流程如圖1所示。
3 ? ?MODBUS通信實踐與教學
3.1 ?總體結構
采用單片機與PC上位機的串口通信方式,并采用RS485總線進行信號傳輸,以保證信號的總體質量。單片機一端作為服務器端,不主動發送數據,只是等待應答客戶端請求的數據。PC機作為客戶端,負責啟動請求與接收響應。
與RS232相比,采用RS485總線的好處在于:(1)傳輸方式不同。RS-232采取不平衡傳輸方式,即所謂單端通信。而RS485則采用平衡傳輸,即差分傳輸方式。在穩定性和抗干擾性方面都有明顯優勢。(2)傳輸距離不同。RS-232適合本地設備之間的通信,傳輸距離一般不超過20 m。而RS-485的傳輸距離為幾十米到上千米。(3)主機數量不同。RS-232只允許一對一通信,而RS-485接口在總線上是允許連接收發器多達128個。
3.2 ?MODBUS軟件設計
MODBUS公共功能碼是MODBUS協議通用的功能碼,這個功能碼是預先被定義好的,并且需要保證是唯一的、公開證明的。對應于每個操作訪問,相關程序代碼如下:
void readCoil(void); //讀線圈
void readRegisters(void); //讀寄存器
void forceSingleCoil(void); //強制單個線圈
void presetSingleRegister(void); //設置單個寄存器
void presetMultipleRegisters(void); //設置多個寄存器
void forceMultipleCoils(void); //強制多個線圈
3.3 ?MODBUS通信從機軟件設計
MOBUS通信的主要過程包括:(1)進行系統初始化設置,主要包括定時器初始化,串口初始化,中斷服務函數的編寫和變量定義。(2)定時處理,不是指定時器與計數器的初始化,而是指判斷一個完整的MODBUS幀是否結束的時間。關于區分兩個幀的間隔時間,有許多衡量方法,一般采用延時幾十微秒的方法。(3)循環監聽MODBUS狀態,一旦收到完整的數據幀,便開始處理,利用前面講到的MODBUS庫函數進行處理。在完成讀寫任務后,按照MODBUS幀規則,應答數據通過MODBUS總線傳回客戶端。部分初始化代碼如下。
//串口初始化代碼
void UartInit (ULONG baud, UCHAR mode)
{ IE=0x90;
TMOD = (TMOD & 0X0F) | 0X20;
TH1 = -22118400L/12/32/9600;
TL1 = -22118400L/12/32/9600;
TR1 = 1;
SCON = 0X50;
PCON |= 0X80; }
//串口中斷服務函數代碼
void commIntProc(void) interrupt 4
{ if (!RI) return;
RI = 0;
receTimeOut = 20;
receBuf[receCount] = SBUF;
receCount ++;
receCount &= 0x0f; }
4 ? ?開發過程需要注意的問題
4.1 ?單片機型號的選擇
單片機最常用的主要包括89C51和89C52系列,許多型號的單片機均可采用這種型號的工程。然而,單片機開發時最好要用自己的工程型號以及頭文件。如本例用到的STC15系列單片機,需要在建立工程時便選定型號,并且加入其特有的頭文件:#include “stc15.h”。這樣,才能保證工程能夠編譯通過并正確下載到芯片中。
4.2 ?波特率的控制
在傳輸過程中,客戶機與服務器的波特率設置必須完全一致,否則將接收不到正確的數據。受到傳輸距離和單片機性能的約束,在速度選擇上要適中,具體情況要通過實驗得以驗證,一般不宜過高或過低。
4.3 ?傳輸距離
MODBUS通信物理層多采用的是串行通信,在通信過程中不同類型的串行通信差別很大,如RS232和RS485在通信原理和通信性能上都存在很大差異,在開發過程中,應該根據需要合理選擇,避免造成信號不穩定。
4.4 ?CRC校驗碼
循環冗余校驗碼(Cyclic Redundancy Check,CRC)可以有效地檢測到傳輸問題導致的數據錯誤,它的原理是利用CRC算法將數據幀轉換成一個CRC檢驗碼,接收方在接收到數據以后,再重新計算校驗碼并與發送時的檢驗碼相比對,以檢驗數據的準確性。在實踐過程中,CRC校驗碼的生成和檢測一般直接利用庫函數完成,不是MODBUS研究的重點,在開發和教學過程中應當注意區分。
4.5 ?節點數量
有的項目可能需要幾百甚至上千個節點進行485通信,從理論上講,無論是MODBUS還是485總線都是有數量限制的,MODBUS的數量最多240個。485總線根據芯片的不同,差異也很大,在幾十到幾百之間。同時,還受到線路長度的影響。如果想讓更多的設備連接在一起,需要采用中繼器或者多串口服務器一類的設備進行網絡拓撲。
5 ? ?結語
通過對MODBUS的系統研究與實驗論證,證明MODBUS協議在單片機平臺上,利用RS485通信是十分可靠并可以實現的,可以應用到嵌入式系統等相關課程的教學當中。通過合理的組織教學,讓學生能夠熟悉并掌握工業現場的應用技術,更接近市場的人才需求,內容適合物聯網相關專業的學生學習。同時,還要注意講授內容的取舍,把重點放在MODBUS協議本身,以免使學生產生畏難心理。