呂孟恩,韓曉明,張鵬軍
(中北大學 機電工程學院,太原030051)
目前武器系統通訊仍然多采用CAN 總線,隨著對武器系統控制速率及精度要求的不斷提高,CAN總線逐漸顯現出不足,如:總線通信速率在系統中某些關鍵部位無法達到預期要求;傳輸模式過于簡單等。FlexRay 總線具有高傳輸效率、故障可容錯等特點,彌補了CAN 總線的不足,于是FlexRay 總線技術在火炮系統中得到應用。FlexRay 總線協議中數據段的長度為254 字節,而CAN 總線的數據段長度為13 字節,因此當火控系統中同時存在CAN 協議與FlexRay 協議時,若要實現兩種總線的通信,首先要解決數據幀格式不統一的問題。
CAN 總線使用串行通訊方式,支持分布式實時控制,工作方法有多主工作方式、非破壞仲裁技術和接收濾波3 種。它的數據幀分為標準幀和擴展幀,均由7 個位場組成,如圖1所示[1]。

圖1 CAN 2.0B 標準數據幀格式Fig.1 CAN 2.0B standard data frame format
幀起始是數據幀的起始標志,是一個顯性位;仲裁場包含了11 位的識別符和遠程發送請求位(RTR),節點根據標識符的值判斷是否接收該報文;控制場由一個4 位的數據長度代碼和2 個顯性保留位組成,DLC 長度可以作為判斷數據是否全部接收的依據;數據場中存放的是將要發送的數據,數據長度最高為8 個字節,最低可以為0 字節,由高位到低位依次發送;CRC 場包含CRC 序列和CRC界定符;應答場由應答間隙和應答界定符組成,應答間隙中的ACK 信號可以作為判斷接收器接收到的報文是否有效的依據,若接收到的報告為 “顯性”,則報文接收成功,若接收到的報告為“隱性”,則報文接收失敗[2]。
FlexRay 總線作為近年發展迅速的一種事件觸發類型的新型現場總線技術,其所具有的高實時性、高確定性、擁有容錯性等優點使FlexRay 得到廣泛應用。FlexRay 的一個通信周期由4 個部分組成,包含了靜態段、動態段、特征符號窗和網絡空閑時間[3],其中靜態段采用時分多路的信息傳輸方式,動態段采用柔性時分多路復用訪問方式。靜態段可以劃分成多個長度相同的靜態時隙分配給網絡中各節點,當所分配的時隙到來時該節點才能對數據進行收發。動態段則更加靈活的支持事件觸發。
FlexRay 的數據幀由3 個部分組成,即幀頭部分、有效數據段和幀尾部分,數據幀格式如圖2所示。其中,有效數據部分最高由254 個字節組成。在CRC 校驗中,有效數據部分的前6 個字節設為碼距,當數據長度超過248 字節時,碼距長度減小為4個字節。

圖2 FlexRay 數據幀格式Fig.2 FlexRay data frame format
FlexRay 總線協議與CAN 總線協議為兩種不同的總線協議,無法直接進行數據傳輸。為了解決FlexRay 與CAN 的通信問題,本文設計了一種基于CAN 協議和FlexRay 協議的網關,通過轉換數據結構實現信息交互調度。兩種協議的對比關系如表1所示。

表1 FlexRay 協議與CAN 協議對比關系表Tab.1 Comparison of FlexRay protocol and CAN protocol
本網關通過對FlexRay 總線和CAN 總線中的數據幀進行拆分,然后再將拆分后的數據在網關中進行重組,按需求發送至FlexRay 目標節點或者CAN 目標節點,達到數據在兩種總線之間傳輸的目的,實現總線之間的互相通信。網關系統結構框圖如圖3所示。

