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