首先每個 ECU是一個網絡節點,每個網絡節點可收發一些 Message,每個Message 由CAN signals構成。每個 CAN signal利用一個或多個連續的2進制位來表示承載的信息。下面就來舉個列子簡要介紹如何理解 CAN signal的定義。
以節點 IPC中ESP_STATUS 這個CAN message 中的 ESP_VehicleSpeed這個CAN signal 為例,查看 DBC中的定義如下圖:
可以看到這個 signal由13 個bit構成,字節序是 Motorola,單位是KPH ,Factor是 0.05625,
無效值是 0x1FFF,最大值是460.69 KPH 。
怎么來理解這個 13bit以及Factor 和最大值呢?
首先可以看 Layout,這個signal 占了2個字節,其中一個占了 8位,另一個占了5位,合在一起正好是 13位,而13 個bit可以表示的無符號范圍正好是 0 – 0x1FFF,因此一般把最大的那個范圍定做 Invalid Value,如果CAN signal 是這個值,那么此時獲取的 CAN signal就是無效的。
那么怎么理解 factor呢?可以把它理解為精度,即每一個 CAN signal的整數值所代表的有單位的數值,即 0表示0 KPH , 1表示 1*0.05625即0.05625KPH ,2表示 2*0.05625即0.1125 KPH ,n表示 n*0.05625 KPH,注意這里的n是十進制數值。因此可以把收到的 CAN signal整數值對應轉換為實際數值,自然的可以理解最大值是怎么來的,即 0x1FFF即十進制8191 ,與0.05625相乘得到的 460.69。
如何根據 layout獲得相應的CAN signal 數值呢,寫代碼獲取該 CAN signal的數值應該是這樣:
(Msg.ESP_VehicleSpeed_0 << 0) + (Msg.ESP_VehicleSpeed_1 << 5)