圖3 網關系統結構框圖Fig.3 Gateway system structure diagram
網關核心單元采用16 位微控制器MC9S12XF512,該控制器同時集成了CAN 總線單元和FlexRay 總線單元,其中FlexRay 總線驅動器選用TJA1080 芯片,該通訊控制器可以實現物理總線與FlexRay 總線之間的通訊。同時,該芯片可以讓FlexRay 網絡具有差分發送和差分接收的功能,單通道通訊速率可達到10 Mbps,極大地提高了系統的數據傳輸速率。CAN 信號收發器選用TJA1050 芯片,該芯片實現了物理總線與CAN 總線之間的通信,使CAN 總線具備了差動接收和差動發送的功能。TJA1050 將輸出信號的CAN_H 與CAN_L 進行耦合,增強了信號的抗電磁干擾能力,即使周圍存在較大的電磁輻射,網關仍具有優秀的差動接收能力[4]。
CAN 總線與FlexRay 總線屬于兩種不同的總線協議,所以在設計兩種總線子網時存在一定差別。當信號在兩種網絡之間的相互傳輸時,網關首先接收來自目標節點上的數據,然后對數據進行拆分、緩存和重裝,實現格式的轉換。最后,將重裝之后的報文放在另一個總線網絡中,面向目標節點進行傳輸。FlexRay-CAN 網關的軟件結構主要由FlexRay信號接收中斷、FlexRay 信號接收循環隊列、FlexRay信號接收處理任務、CAN 信號發送循環隊列、CAN信號發送任務和中斷處理任務等功能組成,實現消息在不同總線協議之間的轉換和傳輸。網關軟件結構如圖4所示。

圖4 FlexRay-CAN 網關軟件架構Fig.4 FlexRay-CAN gateway software architecture
當需要在FlexRay 子網中路由消息時,FlexRay-CAN 網關生成一個中斷,中斷處理子程序接收要轉發的消息,并將該消息從接收緩沖區發送到FlexRay 子網的報文接收隊列中,然后網關通過在FRtoCAN 網關路由表中查找需要發送的FlexRay 報文所映射的信息,將FlexRay 報文接收隊列中的消息發送至CAN 子網的發送緩沖區中。由于FlexRay數據段的長度約為CAN 的19 倍,所以在將數據從FlexRay 子網傳輸到CAN 子網時,需要對FlexRay報文進行拆分,將其分割成CAN 子網的目標節點能夠接收的報文格式,該過程采用雙緩沖區結構以保證數據的完整性[5]。
當火炮系統接收FlexRay 報文時,依據FRtoCAN路由表將報文的數據復制到目標節點,流程如圖5所示。
在一個通信周期的靜態段發送報文時,一般用槽標號表示FlexRay 報文標號。當FlexRay 執行數據接收處理任務時,為防止信息緩存器中的內容在數據接收處理的過程中改變,首先需要將信息緩存器進行鎖存,等待接收處理任務完成之后再將其釋放。由于FlexRay 報文中數據量大于CAN 報文的數據量,所以將FlexRay 報文存儲在雙緩沖區結構中,優化CAN 報文的發送處理任務[6]。
在雙緩沖區結構中,主緩沖區和從緩沖區狀態的切換與所有與雙緩沖區相關的CAN 報文發送都基于2 個條件:一是讀操作在CAN 報文數據緩沖區的狀態標志位信息,二是狀態切換使能標志位在主從緩沖區的狀態信息。緩沖區中的屬性描述表以及索引號決定了CAN 報文的發送任務是否順利完成。CAN 報文發送任務流程如圖6所示。

圖5 FlexRay 報文接收任務流程Fig.5 FlexRay message receiving task flow chart
在雙緩沖區結構中,從緩沖區的寫操作和主緩沖區的讀操作分別只能發生在FRtoCAN 網關處于報文接收處理任務階段和CAN 報文發送任務階段,通過交換主從緩沖區的基地址可以實現主從緩沖區狀態切換。FlexRay-CAN 網關中存在的制約條件避免了搶占式調度現象的發生。該性質避免了主從緩沖區的狀態切換動作發生在資源臨界區或者中斷臨界區中,從而極大地提高了主從緩沖區的基地址交換效率[7]。
對于在FlexRay-CAN 網關中轉發的報文主要分為2 種:一種是“上行數據”,指的是將CAN 網絡中的報文發送到FlexRay 網絡中;另一種是“下行數據”,指的是將FlexRay 網絡中報文發送到CAN 網絡中。上行數據和下行數據的轉換方法基本一致,本文主要解決數據在發送時存在的數據幀不兼容和消息調度的問題。

