胡明飛,楊 艷,漆靜群 ,可迪群
(1.武漢大學 物理科學與技術學院,武漢 430072;2.華中科技大學 光學與電子信息學院,武漢 430074;3.華中科技大學 自動化學院,武漢 430074)
智能儀表和現場總線的出現標志著工業控制領域網絡時代的到來,而以單片機多機通信實現分布式處理系統也逐漸成為主流。其中RS485總線因其結構簡單、通信速率高、傳輸距離遠等諸多優點,得以廣泛應用。RS485總線常采用主從式協議進行通信,但當終端用戶數目增加到一定程度后,主機的任務會過于繁重,系統性能大幅度下降[1]。因此,本文提出了一種基于RS485總線的多主機通信協議SBUS(simple BUS)的設計,各主機均擁有獨立的處理能力,在需要發送數據時采用CSMA/CD(carrier sense multiple access/collision detect)協議進行信道爭用,這樣就分擔了主控機的風險,并且提高了通信效率。
SBUS協議是在通過研究CSMA/CD協議之后而設計的一個網絡中各主機可以主動發起連接的通信協議,其結構框圖如圖1所示。
當總線上有數據幀到來時,協議會先對數據包行地址識別,若是發往本機的數據則繼續接收剩余的數據,并存放到接收緩沖區;并且當檢測到數據幀結束標志時則停止接收,然后通知應用層來取走數據;反之若發現數據包的地址非本機則拒絕接收余下的數據。數據從緩沖區取出之前會進行一些處理,比如差錯處理、進程解析等;若校驗錯誤根據需要確定是否重發。

圖1 SBUS協議架構圖Fig.1 SBUS protocol architecture diagram
當應用層需要發送一個數據包時,會先添加一些頭部信息,然后寫入發送緩沖區,等待鏈路層發送處理函數發送;發送時,會先監聽信道,當檢測到信道空閑則占用信道,然后將當前待發送的數據幀發送出去,并同時進行沖突檢測,若有沖突則進行沖突處理。
這樣就保證了網絡中可以存在多個主機,它們之間是通過信道爭用機制來與主控機進行通信的,各機處于平等的地位,相對于主從式通信而言,多主式通信在一定程度上可以提高通信效率[1]。
這里主要介紹測試時與SBUS協議相關的一些硬件電路設計。
利用SBUS多主式協議,完成了多路溫度采集系統的設計。常見的串口RS-232標準因為通信距離短、速率低,所以不適于該通信系統,而RS-485標準則很好地彌補了這方面的缺陷。所以物理層的收發器設計采用了Maxim公司的MAX485芯片,具體電路如圖2所示。

圖2 RS485通信電路原理圖Fig.2 RS485 communication circuit diagram
采用RS485標準,其傳輸速率可最高達到10 Mb/s,傳輸距離延長到1219.2 m(速率低于100 kb/s時)。它的數據信號采用差分傳輸方式,使用一對雙絞線,見圖2中的A和B[2-3]。
RS485收發器有2個使能端,將接收使能端(/RE)接地,發送使能端由51單片機控制,所以主機空閑時一直處于接收狀態,而當需要發送數據的時候使能發送端即可。另外,為了實現總線的監聽,將串口接收端通過施密特觸發器接至單片機的外部中斷INT0,這樣可通過中斷來判斷總線是否忙。
RS-485是一種半雙工結構通信總線,大多用于一對多點的通信系統,故采用T頭的星狀型網絡拓撲,如圖3所示。在多路溫度采集系統中通信媒介采用RJ45接口的網線,且各機共地連接[1,3]。

圖3 星型網絡拓撲接口原理圖Fig.3 Star network topology interface principle diagram
通信協議的主要部分由數據發送和數據接收2個模塊構成。流程如圖4所示。

圖4 收發函數模塊的流程圖Fig.4 Flow chart of sending and receiving function module
51單片機的串口通信中SM2位稱之為多機通信控制位,其作用是當串口工作在方式2或方式3下時,若SM2=1,僅當接收到第9位(RB8)為1時,才將前8位數據送入SBUF,并置位RI,產生中斷;若接收到的RB8=0,則丟棄前8位數據。當SM2=0時,無論RB8=0或1都將前8位數據送入SBUF,置位RI,產生中斷。
利用該功能,可將傳輸的第9位設置為數據/地址標志位,即RB8=1時,為地址幀,反之為數據幀。初始化后將SM2=1,此時主機一直處于接收地址幀的狀態,當到來一地址幀后即可接收。若前8位數據所代表的地址為本機地址,則將SM2置為0,此時主機就可以接收余下若干字節的數據幀了,其他主機因為地址不匹配SM2仍為1,不能接收余下的數據幀,原理如圖5所示,這樣就達到了數據包的正確接收了。

