潘文卿,王飛飛,宋炳雨
(濰柴動(dòng)力股份有限公司,山東 濰坊 261061)
在發(fā)動(dòng)機(jī)下線的時(shí)候,會(huì)根據(jù)發(fā)動(dòng)機(jī)的型號(hào)、適配領(lǐng)域等對(duì)于一些特殊變量進(jìn)行現(xiàn)場(chǎng)標(biāo)定,數(shù)據(jù)標(biāo)定完成后,如果統(tǒng)一按照傳統(tǒng)的UDS(UDS-Unified Diagnostic Services,統(tǒng)一診斷服務(wù))刷寫流程進(jìn)行數(shù)據(jù)的整區(qū)刷寫會(huì)耗費(fèi)較多的時(shí)間,操作步驟也相對(duì)專業(yè)化,不利于不同層級(jí)的客戶進(jìn)行操作,所以我們需要研究一種簡(jiǎn)單、快捷的操作方法,只需知道要更新變量的地址、變量的長(zhǎng)度,輸入后就可以完成單個(gè)變量的數(shù)據(jù)固化,方便操作,同時(shí)節(jié)約時(shí)間。
傳統(tǒng)UDS刷寫流程如圖1所示,在刷寫流程中擦除時(shí),是根據(jù)整個(gè)單片機(jī)的Block分區(qū)決定的,Block分區(qū)有256k、128k、64k等整塊大小,每當(dāng)擦除的時(shí)候都會(huì)整塊擦除,寫數(shù)據(jù)的時(shí)候也是整區(qū)寫入新的數(shù)據(jù)。請(qǐng)求下載過程中,上位機(jī)會(huì)傳輸要下載的起始地址、地址范圍等信息與下位機(jī)進(jìn)行校驗(yàn),校驗(yàn)通過后再進(jìn)一步傳輸數(shù)據(jù),如果跨區(qū)了或者范圍不對(duì),就會(huì)報(bào)錯(cuò),不再進(jìn)行會(huì)話流程。在新的數(shù)據(jù)刷寫完畢后,會(huì)對(duì)刷寫的新數(shù)據(jù)進(jìn)行校驗(yàn),上位機(jī)計(jì)算一個(gè)傳輸數(shù)據(jù)的校驗(yàn)和,下位機(jī)根據(jù)刷寫的范圍和長(zhǎng)度計(jì)算一個(gè)校驗(yàn)和,兩個(gè)對(duì)比,如果一致則認(rèn)為此次刷寫是成功的,可以退出刷寫流程。在此過程中的計(jì)算、校驗(yàn)、傳輸?shù)淖钚挝皇菍?duì)應(yīng)單片機(jī)Flash分區(qū)的Block塊。

