作者:autogeek
原文鏈接:http://www.cnblogs.com/autogeek/p/4225017.html
現在汽車儀表大部分的總計里程和小計里程都是顯示在屏幕上的,這包括段碼屏、點陣屏、TFT彩屏等,雖然顯示形式不一樣,但是從業務需求和軟件應用層的實現策略來講,原理應該都是通用的。本文不涉及具體車型,僅對一般的業務邏輯作介紹,一是為了自己總結記錄,二是期望吸引同行或愛好者交流。
1.總計里程
ODO(Total Odometer )即總計里程,顧名思義,主要作用是記錄汽車總的行駛里程,一般來講,在用戶使用過程中是無法對其修改或清零的,因為它是對二手汽車價值評估的一項重要數值,當然隨意篡改這一數據也是違法的。
在行車過程中,儀表上的總計里程會按每1km或1mile的頻率更新數據顯示,一般最大顯示數字是999,999,單位可以是Km或者Miles。當達到最大值的時候,不會rollover,應該保持在最大值,當然估計還沒達到最大值車子就應該報廢了,所以只有在開發測試過程中才能有機會看到這一狀態。 如果數據失效,一般顯示策略是用“---”代表。如果支持不同單位顯示,可以通過按鍵去選擇菜單配置項來設置單位,一旦設定,數據會根據單位進行切換,轉換后超過最大值的部分會被丟棄。
從內部實現角度,一般是數據源頭是EMS過來的CAN信號,比如每1m發一次,儀表每收到1000個CAN信號(1000m)就去更新計算一次ODO,當然也有的策略是每10m儀表更新計算一次,這個具體要看不同的OEM要求了,但是最終顯示都是按每1km或1mile更新的。為了在掉電之后ODO數據不會丟失,上電之后能夠繼續之前的數據累加,ODO數據會存儲在非易失性存儲器中,比如EERPOM或者內部Flash。在每次上電儀表都會讀出之前存儲的數據,並作有效性校驗,然后每增加1km或者1mile就會往存儲器中更新這個值,在掉電之前,最終值也會存進去。
鑒於這個值的重要性,儀表並不是簡單的存取它,而是有一定的備份和校驗策略。比如,可能儀表會為它分配三塊同樣的存儲區域,每次存儲都會將同樣的值寫到三個地方,而當每次讀出來的時候,也是三個地方的值都讀出來,比較其中的任意兩個值,如果三個中至少有兩個相同,那么這個值就是有效的,如果三個值兩兩互不相同,那么這個值就是無效的,儀表會用一個默認值來替換它,同時有的儀表可能會為此記錄一個DTC,直到該值有效才擦除此DTC。這樣一來,既保障了數據的有效性,同時也有效阻止隨意篡改總計里程。其實,一般儀表出廠之后是允許清零的,可以通過先斷電,長按某個按鍵,再上電,但是這是有限制條件的,比如最多可以4次清零,累積清除里程不得超過512km。
2.小計里程
小計里程(Trip Odometer),用作記錄從上次小計里程清零開始到現在所行使的里程,它並不像ODO那么重要,對它清零也不違法,而是用戶的一項權利。顯示最大值是999.9,單位也是Km或者Mile,精度是0.1,計數超過最大值后,一般策略是rollover,即重新回零計數。如果切換單位,可能會清零重新按新單位顯示,也可能直接顯示切換后的新數值,這就要看車輛配置和顯示策略了。在儀表斷電之后,該值會清零重新計數,但是不斷電僅熄火的話,這個值不會丟失,因此它也是要存儲在非易失性存儲器中的。用戶一般可以通過長按儀表或者方向盤上的鍵來把小計里程清零。
從內部實現來講,原理還是比較簡單的,也是通過EMS的那個CAN信號,和ODO同步累加,只不過要每0.1km或者0.1mile更新顯示。它不需要備份和校驗策略。
3.診斷相關
這里不得不提一下診斷,對於外部來說,能修改總計里程的方法一般也就是通過OBD用診斷命令來做到。但是一般也只是允許改大,不允許改小,除非破解軟件。同時還要知道加密算法才能成功執行診斷指令,不同的OEM的加密算法肯定是不同的,除非內部相關人員拿到一手資料,否則只有靠破解,難度就取決於加密的復雜度了。OBD是汽車ECU留給外界的唯一后門,因此現在越來越火的車聯網都尋求以它為突破口,獲取車輛行駛數據。以后會專門寫寫關於OBD的文章。
