我們在用CANoe進(jìn)行CAN總線的測試時(shí),會(huì)發(fā)現(xiàn)CAN報(bào)文的發(fā)送類型有很多種,有些類型不太容易理解,有些類型之間又容易混淆,一不小心就會(huì)用錯(cuò),今天我們就來介紹下CAN報(bào)文的發(fā)送類型。 CAN報(bào)文的發(fā)送類型分為基本發(fā)送類型和混合發(fā)送類型兩大類。 基本發(fā)送類型包括Cyclic周期發(fā)送、OnChange變化時(shí)發(fā)送、OnWrite寫入時(shí)發(fā)送和IfActive有效時(shí)發(fā)送。 基本發(fā)送類型中的Cyclic稱為周期型,而其他3個(gè)類型稱為事件型(event)。 混合發(fā)送類型就是指基本類型中的周期型與事件型的組合,包括Cyclic and OnChange、Cyclic and OnWrite、Cyclic and IfActive。 1.基本發(fā)送類型 1.1
Cyclic周期發(fā)送 周期發(fā)送是指報(bào)文獨(dú)立于信號,按照固定的周期發(fā)送,也就是報(bào)文的發(fā)送與報(bào)文中的信號變化沒有關(guān)系。 周期性發(fā)送報(bào)文是我們最常用的報(bào)文,這類報(bào)文中包含的通常都是需要經(jīng)常使用或者變化頻率較高的信號,比如車速、轉(zhuǎn)速等信號。 Cyclic周期性發(fā)送報(bào)文示例 如上圖示例所示,ID為201的報(bào)文按照200ms的固定周期發(fā)送車速信號,車速信號在這個(gè)期間會(huì)有些變化,從52->51->52->53>,但是無論信號如何變化,報(bào)文周期都是6.8-6.6=7.0-6.8=7.2-7.0=200ms。 周期型報(bào)文就像大城市的公交汽車,報(bào)文中的信號就像是乘車的人員,一旦公交汽車發(fā)車周期確定了,比如10分鐘,則每間隔10分鐘都會(huì)有一輛車從始發(fā)站啟動(dòng)后發(fā)出,無論車上有幾個(gè)人,都會(huì)按時(shí)發(fā)送。 周期型報(bào)文(公交車)按固定時(shí)間發(fā)送,即使信號為0(空車)也要發(fā)送 1.2
OnChange變化時(shí)發(fā)送 變化時(shí)發(fā)送是指當(dāng)報(bào)文中的信號變化時(shí),報(bào)文才會(huì)發(fā)送。 這類報(bào)文中包含的通常都是變化頻率不高的信號,比如通過中控屏進(jìn)行的按鍵調(diào)節(jié)信號,OnChange報(bào)文的目的是為了節(jié)省總線資源。 OnChange變化時(shí)發(fā)送報(bào)文示例 如上圖示例所示,ID為368的報(bào)文為OnChange變化時(shí)發(fā)送的報(bào)文,假如當(dāng)前的背光亮度為30,此時(shí)總線上沒有368報(bào)文; 此時(shí)通過中控屏的觸摸按鍵將背光設(shè)置改為32,則中控屏?xí)l(fā)出一幀ID為368,背光信號為32的報(bào)文。 1.3
OnWrite寫入時(shí)發(fā)送 寫入時(shí)發(fā)送是指當(dāng)報(bào)文中的信號被重新寫入時(shí),報(bào)文才會(huì)發(fā)送。這里的重新寫入主要是指在測試軟件中對信號的重新設(shè)置寫入,在ECU中也可以認(rèn)為是應(yīng)用層對底層通信信號的寫入。 OnWrite與OnChange的主要區(qū)別是OnWrite重新寫入不一定就是數(shù)值的改變,也可以保持不變。 還是以中控屏的背光設(shè)置為例,比如背光原來為30,可以再次設(shè)置為32,設(shè)置后又繼續(xù)設(shè)置了兩次,但都是32,并沒有改變這個(gè)值。 OnWrite寫入時(shí)發(fā)送報(bào)文示例 以上示例中,最后兩幀的背光信號都是32,對比第2幀并沒有改變,但是中控屏依然會(huì)發(fā)出這兩幀,因?yàn)槎际?strong>寫入的操作。 這里要注意的是發(fā)送時(shí)間都是實(shí)時(shí)隨機(jī)的時(shí)間(中控按鍵確認(rèn)的時(shí)間),并沒有固定發(fā)送周期。 1.4
IfActive有效時(shí)發(fā)送 有效時(shí)發(fā)送是指當(dāng)報(bào)文中的信號為有效值時(shí),報(bào)文會(huì)以一個(gè)快速的周期(cycle time fast)發(fā)送,當(dāng)信號變?yōu)?strong>無效時(shí),報(bào)文就不再發(fā)送。 無效值Inactive Value也就是默認(rèn)值,比如BCM的報(bào)文ID是380,其中的DoorOpen門開信號的無效值是0,表示門關(guān),有效值是1表示門開,快速周期為100ms。 開始狀態(tài)為門關(guān),總線上沒有報(bào)文,當(dāng)門開有效,即門開信號為1時(shí),380報(bào)文立即以100ms為周期發(fā)送報(bào)文;當(dāng)門關(guān)后,即門開信號為0時(shí),報(bào)文立即停發(fā)。 IfActive有效時(shí)發(fā)送報(bào)文示例 以上示例中,報(bào)文是以快速周期100ms發(fā)送的,不發(fā)送時(shí)就表示門開信號為0(無效)。 OnChange、OnWrite和IfActive都屬于事件型報(bào)文,這類報(bào)文就像在出租車站點(diǎn)等待的出租車,沒人打車的時(shí)候不需要上路,只有乘客打車時(shí)才會(huì)上路,否則大量的空載出租車在道路上行駛,不僅沒有作用,反而容易擠占道路資源,造成道路擁擠。 事件型報(bào)文(出租車)沒有信號觸發(fā)(無人打車)時(shí)不需要發(fā)出 1.5 Repetitions重復(fù)發(fā)送參數(shù) 對于基本型中的OnChange、OnWrite來說,它們雖然不是周期發(fā)送,但是并不是說只能發(fā)一次,也可以發(fā)送多次。對于IfActive來說,也可以按快速周期發(fā)送的同時(shí)限制發(fā)送次數(shù)。而發(fā)送次數(shù)是通過定義Repetitions重復(fù)次數(shù)來實(shí)現(xiàn)的。 所以基本型中又衍生出3個(gè)子類型OnChangeWithRepetition、OnWriteWithRepetition和IfActiveWithRepetition。 比如在OnChangeWithRepetition子類型中,如果設(shè)置了Repetitions=3,則報(bào)文會(huì)連續(xù)發(fā)送三次,三次之間的時(shí)間不小于最小報(bào)文發(fā)送的延遲時(shí)間Delay time。 OnChangeWithRepetition示例 注意連續(xù)發(fā)送報(bào)文的時(shí)間間隔都比較短,但是也不能小于最小報(bào)文發(fā)送的延遲時(shí)間Delay time,示例中的間隔為100ms。 再比如在IfActiveWithRepetition子類型中,Repetitions=2,快速發(fā)送周期cycle time fast=100ms,則報(bào)文只發(fā)送兩幀。 IfActiveWithRepetition示例 注意此時(shí)報(bào)文的發(fā)送周期是按照cycle time fast快速周期時(shí)間100ms發(fā)送,雖然與上面的間隔時(shí)間100ms相等,但是含義不同。 2.混合型 2.1
Cyclic and OnChange 周期和變化時(shí)發(fā)送是指報(bào)文平時(shí)是周期性發(fā)送,當(dāng)報(bào)文中的信號變化時(shí),此報(bào)文會(huì)額外的發(fā)送一次,原來的周期不變。 Cyclic
and OnChange示例 如上圖示例所示,其中的第3幀就是額外發(fā)送的幀,它的發(fā)送時(shí)間為6.920s,是個(gè)實(shí)時(shí)的隨機(jī)時(shí)間,不是按照周期發(fā)送的。 2.2 Cyclic
and OnWrite 周期和寫入時(shí)發(fā)送是指報(bào)文平時(shí)是周期性發(fā)送,當(dāng)報(bào)文中的信號被重新寫入時(shí),此報(bào)文會(huì)額外的發(fā)送一次,原來的周期不變。 Cyclic and OnWrite示例 如上圖示例所示,其中的第3幀和第5幀就是寫入時(shí)額外發(fā)送的幀,它們的發(fā)送時(shí)間分別為6.920s和7.110s,都是實(shí)時(shí)的隨機(jī)時(shí)間,不是按照周期發(fā)送的。 注意第5幀的重新寫入數(shù)據(jù)仍然是32,沒有改變,這也是OnWrite與OnChange的主要區(qū)別。 2.3
Cyclic and IfActive 周期和有效時(shí)發(fā)送是指報(bào)文平時(shí)是按正常周期cyclic time發(fā)送,當(dāng)報(bào)文中的信號為有效值時(shí),報(bào)文會(huì)按IfActive報(bào)文的快速周期cyclic time fast發(fā)送,等到信號變?yōu)闊o效值時(shí),報(bào)文又會(huì)恢復(fù)到原來的正常周期發(fā)送。 Cyclic and IfActive示例 如上圖示例所示,其中前4幀是按正常周期1s發(fā)送,信號為無效值0;從第5幀開始,當(dāng)信號變?yōu)橛行е?時(shí),則按照快速周期100ms發(fā)送,所以中間4幀是快速發(fā)送。后面4幀,信號又恢復(fù)為無效值0,周期也恢復(fù)為正常周期1s。 快速周期時(shí)間 cycle time fast這個(gè)參數(shù)僅在IfActive及其組合的類型中使用。 混合型的報(bào)文就像旅游景點(diǎn)的接駁班車,平時(shí)人少時(shí)(基本不變),可以慢周期發(fā)車;等到節(jié)假日乘客突然很多(變化)時(shí)就臨時(shí)改為快速發(fā)車。這樣平時(shí)可以較少的占用道路資源,假日期間又可以解決臨時(shí)客流量大的問題。 混合型的報(bào)文(接駁班車)發(fā)送周期平時(shí)慢,緊急時(shí)快 信號觸發(fā)(人流量變化)時(shí)需要快速的把消息發(fā)送出去 3應(yīng)用實(shí)例 在實(shí)際使用時(shí),有些信號涉及到相互同步的問題,比如儀表和中控的背光設(shè)置。 傳統(tǒng)產(chǎn)品中,儀表的按鍵可以設(shè)置儀表屏的背光亮度,中控按鍵可以設(shè)置中控屏的背光亮度。在智能座艙的架構(gòu)中,希望儀表和中控的背光能一體化聯(lián)動(dòng),同步變化。也就是通過儀表或中控都可以設(shè)置車內(nèi)屏幕的統(tǒng)一亮度,這時(shí)就需要儀表和中控信號同步,互相發(fā)送背光亮度信息。 如果儀表和中控都按周期報(bào)文發(fā)送,兩者是可以實(shí)時(shí)同步,一方發(fā)現(xiàn)對方的需求與自己不同時(shí),與對方同步即可。 但這種方式也有缺點(diǎn),就是對軟件處理的時(shí)序要求很高,比如在中控系統(tǒng)上進(jìn)行手動(dòng)設(shè)置后,在中控發(fā)出新的報(bào)文給儀表時(shí),儀表在未收到新報(bào)文前已經(jīng)將包含舊數(shù)值的報(bào)文發(fā)給中控系統(tǒng),而中控系統(tǒng)誤以為這個(gè)舊報(bào)文是儀表的新設(shè)置,就會(huì)導(dǎo)致儀表和中控兩者不停地向?qū)Ψ酵?,陷?strong>死循環(huán),背光一直在跳變,無法達(dá)成穩(wěn)定狀態(tài)。 這種情況要求軟件上必須在數(shù)據(jù)變化發(fā)送時(shí)做對方報(bào)文的延時(shí)處理,也就是短時(shí)間內(nèi)不接收對方的報(bào)文,以防止被對方舊的數(shù)據(jù)干擾。 還有一種簡化的方法就是一方為周期型發(fā)送,另一方為事件型發(fā)送。比如儀表(假設(shè)ID=350)為周期發(fā)送,發(fā)送周期為500ms;中控為OnChange有變化時(shí)發(fā)送,變化時(shí)重復(fù)發(fā)送3幀,則報(bào)文如下: 儀表中控背光同步發(fā)送 由上圖示例可知: 1-4幀為儀表發(fā)送的周期幀,周期為500ms,背光為30; 5、6、7三幀為中控發(fā)送的事件幀,連續(xù)發(fā)了三幀,間隔為100ms,背光改為32; 8、9幀為儀表收到中控發(fā)來的事件型報(bào)文后,同步更新自身的背光亮度值后發(fā)出的周期幀,周期仍然是500ms。 這種方式將儀表的背光信號定為周期型發(fā)送,可以保證較好的同步實(shí)時(shí)性,將中控定為事件型方式發(fā)送,可以避免兩者進(jìn)入死循環(huán)的可能。但是中控會(huì)有被儀表的舊信號覆蓋的可能,所以中控中仍需要做報(bào)文的延時(shí)處理,但是整體上來看,這種方式風(fēng)險(xiǎn)更低、處理更簡單。 小結(jié): CAN總線的報(bào)文發(fā)送類型主要包括周期型和事件型,周期型就是按照固定周期發(fā)送,與具體發(fā)送的信號無關(guān)。事件型不按周期發(fā)送,是按照信號的特點(diǎn)發(fā)送,具體分為信號變化時(shí)發(fā)送、信號寫入時(shí)發(fā)送和信號有效時(shí)發(fā)送。周期型與事件型還可以分別組合成混合型。 周期型的特點(diǎn)是穩(wěn)定、可靠,實(shí)時(shí)同步效果好,但占用總線資源多;事件型的同步效果沒那么好,但是占用總線資源少! |
|