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