圖5 地址識別流程Fig.5 Address recognition process
圖5所示的地址匹配過程可視為幀的起始標志,同樣的原理可以實現數據包結束幀的標定。假設主機A正在向主機B傳輸數據,當A想結束一幀數據的傳輸,只需將RB8=1即可,而B在接收數據幀的時候不斷查詢RB8(數據幀的第9位一直為0),若發現RB8=1則說明該字節為結束標志符(該字節內容無任何實際意義),一幀數據已接收完成,需停止接收。此時,SM2又要設為1,為接收下一幀做準備。
CSMA/CD即載波監聽多路訪問/沖突檢測,實現過程:在51單片機的RXD端通過一個反向器與外部中斷0連接,如圖6所示,同時初始化一個定時器,時長為T,外部中斷0的中斷服務函數對定時器初值進行重裝[2,4]。當RS-485總線上有數據傳輸時,中斷會被反復觸發,定時器初值也一直重裝。這樣如果定時器溢出(即T時間內總線上仍沒有數據傳輸),則可認為總線是空閑的,就可以占用信道發送數據了[5]。

圖6 利用中斷監聽總線Fig.6 Using interrupt monitor bus
其中總線監聽函數代碼如下:

可以看到,函數中使用 while(!send_flag);語句來等待總線空閑,即當總線有數據傳輸時,檢測總線的中斷則持續觸發,對send_flag進行置位的定時器也不斷重裝,這樣send_flag就一直是0,進程阻塞在這里,等到總線空閑后,定時器會溢出,然后send_flag就置位,數據發送進程繼續往下執行,即該主機檢測到了總線空閑,并占用信道。
若同時有多個主機檢測到總線空閑,發送數據時就會產生沖突,所以在發送數據幀之前,需發送若干字節的測試碼(比如0xaa),并接收回來,若有沖突則接收回來的測試碼發生變化,這樣就檢測到了沖突。RS485收發控制器的接收使能一直接地,即一直處于使能狀態,這樣在發送數據的時候,接收和發送使能是同時打開的,所以既能發又能收;雖然51的串行接收和發送緩沖SBUF是共用的,但二者并不沖突,因為在串行接收的時候內部有個移位寄存器,當接收到完整的字節后它才將整個字節送到SBUF,又由于程序是順序執行的,而非同時進行,所以這里可以自發自收[3,5]。


以上為沖突檢測的具體實現,當函數返回FALSE后,要對數據進行沖突處理,在多路溫度采集系統設計時,采取的沖突處理策略是:延時一段時間,繼續新一輪的總線競爭,代碼如下:

整個系統由一個主控機和若干溫度采集器構成,主控機主要負責將多個采集器傳送過來的溫度數據進行實時的顯示和存儲,并且提供人機交互,便于查詢和控制。
如圖7所示,采集器主要功能就是周期地進行溫度采集、轉化,然后將無差錯的數據通過SBUS協議發送到總線上,根據地址匹配主控機會接收到該幀數據。

圖7 采集器和主控器的主流程圖Fig.7 Main flow chart of the collector and the main controller
本系統進一步完善的話,通過RS485組網,可實現各種現場數據的采集,尤其是點對多點的通信,在從機數量多的時候,采取主從式通信必然會導致通信效率降低,而本文提出了多主機進行信道爭用機制,可在一定程度上解決此問題,但是要很好地解決它,還需要對協議做進一步的完善,比如實現主從式和多主機通信之間的智能切換,在網絡負荷量較大時可切換到主從式通信,這樣就避免了網絡中某個主機一直爭用不到總線;而當負荷減輕時又切換到CSMA/CD協議下。
[1]陳汝全.單片機實用技術:整機設計、多機通信、實用技術[M].北京:電子工業出版社,1992.
[2]謝筑森.單片機開發與典型應用設計[M].合肥:中國科學技術大學出版社,1997.
[3]夏繼強.單片機實驗與實踐教程[M].北京:北京航空航天大學出版社,2001.
[4]余孟嘗.數字電子技術基礎簡明教程[M].北京:高等教育出版社,1999.
[5]馬忠梅.單片機的C語言應用程序設計[M].北京:北京航空航天大學出版社,1999.