季 霆
(合肥工業(yè)大學(xué) 機(jī)械與汽車工程學(xué)院,合肥 230009)
FlexRay總線作為下一代汽車內(nèi)部的主干網(wǎng)絡(luò),其良好的性能尤其是高速、精確和容錯(cuò)的特點(diǎn),能夠滿足未來汽車高速控制應(yīng)用的需要[1-3]。FlexRay總線精確的時(shí)鐘基準(zhǔn)是其可靠運(yùn)行的關(guān)鍵因素之一,而網(wǎng)絡(luò)中的時(shí)鐘同步是總線時(shí)基精確的重要保證,因此研究FlexRay時(shí)鐘同步問題具有重要的現(xiàn)實(shí)意義。
文獻(xiàn)[4]提出了一種基于分析模式的FlexRay時(shí)鐘同步算法,可以不通過測(cè)量而直接通過計(jì)算得出任意兩個(gè)節(jié)點(diǎn)之間的時(shí)鐘偏差。文獻(xiàn)[5]對(duì)FlexRay總線時(shí)鐘同步進(jìn)行了分析,建立了同步算法數(shù)學(xué)模型,理論上說明了FlexRay時(shí)鐘同步具有較強(qiáng)的容錯(cuò)性和適用性。文獻(xiàn)[6]指出FlexRay時(shí)鐘同步所用容錯(cuò)中值(Fault-tolerant midpoint,F(xiàn)TM)算法每輪對(duì)網(wǎng)絡(luò)修正后存在±ε(ε為傳送延時(shí))漂移。
FlexRay協(xié)議要求網(wǎng)絡(luò)中至少包含3個(gè)同步節(jié)點(diǎn)進(jìn)行時(shí)鐘同步,上述文獻(xiàn)都是建立在這個(gè)基礎(chǔ)上進(jìn)行討論的。當(dāng)節(jié)點(diǎn)數(shù)目較少時(shí),這種限制將對(duì)網(wǎng)絡(luò)的性能產(chǎn)生影響。針對(duì)這種情況,文獻(xiàn) [7]結(jié)合IEEE 1588提出了一種同步節(jié)點(diǎn)數(shù)目少于3個(gè)的同步方法,但是沒有解決同步過程中的同步節(jié)點(diǎn)容錯(cuò)問題。一旦同步節(jié)點(diǎn)出現(xiàn)故障,整個(gè)網(wǎng)絡(luò)將無法正常工作,造成消息的延誤[8]。
本文在上述研究的基礎(chǔ)上,提出了一種FlexRay的單節(jié)點(diǎn)容錯(cuò)同步算法。該方法只需要一個(gè)同步節(jié)點(diǎn)并且無需額外的硬件支持,即可在保證FlexRay安全性和可靠性的前提下完成時(shí)鐘同步。
FlexRay總線協(xié)議中,簇內(nèi)所有的節(jié)點(diǎn)都應(yīng)有相同的“時(shí)間觀”,遵守一個(gè)標(biāo)準(zhǔn)的全局時(shí)間。但是這并不意味著節(jié)點(diǎn)間具有完全嚴(yán)格的同步時(shí)間,只要節(jié)點(diǎn)間的時(shí)間差保持在允許的誤差范圍內(nèi)即可。在一個(gè)通訊周期內(nèi)分為4個(gè)時(shí)間層次,從最低層到最高層分別依次為:最小時(shí)間節(jié)拍層、最大時(shí)間節(jié)拍層、仲裁網(wǎng)格層和通訊周期層。
時(shí)鐘同步過程設(shè)置三種模式:(1)備用模式(STANDBY),(2)非同步模式(NOSYNC),(3)同步模式(SYNC)。在STANDBY模式中時(shí)鐘同步過程被停止,在NOSYNC模式中節(jié)點(diǎn)執(zhí)行時(shí)鐘同步但不發(fā)送同步消息,在SYNC模式中節(jié)點(diǎn)發(fā)送同步消息并執(zhí)行時(shí)鐘同步[9]。
FlexRay協(xié)議中節(jié)點(diǎn)在靜態(tài)段完成同步測(cè)量,以獲得各節(jié)點(diǎn)的時(shí)間偏差值,運(yùn)用FTM算法[9]對(duì)每一組時(shí)間偏差值進(jìn)行處理,所獲得的值即為時(shí)鐘同步算法的校正值。FlexRay同步機(jī)制運(yùn)用兩種類型的校正:相位校正和速率校正。相位校正值是各非同步節(jié)點(diǎn)與同步節(jié)點(diǎn)的時(shí)間偏差值,每周期進(jìn)行計(jì)算并在奇數(shù)周期末尾完成校正。速率校正值是兩個(gè)連續(xù)周期同一節(jié)點(diǎn)同一時(shí)刻的時(shí)間偏差值,偏差的計(jì)算結(jié)果在每個(gè)奇數(shù)周期完成計(jì)算,在下一個(gè)周期開始時(shí)生效,在最大時(shí)間節(jié)拍形成過程中實(shí)行。
為了計(jì)算同步幀發(fā)送節(jié)點(diǎn)與同步幀接收節(jié)點(diǎn)之間的時(shí)間偏差,就必須分別測(cè)量同步幀發(fā)送端和同步幀接收端的觸發(fā)點(diǎn)時(shí)刻。但是由于傳輸起始序列截?cái)嘤绊?,同步幀接收?jié)點(diǎn)接收到傳輸起始序列1/0跳變沿的時(shí)間并不是同步幀接收節(jié)點(diǎn)的觸發(fā)點(diǎn)時(shí)刻。因此在FlexRay總線協(xié)議中需要測(cè)量首個(gè)字節(jié)起始序列中的1/0跳變沿,用該時(shí)刻減去解碼修正量和延時(shí)補(bǔ)償量倒推得到接收端傳輸起始序列的開始時(shí)刻。解碼修正量中包含傳輸起始序列、幀起始序列和字節(jié)起始序列,延時(shí)補(bǔ)償量中包含有收發(fā)器延遲、星型耦合器延遲和電纜長度的傳輸延遲[10]。
圖1為時(shí)間偏差值測(cè)量過程,其中點(diǎn) a表示發(fā)送端靜態(tài)時(shí)間槽行動(dòng)點(diǎn),即發(fā)送端開始發(fā)送幀的時(shí)刻;點(diǎn)b表示第二時(shí)間參考點(diǎn),位于首個(gè)字節(jié)起始序列的第二位頻閃點(diǎn);點(diǎn)c表示主時(shí)間參考點(diǎn),由第二時(shí)間參考點(diǎn)減去解碼修正量和延時(shí)補(bǔ)償量得來;pDecodingCorrection為解碼修正量,pDelayCompensation為延時(shí)補(bǔ)償量,TSS為傳輸起始序列,F(xiàn)SS為幀起始序列,BSS為字節(jié)起始序列。由圖1可知,點(diǎn)c與點(diǎn)a之間的差值為同步幀發(fā)送節(jié)點(diǎn)與同步幀接收節(jié)點(diǎn)之間的時(shí)間差(時(shí)鐘偏差值)。
針對(duì)FlexRay協(xié)議中同步節(jié)點(diǎn)數(shù)目不能小于三個(gè)的情況,本文采用單節(jié)點(diǎn)容錯(cuò)算法來實(shí)現(xiàn)時(shí)鐘同步,為了解決單節(jié)點(diǎn)失效的問題,在時(shí)鐘同步過程中增加一個(gè)同步節(jié)點(diǎn)優(yōu)先級(jí)表。表的結(jié)構(gòu)見表1,其中NODE_ID為節(jié)點(diǎn)的ID號(hào),值越小優(yōu)先級(jí)越高;NODE_NM為節(jié)點(diǎn)的名稱;MES_ID為該節(jié)點(diǎn)發(fā)送同步消息所在的靜態(tài)時(shí)間槽的ID;NODE_STA為節(jié)點(diǎn)狀態(tài)標(biāo)志,表示該節(jié)點(diǎn)是否失效。
表1 同步節(jié)點(diǎn)優(yōu)先級(jí)表
在網(wǎng)絡(luò)啟動(dòng)或者有新節(jié)點(diǎn)加入網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)中各節(jié)點(diǎn)根據(jù)其他節(jié)點(diǎn)提供的信息建立或者更新自身的同步節(jié)點(diǎn)優(yōu)先級(jí)表。當(dāng)前同步節(jié)點(diǎn)失效時(shí),根據(jù)此表優(yōu)先級(jí)與其他節(jié)點(diǎn)協(xié)商決定同步節(jié)點(diǎn)。
在FlexRay協(xié)議中,各非同步節(jié)點(diǎn)在觸發(fā)點(diǎn)接收同步消息,在超過觸發(fā)點(diǎn)偏移量之后仍然沒有收到同步報(bào)文,就認(rèn)為該同步節(jié)點(diǎn)發(fā)生了故障,本文亦采用該方法判斷節(jié)點(diǎn)是否發(fā)生故障。如果故障發(fā)生次數(shù)達(dá)到設(shè)定值,則認(rèn)為該同步節(jié)點(diǎn)失效,在同步節(jié)點(diǎn)優(yōu)先級(jí)表中選擇優(yōu)先級(jí)最高的節(jié)點(diǎn)替代同步節(jié)點(diǎn),在周期動(dòng)態(tài)段部分發(fā)出選擇消息(Vote)。各節(jié)點(diǎn)收到 Vote消息后,掃描信息表,若與己選同步節(jié)點(diǎn)相同,發(fā)送確認(rèn)消息,啟動(dòng)候選同步節(jié)點(diǎn)。
FlexRay協(xié)議中為了測(cè)量同步節(jié)點(diǎn)和非同步節(jié)點(diǎn)之間的偏差,需要測(cè)量第二時(shí)間參考點(diǎn)并計(jì)算解碼修正量和延時(shí)補(bǔ)償量的值,這樣不僅增加了計(jì)算開銷,還增大了誤差。為了減小開銷和誤差,本文基于文獻(xiàn)[11]的方法來計(jì)算時(shí)間偏差值,圖2為相應(yīng)的通信過程。同步節(jié)點(diǎn)在T1時(shí)刻發(fā)送Sync消息,同步節(jié)點(diǎn)和非同步節(jié)點(diǎn)接收端分別測(cè)量接收到該報(bào)文的第二時(shí)間參考點(diǎn)時(shí)刻,分別記為T2和T3,同步節(jié)點(diǎn)在T4時(shí)刻發(fā)送一個(gè)包含時(shí)間戳T2的Follow_up消息。
本文時(shí)間偏差值計(jì)算過程中采用如下假設(shè)[7,11]:
(1)幀到達(dá)各節(jié)點(diǎn)的延時(shí)是定值,即網(wǎng)絡(luò)必須是廣播型網(wǎng)絡(luò),延遲時(shí)間可以接近于0,或是一個(gè)常值。
(2)節(jié)點(diǎn)接收器能夠接收到該節(jié)點(diǎn)發(fā)送器發(fā)送的幀。
設(shè)Toffset為時(shí)間偏差,單位為最小時(shí)間片個(gè)數(shù),該值可以為正也可以為負(fù);Lmaxoffset為時(shí)間偏差允許上限,根據(jù)情況預(yù)先設(shè)置;u為解碼修正量,ν為延時(shí)補(bǔ)償量。那么,可以得到同步節(jié)點(diǎn)和非同步節(jié)點(diǎn)之間的等式:
由于同步節(jié)點(diǎn)的發(fā)送端和接收端在同一節(jié)點(diǎn)上,認(rèn)為它們之間的偏差為0,那么可以得到同步節(jié)點(diǎn)發(fā)送端和接收端的等式:
由假設(shè)(1)可知式,(1)(2)中解碼修正量和延時(shí)補(bǔ)償量的值相等,即 u1=u2,ν1=ν2,因而由(2)和(1)可得:
式(3)中的Toffset就是同步節(jié)點(diǎn)與非同步節(jié)點(diǎn)的時(shí)間偏差值,因此由T3和T2即可得到Toffset,而T3和T2可以從Sync消息和Follow_up消息中獲取。
基于上述機(jī)制的單節(jié)點(diǎn)容錯(cuò)算法,算法流程圖如圖3所示,具體步驟如下:
步驟1:初始化FlexRay網(wǎng)絡(luò)中各節(jié)點(diǎn)控制器和寄存器,錯(cuò)誤計(jì)數(shù)器M清零。根據(jù)在同步節(jié)點(diǎn)優(yōu)先級(jí)表中預(yù)先的設(shè)置,將表中優(yōu)先級(jí)最高的節(jié)點(diǎn)設(shè)為同步模式,其他節(jié)點(diǎn)設(shè)為非同步模式。
步驟 2:在第 i(i≤63)個(gè)通信,同步節(jié)點(diǎn)向總線上各節(jié)點(diǎn)發(fā)送Sync消息。
步驟3:各節(jié)點(diǎn)(包括同步節(jié)點(diǎn))接收到Sync消息,并記錄各自的接收時(shí)刻。
步驟4:同步節(jié)點(diǎn)向各節(jié)點(diǎn)發(fā)送一個(gè)Follow_up消息,非同步節(jié)點(diǎn)通過公式(3)可以計(jì)算各節(jié)點(diǎn)本地時(shí)鐘的偏差 Toffset,當(dāng)∣Toffset∣>Lmaxoffset時(shí),啟動(dòng)錯(cuò)誤計(jì)數(shù)器令 M=M+1,令 Toffset=Lmaxoffset。
步驟5:因?yàn)榫W(wǎng)絡(luò)可能出現(xiàn)錯(cuò)誤,造成部分Sync消息不能被所有節(jié)點(diǎn)成功接收。如果節(jié)點(diǎn)超過觸發(fā)點(diǎn)偏移量仍然沒有收到Sync消息,啟動(dòng)錯(cuò)誤計(jì)數(shù)器令 M=M+1,同時(shí)令 Toffset=Lmaxoffset。
步驟6:若某節(jié)點(diǎn)錯(cuò)誤計(jì)數(shù) M≥3則判定同步節(jié)點(diǎn)失效,掃描數(shù)據(jù)表選擇下一順序節(jié)點(diǎn)為候選同步節(jié)點(diǎn),并在動(dòng)態(tài)段中發(fā)送廣播選擇消息(Vote)。
步驟7:各節(jié)點(diǎn)收到 Vote消息后掃描信息表,若與已選同步節(jié)點(diǎn)相同,則在動(dòng)態(tài)段中發(fā)送確認(rèn)消息。Vote消息的發(fā)送節(jié)點(diǎn)收到確認(rèn)后,將原同步節(jié)點(diǎn)的模式改為備用模式,所選同步節(jié)點(diǎn)的模式改為同步模式,各節(jié)點(diǎn)錯(cuò)誤計(jì)數(shù)器清零。若規(guī)定時(shí)間內(nèi)未收到確認(rèn)消息,判定該非同步節(jié)點(diǎn)故障,原同步節(jié)點(diǎn)繼續(xù)運(yùn)行,錯(cuò)誤計(jì)數(shù)器清零。
步驟8:若該周期結(jié)束,則i=i+1。如果i≤63,則返回步驟2,否則返回步驟1。
圖4a中表示了一個(gè)周期內(nèi)上述時(shí)鐘同步的過程。在一個(gè)周期靜態(tài)段內(nèi),同步節(jié)點(diǎn)在發(fā)送Sync消息和Follow_up消息后預(yù)留了兩個(gè)靜態(tài)時(shí)間片,在第五個(gè)靜態(tài)時(shí)間片開始發(fā)送普通數(shù)據(jù)幀。圖4b中表示了FlexRay協(xié)議時(shí)鐘同步過程,四個(gè)同步節(jié)點(diǎn)分別發(fā)送四個(gè)Sync消息之后,在第五個(gè)靜態(tài)時(shí)間片開始發(fā)送普通數(shù)據(jù)幀。從圖4可以看出,在保證相同可靠性的前提下,本文所提同步算法不影響靜態(tài)段的長度以及周期長度。而且本文同步算法不需計(jì)算解碼修正量和延時(shí)補(bǔ)償量就可以直接計(jì)算時(shí)間偏差值,精簡了測(cè)量步驟同時(shí)也減少了由于計(jì)算解碼修正量和延時(shí)補(bǔ)償量值而造成的誤差。
本文利用CANoe和DaVinci Network Designer軟件對(duì)本文所提單節(jié)點(diǎn)容錯(cuò)同步算法進(jìn)行仿真實(shí)驗(yàn)。
實(shí)驗(yàn)中選取4個(gè)節(jié)點(diǎn),記為ECU_1、ECU_2、E CU_3和ECU_4,每個(gè)節(jié)點(diǎn)均有兩組工作消息需要發(fā)送。在單節(jié)點(diǎn)容錯(cuò)同步算法中,考慮容錯(cuò)需要,令ECU_1為初始同步節(jié)點(diǎn),ECU_2為候選同步節(jié)點(diǎn);在FlexRay協(xié)議原有同步算法中,ECU_1、ECU_2和ECU_3為同步節(jié)點(diǎn)。在DaVinci Network Designer軟件中完成FlexRay數(shù)據(jù)庫建立,并在CANoe軟件中建立仿真系統(tǒng),如圖5所示。
在正常通信過程中,當(dāng)初始同步節(jié)點(diǎn)ECU_1斷開,候選同步節(jié)點(diǎn)ECU_2能夠代替ECU_1成為下一同步節(jié)點(diǎn),圖6為上述過程的trace圖。
本文在對(duì)FlexRay協(xié)議時(shí)鐘同步算法研究的基礎(chǔ)上,提出了FlexRay總線的單節(jié)點(diǎn)容錯(cuò)同步算法,只需要1個(gè)同步節(jié)點(diǎn)即可完成時(shí)鐘同步,減少了時(shí)鐘同步的測(cè)量步驟和計(jì)算量。該算法引入同步節(jié)點(diǎn)優(yōu)先級(jí)表,在同步節(jié)點(diǎn)出現(xiàn)故障的情況下,可以根據(jù)同步節(jié)點(diǎn)優(yōu)先級(jí)表選擇新的同步節(jié)點(diǎn)。最后在CANoe中進(jìn)行仿真,結(jié)果表明該算法可以在保證安全可靠的前提完成通信,并提高同步精度。
[1]羅峰,陳智琦,劉矗,等.基于FlexRay的車載網(wǎng)絡(luò)系統(tǒng)開發(fā)[J].電子測(cè)量與儀器學(xué) 2009(增刊 1):289-295.
[2]顧嫣,張鳳登.FlexRay動(dòng)態(tài)段優(yōu)化調(diào)度算法研究[J].自動(dòng)化儀表,2009,30(12):25-29.
[3]周躍鋼.基于LabVIEW和J1939協(xié)議的CAN總線通訊平臺(tái)構(gòu)建[J].汽車科技,2011,06:18-22.
[4]Jan Sobotka,Jiri Novak,Jan Malinsky.Analytic Model of FlexRay Synchronization Mechanism [J].The 6th IEEE In ternational Conference on Intelligent Data Acquisition and Advanced Computing Systems,2011:969-974.
[5]陳濤,秦貴和.FlexRay時(shí)鐘同步分析[J].計(jì)算機(jī)工程,2010,14(36):235-237.
[6]Bruno Dutertr.the Welch Lynch Clock Synchronization Algorithm[R].1998,5.
[7]Jin Ho Kim,Suk Hyung Seo,Jung Hoon Chun,Jae Wook Jeon.Distributed Clock Synchronization Algorithm for Industrial Networks[J].The 8th IEEE International Workshop on Factory Communication Systems.2003.
[8]J.H.Kim,S.H.Seo,T.Y.Moon,K.H.Kwon,J.W.Jeon,S.H.Hwang.A method of Task Synchronization in a distributed system using FlexRay[J].The IEEE Interational Conference on In-dustrial Informatics,2008:1149-1153.
[9]FlexRay Consortium.FlexRay Communications System Protocol Specfication [S].2005(12).
[10]楊福宇.FlexRay時(shí)鐘同步的同向漂移[J].單片機(jī)與嵌入式應(yīng)用,2011,4:3-6.
[11]張利,李縣軍,王躍飛.汽車CAN網(wǎng)絡(luò)時(shí)鐘同步方法研究[J].電子測(cè)量與儀器學(xué)報(bào),2011,25(2):147-152.