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