??? 摘 要: 提出了一種附加硬件設備,配合軟件實現了RS485總線上的載波監(jiān)聽多點" title="多點">多點接入/沖突檢測協(xié)議。滿足了系統(tǒng)的穩(wěn)定性和可靠性,并且提高了系統(tǒng)的實時性" title="實時性">實時性。?
??? 關鍵詞: RS485總線? 半雙工? 載波監(jiān)聽多點接入/沖突檢測
?
??? 智能儀表和現場總線的出現標志著工業(yè)控制" title="工業(yè)控制">工業(yè)控制領域網絡時代的到來,成為工業(yè)控制的主流。目前國際上已經出現了多種現場總線和相應的通信協(xié)議,但是其系統(tǒng)造價對于許多中小型應用仍顯過高。而RS485總線以其構造簡單、造價低廉、可選芯片多、便于維護等特點在眾多工業(yè)控制系統(tǒng)中得到應用。?
1 RS485總線及現有工作方式" title="工作方式">工作方式的特點?
??? RS485總線以雙絞線為物理介質,工作在半雙工的通信狀態(tài)下[1],即同一時刻,總線上只能有一個節(jié)點成為主節(jié)點而處于發(fā)送狀態(tài),其他所有節(jié)點必須處于接收狀態(tài)。如果同一時刻有兩個以上的節(jié)點處于發(fā)送狀態(tài),將導致所有發(fā)送方的數據發(fā)送失敗,即所謂總線沖突。為了避免總線沖突,RS485總線具有以下特點:?
??? 以工作模式來說,一般的RS485總線工作在主從模式下。整個通信總線系統(tǒng)由一個主節(jié)點、若干個從節(jié)點組成,由主節(jié)點不斷地輪流查詢從節(jié)點是否有通信需求。如果有則將總線控制權交給某一從節(jié)點,從節(jié)點發(fā)送完畢后立刻交還總線控制權。另外還有一種“輪主輪從”的工作方式,即讓總線控制權在各個節(jié)點間以類似令牌環(huán)的方式傳遞[3],得到控制權的節(jié)點成為主節(jié)點,其它節(jié)點成為從節(jié)點。一個節(jié)點在發(fā)送完數據的同時,將總線控制權交給相鄰的節(jié)點,而這個節(jié)點在處理完本節(jié)點的通信需求后再把控制權向下傳遞。令牌環(huán)式的RS485工作方式如圖1所示。
?
?
??? 從通信節(jié)點來講,RS485總線上的節(jié)點必須具備將自己的驅動器切換到高阻態(tài)的功能[1],以便在發(fā)送完數據后不會對總線狀態(tài)造成影響。這種驅動器實行發(fā)送態(tài)—高阻態(tài)切換的一個影響是:從發(fā)送數據完畢到設備切換為高阻態(tài),需要一個轉換延遲。這個轉換延遲是2線制通信中一個很重要的參數。這個時間不能太短,否則發(fā)出的字符的最后一部分因為尚未在總線上建立起來而導致丟失。同時這個時間也不能太長,否則在發(fā)送端還未轉為高阻態(tài)時其他設備已經開始發(fā)送數據,會導致總線沖突。因此2線制RS485總線上的主設備必須知道所有從設備的反應時間,并保證在從設備反應之前把驅動器設為高阻態(tài),以接收從設備的數據。常用設備的轉換延遲是當前波特率發(fā)送一個字節(jié)的時間。?
??? 以上為適應RS485總線的特殊之處而采用的工作方式也引入了一些不足。首先,上面提到的兩種總線工作方式在很多對實時性、可靠性要求高的工業(yè)控制場合有較大的局限性。主要原因是主從式總線的從節(jié)點無發(fā)起通信的權利,相互之間的通信需要通過主節(jié)點中轉。而“輪主輪從”總線上的各個節(jié)點由于等待總線控制權的時間未知,實時性也無法保證。同時,如果主從式的主節(jié)點或者是“輪主輪從”式的獲取令牌的節(jié)點出現故障,整個總線的工作將癱瘓,風險過于集中。其次,對驅動器實行“發(fā)送態(tài)—高阻態(tài)”切換以及考慮切換延遲等要求使編程變得復雜。在上電瞬間、CPU損壞或者是程序跑飛的情況下,還需要考慮復雜的故障保護等問題[2],否則將容易引起總線故障。?
2 RS485總線上CSMA/CD的實現?
??? 為了解決各個節(jié)點主動獲取總線控制權的問題,人們想到了利用監(jiān)聽總線狀態(tài)的方式實現總線控制權的本地判斷和獲取,也就是CSMA/CD協(xié)議實際上做的工作[3]。即所有節(jié)點在發(fā)送前監(jiān)聽總線上是否有其他節(jié)點在發(fā)送數據,如果有,就暫時不發(fā)送。另外在發(fā)送數據的同時,邊發(fā)送邊監(jiān)聽,如果監(jiān)聽到沖突則沖突雙方都停止發(fā)送。這樣做,既能保證每一個節(jié)點都具有發(fā)起通信的權利,又能盡量減少發(fā)生總線沖突的機會,提高整個系統(tǒng)的吞吐量。?
??? 已有的一種實現方法[4]是將總線接收器的輸出端反相后接到CPU的外部中斷管腳,如圖2所示。用觸發(fā)中斷的方式判斷總線上是否有數據傳輸,同時結合定時器中斷判斷總線是否空閑。如果總線空閑,就獲得總線控制權,發(fā)送數據;然后用監(jiān)聽自己發(fā)送數據的辦法判斷是否發(fā)生總線沖突。該方法解決了總線控制權分配的時延問題,但是需要使用至少4個管腳(INT0、RXD、TXD、驅動器使能管腳),并且占用外部中斷和內部定時器中斷,需要利用軟件監(jiān)聽發(fā)送的數據避免總線沖突。系統(tǒng)資源耗費較多,編程復雜,在一些場合的應用也有局限性。本文在以上方法的基礎上提出了一種利用硬件監(jiān)聽總線狀態(tài)的方法,真正實現CSMA/CD協(xié)議。同時減少了系統(tǒng)資源的占用率,簡化了總線沖突的判斷。另外實現了驅動器的無延遲自動切換" title="自動切換">自動切換,進一步提高了系統(tǒng)的實時性。該系統(tǒng)工作穩(wěn)定、可靠,并且大大提高了通信的實時性,特別適合實時分布式控制的場合。?
?
?
2.1 系統(tǒng)框圖?
??? 系統(tǒng)由總線狀態(tài)判斷邏輯、驅動器自動切換邏輯兩部分組成,如圖3所示。系統(tǒng)資源只占用CPU的3個管腳:RXD、TXD、總線狀態(tài)指示腳,不占用任何中斷。在軟件實現方面由于采用了硬件判斷總線狀態(tài)而變得非常簡單,只需要對標準的232通信程序做微小修改即可。?
?
?
2.2 總線狀態(tài)判斷邏輯?
??? 該電路由雙RS485總線接收器構成,兩個接收器的輸出相與后得到總線狀態(tài)信號。偏置電阻網絡的對稱形式使得在總線沒有被驅動的情況下,兩條總線的電平相等??偩€狀態(tài)判斷邏輯如圖4所示。由于接收器的兩個接入點電平不同,所以當總線處于高阻狀態(tài)或者總線被短路時,兩個接收器都是高電平輸出,總線狀態(tài)為高電平。因為A、B線通過6.8kΩ電阻分別接入兩個接收器的不同接收端,所以當總線出現任何一個確定的邏輯狀態(tài)時,都將引起其中一個接收器的輸出變?yōu)榈碗娖?這樣總線狀態(tài)就變?yōu)榈碗娖?表明總線被占用。經過理論計算和EWB仿真,該網絡從A、B點看接入阻抗為12.2kΩ,恰好滿足RS485協(xié)議的接收器輸入阻抗要求。?
?
?
2.3 驅動器無延遲自動切換邏輯?
??? 為了實現驅動器的無延遲自動切換,TXD信號反相后接到驅動器使能,而驅動器輸入直接接地,如圖5所示。這樣處理使驅動器只在數據為0時打開,把數據0發(fā)出去。而當數據為1或者無數據時立刻關閉,縮短了切換時間。但是這樣做,使得數據1無法被正常發(fā)送出去。為使串行數據能被正確地接收,有兩個辦法產生數據中的1。第一個辦法,使用總線判斷電路中的正向接收器的輸出端(OUT+)作為RXD信號,該信號在總線空閑、開路和短路時輸出邏輯1,并且與RXD信號同相。第二個辦法,使用類似MAX3080自帶故障保護(fail-safe)功能的芯片作為接收器。MAX3080將接收器的觸發(fā)門限電壓從-200mv~+200mv調整為-200mv~-50mv,也能夠在總線空閑、開路和短路時輸出邏輯1。如果總線上的每一個節(jié)點都使用這些方法,那么所有節(jié)點都可以實現驅動器無延遲自動切換而不必擔心數據中的1不能被正確接收。?
?
?
2.4 軟件的實現?
??? 發(fā)送數據方面,只需將標準串口函數putc()封裝成一個函數RS485PutString()發(fā)送數據即可。在RS485PutString()函數中,能夠方便地實現各種總線狀態(tài)判斷策略,甚至是CSMA/CD協(xié)議,實現載波監(jiān)聽,邊發(fā)送邊監(jiān)聽。也可以在此函數的基礎上進行諸如定義不同數據包的實時性級別、定義總線超時判斷等高級編程。?
??? 該函數的主要流程如圖6。?
?
?
??? 判斷總線狀態(tài)就是簡單地讀取總線狀態(tài)判斷電路的輸出,高為空閑,低為總線已被占用。為了減少誤判,通常在判斷總線狀態(tài)為空閑后還要繼續(xù)判斷一段時間,具體的總線狀態(tài)判斷策略要根據通信協(xié)議進行調整。?
??? 如果判斷總線空閑,即可進行數據發(fā)送。在發(fā)送過程中可以方便地繼續(xù)讀取總線狀態(tài)以進行邊發(fā)送邊監(jiān)聽的沖突檢測。一旦發(fā)現沖突發(fā)生,發(fā)送方放棄本次數據傳輸而轉入強化沖突流程(繼續(xù)發(fā)送幾個0x00以使各方都確認發(fā)生了總線沖突),然后再進入總線偵聽流程。以往的RS485總線沖突檢測處理機制是通過對自己所發(fā)送的數據進行監(jiān)聽接收,然后比較接收到的數據與發(fā)送的數據是否相符,判斷是否發(fā)生總線沖突,在軟件實現上比較復雜。而本系統(tǒng)的沖突檢測非常簡單:發(fā)送完一個字節(jié)就讀取一次總線狀態(tài)指示管腳的狀態(tài),如果發(fā)現總線被占用,就是發(fā)生了總線沖突。?
??? 接收程序方面,因為接收器常開,所以仍然可以使用串行接收器的中斷服務程序,將接收到的數據放入緩沖區(qū),然后由命令解釋程序處理接收到的命令。本質上與RS232的串口通信程序完全一樣,只是如果接收器是常開的話,在自己發(fā)送數據時,要記住將串行接收器中斷關閉,發(fā)送完畢后再打開,以避免運行不必要的中斷服務程序。?
??? 另外,還可以結合驅動器和總線狀態(tài)判斷邏輯對總線進行開路和短路的檢測/報警。具體說就是某一個節(jié)點使能總線驅動器,然后判斷總線狀態(tài),如果仍然顯示總線空閑,說明總線短路或者總線到總線狀態(tài)判斷邏輯之間開路了。?
2.5 存在的不足之處?
??? 該方法中的總線狀態(tài)判斷邏輯對邏輯0狀態(tài)的要求比較高,需要B線電平比A線高約1.1V才能得到低電平。如果采用總線判斷電路中的正向接收器的輸出端(OUT+)作為RXD信號,就會因為對邏輯0的要求而不滿足RS485的-200mV門限電平標準。若采用另一個具有故障保護功能的接收器并聯(lián)的話,固然能滿足-200mV門限電平標準,但整個節(jié)點的輸入阻抗將降低到6kΩ。?
??? 以上不足之處都在于無法完全滿足標準RS485總線標準,但在特定條件下是不會影響工作效果的。例如阻抗雖然降低了,但是當節(jié)點數不超過16時,是能夠很好地工作的。?
??? 實驗表明,這種實現了CSMA/CD的多主式RS485總線工作穩(wěn)定,可靠性高,大大提高了實時性。特別適合于強調實時性的分布式控制系統(tǒng),能夠方便地實現點與點之間的控制信息實時交換。?
參考文獻?
1 B&B Electronics Mfg.Co.Inc.RS-422 and RS-485 Application?Note.[M] www.bb-elec.com:1997?
2 房惠龍,楊靜娟. 提高 485總線在售飯系統(tǒng)中的可靠性[J]. 電子工程師,2002;28(9)?
3 謝希仁.計算機網絡(第2版)[M].北京:電子工業(yè)出版社,1999?
4 吳軍輝,林開顏,徐立鴻. RS485總線通信避障及其多主發(fā)送的研究[J]. 測控技術,2002;21(8):41~43