圖6 CAN 報文發送流程Fig.6 Flow chart of CAN message sending
通過對CAN 數據幀和FlexRay 數據幀的分析,決定在進行數據轉換時采用多消息幀打包的方法。在數據發送之前,將CAN 網關的數據發送隊列的前M 個有效數據幀進行整合,存儲在FlexRay 幀的有效數據段內,使其轉換成符合FlexRay 數據幀的格式。CAN 總線的消息幀包括仲裁域、控制域和數據域,數據長度最大為13 個字節,而FlexRay 的有效數據段為0~254 個字節,所以M 的取值范圍應該為1≤M≤19。
對于消息調度的轉發,本文采用了多隊列混合優先級調度方式,如圖7所示。在數據隊列內部采用最早截止期優先(earliest deadline first,EDF)算法,每兩個隊列之間采用改進加權輪轉調度(weighted roundRobin,WRR)算法。

圖7 消息調度示意圖Fig.7 Message scheduling diagram
CAN 子網所傳輸的消息中,從實時角度考慮可以分為三類:軟實時消息、硬實時消息和非實時消息,依據這三類分別設置三個獨立隊列。對三個隊列內的CAN 消息采用EDF 算法進行優先級調度排序,以滿足網絡中消息傳輸的實時性要求[8]。對于三個隊列之間的調度采用WRR 算法,該算法首先給三個隊列分別賦予不同的權值,然后再輪巡處理各隊列之間的數據。所賦予的權值大小決定了隊列消息的發送順序。高權值會優先處理,一般將對實時性要求較高的信息存儲在高權值的隊列中,因此會導致高權值隊列一直占用CPU,存儲在低權值隊列中的非實時性數據短時間內不能及時發送,增加了系統的負擔,影響數據的實時性。為解決系統的實時性和公平性問題,在各隊列之間采用基于閾值的動態權值改進加權輪轉調度(WRR)算法。
在一個循環周期內,動態權值對隊列服務的次數與權值相對應。Z1、Z2、Z3分別為硬實時隊列權值、軟實時隊列權值和非實時隊列權值,且Z1>Z2>Z3,輪轉次數為i,在非實時隊列的緩沖區中,非實時數據所占的比例為K,閾值M 為一個固定百分數,其值小于1。具體算法過程如下:
步驟1初始化賦予Z1=a;Z2=b,Z3=c;a>b,a、b、c 均為整數;輪轉次數i=1;
步驟2按數據隊列的優先級對CAN 報文進行分類,然后送入不同的隊列,在隊列內部按照最早截止期優先算法進行排序;
步驟3在輪巡過程中有如下規定:若i≤a,對硬實時隊列的數據組包發送;若i≤b,對軟實時隊列的數據組包發送;若i≤c,對非實時隊列的數據包發送。如果此時K≥M,則c=c+1,則返回步驟2,且i=i+1,直到i>a 時,一個完整的輪巡周期結束,此時返回步驟1。
在初始化時,從硬實時隊列消息的發送優先級方面考慮,令硬實時隊列的權值大于非實時隊列權值和軟實時隊列權值,保證了硬實時隊列的消息優先發送,但由此會導致某一時刻實時隊列發送的消息較多,非實時隊列中的消息不能及時發送,數據大量聚集,造成消息的阻塞延遲。為了改善這一狀況,將非實時隊列的權值設為動態權值,根據當前隊列中非實時消息所占的比例,當非實時隊列權值超過設定值大小時,動態權值權值大小加1。這樣在保證硬實時消息的發送優先級的同時可以改善實時隊列中的消息長時間占用CPU 的情況[9]。
如果三個隊列中同時存在需要被處理的數據幀時,在每個隊列中選取前X 個數據幀打包發送;如果數據幀數量小于X,則可以直接發送;如果某一隊列中沒有數據幀,則不對該隊列進行任何處理,直接開始對下一個隊列進行操作。
FlexRay 總線具有數據量大、通信速率快等優點,在未來應用于火炮系統是大勢所趨。本文通過分析CAN 總線與FlexRay 總線的數據幀結構,對數據幀進行拆分重組,設計了一種可以實現兩者數據轉換的網關,解決了兩種總線的通信問題,各隊列之間采用基于閾值的動態權值改進加權輪轉調度算法提高了火炮系統的信號傳輸速率和穩定性,對提高火控系統的響應速度有著深刻意義。