林云策,朱浩然,包志舟
(1.溫州大學(xué)電氣與電子工程學(xué)院,浙江 溫州 325035;2.溫州大學(xué)樂清工業(yè)研究院,浙江 溫州 325035;3.浙江人民電器有限公司,浙江 溫州 325035)
RS-485總線具有接口芯片豐富、硬件成本低、操作方便、低速傳輸時傳輸距離遠等特點[1-2],被廣泛應(yīng)用于電鍍電源、實驗室電源管理、電力終端設(shè)備管理等領(lǐng)域[3-4]。傳統(tǒng)的RS-485 總線應(yīng)用多為基于Modbus 協(xié)議的一主多從(一個主節(jié)點,多個從節(jié)點)通信方式,采用主節(jié)點輪詢從節(jié)點的方式進行通信[5-7],優(yōu)點是通信方式簡單。但一主多從通信模式只適合規(guī)模不大或?qū)νㄐ艑崟r性要求不高的場景。隨著從機節(jié)點數(shù)的增加,主節(jié)點輪詢從節(jié)點的時間會變長[8-9]。因此。為了提高通信實時性,拓寬RS-485總線的應(yīng)用,多主訪問RS485通信方式被提出[10]。多主訪問RS485 通信方式是利用主節(jié)點可以主動發(fā)起通信的特點,取消了輪詢機制,采用通信節(jié)點主動變?yōu)橹鞴?jié)點進行主從通信的方式,大大提高了通信的實時性。但是因為只有一條總線,當(dāng)多個主節(jié)點發(fā)起通信時,在總線上會發(fā)生通信擁堵,如何解決總線上的通信擁堵是實現(xiàn)多主訪問RS485總線技術(shù)的關(guān)鍵[11]。
文獻[12]提出將RS-485 總線接收器的輸出端反相后接到CPU 的外部中斷管腳,用觸發(fā)中斷的方式判斷總線上是否有數(shù)據(jù)傳輸,同時結(jié)合定時器中斷判斷總線是否空閑。但需要軟件定時器的配合,且對并發(fā)節(jié)點的處理只是簡單采取隨機延時后重發(fā),總線利用率不高。文獻[13]提出利用硬件電路實現(xiàn),具體的電路由兩個對稱RS485 總線接收器構(gòu)成,需要進行合適的阻抗匹配,兩個接收器的輸出相與后得到總線狀態(tài)信號。該方案電路復(fù)雜,容易引入故障點,且?guī)лd能力較弱,不能超過16個節(jié)點。文獻[14]提出利用74HC123 單穩(wěn)態(tài)觸發(fā)器形成總線狀態(tài)標(biāo)志,判定當(dāng)前總線是否為忙。該方案單穩(wěn)態(tài)時間設(shè)計比較依賴固定的通信波特率,缺乏對并發(fā)主節(jié)點的有效的處理方式,導(dǎo)致總線利用效率仍然不高。文獻[15]提出利用定時器進行總線偵聽,再對總線進行改造,使之具備邏輯“與”功能,配合具有優(yōu)先級的數(shù)據(jù)幀解決多節(jié)點并發(fā)問題。該方案相對優(yōu)秀,總線利用率較高但需要用到定時器資源。文獻[16]提出一種令牌環(huán)機制,主節(jié)點按一定順序進行通信,需要緊急通信的主節(jié)點在一定搶發(fā)時間內(nèi)爭搶總線,并發(fā)的主節(jié)點,按不同優(yōu)先級重復(fù)發(fā)送數(shù)據(jù),競爭總線。該方案適合規(guī)模小、數(shù)據(jù)量小的場合。
以上各方案都可以基本實現(xiàn)多主訪問的功能,但是都有各自的局限性,針對不同的場合都有各自的用處。針對現(xiàn)有的方案,本文提出了一種不占用軟件資源、帶載能力強、總線利用高的新型的可支持多主訪問的RS-485總線技術(shù)方案。
多主多從模式設(shè)有多個主節(jié)點,隨機發(fā)起通信的多個主節(jié)點容易在總線上出現(xiàn)通信擁擠。為了避免這種情況,主節(jié)點的主動通信需要合理規(guī)劃,有效化解沖突。為此,節(jié)點需要滿足兩點要求。第一,主節(jié)點只有在檢測到總線空閑的時候,才有權(quán)限向總線發(fā)送數(shù)據(jù),進行有效通信。第二,偵聽總線空閑雖然避免了主節(jié)點在總線忙時發(fā)送數(shù)據(jù)。但無法避免同時檢測總線空閑的主節(jié)點一起搶占總線,造成通信混亂。因此需要對多個并發(fā)的主節(jié)點進行仲裁,選中唯一可通信節(jié)點。
針對第一點,需要設(shè)計出偵聽總線空閑機制,通知主節(jié)點具備發(fā)送條件。針對第二點,需要設(shè)計出并發(fā)沖突節(jié)點競爭機制。
對偵聽總線空閑機制的設(shè)計,是抓主總線空閑的特征,即總線空閑時,總線信號不變;總線繁忙時,總線信號是變化的。因此可以根據(jù)這一特點,利用不同的技術(shù)手段和資源,根據(jù)需求設(shè)計總線空閑偵聽機制。
多個并發(fā)主節(jié)點在總線發(fā)生沖突時,會造成總線電平的不可預(yù)測混亂,導(dǎo)致節(jié)點接收的數(shù)據(jù)與發(fā)送端不一致。是否對發(fā)生沖突的總線規(guī)律化處理,沖突節(jié)點以何種方式再次發(fā)送是并發(fā)沖突節(jié)點競爭機制設(shè)計的關(guān)鍵問題。本文將偵聽總線空閑機制和并發(fā)沖突節(jié)點競爭機制合稱為沖突檢測機制。
工程技術(shù)方案的設(shè)計除了解決功能性要求外,還需要考慮軟硬件資源配置的問題。本文針對偵聽總線空閑機制和并發(fā)沖突節(jié)點競爭機制的關(guān)鍵問題,在只添加少量硬件資源,不占用軟件定時器資源的條件下,提出了可靠性高的沖突檢測硬件電路,再配合特定的發(fā)送數(shù)據(jù)格式,實現(xiàn)可支持多主訪問的RS-485總線通信方式。
常用485接口芯片的接口如圖1所示。該芯片可以將實現(xiàn)USRT 串口電平格式和RS485 總線的電平格式相互轉(zhuǎn)化。該芯片一共有8 個引腳其分別為接收數(shù)據(jù)輸出腳RO、接收控制腳RE、發(fā)送控制腳DE、發(fā)送數(shù)據(jù)輸入腳DI、接受數(shù)據(jù)輸出腳和一對總線接口引腳A、B 所構(gòu)成[17]。RS485 采用差分傳輸即通過AB 間的電壓差確定。發(fā)送控制腳DE 為低電平時,A、B 口為高阻態(tài);發(fā)送控制腳DE 高電平時,使能發(fā)送控制腳,令A(yù)、B 解除高阻態(tài)。對于接受數(shù)據(jù)控制腳也同理,不過控制邏輯相反。RS-485引腳詳細的功能真值表1所示。
表1 輸出真值表
圖1 RS-485接口
本文是利用485 芯片的AB 口高阻態(tài)特點,并配合少量的邏輯門電路,實現(xiàn)沖突檢測硬件電路,其結(jié)構(gòu)圖如圖2所示。對485接口芯片的數(shù)據(jù)接收控制腳位一直使能。
圖2 沖突檢測電路結(jié)構(gòu)
沖突檢測硬件電路的左邊接MUC,RS-485 為控制信號,TXD 為串口輸出,GATE 為沖突檢測信號。該沖突檢測的電路的原理是在當(dāng)總線發(fā)生沖突時,GATE 會出現(xiàn)低電平;當(dāng)總線空閑時,GATE會出現(xiàn)高電平。
輸入環(huán)節(jié)是由1個與非門構(gòu)成,如圖3所示。與非門的兩個輸入分別是RS485 控制信號和串口輸出TXD,與非門的輸出連接485 芯片的數(shù)據(jù)發(fā)送控制腳。串口輸出TXD 和485 接口芯片的數(shù)據(jù)發(fā)送腳DI 直連。輸入環(huán)節(jié)功能真值表如表2 所示。由表可知,輸入環(huán)節(jié)的特點是當(dāng)DIS_RS485 信號為邏輯“0”時實現(xiàn)485 通信;當(dāng)DIS_RS485 信號為邏輯“1”時可以令串口輸出的邏輯“1”,不是通過485 芯片的邏輯電平“1”的輸出,而是通過A、B 總線上的電阻來實現(xiàn)邏輯“1”的輸出。而當(dāng)有節(jié)點出現(xiàn)邏輯“0”時總線電平被拉低,變成邏輯“0”。這種輸出方式可以保證總線上多個節(jié)點通信,不會破壞總線電平標(biāo)準(zhǔn),有很強的帶載能力,且可以據(jù)此對節(jié)點進行優(yōu)先級設(shè)置。
表2 輸入環(huán)節(jié)功能真值表
圖3 輸入環(huán)節(jié)電路
當(dāng)總線上有兩個節(jié)點J1、J2 分別輸出USRT 串口格式字節(jié)0xFC 和0xEF 時,總線上收到的是0xEC。如圖4所示。
圖4 多節(jié)點總線沖突情況
輸出環(huán)節(jié)是由1 個非門和1 個與非門組成,輸出環(huán)節(jié)的電路如圖5所示。
圖5 輸出環(huán)節(jié)電路
輸出環(huán)節(jié)的輸入是串口輸出TXD 和485 接收數(shù)據(jù)輸出腳RO。輸出環(huán)節(jié)的作用是利用總線數(shù)據(jù)和節(jié)點自身的輸出判定總線是否忙,功能真值如表3 所示。由表可以看出輸出環(huán)節(jié)的功能是類同或門。因為輸入環(huán)節(jié)的存在中,在本電路中第二種情況不會發(fā)生。當(dāng)本節(jié)點收發(fā)邏輯電平不一致,即GATE為邏輯0時,說明當(dāng)前總線不空閑(僅識別GATE為1,不能說明總線空閑)。利用GATE電平的變化的規(guī)律,MUC 通過一定的軟件手段,可以判定總線是否為忙。
表3 輸出環(huán)節(jié)功能真值表
沖突檢測電路對傳統(tǒng)的485 總線和控制機制進行了改造。將傳統(tǒng)485 通信的邏輯“1”的電平輸出,改為高阻態(tài)偏置電壓輸出,實現(xiàn)了總線沖突時高電平保持,出現(xiàn)低電平拉低的規(guī)律化特征,并實現(xiàn)節(jié)點輸出數(shù)據(jù)和總線數(shù)據(jù)的硬件比較。
MUC 對沖突檢測電路的GATE 口進行檢測,只檢測到邏輯電平“1”時,授予節(jié)點通信權(quán)限;一旦檢測到邏輯電平“0”,該節(jié)點需要重新申請通信權(quán)限。
MUC 的一個外部中斷口接GATE 口,采用下降沿觸發(fā)或低電平觸發(fā)中斷,通過中斷對節(jié)點進行授權(quán)。
為了更好地偵聽總線是否空閑,且不影響總線通信,在發(fā)送數(shù)據(jù)引腳上額外增加上1 個發(fā)送控制電路如圖6 所示。利用1 個NPN 三極管,控制485 芯片的數(shù)據(jù)輸出控制腳,在偵聽總線時,SEND_DIS輸出高電平,拉低發(fā)送數(shù)據(jù)控制腳DE的電平,防止查詢總線幀對總線的影響。查詢總線幀是節(jié)點串口以總線485通信最低波特率的一半的查詢字節(jié)0xFF。因為串口發(fā)送字節(jié)時,存在一個低電平的起始位,所以查詢總線幀可以優(yōu)先檢測出,總線上是否有通信發(fā)生。若在發(fā)送查詢數(shù)據(jù)幀期間,GATE口出現(xiàn)低電平則說明系統(tǒng)忙,否則總線空閑。當(dāng)總線上在兩個字節(jié)波特率時間內(nèi)沒有字節(jié)發(fā)送時,說明不存在有效通信,所以可以認(rèn)定總線空閑。
圖6 發(fā)送控制電路
獲得發(fā)送權(quán)限的主節(jié)點按485 通信波特率發(fā)送優(yōu)先級數(shù)據(jù)幀,GATE 腳出現(xiàn)低電平的主機退出競爭,繼續(xù)進行偵聽總線,申請發(fā)送權(quán)限。同時發(fā)起通信的主節(jié)點按優(yōu)先級獲得發(fā)送權(quán)限。
優(yōu)先級和二進碼的換算關(guān)系如式(1)所示。
式中:n為優(yōu)先級數(shù);j為參與計算的bit-1 位數(shù);i為先發(fā)送比特位數(shù)(i=0,1,2,…,j),數(shù)字越小越早發(fā)送;ai為對應(yīng)比特位上的取值。
一個字節(jié)的高位5 位取相同位數(shù),只計算低3 位比特位,按右邊為低位先發(fā)設(shè)計的優(yōu)先級數(shù)據(jù)幀的形式如表4所示。
表4 計算3個比特位的地址碼
每個節(jié)點的狀態(tài)都是在偵聽總線態(tài),發(fā)送優(yōu)先幀態(tài),485態(tài)之間相互轉(zhuǎn)換。狀態(tài)轉(zhuǎn)化如圖7所示。
圖7 節(jié)點狀態(tài)轉(zhuǎn)化
本機制不需要用到定時器資源,硬件實現(xiàn)沖突檢測。
本本設(shè)計方案對主控芯片的要求偏向IO 口資源,而不占用定時器資源。這對一些對定時器資源有要求的節(jié)點事務(wù),且主控定時器資源少的主控有明顯的優(yōu)勢。例如像51 單片機這種低成本、定時器資源少的主控,一旦存在定時查詢事務(wù),定時器資源緊張的情況下,采用本方案就可以明顯緩解緊張資源。這為工程上提供了一種新的方案選擇。
對總線偵聽程序的設(shè)計重點是在總線空閑判斷和狀態(tài)轉(zhuǎn)換。總線空閑判斷要和各個狀態(tài)轉(zhuǎn)換相匹配。狀態(tài)轉(zhuǎn)換主要是沖突檢測電路進行功能配置和必要的數(shù)據(jù)幀配合。
節(jié)點的起始狀態(tài)為偵聽總線態(tài),默認(rèn)具有通信權(quán)限。當(dāng)節(jié)點有通信需求時,才會發(fā)送查詢總線幀。一般先配置沖突檢測電路功能令SEND_DIS=1,DIS_RS485=1,再開啟外部中斷,然后配置串口發(fā)送查詢總線幀。外部中斷的優(yōu)先級必須高于串口中斷的優(yōu)先級。在外部中斷函數(shù)中,對節(jié)點進行授權(quán)剝奪。在發(fā)送完查詢總線幀后且通信權(quán)限未被剝奪,節(jié)點進入發(fā)送優(yōu)先幀態(tài)。
進入發(fā)送優(yōu)先幀態(tài)的節(jié)點,也是先配置沖突檢測電路功能,令SEND_DIS=0,DIS_RS485=1。然后發(fā)送優(yōu)先級幀,發(fā)送完成后,再查詢節(jié)點通信權(quán)限。如果仍然具有發(fā)送權(quán)限,則進入485 通信態(tài),否則退回總線幀聽?wèi)B(tài),并恢復(fù)其通信權(quán)限,進行新一輪的總線查詢。
進入485 通信態(tài)的節(jié)點,配置相應(yīng)的沖突檢測電路功能即令SEND_DIS=0,DIS_RS485=0。進行485 通信,通信結(jié)束后可以關(guān)閉通信或者總線偵聽?wèi)B(tài),等待下一次通信需求的發(fā)起。程序設(shè)計的流程如圖8所示。
圖8 程序設(shè)計流程
本文通過MATLAB Simulink 平臺對方案進行邏輯驗證了。實驗平臺對485總線AB 總線進行了合理簡化,一個節(jié)點的電位模擬總線信號,具體接法見圖9。用1個受控的開關(guān)模擬高阻態(tài),開關(guān)的控制腳模擬485 芯片數(shù)據(jù)發(fā)送控制腳DE,開關(guān)斷開為高阻態(tài),開關(guān)閉合總線電平由受控電壓源決定,即正常485通信。沖突檢測電路的3個與非門用了自帶的模型。節(jié)點的主控master 的控制邏輯用MATLAB FUNCTION 函數(shù)進行模擬。Change 引腳為波特率切換信號。兩個方波的頻率模擬波特率,輸入master 模塊的baud 腳。Trig 腳模擬數(shù)據(jù)發(fā)送請求,高電平為請求數(shù)據(jù)發(fā)送,低電平無請求。Byte 腳輸入優(yōu)先級地址幀。Byte_485 模擬后續(xù)通信數(shù)據(jù)。其他腳和上文描述的意義相同。
圖9 多主訪問485總線方案
通過上述平臺以兩個主節(jié)點為例模擬本方案多節(jié)點錯時通信、多節(jié)點并發(fā)通信工況。
偵聽總線空閑通的模擬情況如圖10所示。由圖10可知當(dāng)節(jié)點J1 正在通信的時候,節(jié)點J2 發(fā)送了總線查詢幀,當(dāng)其遇到了J1通信過程中的低電平時,J2的GATE2腳迅速被拉低,并且重新發(fā)送總線查詢幀,并重復(fù)上述過程。一直到節(jié)點J1 完成通信后,節(jié)點J2 檢測總線空閑,才進入正常的通信。
圖10 多節(jié)點錯時通信
由圖11 可知節(jié)點J1 和節(jié)點J2 同時發(fā)起通信要求,同時監(jiān)聽到總線空閑,并發(fā)進入發(fā)送優(yōu)先幀態(tài)。由于節(jié)點J2的優(yōu)先級比J1高,節(jié)點J1首先發(fā)送的電平為高電平遇到節(jié)點J2 發(fā)送的低電平后,GATE1 電平被迅速拉低,節(jié)點J1 退出競爭,進入總線偵聽?wèi)B(tài),而節(jié)點J2 競爭成功,繼續(xù)通信。直到節(jié)點J2通信結(jié)束后,節(jié)點J1檢測到總線空閑,并獲得總線通信權(quán),開始正常通信。
圖11 多節(jié)點并發(fā)通信
從仿真結(jié)果可以看出當(dāng)存在節(jié)點發(fā)起通信請求兩個通信字節(jié)時間后,必定有節(jié)點進行有效通信,體現(xiàn)了本方案總線高利用率和穩(wěn)定性。
本文對多主訪問的RS-485總線技術(shù)進行了研究,針對總線空閑偵聽機制和多節(jié)點并發(fā)競爭機制兩個問題,提出了基于邏輯門的沖突檢測電路和相應(yīng)的軟件算法,并在MATLAB Simulink 搭建了方案模型,并進行不同工況的仿真。仿真結(jié)果證明了本方案的可行性。此外,本方案還具備以下優(yōu)點。
(1)在不采用定時器資源下,具備有高效的總線空閑偵聽機制,支持大規(guī)模節(jié)點的優(yōu)點,為定時器資源少的主控芯片,提供了新的多主訪問RS485總線技術(shù)方案。
(2)在節(jié)點發(fā)送數(shù)據(jù)過程中就自動完成了總線競爭而不被打斷,無需強化沖突,浪費總線資源,大大提高了總線利用率。
本文為擴展RS-485多主訪問總線技術(shù)的應(yīng)用做出了一定的貢獻。