如何實(shí)現(xiàn)可靠的CAN長(zhǎng)字節(jié)通訊?
CAN總線從上個(gè)世紀(jì)80年代開始,逐漸在汽車電子、軌道交通、醫(yī)療電子、工程機(jī)械等廣泛的工業(yè)場(chǎng)合應(yīng)用。這個(gè)“古老”的總線,最讓人“不爽”的地方,就是一幀只能傳輸八字節(jié)數(shù)據(jù),如果要一次傳輸更長(zhǎng)字節(jié),需要分幀,而選擇一種可靠的分幀方法就是使用者一定要注意的。
本文引用地址:http://butianyuan.cn/article/201807/383769.htmCAN總線作為汽車電子而生的總線,提出了“優(yōu)先級(jí)自動(dòng)仲裁”和“短幀快速傳輸”的控制概念,為了達(dá)到“高實(shí)時(shí)性”的快速控制目標(biāo)。使用一幀八字節(jié)的通訊單元具有了一系列的優(yōu)點(diǎn)缺點(diǎn):
優(yōu)點(diǎn)
(1)8個(gè)字節(jié)正好是8個(gè)字節(jié)、4個(gè)16位、2個(gè)32位、1個(gè)64位的變量的存放“容器”。那么用戶只要在ID中存放“寄存器地址”,然后通過(guò)1幀來(lái)“讀取”或者“修改”,對(duì)應(yīng)的“數(shù)值”,這樣比較方便;
(2)短幀提高總線共享速度。任何一個(gè)CAN節(jié)點(diǎn)發(fā)送報(bào)文,在發(fā)送一幀后,需要重新和其他節(jié)點(diǎn)競(jìng)爭(zhēng)總線,這樣只要用戶設(shè)計(jì)適當(dāng)?shù)陌l(fā)送間隔,就可以保證所有的點(diǎn)“共享”總線,提高總線利用率,也保證每個(gè)節(jié)點(diǎn)的發(fā)送周期大致保證一致。
缺點(diǎn)
(1)長(zhǎng)數(shù)據(jù)傳輸時(shí)數(shù)據(jù)負(fù)載偏低。在多幀發(fā)送時(shí),由于每幀發(fā)送都要發(fā)送CANID,所以實(shí)際的CAN數(shù)據(jù)所占的比例就很低了,以CAN擴(kuò)展幀為例,其29位ID和64位的數(shù)據(jù),導(dǎo)致數(shù)據(jù)承載只能達(dá)到60%。所以在長(zhǎng)數(shù)據(jù)傳輸時(shí),CAN甚至比不上同樣波特率下的RS485/Modbus;
(2)長(zhǎng)數(shù)據(jù)傳輸分幀丟幀,會(huì)導(dǎo)致整包傳輸失敗。當(dāng)需要一次傳輸超過(guò)8字節(jié)數(shù)據(jù)時(shí),需要分多幀傳輸,如果其中一幀“丟失”,則會(huì)導(dǎo)致整個(gè)發(fā)送包的無(wú)效。這就要求接收節(jié)點(diǎn)對(duì)每一個(gè)分幀進(jìn)行確認(rèn),以保證每一個(gè)分幀的到達(dá),而這么做就會(huì)大大降低效率;
(3)長(zhǎng)數(shù)據(jù)傳輸時(shí)同步性差。比如要同時(shí)輸出動(dòng)作超過(guò)8字節(jié)的控制命令時(shí),由于每個(gè)幀到達(dá)有先后,先到的先動(dòng)作,后到的后動(dòng)作,就會(huì)引起輸出的不同步性。
可見CAN總線在當(dāng)前的主流應(yīng)用中,主要矛盾集中在其8字節(jié)短幀的長(zhǎng)數(shù)據(jù)傳輸上。因此世界廣大科技工作者制定出一系列的改進(jìn)和改革方法來(lái)解決這些缺點(diǎn)。
升級(jí)為CANFD協(xié)議提高數(shù)據(jù)負(fù)載率
幾年前,梅賽德斯奔馳的工程師們對(duì)CAN總線的制定單位CiA(CAN in Automatic)協(xié)會(huì)提出,奔馳已經(jīng)將CAN用盡了。因?yàn)楸捡Y的工程師們通過(guò)不斷優(yōu)化通訊機(jī)制,已經(jīng)將奔馳的CAN總線利用率提高到90%以上,已經(jīng)無(wú)帶寬可用,只能通過(guò)網(wǎng)關(guān)不斷增加新的CAN網(wǎng)絡(luò)來(lái)擴(kuò)展數(shù)據(jù)通道。這樣導(dǎo)致整車的總線區(qū)域越來(lái)越多。
車載以太網(wǎng)雖然可以解決數(shù)據(jù)量的問(wèn)題,但其布線改變過(guò)大,成本上升過(guò)多,只適合于網(wǎng)關(guān)之間的通訊。所以CiA協(xié)議就聯(lián)合各大車廠,制定出新一代的CANFD協(xié)議,以快速升級(jí)現(xiàn)有的CAN2.0B。其主要的內(nèi)容就是將一幀的數(shù)據(jù)段由8字節(jié)提升到64字節(jié),同時(shí)可以提升數(shù)據(jù)段的波特率,以縮短通訊時(shí)間。如圖1所示。
圖 1 CANFD報(bào)文提升數(shù)據(jù)負(fù)載率
這樣,不需要每8字節(jié)就要發(fā)一次CANID,即使不提升波特率,也提升了8倍的數(shù)據(jù)負(fù)載率。如果提升了8倍波特率,則可以達(dá)到64倍的數(shù)據(jù)負(fù)載率,相當(dāng)于擴(kuò)充了64倍帶寬。其提升效果非常明顯。
采用可靠的分幀協(xié)議
成熟的應(yīng)用層協(xié)議都有可靠的分幀協(xié)議,比如CANopen,DeviceNET,J1939協(xié)議等,總的方針都是“握手”“傳輸”“確認(rèn)”“結(jié)束”這四個(gè)過(guò)程循環(huán)。這里只介紹CANopen協(xié)議中的SDO多幀傳輸。
發(fā)送方(客戶端)發(fā)送的報(bào)文CAN-ID為600h+Node-ID,接收方(服務(wù)器)成功接收后,回應(yīng)CAN-ID為580h+Node-ID的報(bào)文。下載協(xié)議download protoco如圖2所示。
圖2 普通SDO下載協(xié)議
上傳協(xié)議upload protoco如圖3所示。
圖 3普通SDO上傳協(xié)議
采用同步傳輸協(xié)議
同步傳輸,解決的就是實(shí)現(xiàn)整個(gè)網(wǎng)絡(luò)的同步傳輸,如圖4所示,就像閱兵分列式上的方陣,所有士兵邁著整齊的步伐行進(jìn)。這里以CANopen的同步報(bào)文為例講解。
圖4同步協(xié)議與閱兵分列式
每個(gè)節(jié)點(diǎn)都以同步報(bào)文作為PDO(過(guò)程數(shù)據(jù)的)觸發(fā)參數(shù),為了保證時(shí)間準(zhǔn)確性,該同步報(bào)文的COB-ID 具有比較高的優(yōu)先級(jí)以及最短的傳輸時(shí)間。 CANopen選用80h作為同步報(bào)文的CAN-ID,如圖5所示。
圖5 同步報(bào)文
一般同步報(bào)文由NMT(網(wǎng)絡(luò)管理)主機(jī)發(fā)出,CAN報(bào)文的數(shù)據(jù)為0字節(jié)。但如果一個(gè)網(wǎng)絡(luò)內(nèi)有2個(gè)同步機(jī)制,就需要設(shè)置不同的同步節(jié)拍,比如某些節(jié)點(diǎn)按1個(gè)同步幀發(fā)送1次PDO,其他的節(jié)點(diǎn)收到2個(gè)同步幀才發(fā)送1此PDO,
在同步協(xié)議中,有2個(gè)約束條件:
同步窗口時(shí)間:索引1007h約束了同步幀發(fā)送后,從節(jié)點(diǎn)發(fā)送PDO的時(shí)效,即在這個(gè)時(shí)間內(nèi)發(fā)送的PDO才有效,超過(guò)時(shí)間的PDO將被丟棄,當(dāng)同步窗口結(jié)束后,開始同時(shí)執(zhí)行動(dòng)作。
通訊循環(huán)周期:索引1006h規(guī)定了同步幀的循環(huán)周期,就是同步包發(fā)送的周期。
CAN總線在諸多愛好者的推動(dòng)下,不斷改進(jìn)和改革自身,讓這個(gè)古老的總線煥發(fā)出勃勃生機(jī)。廣州致遠(yuǎn)電子有限公司,作為CAN總線在國(guó)內(nèi)的重要推廣者,CANScope總線綜合分析儀已免費(fèi)標(biāo)配CANPRO軟件,可以解析主流的CANOpen,DeviceNet,J1939協(xié)議。
評(píng)論