胡明飛,楊 艷,漆靜群 ,可迪群
(1.武漢大學(xué) 物理科學(xué)與技術(shù)學(xué)院,武漢 430072;2.華中科技大學(xué) 光學(xué)與電子信息學(xué)院,武漢 430074;3.華中科技大學(xué) 自動(dòng)化學(xué)院,武漢 430074)
智能儀表和現(xiàn)場總線的出現(xiàn)標(biāo)志著工業(yè)控制領(lǐng)域網(wǎng)絡(luò)時(shí)代的到來,而以單片機(jī)多機(jī)通信實(shí)現(xiàn)分布式處理系統(tǒng)也逐漸成為主流。其中RS485總線因其結(jié)構(gòu)簡單、通信速率高、傳輸距離遠(yuǎn)等諸多優(yōu)點(diǎn),得以廣泛應(yīng)用。RS485總線常采用主從式協(xié)議進(jìn)行通信,但當(dāng)終端用戶數(shù)目增加到一定程度后,主機(jī)的任務(wù)會過于繁重,系統(tǒng)性能大幅度下降[1]。因此,本文提出了一種基于RS485總線的多主機(jī)通信協(xié)議SBUS(simple BUS)的設(shè)計(jì),各主機(jī)均擁有獨(dú)立的處理能力,在需要發(fā)送數(shù)據(jù)時(shí)采用CSMA/CD(carrier sense multiple access/collision detect)協(xié)議進(jìn)行信道爭用,這樣就分擔(dān)了主控機(jī)的風(fēng)險(xiǎn),并且提高了通信效率。
SBUS協(xié)議是在通過研究CSMA/CD協(xié)議之后而設(shè)計(jì)的一個(gè)網(wǎng)絡(luò)中各主機(jī)可以主動(dòng)發(fā)起連接的通信協(xié)議,其結(jié)構(gòu)框圖如圖1所示。
當(dāng)總線上有數(shù)據(jù)幀到來時(shí),協(xié)議會先對數(shù)據(jù)包行地址識別,若是發(fā)往本機(jī)的數(shù)據(jù)則繼續(xù)接收剩余的數(shù)據(jù),并存放到接收緩沖區(qū);并且當(dāng)檢測到數(shù)據(jù)幀結(jié)束標(biāo)志時(shí)則停止接收,然后通知應(yīng)用層來取走數(shù)據(jù);反之若發(fā)現(xiàn)數(shù)據(jù)包的地址非本機(jī)則拒絕接收余下的數(shù)據(jù)。數(shù)據(jù)從緩沖區(qū)取出之前會進(jìn)行一些處理,比如差錯(cuò)處理、進(jìn)程解析等;若校驗(yàn)錯(cuò)誤根據(jù)需要確定是否重發(fā)。
圖1 SBUS協(xié)議架構(gòu)圖Fig.1 SBUS protocol architecture diagram
當(dāng)應(yīng)用層需要發(fā)送一個(gè)數(shù)據(jù)包時(shí),會先添加一些頭部信息,然后寫入發(fā)送緩沖區(qū),等待鏈路層發(fā)送處理函數(shù)發(fā)送;發(fā)送時(shí),會先監(jiān)聽信道,當(dāng)檢測到信道空閑則占用信道,然后將當(dāng)前待發(fā)送的數(shù)據(jù)幀發(fā)送出去,并同時(shí)進(jìn)行沖突檢測,若有沖突則進(jìn)行沖突處理。
這樣就保證了網(wǎng)絡(luò)中可以存在多個(gè)主機(jī),它們之間是通過信道爭用機(jī)制來與主控機(jī)進(jìn)行通信的,各機(jī)處于平等的地位,相對于主從式通信而言,多主式通信在一定程度上可以提高通信效率[1]。
這里主要介紹測試時(shí)與SBUS協(xié)議相關(guān)的一些硬件電路設(shè)計(jì)。
利用SBUS多主式協(xié)議,完成了多路溫度采集系統(tǒng)的設(shè)計(jì)。常見的串口RS-232標(biāo)準(zhǔn)因?yàn)橥ㄐ啪嚯x短、速率低,所以不適于該通信系統(tǒng),而RS-485標(biāo)準(zhǔn)則很好地彌補(bǔ)了這方面的缺陷。所以物理層的收發(fā)器設(shè)計(jì)采用了Maxim公司的MAX485芯片,具體電路如圖2所示。
圖2 RS485通信電路原理圖Fig.2 RS485 communication circuit diagram
采用RS485標(biāo)準(zhǔn),其傳輸速率可最高達(dá)到10 Mb/s,傳輸距離延長到1219.2 m(速率低于100 kb/s時(shí))。它的數(shù)據(jù)信號采用差分傳輸方式,使用一對雙絞線,見圖2中的A和B[2-3]。
RS485收發(fā)器有2個(gè)使能端,將接收使能端(/RE)接地,發(fā)送使能端由51單片機(jī)控制,所以主機(jī)空閑時(shí)一直處于接收狀態(tài),而當(dāng)需要發(fā)送數(shù)據(jù)的時(shí)候使能發(fā)送端即可。另外,為了實(shí)現(xiàn)總線的監(jiān)聽,將串口接收端通過施密特觸發(fā)器接至單片機(jī)的外部中斷INT0,這樣可通過中斷來判斷總線是否忙。
RS-485是一種半雙工結(jié)構(gòu)通信總線,大多用于一對多點(diǎn)的通信系統(tǒng),故采用T頭的星狀型網(wǎng)絡(luò)拓?fù)?,如圖3所示。在多路溫度采集系統(tǒng)中通信媒介采用RJ45接口的網(wǎng)線,且各機(jī)共地連接[1,3]。
圖3 星型網(wǎng)絡(luò)拓?fù)浣涌谠韴DFig.3 Star network topology interface principle diagram
通信協(xié)議的主要部分由數(shù)據(jù)發(fā)送和數(shù)據(jù)接收2個(gè)模塊構(gòu)成。流程如圖4所示。
圖4 收發(fā)函數(shù)模塊的流程圖Fig.4 Flow chart of sending and receiving function module
51單片機(jī)的串口通信中SM2位稱之為多機(jī)通信控制位,其作用是當(dāng)串口工作在方式2或方式3下時(shí),若SM2=1,僅當(dāng)接收到第9位(RB8)為1時(shí),才將前8位數(shù)據(jù)送入SBUF,并置位RI,產(chǎn)生中斷;若接收到的RB8=0,則丟棄前8位數(shù)據(jù)。當(dāng)SM2=0時(shí),無論RB8=0或1都將前8位數(shù)據(jù)送入SBUF,置位RI,產(chǎn)生中斷。
利用該功能,可將傳輸?shù)牡?位設(shè)置為數(shù)據(jù)/地址標(biāo)志位,即RB8=1時(shí),為地址幀,反之為數(shù)據(jù)幀。初始化后將SM2=1,此時(shí)主機(jī)一直處于接收地址幀的狀態(tài),當(dāng)?shù)絹硪坏刂穾蠹纯山邮?。若?位數(shù)據(jù)所代表的地址為本機(jī)地址,則將SM2置為0,此時(shí)主機(jī)就可以接收余下若干字節(jié)的數(shù)據(jù)幀了,其他主機(jī)因?yàn)榈刂凡黄ヅ銼M2仍為1,不能接收余下的數(shù)據(jù)幀,原理如圖5所示,這樣就達(dá)到了數(shù)據(jù)包的正確接收了。
圖5 地址識別流程Fig.5 Address recognition process
圖5所示的地址匹配過程可視為幀的起始標(biāo)志,同樣的原理可以實(shí)現(xiàn)數(shù)據(jù)包結(jié)束幀的標(biāo)定。假設(shè)主機(jī)A正在向主機(jī)B傳輸數(shù)據(jù),當(dāng)A想結(jié)束一幀數(shù)據(jù)的傳輸,只需將RB8=1即可,而B在接收數(shù)據(jù)幀的時(shí)候不斷查詢RB8(數(shù)據(jù)幀的第9位一直為0),若發(fā)現(xiàn)RB8=1則說明該字節(jié)為結(jié)束標(biāo)志符(該字節(jié)內(nèi)容無任何實(shí)際意義),一幀數(shù)據(jù)已接收完成,需停止接收。此時(shí),SM2又要設(shè)為1,為接收下一幀做準(zhǔn)備。
CSMA/CD即載波監(jiān)聽多路訪問/沖突檢測,實(shí)現(xiàn)過程:在51單片機(jī)的RXD端通過一個(gè)反向器與外部中斷0連接,如圖6所示,同時(shí)初始化一個(gè)定時(shí)器,時(shí)長為T,外部中斷0的中斷服務(wù)函數(shù)對定時(shí)器初值進(jìn)行重裝[2,4]。當(dāng)RS-485總線上有數(shù)據(jù)傳輸時(shí),中斷會被反復(fù)觸發(fā),定時(shí)器初值也一直重裝。這樣如果定時(shí)器溢出(即T時(shí)間內(nèi)總線上仍沒有數(shù)據(jù)傳輸),則可認(rèn)為總線是空閑的,就可以占用信道發(fā)送數(shù)據(jù)了[5]。
圖6 利用中斷監(jiān)聽總線Fig.6 Using interrupt monitor bus
其中總線監(jiān)聽函數(shù)代碼如下:
可以看到,函數(shù)中使用 while(!send_flag);語句來等待總線空閑,即當(dāng)總線有數(shù)據(jù)傳輸時(shí),檢測總線的中斷則持續(xù)觸發(fā),對send_flag進(jìn)行置位的定時(shí)器也不斷重裝,這樣send_flag就一直是0,進(jìn)程阻塞在這里,等到總線空閑后,定時(shí)器會溢出,然后send_flag就置位,數(shù)據(jù)發(fā)送進(jìn)程繼續(xù)往下執(zhí)行,即該主機(jī)檢測到了總線空閑,并占用信道。
若同時(shí)有多個(gè)主機(jī)檢測到總線空閑,發(fā)送數(shù)據(jù)時(shí)就會產(chǎn)生沖突,所以在發(fā)送數(shù)據(jù)幀之前,需發(fā)送若干字節(jié)的測試碼(比如0xaa),并接收回來,若有沖突則接收回來的測試碼發(fā)生變化,這樣就檢測到了沖突。RS485收發(fā)控制器的接收使能一直接地,即一直處于使能狀態(tài),這樣在發(fā)送數(shù)據(jù)的時(shí)候,接收和發(fā)送使能是同時(shí)打開的,所以既能發(fā)又能收;雖然51的串行接收和發(fā)送緩沖SBUF是共用的,但二者并不沖突,因?yàn)樵诖薪邮盏臅r(shí)候內(nèi)部有個(gè)移位寄存器,當(dāng)接收到完整的字節(jié)后它才將整個(gè)字節(jié)送到SBUF,又由于程序是順序執(zhí)行的,而非同時(shí)進(jìn)行,所以這里可以自發(fā)自收[3,5]。
以上為沖突檢測的具體實(shí)現(xiàn),當(dāng)函數(shù)返回FALSE后,要對數(shù)據(jù)進(jìn)行沖突處理,在多路溫度采集系統(tǒng)設(shè)計(jì)時(shí),采取的沖突處理策略是:延時(shí)一段時(shí)間,繼續(xù)新一輪的總線競爭,代碼如下:
整個(gè)系統(tǒng)由一個(gè)主控機(jī)和若干溫度采集器構(gòu)成,主控機(jī)主要負(fù)責(zé)將多個(gè)采集器傳送過來的溫度數(shù)據(jù)進(jìn)行實(shí)時(shí)的顯示和存儲,并且提供人機(jī)交互,便于查詢和控制。
如圖7所示,采集器主要功能就是周期地進(jìn)行溫度采集、轉(zhuǎn)化,然后將無差錯(cuò)的數(shù)據(jù)通過SBUS協(xié)議發(fā)送到總線上,根據(jù)地址匹配主控機(jī)會接收到該幀數(shù)據(jù)。
圖7 采集器和主控器的主流程圖Fig.7 Main flow chart of the collector and the main controller
本系統(tǒng)進(jìn)一步完善的話,通過RS485組網(wǎng),可實(shí)現(xiàn)各種現(xiàn)場數(shù)據(jù)的采集,尤其是點(diǎn)對多點(diǎn)的通信,在從機(jī)數(shù)量多的時(shí)候,采取主從式通信必然會導(dǎo)致通信效率降低,而本文提出了多主機(jī)進(jìn)行信道爭用機(jī)制,可在一定程度上解決此問題,但是要很好地解決它,還需要對協(xié)議做進(jìn)一步的完善,比如實(shí)現(xiàn)主從式和多主機(jī)通信之間的智能切換,在網(wǎng)絡(luò)負(fù)荷量較大時(shí)可切換到主從式通信,這樣就避免了網(wǎng)絡(luò)中某個(gè)主機(jī)一直爭用不到總線;而當(dāng)負(fù)荷減輕時(shí)又切換到CSMA/CD協(xié)議下。
[1]陳汝全.單片機(jī)實(shí)用技術(shù):整機(jī)設(shè)計(jì)、多機(jī)通信、實(shí)用技術(shù)[M].北京:電子工業(yè)出版社,1992.
[2]謝筑森.單片機(jī)開發(fā)與典型應(yīng)用設(shè)計(jì)[M].合肥:中國科學(xué)技術(shù)大學(xué)出版社,1997.
[3]夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程[M].北京:北京航空航天大學(xué)出版社,2001.
[4]余孟嘗.數(shù)字電子技術(shù)基礎(chǔ)簡明教程[M].北京:高等教育出版社,1999.
[5]馬忠梅.單片機(jī)的C語言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,1999.