李繼武
(南京城市職業(yè)學院智能工程學院,江蘇南京 210000)
CAN(Controller Area Network)即控制器局域網,是由德國Bosch公司為監(jiān)測和控制汽車而開發(fā)的一種網絡總線技術[1]。CAN總線采用時間觸發(fā)協(xié)議,在消息傳輸中采用無破壞性的基于優(yōu)先權的仲裁機制,確保了數據的完整性和安全性[2]。CAN總線傳輸速度快、可靠性高,得到汽車主機廠和供應商的大力支持,已經成為最有前途的現(xiàn)場總線技術之一[3]。
汽車空調系統(tǒng)是現(xiàn)代汽車的基本組成部分,隨著智能控制技術的進步,利用CAN總線技術控制空調的制冷、加熱、通風和內外循環(huán)等功能越來越方便[4]。
CAN總線技術課程是新能源汽車技術專業(yè)核心課程,從教學實訓和人才崗位需求考慮,讓學生掌握CAN總線工作原理和CAN報文的數據解析過程是實訓教學的重點[5]。但是由于CAN總線技術理解起來比較抽象,使用萬用表或示波器檢測到的CAN信號僅僅是數字或波形,要正確理解CAN信號背后的含義難度比較大[6]。
本文作者設計了一款CAN總線教學平臺,利用CAN總線技術控制電動汽車空調實現(xiàn)“自動”“關閉”“A/C”等12項功能,直觀演示了CAN總線技術工作原理和CAN報文解析過程,在提高CAN總線技術實訓課程教學質量方面有一定的應用和推廣價值。
文中測試用車為2019年上市的比亞迪E5出行版純電動汽車,工信部純電續(xù)航里程405 km,電池能量51.2 kWh,前置永磁同步單電機,單速變速箱,10.922 cm(4.3英寸)液晶儀表,自動空調。
通過USB-CAN接口卡,PC機可以方便連接至汽車CAN總線網絡。測試用USB-CAN接口卡為廣成科技公司生產的USBCAN-II S V502型,該接口卡集成兩路CAN總線接口,使用鳳凰端子接線方式,支持CAN2.0A/CAN2.0B幀格式,符合ISO/DIS11898規(guī)范,通信波特率在5 kb/s~1 Mb/s 之間可任意編程,使用USB總線電源供電,CAN總線接口采用電氣隔離,隔離模塊絕緣電壓直流1 500 V,最高接收數據流量為14 000幀/s,支持Windows操作系統(tǒng),工作溫度范圍為-20~70 ℃[7]。
比亞迪 E5 CAN總線網絡有4種:啟動網CAN(125 kb/s)、舒適網CAN(125 kb/s)、動力網CAN(250 kb/s)和ESC網CAN(500 kb/s)。接線方法如圖1所示。
圖1 USB-CAN接線方法
由于各個網絡之間速率不同,相互通信需要一個中間設備網關控制器進行轉發(fā)[8]。空調系統(tǒng)屬于舒適網CAN,比亞迪E5網關控制器ECU的7、8號引腳為舒適網CAN接出引腳,其中7號引腳為CANH,8號引腳為CANL。PC機通過USB-CAN接口卡的鳳凰端子連接到網關控制器的7、8號引腳上即可接入汽車舒適CAN網絡。
比亞迪E5汽車空調面板有12個按鍵,各按鍵的具體功能如表1所示。軟件功能按照比亞迪E5空調面板視圖設計。
表1 比亞迪E5自動空調12個按鍵功能說明
空調面板視圖可以作為軟件界面,每個按鍵設計成軟件按鈕,單擊不同按鈕模擬按下不同按鍵,同時發(fā)送CAN命令給空調,以啟動空調的相應功能,軟件界面如圖2所示。
圖2 軟件界面
軟件開發(fā)平臺選擇Microsoft Visual Studio Enterprise 2015,編程語言使用C#,CAN分析儀測試調試工具使用CANTest軟件。
USB-CAN接口卡在收發(fā)數據之前,要依次執(zhí)行3個操作:打開設備、初始化設備和啟動設備。
打開USB-CAN接口卡需要使用DLL庫中的OpenDevice函數,其原型如下:
DWORD__stdcall OpenDevice(DWORD DevType,
DWORD DevIndex,DWORD Reserved);
其中DevType表示設備類型,USBCAN I型為3,USBCAN II型為4;DevIndex表示設備索引,如果只有一個設備,索引為0,如果有兩個設備可以為0或1;Reserved為保留參數,未使用。返回值為1表示操作成功,0表示操作失敗。
初始化USB-CAN接口卡,就是配置其5個參數:驗收碼、屏蔽碼、波特率、濾波使能和模式。
(1)驗收碼
USB-CAN接口卡有4個驗收代碼寄存器ACR0、ACR1、ACR2和ACR3,其中高字節(jié)對應ACR0,低字節(jié)對應ACR3,寄存器格式如表2所示。
表2 驗收代碼寄存器ACR
(2)屏蔽碼
USB-CAN接口卡有4個驗收屏蔽寄存器AMR0、AMR1、AMR2和AMR3,其中高字節(jié)對應AMR0,低字節(jié)對應AMR3,寄存器格式如表3所示。
驗收濾波器由驗收代碼寄存器ACR和驗收屏蔽寄存器定義,每一位驗收屏蔽位分別對應每一位驗收代碼,當該位驗收屏蔽位為1時,接收的相應幀ID位無論是否和相應的驗收代碼位相同均會表示為接收;當驗收屏蔽位為0時,只有相應的幀ID位和相應的驗收代碼位值相同的情況才會表示為接收。只有在所有的位都表示接收的時候,CAN控制器才會接收該報文[9]。
(3)波特率
USB-CAN接口卡使用定時器0和定時器1設置通信波特率,電動汽車空調CAN總線屬于舒適CAN,波特率為125 kb/s,USB-CAN接口卡的定時器0設置為0x03,定時器1設置為0x1C。
(4)濾波使能
該屬性為0表示“不使能”,1表示“使能”,此處應設置為1。
(5)模式
USB-CAN接口卡有兩種工作模式,0表示正常模式,1表示只聽模式,此處設置為0。
初始化USB-CAN接口卡時,上述5個參數封裝入如下INIT_CONFIG結構體:
public struct INIT_CONFIG
{
public uint AccCode;//驗收碼
public uint AccMask;//屏蔽碼
public byte Timing0;//定時器0
public byte Timing1;//定時器1
public byte Filter;//濾波使能
public byte Mode;//模式
public uint Reserved;//系統(tǒng)保留
}
初始化USB-CAN接口卡調用InitCan函數,原型如下:
DWORD__stdcall InitCan(DWORD DevType,DWORD
DevIndex,DWORD CANIndex,P_INIT_CONFIG pInitConfig);
其中DevType和DevIndex參數與OpenDevice函數相同,CANIndex表示第幾路CAN,即對應接口卡的CAN通道號。返回值1表示操作成功,0表示操作失敗[10]。
打開的USB-CAN設備經過參數初始化后,即可啟動某一個CAN通道以發(fā)送或接收CAN數據,啟動函數為StartCAN,其原型如下:
DWORD__stdcall StartCAN(DWORD DevType,DWORD
DevIndex,DWORD CANIndex);
其中DevType、DevIndex和CANIndex與InitCan函數相同。返回值為1表示操作成功,0表示操作失敗。
標準數據幀11個字節(jié),前3個字節(jié)為幀描述,后8個字節(jié)為幀數據,如表4所示。
表4 標準數據幀
字節(jié)1為幀信息,第7位(FF)表示幀格式,F(xiàn)F為0表示標準幀,F(xiàn)F為1表示擴展幀;第6位(RTR)表示幀類型,RTR為0表示數據幀,RTR為1表示遠程幀;DLC表示在數據幀時實際的數據長度。字節(jié)2和字節(jié)3為報文識別碼,其高11位有效。字節(jié)4—11為數據幀的實際數據,遠程幀時無效。
針對標準數據幀格式,定義一個幀結構體如下:
typedef struct_CAN_OBJ {
UINT ID;//幀識別碼
UINT TimeStamp;//接收到信息幀時的時間標識,從CAN控制器初始化開始計時
BYTE TimeFlag;//是否使用時間標識,為1時TimeStamp有效
BYTE SendType;//發(fā)送幀類型:0表示正常發(fā)送,1表示單次發(fā)送
BYTE RemoteFlag;//幀類型:0表示數據幀,1表示為遠程幀
BYTE ExternFlag;//幀格式:0表示標準幀,1表示擴展幀
BYTE DataLen;//數據長度DLC(≤8)
BYTE Data[8];//CAN報文的數據
BYTE Reserved[3];//系統(tǒng)保留
} CAN_OBJ,*P_CAN_OBJ;
其中TimeStamp和TimeFlag只在此幀為接收幀時有意義,SendType只在此幀為發(fā)送幀時有意義。CAN_OBJ結構體中,ID和Data這兩個參數最重要,以比亞迪E5汽車的空調CAN為例,ID為空調CAN總線的標識碼,Data為控制空調的CAN命令(發(fā)送時)或當前空調狀態(tài)信息(接收時)。
文中使用C#語言結合ECAN動態(tài)鏈接庫完成CAN數據的收發(fā)。發(fā)送CAN數據,ECAN庫提供了Transmit函數,其原型如下:
ULONG__stdcall Transmit(DWORD DevType,DWORD
DevIndex,DWORD CANIndex,P_CAN_OBJ pSend,ULONG Len);
其中DevType、DevIndex和CANIndex 3個參數同InitCan函數相同,pSend表示要發(fā)送的數據幀數組的首指針,Len表示要發(fā)送的數據幀數組的長度,返回值返回實際發(fā)送的幀數。
發(fā)送CAN數據的程序流程如圖3所示。
圖3 發(fā)送CAN數據流程
接收CAN數據即從指定的設備CAN通道的緩沖區(qū)里讀取數據,ECAN庫提供了Receive函數,原型如下:
ULONG__stdcall Receive(DWORD DevType,DWORD
DevIndex,DWORD CANIndex,P_CAN_OBJ pReceive,ULONG Len,INT WaitTime=-1);
其中DevType、DevIndex和CANIndex 3個參數與Transmit函數的相同,pReceive表示用來接收的數據幀數組的首指針,Len表示用來接收的數據幀數組的長度,WaitTime表示等待超時時間,單位為ms。返回值返回實際讀取到的幀數,如果返回值為0xFFFFFFFF,則表示讀取數據失敗,有錯誤發(fā)生,可調用ReadErrInfo函數來獲取錯誤碼。接收CAN數據的流程如圖4所示。
圖4 接收CAN數據流程
啟動程序,進入舒適CAN,選擇空調系統(tǒng),單擊“自動”按鈕,一條CAN命令通過USK-CAN接口卡,經網關控制器發(fā)送給空調,空調啟動進入“自動”模式,界面如圖5所示。查看汽車發(fā)現(xiàn)空調已經啟動,空調面板上的“自動”、“A/C”和“內外循環(huán)”3個按鍵均已點亮。
圖5 程序運行界面
(1)利用C#語言和ECAN動態(tài)鏈接庫設計的電動汽車空調控制教學軟件,可以通過USB-CAN接口卡向自動空調發(fā)送CAN命令,實現(xiàn)空調各項控制功能;
(2)通過軟件演示可以直觀掌握CAN總線基本工作原理和CAN通信協(xié)議解析過程,有效降低CAN網絡課程實訓教學難度,有利于提高教學質量;
(3)系統(tǒng)運行穩(wěn)定可靠、操作簡單、演示直觀,既可以應用在CAN網絡課程實訓教學場合,也可以稍加改進后應用在汽車CAN網絡故障診斷分析場合。