五分鐘教會如何計算CAN總線負載率,包學包會

最近某個工作項目中需要計算CAN總線上的負載率,這個東西從字面上來理解是很簡單的,就是指總線上所有節點在單位時間內發送的所有數據佔整個總線理論帶寬的比值,或者說,總線實際數據傳輸速率與理論上能達到的數據傳輸速率的比值。

當然,想要真正的計算出實際項目中的負載率,肯定是有一個公式可以套用的。本想偷懶一下去找現成的,但是在網上一番搜尋之後卻發現,沒有任何一篇文章把這個事情簡單而精準的解釋清楚的。算了,自己來。

開始之前先給一個簡單的例子,比如在一個波特率爲500Kbps的總線上,理論上每秒鐘能夠傳輸500000個BIT,而如實際上只傳輸了100000個BIT,那麼就可以得到此刻的總線負載率爲100000/500000=20%。當然,這只是一個非常粗糙的示例,真正的計算過程肯定要複雜一點。好,下面就開始實際的推導過程:

首先給出核心公式:

負載率R = 每秒鐘實際上傳輸的所有數據的BIT總數A / 每秒鐘理論上所能傳輸的BIT總數T

很簡單的,對於指定了波特率的某個CAN總線,上述公式的分母T是恆定的。就比如上述示例中,波特率爲500kbps的總線上,理論上每秒鐘能夠傳輸500000個BIT。而如果波特率爲250kbps,那麼就能傳輸250000個BIT。所以,我們只要計算上述公式中的分子A即可。

每秒鐘實際上傳輸的所有數據的BIT總數A =
[該秒內所發送的所有ID1報文的所有BIT總數A1] +
[該秒內所發送的所有ID2報文的所有BIT總數A2] +
…… +
[該秒內所發送的所有IDn報文的所有BIT總數An]

其中:

該秒內所發送的所有ID1報文的所有BIT總數A1 = ID1的每一個報文的BIT總數Z * ID1的發送次數K

由於ID1的發送次數K是明確的,比如按照50ms的間隔發送,那就意味着一秒鐘內的發送次數是20次。所以,我們只需要計算出“ID1的每一個報文的BIT總數Z”即可;

ID1的每一個報文的BIT總數Z = 實際報文數據幀的BIT總數Zg + 幀間隔的BIT總數Zy

對於標準幀和擴展幀,上述的值是不一樣的,如下:

  • 對於CAN標準幀:假設數據幀長度恆定爲8個字節,可以得到每一個數據幀最大長度共計108bit,分別爲:幀起始(1bit)、仲裁域(12bit)、控制域(6bit)、數據域(8×8bit)、循環冗餘碼域(15bit)、1bit分隔符、應答域(2bit)和幀結尾(7bit);
    在這裏插入圖片描述
  • 對於CAN擴展幀:假設數據幀長度恆定爲8個字節,可以得到每一個數據幀最大長度共計128bit,分別爲:幀起始(1bit)、仲裁域(32bit)、控制域(6bit)、數據域(8×8bit)、循環冗餘碼域(15bit)、1bit分隔符、應答域(2bit)和幀結尾(7bit);
    在這裏插入圖片描述

而幀間隔的BIT總數,根據CAN協議的規定,都是3個BIT。

所以,對單個數據幀來說,完成一幀標準幀的全套發送行爲總共需要108 + 3 = 111個BIT,完成一幀擴展幀的全套發送行爲總共需要128 + 3 = 131個BIT。

至此,所有的元素取值都已經計算清楚,接下來我們進行整合計算:

假設總線波特率爲500kbps,工作於標準幀模式,共有5個ID,每個ID按照50ms的間隔進行發送,那麼此時的總線負載率計算如下:

負載率R
=(A1 + A2 + A3 + A4 + A5)/ 500000
=(A * 5)/ 500000
=(Z * K)* 5 / 500000
=(111 * 20)* 5 / 500000
= 2.22%

爲此,我特地設計了一個表格,填入總線波特率、幀類型,以及各個ID(目前最多支持10個ID)的發送次數,便可自動計算出總線的理論負載率,如下:
在這裏插入圖片描述
有需要的同學,可以留言給我,我單獨郵件發給大家

最後說明一下:

負載率越高,代表需要發送的數據越多,相對來說低優先級節點發生通訊延遲的概率越大。一般情況下,爲保證低優先級的報文傳輸延遲在可接受的時間範圍內,總線利用率不應超過30%,當負載率大於38%~40%時,穩定性開始衰減,超過50%後存在影響駕駛性及安全性風險,大於70%時,穩定性衰減加劇,超過98%時,網絡將不堪重負。

不過,實際上30%的數據也只是一個經驗數值,歷史很悠久的一個經驗數值。從本質上來看,限制負載率最終是要保證相對低優先級節點的通訊實時性,如果能通過網絡及節點優化等手段滿足每個節點的最大響應時間滿足要求,負載率只是一個無關緊要的參數。12年的時候菲亞特已經可以做到70%的負載率下仍然能夠保證正常通訊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章