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