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