圖1 傳統(tǒng)UDS刷寫流程圖
單變量刷寫的流程設(shè)計(jì)是在標(biāo)準(zhǔn)UDS刷寫流程中加入特殊的流程。如圖2所示,增加數(shù)據(jù)的上載查看功能,當(dāng)要更新數(shù)據(jù)時(shí)可以先將該權(quán)限范圍的數(shù)據(jù)上載上來查看是否需要更新,如果需要變更,根據(jù)下載流程,請(qǐng)求擦除,在擦除之前將對(duì)應(yīng)Flash中的數(shù)據(jù)先備份對(duì)應(yīng)大小的Flash備份區(qū)和一個(gè)對(duì)應(yīng)大小的RAM區(qū)中,然后再擦除,以保證在后續(xù)的操作過程中出現(xiàn)異常后數(shù)據(jù)的完整。在請(qǐng)求下載的過程中會(huì)將數(shù)據(jù)的起始地址和長(zhǎng)度傳遞給下位機(jī),下位機(jī)會(huì)根據(jù)安全校驗(yàn)的權(quán)限進(jìn)行判斷收到的地址范圍是否在權(quán)限范圍內(nèi),如果在權(quán)限范圍內(nèi)會(huì)繼續(xù)傳輸數(shù)據(jù),如果不在范圍內(nèi)存在跨權(quán)限的情況,會(huì)給出否定響應(yīng)并聲明權(quán)限不對(duì)。如果權(quán)限范圍正確,會(huì)校驗(yàn)傳輸?shù)刂肥欠翊嬖诳鐓^(qū)的問題,如果存在跨區(qū)的問題時(shí)同樣會(huì)做出否定響應(yīng)提示上位機(jī),單次傳輸數(shù)據(jù)必須傳輸同一個(gè)區(qū)的數(shù)據(jù),不能跨區(qū)、跨權(quán)限。在傳輸數(shù)據(jù)時(shí),將收到的新數(shù)據(jù)在對(duì)應(yīng)的RAM中找到相對(duì)位置更新數(shù)據(jù),傳輸完畢后,如果本區(qū)域內(nèi)還有新的數(shù)據(jù)要傳輸,則繼續(xù)接收,繼續(xù)放到RAM中對(duì)應(yīng)的位置上,如果沒有數(shù)據(jù)傳輸了,就計(jì)算RAM中的校驗(yàn)和與上位機(jī)計(jì)算的傳輸數(shù)據(jù)的校驗(yàn)和作對(duì)比,如果一致,則將RAM中的數(shù)據(jù)寫到對(duì)應(yīng)的Flash中,結(jié)束會(huì)話流程。如果不一致則反饋否定響應(yīng)告知上位機(jī)傳輸過程有問題,需要進(jìn)一步校驗(yàn)傳輸。

圖2 單變量刷寫的流程圖
下線數(shù)據(jù)權(quán)限分為發(fā)動(dòng)機(jī)廠權(quán)限、整車廠權(quán)限、服務(wù)站權(quán)限、用戶權(quán)限,權(quán)限大小依次降低,并采用向下級(jí)聯(lián)的方式。發(fā)動(dòng)機(jī)廠權(quán)限可以刷寫所有區(qū)的數(shù)據(jù),整車廠權(quán)限除了發(fā)動(dòng)機(jī)廠權(quán)限區(qū)域的數(shù)據(jù)不能刷寫,其他權(quán)限范圍的數(shù)據(jù)都可以刷寫,服務(wù)站權(quán)限只能刷寫服務(wù)站和用戶權(quán)限范圍的數(shù)據(jù),用戶權(quán)限只能刷寫用戶權(quán)限范圍內(nèi)的數(shù)據(jù)。在安全校驗(yàn)和請(qǐng)求下載步驟中都會(huì)按照權(quán)限的設(shè)置進(jìn)行校驗(yàn),如果是采用整車廠進(jìn)行安全校驗(yàn),在請(qǐng)求下載時(shí)傳輸?shù)氖前l(fā)動(dòng)機(jī)廠數(shù)據(jù)域的起始地址和長(zhǎng)度則會(huì)報(bào)出權(quán)限錯(cuò)誤,不能往下進(jìn)行刷寫,如果重新傳輸一個(gè)整車廠權(quán)限范圍內(nèi)的起始地址和長(zhǎng)度,會(huì)繼續(xù)會(huì)話刷寫流程。權(quán)限級(jí)聯(lián)圖如圖3所示。

