李桂偉,丁健,蔡永祥
(中汽研(天津)汽車工程研究院有限公司,天津 300300)
CAN總線是一種串行總線通信協(xié)議,目前在汽車的電子控制單元中應(yīng)用十分廣泛,能夠有效實(shí)現(xiàn)汽車上不同控制器之間的數(shù)據(jù)交互。CANoe軟件是德國(guó)Vector公司推出的一款專業(yè)CAN/LIN等總線網(wǎng)絡(luò)開(kāi)發(fā)和測(cè)試軟件,利用該軟件可以實(shí)現(xiàn)整車的網(wǎng)絡(luò)建模、仿真和測(cè)試等工作。目前CANoe軟件已在汽車行業(yè)內(nèi)廣泛使用。CAPL(CAN Access Programming Language)語(yǔ)言是CANoe軟件自帶的一種類C編程語(yǔ)言,使用CAPL語(yǔ)言能夠擴(kuò)展CANoe軟件功能,實(shí)現(xiàn)對(duì)軟件功能的二次開(kāi)發(fā)。
本文針對(duì)于控制器功能邏輯驗(yàn)證中CAN總線網(wǎng)絡(luò)仿真需求,利用CANoe軟件的CAPL編程語(yǔ)言結(jié)合Interaction Layer(以下簡(jiǎn)稱IL)交互層的方式,搭建整車總線網(wǎng)絡(luò)仿真模型,幫助測(cè)試人員更快速更高效地完成整車不同控制器的功能邏輯驗(yàn)證工作。
控制器功能邏輯驗(yàn)證處于整車開(kāi)發(fā)V模型的右邊,主要包括了硬件在環(huán)測(cè)試、黃板車臺(tái)架測(cè)試、實(shí)車測(cè)試等(圖1)。在功能邏輯驗(yàn)證中對(duì)于不同的被測(cè)件,測(cè)試人員需要模擬不同的總線環(huán)境、發(fā)送事件報(bào)文、注入總線故障等,因此待開(kāi)發(fā)的網(wǎng)絡(luò)仿真模型應(yīng)同時(shí)具有以下功能。
圖1 整車開(kāi)發(fā)V模型
1)能夠快速配置總線環(huán)境,靈活切換控制器報(bào)文的發(fā)送/停止,最大程度上滿足不同被測(cè)件的總線環(huán)境要求。
2)能夠在模型運(yùn)行過(guò)程中動(dòng)態(tài)改變仿真報(bào)文的周期,滿足故障注入的測(cè)試要求。
3)網(wǎng)絡(luò)仿真模型應(yīng)具有事件報(bào)文發(fā)送能力。
4)網(wǎng)絡(luò)仿真模型應(yīng)能夠方便測(cè)試人員改變信號(hào)的信號(hào)值。
5)網(wǎng)絡(luò)仿真模型應(yīng)包含CheckSum和Rolling Counter等校驗(yàn)算法,避免因不正確的算法引入非預(yù)期的總線故障。
整車網(wǎng)絡(luò)數(shù)據(jù)庫(kù)利用CANoe軟件提供的CANdb++數(shù)據(jù)庫(kù)編輯工具結(jié)合汽車研發(fā)過(guò)程中的整車通信矩陣進(jìn)行創(chuàng)建(圖2)。在整車通信矩陣中,定義了網(wǎng)絡(luò)上所有的報(bào)文信息(報(bào)文ID、報(bào)文發(fā)送類型等)、信號(hào)信息(信號(hào)長(zhǎng)度、信號(hào)起始位、真值表等)以及報(bào)文的發(fā)送和接收節(jié)點(diǎn)。使用CANdb++編輯工具可以將整車通信矩陣在CANdb++編輯器中創(chuàng)建相應(yīng)的網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)象、報(bào)文對(duì)象、信號(hào)對(duì)象,對(duì)象創(chuàng)建完成之后,再依次建立節(jié)點(diǎn)與報(bào)文、報(bào)文與信號(hào)之間的所屬關(guān)系。
圖2 編輯網(wǎng)絡(luò)數(shù)據(jù)庫(kù)
由于搭建網(wǎng)絡(luò)仿真模型需要使用CANoe軟件IL交互層,因此在創(chuàng)建網(wǎng)絡(luò)數(shù)據(jù)庫(kù)時(shí)對(duì)數(shù)據(jù)庫(kù)的信息完整度要求較高,因此除了建立網(wǎng)絡(luò)節(jié)點(diǎn)、報(bào)文和信號(hào)等對(duì)象外,還需要為節(jié)點(diǎn)、報(bào)文和信號(hào)定義屬性,如圖3所示。為了滿足IL交互層使用要求,設(shè)置的節(jié)點(diǎn)屬性應(yīng)包括:ILUsed、NodeLayer-Modules,報(bào)文 屬性應(yīng)包括:GenMsgILSupport、GenMsgCycleTime、GenMsgSendType等。
圖3 節(jié)點(diǎn)、報(bào)文屬性設(shè)置
其中NodeLayerModules屬性定義了IL交互層使用的動(dòng)態(tài)鏈接庫(kù),即“CANoeILNLVector.dll”,該動(dòng)態(tài)鏈接庫(kù)是實(shí)現(xiàn)IL交互層報(bào)文仿真的主要部分,在CAPL程序?qū)崿F(xiàn)的邏輯控制中也會(huì)用到動(dòng)態(tài)鏈接庫(kù)中定義的函數(shù)。
CAPL程序是網(wǎng)絡(luò)仿真模型中邏輯控制的核心部分,利用系統(tǒng)變量和不同類型的CAPL事件,同時(shí)結(jié)合CANoeILNLVector.dll動(dòng)態(tài)鏈接庫(kù)提供的IL交互層控制函數(shù),共同完成CAPL程序編寫(xiě),實(shí)現(xiàn)網(wǎng)絡(luò)仿真模型邏輯控制功能。
在編寫(xiě)CAPL程序之前,首先需要?jiǎng)?chuàng)建模型需要的系統(tǒng)變量。系統(tǒng)變量搭建起控制面板和CAPL程序之間的橋梁,測(cè)試人員可以通過(guò)控制面板上關(guān)聯(lián)了系統(tǒng)變量的控件控制CAPL程序中事件程序的執(zhí)行。為了滿足邏輯驗(yàn)證對(duì)網(wǎng)絡(luò)仿真模型的功能需求,模型需要使用的系統(tǒng)變量如圖4所示,其中NODES組中定義的變量是為了實(shí)現(xiàn)節(jié)點(diǎn)報(bào)文的發(fā)送/停止功能,EventSend組中的變量實(shí)現(xiàn)事件報(bào)文控制功能,CyclicSet組、EnableCyclic組和SelectedPeriod組中的變量共同組合實(shí)現(xiàn)報(bào)文周期的動(dòng)態(tài)更改及控制功能。
圖4 創(chuàng)建系統(tǒng)變量
系統(tǒng)變量創(chuàng)建完成之后,可以利用系統(tǒng)變量、CAPL事件和IL交互層控制函數(shù)構(gòu)建仿真模型的CAPL程序。在CAPL程序中用到的主要事件是on start事件和on sysvar事件,用到 的IL交 互 層 控 制函 數(shù) 分 別為:ILDisableMsg()、ILEnableMsg()、ILSetMsgEvent()、ILFaultInjectionSetMsgCycleTime()、ILFaultInjectionResetMsgCycleTime()、ILControlStart()。以BCM節(jié)點(diǎn)為例,CAPL程序如下。
on start
{
//IL交互層控制初始化
ILControlStart();
ILDisableMsg("BCM1");
ILDisableMsg("BCM2");
}
on sysvar(IL::NODES::Enable_AllNodes|IL::NODES::Enable_BCM)
{
//控制報(bào)文發(fā)送/停止
if(@sysvar::IL::NODES::Enable_AllNodes&&@sysvar::
IL::NODES::Enable_BCM)
{
ILEnableMsg("BCM1");
ILEnableMsg("BCM2");
}
else
{
ILDisableMsg("BCM1");
}
}
on sysvar(IL::EnableCyclic::IL_BCM::BCM1|IL::SelectedPeriod::IL_BCM::BCM1|IL::CyclicSet::IL_BCM::BCM1)
{
//設(shè)置報(bào)文的發(fā)送周期
if(@sysvar::IL::EnableCyclic::IL_BCM::BCM1&&@sysvar::IL::SelectedPeriod::IL_BCM::BCM1)
{
ILFaultInjectionSetMsgCycleTime(BCM1,@sysvar::IL::CyclicSet::IL_BCM::BCM1);
}
從國(guó)內(nèi)需求端來(lái)看,根據(jù)記者調(diào)查,東北地區(qū)生產(chǎn)企業(yè)的采購(gòu)在持續(xù)進(jìn)行,大型復(fù)合肥企業(yè)的生產(chǎn)也未間斷,大型流通企業(yè)也在有節(jié)奏地進(jìn)行儲(chǔ)備。短時(shí)間來(lái)看,尿素市場(chǎng)供需平穩(wěn)。
else
{
ILFaultInjectionResetMsgCycleTime(BCM1);
}
}
on sysvar(IL::EventSend::IL_BCM::BCM1|IL::EventSend::IL_BCM::BCM2)
{
//事件報(bào)文控制
if(@sysvar::IL::EventSend::IL_BCM::BCM1==1)
ILSetMsgEvent(BCM1);
if(@sysvar::IL::EventSend::IL_BCM::BCM2==1)
ILSetMsgEvent(BCM2);
}
上述程序?qū)崿F(xiàn)了網(wǎng)絡(luò)仿真模型中BCM節(jié)點(diǎn)報(bào)文發(fā)送/停止功能、報(bào)文周期改變功能、事件報(bào)文發(fā)送功能等。對(duì)于報(bào)文中包含的Rolling Counter信號(hào)和Checksum校驗(yàn)信號(hào),為了避免引入不必要的總線故障,可以通過(guò)調(diào)用如下的兩個(gè)自定義函數(shù)實(shí)現(xiàn)Rolling Counter信號(hào)和Checksum校驗(yàn)信號(hào)的正確發(fā)送。
CLOCK_Signal(signal*sig,int Maxvalue)
{
//CLOCK函數(shù)
(getSignal(sig)==Maxvalue)?$sig=0:$sig++;
}
CRC8_Signal(signal*sig,message*msg)
{
//CRC算法函數(shù)
byte value[7];
byte crc=0xFF;
byte poly=0x1D;
int byte_flag=0,bit_flag=0,num=0;
for(num=0;num<7;num++)
{
value[num]=msg.byte(num);
}
for(byte_flag=0;byte_flag<7;byte_flag++)
{
crc^=value[byte_flag];
for(bit_flag=0;bit_flag<8;bit_flag++)
{
if(crc&0x80)
{
crc=(crc<<1)^poly;
}
else
{
crc=(crc<<1);
}
}
}
$sig=crc;
}
為方便測(cè)試人員操作,控制面板上的控件需直觀體現(xiàn)仿真模型的主要功能,例如面板上應(yīng)包括節(jié)點(diǎn)報(bào)文發(fā)送/停止控件、信號(hào)控件、報(bào)文周期更改控件等,如圖5所示。在編輯控制面板時(shí),信號(hào)對(duì)應(yīng)的控件需要與數(shù)據(jù)庫(kù)中的信號(hào)進(jìn)行關(guān)聯(lián),而控制報(bào)文發(fā)送/停止、周期更改等的控件需要與已創(chuàng)建的系統(tǒng)變量進(jìn)行關(guān)聯(lián)。通過(guò)控制面板,測(cè)試人員可以在面板上進(jìn)行勾選、設(shè)置等操作,實(shí)現(xiàn)快速便捷的仿真控制。
圖5 編輯控制面板
在網(wǎng)絡(luò)仿真模型搭建完成后,利用CANoe軟件運(yùn)行仿真模型,以驗(yàn)證仿真模型的功能是否符合功能邏輯驗(yàn)證的需要。
1)節(jié)點(diǎn)報(bào)文發(fā)送/停止控制:操作模型控制面板選擇Enable IL前面的復(fù)選框和Enable IL of Node區(qū)域內(nèi)任意網(wǎng)絡(luò)節(jié)點(diǎn)前面的復(fù)選框,可以在CANoe軟件的Trace界面上看到選擇節(jié)點(diǎn)的報(bào)文已經(jīng)正常發(fā)送,報(bào)文發(fā)送的周期與DBC數(shù)據(jù)庫(kù)中定義的周期一致,并且若該報(bào)文包含Checksum信號(hào)和Rolling counter信號(hào),可以看到信號(hào)值隨著報(bào)文的發(fā)送正確改變(圖6)。
圖6 報(bào)文發(fā)送/停止驗(yàn)證
2)報(bào)文周期動(dòng)態(tài)調(diào)整:選擇模型控制面板IL Control區(qū)域內(nèi)任意正在發(fā)送的網(wǎng)絡(luò)節(jié)點(diǎn),打開(kāi)報(bào)文周期控制面板。在控制面板上同時(shí)選擇Enable和User前面的選擇框,在報(bào)文周期輸入框中設(shè)置不同的報(bào)文周期,可以看到Trace界面上正在發(fā)送的報(bào)文的發(fā)送周期變成設(shè)置的周期值(圖7)。
圖7 測(cè)試系統(tǒng)運(yùn)行效果截圖
圖7 報(bào)文周期改變驗(yàn)證
3)信號(hào)值操作/事件報(bào)文控制:選擇TX Signals區(qū)域內(nèi)仿真發(fā)送的節(jié)點(diǎn),打開(kāi)報(bào)文控制面板,操作更改面板上任意信號(hào)的信號(hào)值,可以看到Trace界面上該報(bào)文發(fā)送的信號(hào)值按照面板上的改變值更改(圖8)。同時(shí)在控制面板上的Event Timing區(qū)域,可以找到Send Once按鈕,每點(diǎn)擊一次,可以在Trace界面上看到報(bào)文發(fā)送一次。
圖8 信號(hào)值改變/事件報(bào)文驗(yàn)證
網(wǎng)絡(luò)仿真模型在汽車功能邏輯驗(yàn)證中具有十分重要的作用,一個(gè)功能完善的仿真模型不僅能夠幫助測(cè)試工程師提高工作效率,而且可以實(shí)現(xiàn)很多手動(dòng)操作難以實(shí)現(xiàn)的功能。雖然Vector公司的CANoe軟件為用戶提供了多種仿真報(bào)文方式,例如利用CANoe軟件中的IG節(jié)點(diǎn)實(shí)現(xiàn)、CANoe軟件的IL交互層實(shí)現(xiàn)或者CAPL編程實(shí)現(xiàn),但是使用這些方式中的任何一種搭建的仿真模型要么開(kāi)發(fā)難度大,要么擴(kuò)展能力差,都有一些不足的地方存在。為了避免上述問(wèn)題,本文選擇以CAPL編程和IL交互層相結(jié)合的方式搭建網(wǎng)絡(luò)仿真模型,模型編程難度較低,開(kāi)發(fā)時(shí)間短,擴(kuò)展能力強(qiáng),并且模型操作簡(jiǎn)便,更能夠滿足現(xiàn)在測(cè)試快速迭代的要求。