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