圖3 下線數(shù)據(jù)刷寫權(quán)限級(jí)聯(lián)結(jié)構(gòu)圖
為了避免刷寫異常還需要開發(fā)一個(gè)Flash備份區(qū),當(dāng)數(shù)據(jù)請(qǐng)求在例程控制訪問時(shí)需要將對(duì)應(yīng)區(qū)域的原數(shù)據(jù)備份到Flash備份區(qū),以免在刷寫的過程中出現(xiàn)異常,導(dǎo)致新的數(shù)據(jù)沒有更新成功,原Flash區(qū)的數(shù)據(jù)又被擦掉了,導(dǎo)致控制器被刷死。在每個(gè)下線數(shù)據(jù)的Flash區(qū)的開頭都預(yù)留4字節(jié),分別存放單變量刷寫的標(biāo)志位和校驗(yàn)和結(jié)果。如果對(duì)應(yīng)的下線數(shù)據(jù)區(qū)域進(jìn)行過單變量刷寫,則在開頭2字節(jié)設(shè)定一個(gè)標(biāo)志位,在數(shù)據(jù)傳輸完畢后,例程控制-校驗(yàn)和計(jì)算環(huán)節(jié)計(jì)算出校驗(yàn)和后將檢驗(yàn)和以及單變量刷寫的標(biāo)志位一起存放在RAM區(qū)的開頭最開始4個(gè)字節(jié),最后將RAM中的數(shù)據(jù)一起寫到對(duì)應(yīng)的Flash中。
在控制器重新上電的時(shí)候會(huì)對(duì)下線數(shù)據(jù)存放的Flash區(qū)域進(jìn)行校驗(yàn),如果校驗(yàn)異常,則進(jìn)行回滾操作。單變量刷寫的異常斷電存在兩種情況:第1種是將原數(shù)據(jù)備份到備份區(qū)后,原來的數(shù)據(jù)已經(jīng)擦除掉了,新數(shù)據(jù)還沒有在Flash中寫的時(shí)候,此時(shí)Flash中是空的,檢測(cè)到這種結(jié)果的時(shí)候?qū)浞輩^(qū)的數(shù)據(jù)回滾到Flash中保證控制器是可以運(yùn)行起來的;第2種情況是原數(shù)據(jù)備份到備份區(qū),擦除了Flash區(qū),新的數(shù)據(jù)開始往Flash區(qū)寫的過程中異常斷電了,這樣Flash區(qū)的開頭4個(gè)字節(jié)是有數(shù)據(jù)標(biāo)識(shí)的,校驗(yàn)一下校驗(yàn)和與Flash區(qū)的數(shù)據(jù)是否一致,如果不一致同樣將備份區(qū)的數(shù)據(jù)回滾到Flash區(qū)中以保證控制器能夠正常運(yùn)行。
如圖4所示,通過上位機(jī)傳遞一個(gè)12字節(jié)的數(shù)據(jù),完成刷寫流程后我們用調(diào)試器查看對(duì)應(yīng)的Flash區(qū)數(shù)據(jù)就是傳輸?shù)臄?shù)據(jù)。

圖4 單變量刷寫的應(yīng)用
在實(shí)際的刷寫過程中通過實(shí)際測(cè)試,單個(gè)變量刷寫的流程大約在3s左右時(shí)間即可完成,可以大大提升發(fā)動(dòng)機(jī)下線的速率。
本文設(shè)計(jì)了一種單個(gè)變量刷寫的方案,單個(gè)變量是從上位機(jī)只傳輸要更新數(shù)值的單個(gè)或者幾個(gè)變量的地址和數(shù)據(jù)長(zhǎng)度,按照刷寫權(quán)限進(jìn)行區(qū)分,最高權(quán)限的可以對(duì)所有的下級(jí)變量進(jìn)行刷寫,采用向下級(jí)聯(lián)的方式,最低權(quán)限的只能刷寫權(quán)限分區(qū)范圍內(nèi)的數(shù)據(jù)。在下位機(jī)中開發(fā)一塊對(duì)應(yīng)大小的RAM分區(qū),將要刷寫的變量所在的分區(qū)提前備份,新的數(shù)據(jù)傳輸過來后更新對(duì)應(yīng)位置的數(shù)據(jù),傳輸完成后將RAM中的數(shù)據(jù)統(tǒng)一寫到Flash中,同時(shí)需要一個(gè)Flash備份區(qū),將原有數(shù)據(jù)備份到Flash備份區(qū),以免刷寫過程中出現(xiàn)異常導(dǎo)致控制器無法使用。這種方法既可以大大減少刷寫數(shù)據(jù)的時(shí)間,提升發(fā)動(dòng)機(jī)下線的速率,又能保證下線操作的安全性。