1. 程式人生 > 其它 >車載測試系列:CAPL程式語言

車載測試系列: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中報文的兩個訊號有變化的話,會實時更新。