CAN消極報錯發送節點變為離線狀態的故障
只要有掛起待發的消息,此錯就重復發生。由于發送節點的地位未變,它的TEC就一直加上去,直到TEC≥256,節點成為真正的離線狀態。這不是本文第1節所說的等同離線狀態。在離線狀態下,如果能從總線上讀到128次連續的11位隱位,它就可以恢復為主動報錯狀態。總線上不足11位的隱位將不被計入。因此,這種離線狀態一般要長于參考文獻[1]所說的等同離線狀態。為了作比較,假定幀長均為含2字節數據的幀(66位),在掛起的消息傳送16次后,該處于消極報錯狀態的發送節點成為離線,即16×(66+3)=1 104位后離線;又假設最壞情況下有分散的10位空閑,那么節點處于離線的時間為128×(66+3+10)=10112位。該處于消極報錯狀態的發送節點發現一個本地錯后,將有11 216位的時間不能正常收發。同樣情況下,一個處于消極報錯狀態的接收節點發現一個本地錯后在第一次遇到足夠空閑時間時,其等同離線狀態就會結束。
這種處于消極報錯狀態的發送節點變為真正離線的過程是無法從高層加以干預的,因為發送節點/接收節點的地位不是一個軟件可控制的參數。
3 為什么需要消極報錯狀態
理論上,解決這一故障有三種可能的方案:第一種方案是,將消極報錯幀分界符長度按一定的規則改變,使處于消極報錯狀態的節點發現一個錯后總能與其他節點幀啟停保持同步。在本文討論的處于消極報錯狀態的發送節點變為離線狀態的例子中,僅僅改變判斷發送節點/接收節點的規則也是不夠的,因為它僅能把可能的真正離線變為等同離線。所以隨情況改變,消極報錯幀分界符長度仍然是需要的。這一方案對應用的改動最小,僅CAN通信控制器芯片要修改。第二種方案是采用某種形式的CAN時間觸發CAN協議,預留出一些總線空閑時間,使處于消極報錯狀態的節點發現一個本地錯后仍能與其他節點幀啟停同步;但是迄今為止討論的CAN時間觸發協議都缺少足夠的糾錯能力,它們都禁止CAN的出錯自動重發機制,在出錯后會導致數據的丟失。第三種可能的解決方案是,放棄消極報錯狀態,沒了消極報錯狀態就沒了消極報錯幀,就不會有不同步的情況出現,也就不會有離線和等同離線的情況出現。
消極報錯狀態使通信控制器在正常工作與停工之間有一個中間狀態,在此種狀態下,它仍可發送和接收。唯一的差別是它的報錯能力被限制到很小:只有發送節點在ACK以前的本地錯會被其他節點知道。在其他情況下,消極報錯幀不會影響其他節點的收發,不管這種錯是本地錯還是全局錯。這樣,如果這個處于消極報錯狀態的節點不正常,那么它對系統性能下降的影響就很小;如果它工作正常,則系統的性能沒有損失。
對汽車類的應用來說,環境很惡劣,出錯是不可避免的,然而在現場進行排障或修理是有難度或不可能的(例如上天或人海的應用)。在那里,能“跛”著回家是最好的策略。這種策略不僅適用于機械部分,也適用于工作失常的電子通信系統。消極報錯狀態符合這種策略。當車子在這種“跛”著回家方式下工作時,某些暫時性的故障有可能消失。例如,環境溫度、電磁場、振動都可能因工況的不同或路段的不同而改變。隨著通信恢復正常,節點的狀態也可由消極報錯狀態回到主動報錯狀態。如果節點只有主動報錯和離線二種狀態,那么離線時節點就要不斷測試通信是否恢復,或者等一段時間測試一下。顯然,這些方法效率要低,不像消極報錯狀態時仍能提供服務,意味著提供服務的時間的減少。延長處于主動報錯狀態的時間,而去掉消極報錯狀態,會使有本地故障的節點對系統的干擾時間也延長。因此廢棄消極報錯狀態不是一個好的選擇。從Bosch CAN2.0規范里也可以體會到這一點:它規定一個處于消極報錯狀態的節點一定不得發主動報錯標志。消極報錯狀態的想法也為FlexRay所采用,在它的協議運行控制部分規定有三種狀態,分別是POC:NormalActive、POC:Normeal Passive和POC:Halt。
4 小 結
上述分析表明:處于消極報錯狀態的CAN發送節點在某些條件下會因一次誤判而進入離線狀態。其離線的時間一般比處于消極報錯狀態的接收節點因一次誤判而進入的等同離線狀態要長。為了避免這種類型的失效,最好的解決方案是采用可變長消極報錯幀分界符,使消極報錯狀態的節點總能與系統內的其他節點保持幀啟停的同步。在同步的情況下,假設現有CAN調度分析的理論沒有大的缺失,例如沒有此類故障,沒有引起超載幀的條件,可以提供較為可信的結果。
評論