與Vspy的"C Code Interface"一樣;在CANoe的使用中,一樣提供了我們進行二次編程開發的工具——”CAPL Browser”。通過CAPL的編程,我們可以在節點上完成更為復雜的功能需求。操作如下:在CANoe工程的”Simulation Setup”界面下的左側的網絡節點中,點擊鉛筆形狀的圖標,進入CAPL編輯界面(若當前節點還沒有創建對應的CAPL程序,則此時會先提示輸入CAPL程序名,并保存為.can后綴的文件)
1.1、CAPL語言特性
CAPL(Communication Access Programming Laguage)語言是類C語言,語法其實與C語言很相似,但同時又包含了一些C++的特性,如this指針、事件等; 應用于Vector CAN工具節點的編程,是基于事件建模的語言; 可以使用write()函數進行調試,用于將調試信息輸出到CANoe的write窗口上; 通過output()函數進行指定報文的發送; 通常是通過環境變量事件與CANoe面板進行關聯,實現交互; 提供調用dll文件的方法(操作見"關于CAPL中對dll的調用操作"一文);這樣保證了對由其他語言封裝好的程序模塊的調用;
1.2、CAPL的程序結構
如下,一個完整的CAPL程序的結構包含了頭文件、全局變量、事件函數、自定義函數;當然不是每個因素都要有,視具體程序功能確定。
1.3、CAPL的數據類型
1.4、CAPL事件類型概述
CAPL是基于事件建模的語言,從1.2小節對CAPL的程序結構的介紹也可以看出,關于CAPL的運用主要就是在于熟悉其事件的使用;其常用的事件如下:
接下來,我們對CAPL的幾種事件類型進行進一步的介紹
02
CAPL事件類型
2.1、系統事件
在CAPL的系統事件中,有preStart、start、preStop、stopMeasurement這4種。我們可以根據需要在相應的系統事件函數接口中定義想要進行的操作;當工程運行時,下述系統事件的發生順序依次是
preStart-->start-->preStop-->stopMeasurement
關于系統事件的定義格式如下:
on preStart /*系統事件,初始化時執行*/ { resetCan(); /*CAPL接口函數,用于復位CAN控制器*/ } on start /*系統事件,工程開始時執行*/ { write(“Just A Try”); /*write()函數將字符串信息在”write”窗口輸出*/ } on preStop /*系統事件,工程預備停止時執行;發生在stopMeasurement事件前面*/ { write("The Project Will Stop!”); } on stopMeasurement /*系統事件,工程停止時執行*/ { write("The End! "); }
2.2、CAN控制器事件
當硬件對CAN控制器檢測到相應動作發生時執行;以BusOff事件為例,格式如下:
on busOff /*CAN控制器事件:硬件檢測到BusOff時執行*/ { write("BusOff Error!"); }
2.3、CAN消息事件
通過”on message”定義消息事件,該事件會在指定的報文消息被接收時被調用。關于消息事件的定義格式示例如下:
on message 123 /*接收到123(10進制)這個ID的報文時執行*/ on message 0x441 /*接收到0x441(16進制)這個ID的報文時執行*/ on message BCM /*接收到BCM(工程dbc文件中的報文名)這個報文時執行*/ on message* /*接收到任意報文時都執行(注意*與message之間沒有空格)*/ on message 0x300-0x444 /*接收到這個范圍內的ID報文時執行*/ { write(“Received %x”,this.id); /*打印接收到的報文id*/ write(“Received Message %d in total!”,count); }
以上是關于消息事件的定義格式,關于消息的索引及發送操作我們通過下例介紹: 假設VoiceStatus是我們工程dbc文件中定義的一個報文,該報文包括了VoiceType和VoiceOperation這兩個信號;其中,VoiceType這個變量占據第1個字節;VoiceOperation占據第2、3個字節。則關于消息的索引,通過報文的信號(msg.VoiceType這樣)去操作如下:
void TxMsg_VoiceStatus(void) { message VoiceStatus msg; /*將工程中dbc中定義的VoiceStatus這條報文取名為msg*/ msg.VoiceType = @VoiceType; /*對應賦值給到報文的信號,通過報文別名"msg."調出*/ msg.VoiceOperation = @VoiceOperation; output(msg); /*通過output指令發送該報文*/ }
也可以直接通過后接數據類型(msg.byte(0)這樣)去操作,此時操作如下:
void TxMsg_VoiceStatus(void) { message VoiceStatus msg; /*將工程中dbc中定義的VoiceStatus這條報文取名為msg*/ msg.byte(0) = @VoiceType; /*報文第1個數據字節*/ msg.word(1) = @VoiceOperation; ; /*報文從第1個字節開始的一個字(2個字節)*/ output(msg); /*通過output指令發送該報文*/ }
2.4、鍵盤事件
通過”on key”定義鍵盤事件,該事件會在我們按下指定按鍵時執行;關于鍵盤事件的定義格式示例如下:
on key ‘a’ /*在小寫輸入法下,按下鍵盤的’A’鍵時執行*/ on key ‘A’ /*在大寫輸入法下,按下鍵盤的’A’鍵時執行*/ on key ‘ ’ /*按下鍵盤的空格鍵時執行,注意單引號中間是有空格的*/ on key 0x20 /*按下鍵盤的空格鍵時執行*/ on key F2 /*按下鍵盤的’F2’鍵時執行*/ on key CtrlF3 /*同時按下鍵盤的’Ctrl’鍵和’F3’鍵時執行*/ on key* /*按下鍵盤的任意鍵時都會執行(注意*與key之間沒有空格) */ { write(“The Key Is Press”); }
2.5、時間事件
通過”on timer”定義時間事件;該事件會在設定的時間到達時執行。關于時間事件的定義格式及使用示例如下:
variables { msTimer Timer1; /*在variables中聲明一個以ms為單位的定時器變量Timer1*/ } on start { setTimer(Timer1,100); /*將Timer1的定時時間設定為100ms,并啟動它*/ } on timer Timer1 /*定義的Timer1時間事件,每100ms執行一次*/ { setTimer(Timer1,100); /*啟動下一個周期循環*/ } on key ‘a‘ /*鍵盤事件,按下鍵盤’A’鍵時執行*/ { cancelTimer(Timer1); /*停止Timer1這個100ms執行一次的定時器*/ }2.6、錯誤幀事件
通過”on errorFrame ”定義錯誤幀事件;該事件會在硬件檢測到錯誤幀時執行。關于錯誤幀事件的定義格式示例如下:
on errorFrame /*錯誤幀事件:硬件檢測到錯誤幀時執行*/ { write("The error has occur"); }2.7、環境變量事件
通過”on envVar”定義環境變量事件;該事件會在指定的環境變量值有新的輸入時執行(環境變量常常用于關聯上一個面板控件,當我們對控件進行操作時,對應改變關聯上的環境變量值;而此時我們在CAPL中關于該環境變量的事件就會被調用;以此完成交互操作)。關于環境變量事件的定義格式示例如下:
on envVar BCM_HightBeamAlarm /*環境變量事件:指定的環境變量值有輸入時執行*/ { byte num=0; num = getValue(this); /*可以使用getValue(環境變量名/this關鍵字)獲取指定的環境變量的值*/ if(num == 1) { write("The envVar is %d",@BCM_HightBeamAlarm); } else { putValue(this,1);/*使用putValue(環境變量名/this關鍵字,設定的值)改變指定的環境變量的值;直接賦值的話,格式是@BCM_HightBeamAlarm = 1; */ write("Change envVar to %d",@BCM_HightBeamAlarm); } }
關于在CAPL中對環境變量的操作中,getValue()與putValue()是常用的接口函數。其函數格式如下,具體介紹及示例也可以通過神鍵"F1"召喚幫助文檔,在"CAPL"相關章節中進行學習。
Ps:關于環境變量的定義是在dbc文件中完成的;CANoe工程導入該dbc文件即可使用其定義的環境變量了。環境變量的創建如下:
2.8、系統變量事件
通過”onsysvar”定義系統變量事件;該事件會在指定的系統變量值有新的輸入時執行,其格式及使用方法與前一小節的環境變量基本一致;差別只在于環境變量是在dbc文件中定義的;而系統變量的定義如下:
點擊工具欄的”Environment”下的”System Variables”;此時界面如下,右鍵空白處,選擇”New”進行新建;在彈出的窗口對新建的系統變量進行參數設置。
關于系統變量事件的定義格式示例如下:
on sysvar SysVar1 /*系統變量事件:指定的系統變量值有新的輸入時執行*/ { write("The SysVar1 is %d",@SysVar1); }
來源:車端
審核編輯:劉清
-
CAN
+關注
關注
57文章
2744瀏覽量
463627 -
CAN控制器
+關注
關注
3文章
74瀏覽量
15031
原文標題:什么是CAPL編程?
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論