天天看點

車載測試系列: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程式由事件驅動,工程運作過程中發生指定的事件時才會運作相應的事件處理函數。

車載測試系列: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中封包的兩個信号有變化的話,會實時更新。

繼續閱讀