李繼武
(南京城市職業(yè)學(xué)院智能工程學(xué)院,江蘇 南京 211200)
CAN總線(xiàn)技術(shù)課程是新能源汽車(chē)專(zhuān)業(yè)核心課程,承擔(dān)著培養(yǎng)學(xué)生適應(yīng)崗位需求,提高應(yīng)用能力的重任,而以培養(yǎng)應(yīng)用能力為核心改革實(shí)訓(xùn)教學(xué),是高職院校人才培養(yǎng)工作內(nèi)涵式發(fā)展的主要努力方向。高職院校新能源汽車(chē)專(zhuān)業(yè)目前在講授新能源汽車(chē)CAN總線(xiàn)技術(shù)課程時(shí)主要依賴(lài)于CAN網(wǎng)絡(luò)硬件實(shí)訓(xùn)臺(tái)架,這種臺(tái)架通常只是將汽車(chē)上的相關(guān)CAN網(wǎng)絡(luò)設(shè)備拆解下來(lái),再組裝到一個(gè)工作臺(tái)上,通上電后可以測(cè)量CAN網(wǎng)絡(luò)電壓和波形。停留在這個(gè)層次上的實(shí)訓(xùn)臺(tái)架,只能滿(mǎn)足低層次認(rèn)知實(shí)訓(xùn),無(wú)法勝任高職教育創(chuàng)新創(chuàng)業(yè)的高層次需求[1]。汽車(chē)CAN總線(xiàn)技術(shù)課程是汽車(chē)技術(shù)、通信技術(shù)和計(jì)算機(jī)軟硬件技術(shù)結(jié)合的課程,從崗位人才需求角度考慮,學(xué)生不僅需要掌握汽車(chē)技術(shù)和CAN總線(xiàn)技術(shù),還需要從軟件開(kāi)發(fā)的角度入手,掌握CAN數(shù)據(jù)報(bào)文幀的截獲破解方法、報(bào)文幀的收發(fā)過(guò)程以及控制設(shè)備的原理。
本文設(shè)計(jì)了一款CAN總線(xiàn)教學(xué)平臺(tái)軟件,它利用USBCAN接口卡接入某純電動(dòng)汽車(chē)的CAN網(wǎng)絡(luò),通過(guò)配置濾波器和波特率等參數(shù),可以截獲破解舒適網(wǎng)、動(dòng)力網(wǎng)等CAN數(shù)據(jù)。根據(jù)破解的CAN數(shù)據(jù),平臺(tái)實(shí)現(xiàn)了自動(dòng)空調(diào)、組合開(kāi)關(guān)、雨刮開(kāi)關(guān)、背光調(diào)節(jié)等設(shè)備的CAN命令控制模塊。實(shí)踐表明,利用本平臺(tái)軟件開(kāi)展CAN總線(xiàn)技術(shù)課程實(shí)訓(xùn)教學(xué),有效提高了學(xué)生的應(yīng)用能力。作為創(chuàng)新教育和專(zhuān)業(yè)教育相結(jié)合的產(chǎn)品,以平臺(tái)軟件為核心搭建的工作坊為本專(zhuān)業(yè)學(xué)生開(kāi)展創(chuàng)新創(chuàng)業(yè)實(shí)踐提供了重要的機(jī)會(huì)和可能[2]。
平臺(tái)測(cè)試用車(chē)為2019年上市的某款純電動(dòng)汽車(chē),該車(chē)工信部純電續(xù)航里程為400km,電池能量52kWh,前置永磁同步單電機(jī),單速變速器,4.3英寸液晶儀表,自動(dòng)空調(diào)。
平臺(tái)測(cè)試用新能源汽車(chē)CAN總線(xiàn)網(wǎng)絡(luò)包含3個(gè)通信子網(wǎng),分別為舒適網(wǎng)125kb/s,動(dòng)力網(wǎng)250kb/s,ESC網(wǎng)500kb/s。
新能源汽車(chē)CAN網(wǎng)絡(luò)各子網(wǎng)之間由于通信速率不同,互相之間信息交換需要由網(wǎng)關(guān)控制器進(jìn)行轉(zhuǎn)發(fā)[3]。網(wǎng)關(guān)是汽車(chē)內(nèi)部通信的核心,通過(guò)它可以實(shí)現(xiàn)各條總線(xiàn)上信息的共享、網(wǎng)絡(luò)管理和故障診斷功能[4]。各子網(wǎng)同網(wǎng)關(guān)控制器的連接關(guān)系如圖1所示。
圖1 某款純電動(dòng)汽車(chē)網(wǎng)關(guān)控制器電氣連接圖
本平臺(tái)軟件因?yàn)橐獙?duì)測(cè)試用汽車(chē)CAN網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行采樣,所以選取圖1中的①~⑥作為檢測(cè)點(diǎn),并引出采樣接口。
USB接口是一種方便、靈活、簡(jiǎn)單且即插即用的通用串行總線(xiàn),CAN總線(xiàn)可以通過(guò)USBCAN接口卡與USB接口連接從而與主機(jī)進(jìn)行高速通信。USBCAN接口卡用于在USB總線(xiàn)和CAN總線(xiàn)之間完成數(shù)據(jù)的雙向收發(fā)功能。
平臺(tái)選用的USBCAN接口卡是廣成科技公司生產(chǎn)的USBCAN-IIV502型,該接口卡使用鳳凰端子接線(xiàn)方式,具有兩路CAN總線(xiàn)接口,支持CAN2.0A/CAN2.0B幀格式,通信波特率在5kb/s至1Mb/s之間可自由設(shè)置,電源供電采用USB總線(xiàn)方式,CAN總線(xiàn)接口每秒最多接收14000幀數(shù)據(jù),支持Windows操作系統(tǒng)。
上位機(jī)PC、USBCAN接口卡和網(wǎng)關(guān)控制器三者連接關(guān)系如圖2所示。從USBCAN接口卡引出的L、H兩根CAN引線(xiàn)可以接到網(wǎng)關(guān)控制器的7和8引腳(舒適網(wǎng))或14和13引腳(ESC網(wǎng))或9和10引腳(動(dòng)力網(wǎng)),從而接入汽車(chē)CAN網(wǎng)絡(luò)。
圖2 硬件連線(xiàn)圖
程序啟動(dòng)后,首先要調(diào)用ECAN鏈接庫(kù)中的OpenDevice函數(shù)打開(kāi)USBCAN接口卡。該函數(shù)需要指定2個(gè)輸入?yún)?shù):設(shè)備類(lèi)型和設(shè)備索引。設(shè)備類(lèi)型設(shè)置為4表示USBCANⅡ類(lèi)型;設(shè)備索引設(shè)置為0表示只有1個(gè)設(shè)備。如果有2個(gè)設(shè)備,可以指定為0或1。
打開(kāi)USB-CAN接口卡后需要通過(guò)INIT_CONFIG結(jié)構(gòu)體初始化濾波器和波特率等參數(shù)。平臺(tái)采用恩智浦半導(dǎo)體生產(chǎn)的CAN總線(xiàn)控制器,型號(hào)為SJA1000,它有兩種工作模式:BasicCAN和PeliCAN。在BasicCAN模式下,SJA1000只支持接收發(fā)送標(biāo)準(zhǔn)幀格式報(bào)文;在PeliCAN模式下,SJA1000可以接收發(fā)送標(biāo)準(zhǔn)幀格式和擴(kuò)展幀格式兩種報(bào)文。通過(guò)軟件編程使用SJA1000的驗(yàn)收濾波器可以濾掉無(wú)關(guān)報(bào)文。SJA1000驗(yàn)收濾波器包含4個(gè)驗(yàn)收碼寄存器:ACR0、ACR1、ACR2和ACR3;同時(shí)它還擁有4個(gè)屏蔽碼寄存器:AMR0、AMR1、AMR2和AMR3。驗(yàn)收碼與屏蔽碼按位對(duì)應(yīng),如果屏蔽碼某位為1,則報(bào)文幀ID對(duì)應(yīng)位不參與屏蔽接收數(shù)據(jù);如果屏蔽碼某位為0,則該報(bào)文幀ID對(duì)應(yīng)位和驗(yàn)收碼對(duì)應(yīng)位相同時(shí),表示該位允許接收數(shù)據(jù);只有報(bào)文幀ID所有位都允許接收數(shù)據(jù),SJA1000控制器才會(huì)接收該報(bào)文,并將其放入接收數(shù)據(jù)緩沖區(qū)[5]。
INIT_CONFIG結(jié)構(gòu)體同濾波器相關(guān)的成員有3個(gè):Acc-Code、AccMask和Filter。其中AccCode表示驗(yàn)收碼,AccMask表示屏蔽碼,F(xiàn)ilter表示濾波使能,0表示不使能,1表示使能,只有在使能情況下,才能啟用SJA1000濾波功能。濾波器設(shè)計(jì)界面如圖3所示。
圖3 濾波器設(shè)置
設(shè)置通信波特率需要使用SJA1000控制器的2個(gè)寄存器:BTR0(總線(xiàn)定時(shí)寄存器0)和BTR1(總線(xiàn)定時(shí)寄存器1)。BTR0定義了波特率預(yù)設(shè)值(BRP)和同步跳轉(zhuǎn)寬度(SJW)的值,如表1所示。
表1 總線(xiàn)定時(shí)寄存器0
CAN總線(xiàn)時(shí)鐘周期tSCL計(jì)算公式如下:
式中:tCLK——SJA1000的晶振周期。考慮到平臺(tái)采用的晶振頻率f為16MHz,因此tCLK=1/f=1/16μs。計(jì)算樣例數(shù)據(jù)如下:
BTR1定義了每個(gè)位周期的長(zhǎng)度、采樣點(diǎn)的位置和在每個(gè)采樣點(diǎn)的采樣數(shù)目,如表2所示。
表2 總線(xiàn)定時(shí)寄存器1
SAM表示采樣數(shù)目,0表示單倍采樣;TSEG1和TSEG2決定了每一位的時(shí)鐘數(shù)目和采樣點(diǎn)位置,關(guān)于SYNCSEG、TSEG1和TSEG2,計(jì)算公式如下:
根據(jù)上述公式計(jì)算表2樣例,結(jié)果如下:
通過(guò)上面計(jì)算得到tSYNCSEG、tTSEG1和tTSEG2結(jié)果值后,可以計(jì)算出SJA1000控制器的位周期和通信波特率,公式如下:
計(jì)算SJA1000控制器的位周期和通信波特率,結(jié)果如下:
綜上,如果BTR0(總線(xiàn)定時(shí)寄存器0)設(shè)置為0x03,BTR1(總線(xiàn)定時(shí)寄存器1)設(shè)置為0x1C,計(jì)算出的SJA1000控制器通信波特率為125kb/s,其它常用波特率設(shè)置情況如表3所示。
表3 SJA1000控制器常用CAN通信波特率設(shè)置
初始化USB-CAN接口卡參數(shù)后,需要調(diào)用StartCAN函數(shù)打開(kāi)該接口卡的某個(gè)CAN通道。如果有多個(gè)CAN通道,每次調(diào)用都要指定要使用的CAN通道號(hào)。
USB-CAN接口卡某個(gè)CAN通道打開(kāi)后,即可開(kāi)始接收CAN數(shù)據(jù)。由于接收CAN數(shù)據(jù)過(guò)程是一個(gè)耗時(shí)操作,可能導(dǎo)致用戶(hù)界面停止響應(yīng),為了提高程序響應(yīng)性,使用戶(hù)界面及時(shí)刷新CAN數(shù)據(jù),本平臺(tái)設(shè)計(jì)了一個(gè)“后臺(tái)耗時(shí)+通信更新”方案,即開(kāi)啟一個(gè)后臺(tái)獨(dú)立線(xiàn)程完成接收CAN數(shù)據(jù)的耗時(shí)操作,然后通過(guò)線(xiàn)程間事件通信,完成用戶(hù)界面更新操作。
2.4.1 程序核心設(shè)計(jì)方案
使用BackgroundWorker對(duì)象開(kāi)啟單獨(dú)線(xiàn)程完成耗時(shí)操作并及時(shí)響應(yīng)更新用戶(hù)界面,需要按照下面步驟進(jìn)行設(shè)計(jì)。
1)創(chuàng)建一個(gè)BackgroundWorker對(duì)象。BackgroundWorker對(duì)象屬于System.ComponentModel命名空間,它是完成本方案的核心對(duì)象。
2)訂閱BackgroundWorker對(duì)象的3個(gè)事件:DoWork事件、ProgressChanged事件和RunWorkerCompleted事件。
DoWork事件用于執(zhí)行耗時(shí)操作,耗時(shí)期間需要不斷輪詢(xún)CancellationPending屬性,其值一旦為true,則中止耗時(shí)操作。
ProgressChanged事件用于接收耗時(shí)操作的計(jì)算結(jié)果并實(shí)時(shí)更新用戶(hù)界面,事件處理程序的第2個(gè)參數(shù),其類(lèi)型為ProgressChangedEventArgs,它有一個(gè)UserState屬性,是后臺(tái)線(xiàn)程向本事件傳遞進(jìn)度數(shù)據(jù)的媒介。
RunWorkerCompleted事件在后臺(tái)耗時(shí)操作已完成、被取消或引發(fā)異常時(shí)觸發(fā)。判斷哪個(gè)原因觸發(fā)了該事件需要根據(jù)第2個(gè)參數(shù),其類(lèi)型是RunWorkerCompletedEventArgs,它有Cancelled、Error和Result三個(gè)屬性,如果耗時(shí)操作中途取消,則Cancelled屬性為true;如果發(fā)生異常,則Error屬性指明發(fā)生了哪種錯(cuò)誤;如果既沒(méi)中途取消,又沒(méi)發(fā)生異常,則可通過(guò)Result屬性獲得耗時(shí)操作結(jié)果。
3)啟動(dòng)后臺(tái)線(xiàn)程。調(diào)用BackgroundWorker對(duì)象的RunWorkerAsync方法將觸發(fā)DoWork事件,啟動(dòng)后臺(tái)線(xiàn)程開(kāi)始執(zhí)行耗時(shí)工作。
2.4.2 程序核心代碼
整個(gè)程序最核心部分是后臺(tái)線(xiàn)程接收CAN數(shù)據(jù)的耗時(shí)操作,其代碼如下(部分):
上述代碼中,CAN_OBJ作為結(jié)構(gòu)體類(lèi)型代表幀的數(shù)據(jù)結(jié)構(gòu)。Transmit發(fā)送函數(shù)和Receive接收函數(shù)使用CAN_OBJ結(jié)構(gòu)體來(lái)傳送CAN信息幀。Receive函數(shù)從指定的設(shè)備CAN通道的緩沖區(qū)里讀取數(shù)據(jù),函數(shù)原型如下:
上述參數(shù)中,pReceive參數(shù)是一個(gè)指針變量,表示用來(lái)接收的數(shù)據(jù)幀數(shù)組。根據(jù)本方案設(shè)計(jì)的程序,接收CAN數(shù)據(jù)界面如圖4所示。
圖4 接收CAN數(shù)據(jù)界面
發(fā)送CAN數(shù)據(jù)需要調(diào)用ECAN鏈接庫(kù)中的Transmit函數(shù),其原型如下:
上述參數(shù)中,pSend參數(shù)是一個(gè)指針類(lèi)型,表示要發(fā)送的數(shù)據(jù)幀數(shù)組,Len參數(shù)是一個(gè)整數(shù)類(lèi)型,表示要發(fā)送的數(shù)據(jù)幀數(shù)組的長(zhǎng)度。函數(shù)成功調(diào)用后,返回實(shí)際發(fā)送的幀數(shù)。發(fā)送CAN數(shù)據(jù)的界面如圖5所示。
圖5 發(fā)送CAN數(shù)據(jù)界面
以2019款某純電動(dòng)汽車(chē)的“雨刮洗滌”部件為研究對(duì)象,運(yùn)行本實(shí)訓(xùn)平臺(tái)軟件,檢測(cè)出CAN命令如表4所示。
表4 某純電動(dòng)汽車(chē)“雨刮洗滌”部件CAN命令測(cè)試結(jié)果
根據(jù)檢測(cè)結(jié)果,進(jìn)一步開(kāi)發(fā)“雨刮洗滌”功能模塊,程序運(yùn)行界面如圖6所示。
圖6 某純電動(dòng)汽車(chē)“雨刮洗滌”部件CAN命令控制模塊
任選一種“雨刮”工作模式,雙擊即可發(fā)送CAN命令控制雨刮工作。實(shí)際測(cè)試表明,CAN命令發(fā)出后,汽車(chē)雨刮即可按照指定模式工作。
1)本文搭建了“上位機(jī)PC+USBCAN設(shè)備+汽車(chē)網(wǎng)關(guān)控制器”硬件環(huán)境,設(shè)計(jì)開(kāi)發(fā)了一款新能源汽車(chē)CAN總線(xiàn)實(shí)訓(xùn)教學(xué)軟件平臺(tái),通過(guò)該平臺(tái)可以接收、分析新能源汽車(chē)CAN總線(xiàn)數(shù)據(jù),并向新能源汽車(chē)發(fā)送CAN命令,同時(shí)以某款純電動(dòng)汽車(chē)為例,開(kāi)發(fā)了自動(dòng)空調(diào)、組合開(kāi)關(guān)和雨刮開(kāi)關(guān)等部件的CAN命令控制模塊。
2)本文設(shè)計(jì)的實(shí)訓(xùn)平臺(tái)彌補(bǔ)了各高校在用的CAN網(wǎng)絡(luò)實(shí)訓(xùn)平臺(tái)的不足,演示直觀,控制邏輯清晰,提高學(xué)生崗位應(yīng)用能力效果明顯。
3)通過(guò)本文設(shè)計(jì)的實(shí)訓(xùn)平臺(tái)可建立專(zhuān)業(yè)工作坊,為大學(xué)生創(chuàng)新創(chuàng)業(yè)教育提供一個(gè)切實(shí)可行的途徑。
4)本文設(shè)計(jì)的實(shí)訓(xùn)平臺(tái)后續(xù)可持續(xù)拓展不同車(chē)型,以豐富平臺(tái)功能,增加實(shí)訓(xùn)教學(xué)應(yīng)用場(chǎng)景,模擬企業(yè)真實(shí)環(huán)境,提高人才培養(yǎng)質(zhì)量和就業(yè)競(jìng)爭(zhēng)力。