在車載控制器測試中,CAPL是常用的總線測試腳本之一,今天來簡單梳理一下常用的一些語法。
1.定時(shí)器 首先肯定是定時(shí)器了,在編寫CAPL腳本中,使用的頻率很高,比如我們需要周期性的發(fā)送CAN報(bào)文,或者周期性的檢測某個(gè)系統(tǒng)變量的變化時(shí)就需要用到定時(shí)器。 使用定時(shí)器的第一步就是申明定時(shí)器,如下。
msTimer msTimer50; //聲明了一個(gè)ms定時(shí)器; timer sTimer1; //聲明了一個(gè)為s定時(shí)器;
申明完后,就需要設(shè)置定時(shí)器。 setTimer(msTimer50,50);//設(shè)置定時(shí)器msTimer50的時(shí)間為50ms; setTimerCyclic(sTimer1,1);//設(shè)置定時(shí)器sTimer1為1s為周期的循環(huán)定時(shí)器;
在這些都做完之后,可以設(shè)計(jì)定時(shí)器到時(shí)之后,需要執(zhí)行的操作了,以msTimer50為例。 on timer msTimer50 { ....... }
2.信息的發(fā)送操作 CAN報(bào)文操作,是我們常用的之一,下面就以CAN報(bào)文的發(fā)送操作為示例。這里如果在CANOE工程中添加了dbc文件,則可以直接通過dbc來定義message。 message Msg;//聲明一個(gè)message; Msg.dlc=8;//設(shè)置其DLC=8; Msg.id=0x100;//設(shè)置CAN ID=0x100; Msg.byte(0)=A5;//設(shè)置數(shù)據(jù)場的第一個(gè)字節(jié)為A5 output(Msg);//發(fā)送Msg
3.CAN錯(cuò)誤幀檢查 進(jìn)行CAN總線測試時(shí),檢查錯(cuò)誤幀是很常見的,用CAPL腳本實(shí)現(xiàn)自動檢測錯(cuò)誤幀也不困難,CAPL中有現(xiàn)成的函數(shù)接口ChkStart_ErrorFrameOccured()。 該函數(shù)一旦被調(diào)用,CANoe就會從此函數(shù)被調(diào)用時(shí)開始持續(xù)檢測總線上有沒有出現(xiàn)錯(cuò)誤幀。 dword chechId; dword numCheckEvents;
checkId=ChkStart_ErrorFrameOccured();//開始檢測錯(cuò)誤幀 TestAddCondition(checkId);//添加檢測條件,如果出現(xiàn)了錯(cuò)誤幀,則輸出報(bào)告中會記錄下來 TestWaitForTimeout(10000);//持續(xù)檢測10s checkControl_Stop(checkId);//停止檢測錯(cuò)誤幀 numCheckEvents=ChkQuery_NumEvents(checkId);//對5s內(nèi)的檢測情況進(jìn)行獲取,若函數(shù)返回0則沒有出現(xiàn)錯(cuò)誤幀
if(numCheckEvents>0) TestStepFail("Error Frames Occured");
4.添加事件信號 一般使用是某個(gè)事件發(fā)生,然后需要執(zhí)行一些動作,比如打印出錯(cuò)誤信息等。 具體做法是:在一個(gè)位置添加需要等待的事件,程序中的其他地方,如果某個(gè)事件發(fā)生了(如周期超界、錯(cuò)誤幀出現(xiàn)等),提供該事件的供應(yīng),則等待的程序段獲得了該事件,繼續(xù)執(zhí)行下面的操作。幾個(gè)核心的函數(shù)接口如下所示。 //供應(yīng)text事件,主要用于關(guān)聯(lián)事件的觸發(fā)源,以及特定的text long TestSupplyTextEvent( char aText[] ); //添加text事件 long TestJoinTextEvent(char[]aText); //等待text事件,有一個(gè)出現(xiàn)則程序執(zhí)行下一步 long TestWaitForAnyJoinedEvent(dword aTimeout); //等待text事件,所有等待事件都出現(xiàn)則程序執(zhí)行下一步 long TestWaitForAllJoinedEvents(dword aTimeout);
5.回調(diào)函數(shù) CAPL中也有類似于C語言中的回調(diào)函數(shù)的機(jī)制,如檢測報(bào)錯(cuò)誤幀的函數(shù)中就可以使用,當(dāng)總線出現(xiàn)錯(cuò)誤幀就會自動調(diào)用回調(diào)函數(shù)執(zhí)行一些操作。 ErrChkId=ChkStart_ErrorFramesOccured("Callback_ErrorFrameOccured");//檢查錯(cuò)誤幀,如果發(fā)現(xiàn)錯(cuò)誤幀就調(diào)用回調(diào)函數(shù) 回調(diào)函數(shù)設(shè)計(jì)如下: void Callback_errorFrameOccured(dword chk_id) { float t; t=timeNow()/100000.0;//記錄出現(xiàn)錯(cuò)誤幀的時(shí)間 testStep("ErrorFrame_TimeStamp","%.7f s",t);//打印事件戳 TestSupplyTextEvent("ErrorFrameOccured");//設(shè)置前面提到的事件 }
6.總線節(jié)點(diǎn)檢測 監(jiān)控總線上有沒有出現(xiàn)通訊異常的情況。需要使用函數(shù)接口ChkStart_NodeBabbling( ),例如檢測一段時(shí)間內(nèi)總線有沒有出現(xiàn)停止通訊的情況。 CheckId=ChkStart_NodeBabbling(CAN::ACAN,0);//立即開始檢查總線狀態(tài) testWaitForTimeout(5000);//延時(shí)5s ChkControl_Stop(CheckId);//停止檢測 NumberEvents=ChkQuery_NumEvents(CheckId);//如果在2s內(nèi)總線停止通訊,則NumberEvents!=0
|