賈海航,趙霞
(同濟大學 電子與信息工程學院,上海 201804)
摘要:RS485總線經常被用做主從系統各節點間的通信方式,系統中主從機的通信狀態是整個系統正常工作的前提。文章設計了一種基于RS485總線的從機故障檢測方法。首先根據需求設計了一套穩定的網絡通信協議和接口函數,并提出了一種基于RS485網絡通信協議的輪詢方法,可實現一個主機可靠、穩定地輪詢訪問多個從機。主機能夠檢測各個從機的通信狀況,并及時將從機通信故障信息上報到上位機。文章提出的在輪詢基礎上進行故障檢測的方法,大大提高了系統的實時性。
關鍵詞:RS485;輪詢;故障檢測
中圖分類號:TP29文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2017.07.001
引用格式:賈海航,趙霞.基于RS485總線的GSM-R從機故障檢測設計及實現[J].微型機與應用,2017,36(7):1-4,8.
0引言
圖1GSM-R鐵路無線數字通信系統隨著鐵路列車運行速度的不斷提升,通信系統對于鐵路的安全運行越來越重要。鐵路綜合數字移動通信系統(Global System for Mobile Communications-Railway,GSM-R)是一種基于當前世界最成熟、最通用的公共無線通信系統GSM平臺,專為滿足鐵路應用而設計開發的無線數字通信系統[1]。圖1為GSM-R鐵路無線數字通信系統結構示意圖,該系統包括遠端機和近端機兩部分。近端機由時間分布控制單元 (Time Distributed Master Unit,TDMU)及射頻模塊組成,遠端機由射頻拉遠單元(Radio Remote Unit,RRU)和射頻模塊組成。TDMU和RRU不僅需要獲取各自射頻模塊的實時信息,以了解各個射頻模塊的運行狀態,同時還需將各個射頻模塊的故障信息及時上報到上位機,使射頻模塊得到及時的維護。因此,TDMU和RRU與各自的射頻模塊之間穩定可靠的通信是非常重要的。
常用的串口通信方式包括RS232和RS485。RS232串行通信總線屬于全雙工工作方式,數據的收發可以同時進行,但傳輸距離短,且只適合點對點的通信方式。RS485串行通信總線采用半雙工工作方式,數據的收發不能同時進行,任何時刻只能有一個主機處于主動發送狀態,其他所有從機處于被動接收狀態,非常適用于一主多從的通信要求[2]。RS485作為一種構造簡單、技術成熟、傳輸距離遠的通信方式,得到了廣泛的應用。
在本系統中,要求TDMU和RRU可以主動訪問射頻模塊,而射頻模塊只能被動接收并響應。根據上述需求,采用RS485串行總線作為TDMU和RRU訪問射頻模塊的通信方式。將TDMU和RRU作為主機,射頻模塊作為從機,構成RS485主從通信系統。上位機通過TDMU來監控整個系統。
在一些相關文獻中關于RS485總線通信方式的設計都只提到了RS485輪詢過程的實現,但均未考慮從機故障的處理問題。本文針對在輪詢過程中的從機故障檢測問題,提出了RS485總線輪詢與從機故障檢測相結合的實現方法。在本文的設計中,主機通過RS485總線輪詢各個從機,獲取從機信息,同時實時檢測從機故障狀態。
1RS485通信協議和接口函數的設計
1.1通信協議
RS485接口標準通信協議需要用戶自己根據實際情況而設計[3]。設計一套結構簡單、功能完備,并且盡量標準化的通信協議是RS485通信最基本的通信要求。
RS485通信協議的設計主要包括物理層和數據鏈路層[4]。本文使用的VxWorks操作系統通過串口驅動程序已經實現了物理層的所有功能[5]。只需調用操作系統提供的發送和接收函數就可以實現數據通信。本文設計的RS485總線通信協議主要完成數據鏈路層的功能。
數據鏈路層的通信協議[5 6]包括開始結束標志、設備的類型及地址、數據校驗等。設置一個開始、結束標志來表明每一段數據幀的開頭和結尾。設置一個標志來標識數據幀是請求數據幀還是應答數據幀。用設備類型和設備地址兩個標志位來區分不同的從機。數據校驗位用來保證數據幀的正確性。除上述單元,通信協議還應包括命令標識、數據長度等。
根據以上描述,設計的通信協議如圖2所示。
開始標志、結束標志:表示一幀數據的開始和結束,本文均用0x7f表示。
設備類型:本文中用0x01表示功放,用0x02表示低噪放。
設備地址:對于同一種從機類型,用設備地址區分不同設備類型下的不同從機。例如:對于4個功放(設備類型為0x01),設備地址分別為0x00、0x01、0x02、0x03。
命令標識:表示主機對從機發送的命令類型。
響應標識:主機主動向從機發送數據用0xff表示,從機被動響應主機用0x00來表示。
數據長度:表示具體數據的長度。
數據校驗:為保證數據傳輸的正確性和完整性,本文采用CRC校驗碼。CRC校驗碼具有唯一性。若發送端與接收端的校驗碼不一致,則表明數據幀的傳輸有誤[7]。
1.2接口函數
數據鏈路層需為高層提供統一的RS485接口函數,而接口函數的設計需要按照上述的網絡通信協議組包,調用底層串口驅動將數據發送到目的從機并等待接收響應消息。對接收到的數據解析,若此響應數據完整無誤,則將需要的數據從中解析出來。在接口函數的設計中需要考慮數據幀的轉義、數據幀發送和接收、接口函數的保護三方面的內容。
(1)在數據接收端,若具體數據中出現0x7f的數據,在接收端就會影響對完整一幀數據的判斷。因此,在數據發送端要對發送數據進行轉義處理。本文的方法是用0x5f和0x7d兩個字節的數據來代替0x7f,用0x5f和0x5d兩個字節的數據來代替0x5f;在數據接收端進行反轉義處理,與轉義處理相反。
(2)接口函數中最重要的就是數據的發送和接收,本文使用的VxWorks操作系統已經完成了底層RS485串口的配置,只需要調用操作系統提供的發送和接收函數就可以實現數據通信。數據的發送函數Tx485就是將組包好的數據發送到RS485總線上。RS485接收任務一直監聽總線上的數據,通過監聽數據幀中的開始和結束標志來接收一條完整的RS485數據。將一幀完整數據發送到消息隊列,msgQReceive則從消息隊列中接收數據。RS485接口函數如下:
STATUS Port485Send (……)
{
semTake(sem485RdDone,WAIT_FOREVER);
//根據自定義的數據結構進行組包
……;
//進行轉義處理
Escape(SendBuf,OutBuf);
//發送數據
Tx485(OutBuf);
//接收響應數據
msgQReceive (Rx485QId, (char *)RespBuf, LEN_MAX , timeout);
//處理響應數據
Port485_Handle(RespBuf, MsgLen);
semGive(sem485RdDone);
return OK;
}
(3)在RS485總線通信中,同一時刻,只能有一個主機處于發送狀態,其他所有從機處于被動接收狀態,并且從機之間不能相互通信,否則將會引起總線沖突,無法正常工作[7]。RS485總線屬于半雙工的通信方式,數據的收發不能同時進行,數據的發送必須等到上一次數據接收完成之后才能進行。為了滿足上述RS485總線通信的特點,本文需要對RS485接口函數進行保護。
①RS485是一主多從的串行總線,每一時刻只能有一個主機發送數據,也即每一時刻RS485接口函數只能被調用一次。為了防止接口函數被同時調用,在接口函數中增加了信號量的保護。主機在調用接口函數時,必須首先獲取信號量。如果沒能獲取信號量,說明此刻有其他任務在調用接口函數。主機必須等到發送數據結束釋放信號量后,才能獲取信號量,調用接口函數來發送數據。
②RS485通信屬于半雙工的通信方式,數據的收發不能同時進行。在實際的需求中,除了主機不斷輪詢從機之外,上位機也會通過主機向目標從機發送一些查詢從機數據或配置從機參數的數據幀。主機的輪詢是一直進行的,而上位機下發的數據幀是隨機的。為了避免輪詢數據和上位機下發的數據幀在485總線上沖突,本文設置一個全局變量作為主機輪詢的開關。在上位機下發RS485數據幀時,關閉輪詢開關,主機輪詢從機暫時停止。當目標從機響應了上位機之后,打開輪詢開關,主機繼續輪詢從機。
2基于輪詢機制的從機故障檢測的設計
2.1從機故障檢測的流程
圖3是基于輪詢機制的從機故障檢測的設計流程圖。主機每隔800 ms調用一次RS485接口函數輪詢從機設備。若800 ms內未收到從機的響應,則認為此從機通信異常。若連續異常次數達到上限,則主機需要將此從機通信故障信息上報到上位機。
2.2從機故障檢測的實現
為了實現主機在輪詢從機過程中檢測從機通信狀況,本文將輪詢機制嵌套于故障檢測任務中。從機故障檢測任務包括輪詢時間間隔的設計、故障上報設計、輪詢過程中的從機故障檢測設計。其中,輪詢過程中的從機故障檢測是本文的重點。
(1)輪詢時間間隔的設計。通過看門狗定時器和信號量來實現800 ms的主機輪詢從機的時間間隔。在一個800 ms的看門狗定時器中,每隔800 ms釋放一次信號量。
(2)故障上報設計。在故障檢測任務中,Rs485AlmReport是根據當前狀態和同步狀態進行故障上報的函數。當前狀態表示從機當前的狀態,而同步狀態表示從機的歷史狀態。若某一從機的當前狀態是故障狀態,同步狀態是正常狀態,則主機就會向上位機上報此從機故障。故障檢測任務部分代碼如下:
LOCAL void Rs485AlarmManTask(void)
{
wdStart(TimerId, (int) Timer, (FUNCPTR) Rs485TimerFun, 0); //輪詢時間間隔
While(1){
semTake(semAlmSampleT, WAIT_FOREVER) ;
if(RS485UseSwitch == 0){
Rs485AlmCheck( );}//從機故障檢測
Rs485AlmReport( );}//故障上報
}
(3)輪詢過程中的從機故障檢測設計。在故障檢測任務中,Rs485AlmCheck函數調用RS485接口訪問從機設備。為了便于管理所有從機設備,建立如下從機設備信息的數據結構:
typedef struct alarm_info{
UINT8 AlmIndex;/* index of the device */
UINT8 AlarmEna;/* device enable */
UINT8 CurAlmState;/* current alarm state */
UINT8 SyncAlmState;/* synced alarm state */
UINT8(*CommChk) (void); /*detect function */
UINT8 AlmRaiseCnt;/* device raise counter */
UINT8 AlmIdleCnt;/* device clear counter */
} ALARM_INFO;
從機設備信息包括從機序列號、故障檢測使能、當前狀態、同步狀態、故障檢測函數(輪詢函數)、故障統計、正常統計等。根據從機設備信息數據結構建立ALARM_INFO Rs485Devices[MAX_DEV_NUM]所有從機的信息。每隔800 ms執行一次從機故障檢測函數,并統計故障的次數。若故障次數達到上限,則等待Rs485AlmReport故障上報函數將信息上報到上位機。
3故障檢測的優化及結果
在實際情況中,一次從機通信異常不能認為此從機通信故障。在本文中,規定某從機連續4次通信異常,才能認為此從機通信故障。當從機數量較多時,若某一從機通信故障,主機需要將所有的從機設備輪詢4次后,才能將從機通信故障檢測出來并上報到上位機。在這種情況下,主機不能及時將從機通信故障上報到上位機,造成上位機獲取從機通信狀況非常滯后,系統實時性較差。主機為了能夠及時將從機發生故障上報到上位機,在輪詢下一設備前需做如下判定條件:當主機訪問某一從機時,如果從機通信異常,則繼續訪問此從機,而不是訪問下一個從機設備;當連續4次通信異常,主機將此從機的當前狀態改為故障狀態,繼續訪問下一個從機設備。輪詢條件代碼如下:
void Rs485AlmCheck(void)
{
//保持不變
……
//輪詢條件
if(TmpState==Rs485Devices[DevOrder].CurAlmState)
DevOrder+=1;
}
在從機故障檢測函數中,如果實際狀態與當前狀態一致,表明主機已將從機的實際狀態反饋到從機的當前狀態,則繼續輪詢下一個從機設備。
為了說明基于輪詢的從機故障檢測的輪詢條件的優化效果,作如下假設:某一主機下共有7個從機,最壞的情況下,這7個從機同時發生了通信故障。在不加輪詢條件的從機故障檢測中,檢測出第一個從機故障需要0.8×7×3+0.8=17.6 s,在加上輪詢條件后的從機故障檢測中,檢測出第一個從機故障需要0.8×4=3.2 s。如圖4是在7個從機同時故障的情況下,加上輪詢條件前后,主機檢測出這7個從機故障所需要的時間對比。加上輪詢條件后的檢測方法大大減少了從機故障檢測所需的時間。
4結論
基于RS485總線的通信協議和接口函數的設計保證了主機穩定可靠地訪問從機。從機故障檢測的輪詢機制一方面可以不斷地獲取各個從機的設備信息,另一方面可以檢測從機通信故障。但是,當從機數量較多時,輪詢周期就會變長,從機的通信故障不能被及時檢測出來,系統實時性變差。加上了輪詢條件優化后的輪詢機制相比傳統的輪詢機制,實現了快速檢測從機通信故障。上位機可以及時獲取各個從機的通信狀況,提高了系統的實時性。
參考文獻
[1] 胡威.基于GSM-R的列車無線定位方法探索 [J].鐵路通信信號工程技術,2016,13(5):21-23.
[2] 胡文濤. 一種基于協議的提高RS485實時性的方法 [J].現代電子技術,2013,36(18):10-12.
[3] 周鵬,李艷艷. 提高RS485總線主從通信效率的軟件設計[J].單片機與嵌入式系統應用,2008,8(8):70-73.