車載測試系列:CAPL程式語言
CAPL是類似C語言的語法,案例如下:
/*@!Encoding:936*/
includes
{
}
variables
{
//The following three messages are defined for transmission
message EngineStatus EngineStat; //定義一個在DBC中message name為EngineStatus的報文變數EngineStat
message LockingRq LkCtrlRq;
message WindowRq WindowCtrl;
//The following timer is for simulating the cyclic message transmission
msTimer msTimer_EngineStatus; //定義一個ms定時器msTimer_EngineStatus
}
on start
{
setTimerCyclic(msTimer_EngineStatus,100);
}
on timer msTimer_EngineStatus{ //響應定時器事件msTimer_EngineStatus,將報文傳送到匯流排
EngineStat.Velocity = @sysvar::testNS::Velocity; //獲取面板中變數輸入的值
EngineStat.IgnitionStatus = @sysvar::testNS::IgnitionStart;
output(EngineStat); //將報文傳送到匯流排中
}
- 程式結構
先從巨集觀的角度來看,這個CAPL程式的結構包含了標頭檔案、全域性變數、事件函式,沒有自定義函式。
includes{ }標頭檔案是對其他檔案及dll檔案的包含說明,variables{ }是對全域性變數的宣告定義,on start{ },on timer{ }是工程中用到的各類事件。
- 全域性變數
1、message 報文變數
CAPL提供了各種網路對應的報文類。本文以CAN message為例,報文變數定義格式:message + message ID/message name + variable
使用message關鍵字來宣告一個報文變數,message後是message ID或CANoe工程匯入DBC後的message name,然後是在CAPL程式中要使用的報文變數名。
message EngineStatus EngineStat;
如上,定義一個在DBC中message name為EngineStatus的報文變數EngineStat,此外還定義了報文LockingRq和報文WindowRq。
2、msTimer 定時器變數
CAPL提供兩種定時器變數:timer:基於秒(s)的定時器 、msTimer:基於毫秒(ms)的定時器。
msTimer msTimer_EngineStatus;
- 事件函式
CAPL是一種面向過程、由事件驅動的類C語言。
事件驅動針對於順序執行,其區別如下:
順序執行:順序執行流程中,子例程或過程函式按照程式碼編寫順序逐句執行。
事件驅動:CAPL程式由事件驅動,工程執行過程中發生指定的事件時才會執行相應的事件處理函式。
事件起始關鍵字 on
on後加某種事件,工程執行時條件觸發,則執行函式體內的語句。
關鍵字this
系統變數、環境變數或CAN報文事件中,可以用this關鍵字訪問其指代的資料內容。
on start
{
setTimerCyclic(msTimer_EngineStatus,100);
}
如上,on start{ }函式在工程開始時呼叫,setTimerCyclic(msTimer_EngineStatus,100) 設定定時器msTimer_EngineStatus為一個100ms為週期的迴圈定時器;
on timer msTimer_EngineStatus{ //響應定時器事件msTimer_EngineStatus,將報文傳送到匯流排
EngineStat.Velocity = @sysvar::testNS::Velocity; //獲取面板中變數輸入的值
EngineStat.IgnitionStatus = @sysvar::testNS::IgnitionStart;
output(EngineStat); //將報文傳送到匯流排中
}
如上,定義了一個響應定時器事件,函式中EngineStat.Velocity = @sysvar::testNS::Velocity;表示面板panel中的系統變數Velocity變化後,將其賦值給EngineStat報文的Velocity 訊號。最後的output()函式將報文傳送到匯流排中。
整段engine.can的程式碼,實現了週期(100ms)迴圈執行msTimer_EngineStatus事件,將EngineStatus報文每100ms傳送到匯流排中。如果面板panel中報文的兩個訊號有變化的話,會實時更新。