現(xiàn)代汽車的功能日新月異,而每增加一項(xiàng)功能都要增加相應(yīng)的電氣連接,使得分布車體各處的電纜趨于龐大和昂貴,且導(dǎo)致設(shè)計(jì)、安裝、調(diào)試和維護(hù)的困難。傳統(tǒng)的電氣控制系統(tǒng)設(shè)計(jì)已不能滿足汽車對(duì)安全性、性能和便利性的要求這種技術(shù)進(jìn)展,現(xiàn)場(chǎng)總線技術(shù)的應(yīng)用就是這種進(jìn)展導(dǎo)致的必然結(jié)果。
1、汽車總線的優(yōu)點(diǎn)
汽車總線主要具有以下優(yōu)點(diǎn):
網(wǎng)絡(luò)總線式結(jié)構(gòu),只需一根通訊電纜連接,由軟件邏輯控制替代傳統(tǒng)的直接線束控制 。
線路簡(jiǎn)化,減少線束連接復(fù)雜性。
無(wú)需專用配電盒,部件數(shù)量減少,可靠性能增加,總線節(jié)點(diǎn)控制器(ECU)可靠性很高(是目前汽車電器可靠性的幾十倍)。
可實(shí)現(xiàn)實(shí)時(shí)診斷、測(cè)試和報(bào)警功能。
系統(tǒng)可任意擴(kuò)展。
更高的可靠性、更好的服務(wù)贏得市場(chǎng),汽車總線的人性化設(shè)計(jì)功能更加貼近汽車制造商與客戶 。
搭建通用信息平臺(tái),為客戶提供方便,為企業(yè)創(chuàng)造價(jià)值。
汽車總線提供更完善的車況信息,用戶自我服務(wù)變?yōu)榭赡埽档土酥圃鞆S與服務(wù)成本:(1)集中顯示;(2)歷史查詢;(3)診斷與測(cè)試;(4)語(yǔ)音提示 。
準(zhǔn)黑匣子功能。
2、拓?fù)浣Y(jié)構(gòu)
在某品牌商務(wù)車上,我們使用了六個(gè)通訊節(jié)點(diǎn)代替了繁雜的線束,其拓?fù)浣Y(jié)構(gòu)和各個(gè)節(jié)點(diǎn)完成的主要功能見圖1。
圖1 總線節(jié)點(diǎn)分布圖
3、軟件架構(gòu)
按照功能,我們將軟件分成三層次,即驅(qū)動(dòng)層、轉(zhuǎn)換層和規(guī)則處理層。其中,轉(zhuǎn)換層包括輸入驅(qū)動(dòng)和輸出驅(qū)動(dòng)模塊,轉(zhuǎn)換層包括輸入轉(zhuǎn)換和輸出轉(zhuǎn)換模塊。為了實(shí)現(xiàn)各層各模塊之間的通訊,我們定義了三類消息:驅(qū)動(dòng)層和轉(zhuǎn)換層的消息稱之為狀態(tài)消息,轉(zhuǎn)換層的輸入轉(zhuǎn)換和輸出轉(zhuǎn)換間的消息稱為接口消息,轉(zhuǎn)換層和規(guī)則處理層的消息稱之為器件消息。
圖2 軟件架構(gòu)
輸入驅(qū)動(dòng)子模塊負(fù)責(zé)將輸入引腳的電平變化轉(zhuǎn)變?yōu)檩斎霠顟B(tài)消息發(fā)送給轉(zhuǎn)換層,輸出驅(qū)動(dòng)模塊將從轉(zhuǎn)換層接受的輸出狀態(tài)消息轉(zhuǎn)變?yōu)閷?shí)際引腳的電平變化;輸入轉(zhuǎn)換模塊將從驅(qū)動(dòng)層接收的輸入狀態(tài)消息轉(zhuǎn)換為輸入器件消息發(fā)送給規(guī)則層作進(jìn)一步的轉(zhuǎn)換,或者轉(zhuǎn)換為接口消息送交輸出轉(zhuǎn)換模塊進(jìn)行轉(zhuǎn)換輸出;輸出轉(zhuǎn)換模塊將從規(guī)則層接收的輸出器件狀態(tài)消息或者直接由輸入轉(zhuǎn)換模塊來(lái)的接口消息轉(zhuǎn)換為輸出狀態(tài)消息發(fā)送給驅(qū)動(dòng)層;規(guī)則處理模塊把從輸入轉(zhuǎn)換模塊接收的輸入器件消息映射為輸出器件消息發(fā)送給輸出轉(zhuǎn)換模塊。規(guī)則層和轉(zhuǎn)換層的主要區(qū)別在于當(dāng)涉及多個(gè)節(jié)點(diǎn)進(jìn)行邏輯關(guān)系運(yùn)算時(shí),使用規(guī)則層進(jìn)行轉(zhuǎn)換,而只在同一個(gè)節(jié)點(diǎn)進(jìn)行邏輯關(guān)系運(yùn)算時(shí)使用轉(zhuǎn)換層進(jìn)行轉(zhuǎn)換。另外,為了處理復(fù)雜的邏輯關(guān)系,我們也允許規(guī)則處理模塊自己給自己發(fā)送消息,這時(shí)的消息也成為輸入器件消息,同樣輸出轉(zhuǎn)換模塊也可以自己給自己發(fā)消息,這時(shí)的消息也為接口消息。
在整個(gè)系統(tǒng)中,運(yùn)行規(guī)則處理層的節(jié)點(diǎn)只有一個(gè),該節(jié)點(diǎn)稱為主ECU,其他節(jié)點(diǎn)稱為子ECU,主ECU的轉(zhuǎn)換層和規(guī)則處理層可以直接通訊,而子ECU的轉(zhuǎn)換層和主ECU規(guī)則處理層間的通訊通過(guò)通訊管理模塊來(lái)實(shí)現(xiàn)。子ECU之間不直接進(jìn)行消息的交換,必須通過(guò)主ECU聯(lián)絡(luò)。在實(shí)際的使用中,我們使用的是CAN總線,使用的芯片是自帶CAN收發(fā)器的atmel CC03。
為了使轉(zhuǎn)換層和規(guī)則處理層的處理方法一致,同時(shí)為了讓系統(tǒng)在增加新的功能時(shí),不對(duì)軟件作任何修改,我們摒棄了在程序中直接用If-Then-Else對(duì)每一種情況進(jìn)行邏輯判斷的傳統(tǒng)方法,代之以類似于專家系統(tǒng)的規(guī)則匹配進(jìn)行邏輯判斷。該方法的基本思想是:將各組邏輯關(guān)系按一定的組織關(guān)系存儲(chǔ)在數(shù)組中,每組邏輯關(guān)系我們稱之為一組規(guī)則,規(guī)則的每個(gè)條件和結(jié)論都稱之為因子,當(dāng)有消息到來(lái)時(shí),在數(shù)組中查找該消息的所屬的規(guī)則,如果找到,則判斷該組規(guī)則的條件是否都滿足,是,則得到Then的結(jié)果,如果有必要,在條件不滿足時(shí)得到Else的結(jié)果。該算法的關(guān)鍵是對(duì)各種邏輯關(guān)系的組織,目前我們采取的方法是將條件和結(jié)論都表示成二元組(S,ID),這里的ID表示引腳或器件的邏輯編號(hào),S的最高兩位用來(lái)區(qū)分條件和結(jié)論,接下來(lái)的一位表示消息的類型,S的其他位表示狀態(tài)等信息。當(dāng)S的最高位為10時(shí)表示條件,而00為Then的結(jié)論, 01為else結(jié)論,當(dāng)有的消息需要延時(shí)一段時(shí)間發(fā)送時(shí),使用11作為延時(shí)標(biāo)志,這時(shí)S的其他位和ID一起表示延時(shí)的時(shí)間。類型字段只需一位來(lái)表示,并且只在結(jié)論因子中有效,對(duì)于輸入轉(zhuǎn)換模塊,通過(guò)1、0來(lái)區(qū)分是發(fā)送給規(guī)則處理模塊還是直接發(fā)給輸出轉(zhuǎn)換模塊,輸出轉(zhuǎn)換模塊用1、0來(lái)區(qū)分是發(fā)給輸出驅(qū)動(dòng)模塊還是發(fā)給自己,而規(guī)則處理模塊用它來(lái)區(qū)分是發(fā)給轉(zhuǎn)換模塊還是發(fā)給自己。
對(duì)于邏輯[<喇叭按鈕:按下]==[>喇叭:鳴][Else]==[>喇叭:關(guān)],輸入轉(zhuǎn)換數(shù)組中將表示成:
(10000000 00000101)(00100000 10000110)(01100001 10000110)
這里喇叭按鈕的編號(hào)為5,狀態(tài)值為0表示按下,喇叭的編號(hào)為134,由于喇叭的按鈕和喇叭不在一個(gè)節(jié)點(diǎn)上,產(chǎn)生的是輸入器件消息(類型為1)。當(dāng)喇叭按鈕有按下的時(shí)候,輸入驅(qū)動(dòng)模塊將其打包成消息(0x80,0x05)發(fā)送給輸入轉(zhuǎn)換層,輸入轉(zhuǎn)換模塊通過(guò)在轉(zhuǎn)換數(shù)組中查找到ID為5的規(guī)則,通過(guò)判斷該組規(guī)則,得到(0x20,0x85)的器件消息,然后經(jīng)過(guò)通訊模塊,將其發(fā)送給規(guī)則處理模塊,規(guī)則處理模塊將處理后的消息,發(fā)給相關(guān)的子節(jié)點(diǎn),經(jīng)輸出轉(zhuǎn)換后由輸出驅(qū)動(dòng)模塊執(zhí)行。
4、軟件實(shí)現(xiàn)
上述的軟件構(gòu)架的實(shí)現(xiàn),我們可以采用不同的方案,下面給出基于實(shí)時(shí)操作系統(tǒng)的一般實(shí)現(xiàn),并假定汽車總線是CAN的情況。與各個(gè)模塊相對(duì)應(yīng),對(duì)于子ECU,我們定義了五個(gè)任務(wù)和兩個(gè)中斷服務(wù),分別是輸入轉(zhuǎn)換任務(wù)(TskInTrans)、輸出轉(zhuǎn)換任務(wù)(TskOutTrans)、延時(shí)處理任務(wù)(TskDly)、輸出驅(qū)動(dòng)任務(wù)(TskOutput)和發(fā)送任務(wù)(TskCANSend),中斷服務(wù)包括輸入中斷服務(wù)(ISPIn)和CAN接受中斷服務(wù)(ISPCAN),而對(duì)于主ECU,還需一個(gè)規(guī)則處理任務(wù)(TskRule)。為了實(shí)現(xiàn)任務(wù)間以及中斷和任務(wù)間的通訊,定義了四個(gè)郵箱和一個(gè)延時(shí)數(shù)組,分別是輸入轉(zhuǎn)換郵箱(MailInTrans)、輸出轉(zhuǎn)換郵箱(MailOutTrans)、輸出郵箱(MailOutput)、發(fā)送郵箱(MailCANSend)及延時(shí)數(shù)組ArrDly,對(duì)于主ECU還需增設(shè)規(guī)則處理郵箱(MailRule),這里的消息被定義成一個(gè)二元組(Val,ID),ID編號(hào),Val為狀態(tài)值,而延時(shí)數(shù)組的每個(gè)元素還包括一個(gè)延時(shí)字段是個(gè)三元組。主ECU的各個(gè)任務(wù)以及和中斷服務(wù)間的通訊關(guān)系如圖3。
圖3 主ECU各任務(wù)及中斷通訊間的關(guān)系
圖中的延時(shí)數(shù)組用虛框表示,它類似于消息郵箱,與郵箱中的消息相比,還包括一個(gè)延時(shí)的時(shí)間字段,另外在往延時(shí)數(shù)組中放入消息時(shí),它不會(huì)產(chǎn)生任務(wù)調(diào)度。延時(shí)數(shù)組中的延時(shí)消息來(lái)自于輸出轉(zhuǎn)換任務(wù)和規(guī)則處理任務(wù),延時(shí)任務(wù)定時(shí)執(zhí)行,它每隔一個(gè)時(shí)間單位,例如20ms,查詢一下延時(shí)數(shù)組,并將非空的元素的時(shí)間節(jié)拍減一,如果時(shí)間節(jié)拍為0,則根據(jù)Type字段,將其放入規(guī)則郵箱或輸出轉(zhuǎn)換郵箱。
對(duì)于總線中斷服務(wù)程序,主ECU和子ECU的處理方式稍微有的不同,對(duì)于主ECU,它將總線上來(lái)的消息送到規(guī)則處理郵箱 而子ECU則將其放入輸出轉(zhuǎn)換郵箱;而對(duì)于發(fā)送的任務(wù),主ECU的消息來(lái)自于規(guī)則處理任務(wù),子ECU的發(fā)送消息來(lái)自于輸入轉(zhuǎn)換任務(wù)。
采用郵箱進(jìn)行消息傳遞的并利用查表方法進(jìn)行邏輯判斷,轉(zhuǎn)換任務(wù)和規(guī)則處理任務(wù)流程很類似,限于篇幅,這里僅給出輸入轉(zhuǎn)換任務(wù)的流程圖和示意性代碼,另外,對(duì)于CAN及輸入輸出的驅(qū)動(dòng)程序,與具體的硬件有關(guān),這里也不在贅述。
輸入轉(zhuǎn)換任務(wù)的示意性代碼如下(基于Keil C編寫):
void TskInTrans () reentrant
{ StrYz Msg; 定義一個(gè)消息變量
for( ; ; )
{ Msg =(StrYz *)MsgPend(MailInTrans);//等待輸入轉(zhuǎn)換郵箱的消息
While Not EndofInTrans 轉(zhuǎn)換表沒(méi)查完
{ SeekRule(Msg->ID);從當(dāng)前規(guī)則開始,以消息的編號(hào)尋找所屬規(guī)則
if (IsAllOkJK(CurrentRule))// 如果都滿足,則根據(jù)消息的類型,將所有的
PostMsg(); Then因子發(fā)往規(guī)則郵箱或輸出轉(zhuǎn)換郵箱
else 否則,移到Else部分后,再將Else因子發(fā)往相應(yīng)的郵箱
{ MoveToElse();
PostMsg();
}
MoveToNextRule(); 移到下組規(guī)則
}
}
}
5、結(jié)束語(yǔ)
汽車總線控制是汽車產(chǎn)業(yè)的發(fā)展方向,要想進(jìn)行總線控制,必須從軟件和硬件兩個(gè)方面著手,而使用嵌入式操作系統(tǒng)對(duì)軟硬件進(jìn)行管理,不論是實(shí)時(shí)性還是從可靠性來(lái)講,都具有無(wú)可比擬的優(yōu)勢(shì),目前,我們正在研究基于實(shí)時(shí)操作系統(tǒng)的汽車總線控制系統(tǒng),并已在實(shí)驗(yàn)室中在某種商務(wù)車上得以實(shí)現(xiàn),相信不久的將來(lái),該套系統(tǒng)將會(huì)得到廣泛應(yīng)用。