0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是CAPL編程?

jf_EksNQtU6 ? 來源:車端 ? 2023-06-18 10:13 ? 次閱讀

與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后綴的文件)

0fca8074-0cf8-11ee-962d-dac502259ad0.png

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è)因素都要有,視具體程序功能確定。

0fe12c3e-0cf8-11ee-962d-dac502259ad0.png

1.3、CAPL的數(shù)據(jù)類型

0fea8914-0cf8-11ee-962d-dac502259ad0.png

1.4、CAPL事件類型概述

CAPL是基于事件建模的語言,從1.2小節(jié)對(duì)CAPL的程序結(jié)構(gòu)的介紹也可以看出,關(guān)于CAPL的運(yùn)用主要就是在于熟悉其事件的使用;其常用的事件如下:

101765c4-0cf8-11ee-962d-dac502259ad0.png

接下來,我們對(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í)。

102bfad4-0cf8-11ee-962d-dac502259ad0.png

104ae2e6-0cf8-11ee-962d-dac502259ad0.png

Ps:關(guān)于環(huán)境變量的定義是在dbc文件中完成的;CANoe工程導(dǎo)入該dbc文件即可使用其定義的環(huán)境變量了。環(huán)境變量的創(chuàng)建如下:

105fce0e-0cf8-11ee-962d-dac502259ad0.png

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è)置。

106d7e0a-0cf8-11ee-962d-dac502259ad0.png

關(guān)于系統(tǒng)變量事件的定義格式示例如下:

on sysvar SysVar1   /*系統(tǒng)變量事件:指定的系統(tǒng)變量值有新的輸入時(shí)執(zhí)行*/
  {
      write("The SysVar1 is %d",@SysVar1);
  }

來源:車端





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • CAN
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CAPL介紹-編程中常用的函數(shù)結(jié)構(gòu)#CANoe#CAPL#函數(shù)結(jié)構(gòu)

    編程
    北匯信息POLELINK
    發(fā)布于 :2023年01月01日 18:11:59

    CAPL介紹-腳本編輯和常用基本事件#CANoe#CAPL#腳本

    編程語言
    北匯信息POLELINK
    發(fā)布于 :2023年01月06日 09:06:50

    CAPL編程進(jìn)階應(yīng)用——Checksum算法的實(shí)現(xiàn)#CANoe #CAPL #Checksum

    編程
    北匯信息POLELINK
    發(fā)布于 :2023年04月21日 23:00:01

    CANoe:網(wǎng)絡(luò)和ECU開發(fā)、測(cè)試和分析的專業(yè)工具

    可以運(yùn)用類C的CAPL編程語言編程實(shí)現(xiàn)仿真、分析和測(cè)試 可以創(chuàng)建用戶自定義界面來控制仿真和測(cè)試過程或顯示分析數(shù)據(jù)特殊功能:附加模塊可以適應(yīng)OEM的具體要求和協(xié)議(傳輸協(xié)議,網(wǎng)絡(luò)管理,交互層,等)診斷
    發(fā)表于 10-09 17:42

    Vector-CANoe 軟件中文資料,CPAL語言,軟件使用方法等

    本帖最后由 追風(fēng)逐浪 于 2019-3-12 14:29 編輯 Vector-CANoe 軟件中文資料,CPAL語言,軟件使用方法等CANoe.LIN基礎(chǔ)培訓(xùn) CANoe快速入門 CAPL編程
    發(fā)表于 03-12 14:20

    CAPL編程語言 官方英文原版

    之前看過的一份CAPL編程語言資料,英文原版,分享給需要的小伙伴!??!
    發(fā)表于 01-14 18:19

    如何用CAPL通過RS232遠(yuǎn)程控制ALR3220

    CAPL通過RS232遠(yuǎn)程控制ALR3220程控電源
    發(fā)表于 12-28 06:37

    如何使用LabVIEW實(shí)現(xiàn)診斷自動(dòng)化

    ,ECU 內(nèi)部自檢測(cè)策略,都是汽車診斷必不可少的一部分,本文主要介紹在 CANoe 軟件下通用的 CAPL 語言,運(yùn)用 CAPL 語言編寫程序,然后合理的連接硬件,根據(jù)參數(shù)正確對(duì)軟件進(jìn)行相應(yīng)的配置,使用一些接口函數(shù),通過 LabVIEW
    發(fā)表于 12-16 08:00 ?9次下載
    如何使用LabVIEW實(shí)現(xiàn)診斷自動(dòng)化

    CAPL通過RS232遠(yuǎn)程控制ALR3220程控電源

    CAPL通過RS232遠(yuǎn)程控制ALR3220程控電源
    發(fā)表于 01-05 15:10 ?20次下載
    用<b class='flag-5'>CAPL</b>通過RS232遠(yuǎn)程控制ALR3220程控電源

    CAPL編程語言快速入門

    CAPL是由Vector公司開發(fā)的類似于C語言的面向過程編程語言,是CANoe和CANalyzer中可用的編程語言。CAPL中程序塊的執(zhí)行由事件控制,在專用的編譯器中開發(fā)和編譯,這樣可
    的頭像 發(fā)表于 09-17 16:11 ?2812次閱讀
    <b class='flag-5'>CAPL</b><b class='flag-5'>編程</b>語言快速入門

    CAPL編程的進(jìn)階應(yīng)用 | Checksum算法的實(shí)現(xiàn)

    作者:北城舊巷小編:吃不飽CRC與Checksum區(qū)別相信大家在CANMsg或者ETHPDU中經(jīng)常會(huì)看到Checksum這種信號(hào)。提到Checksum,就必須要說明一下CRC校驗(yàn),很多工程師會(huì)概念混淆,認(rèn)為兩者是同一個(gè)東西,實(shí)則它們有很大的區(qū)別。01兩者存放位置不同CRC校驗(yàn):循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果
    的頭像 發(fā)表于 10-11 09:29 ?1287次閱讀
    <b class='flag-5'>CAPL</b><b class='flag-5'>編程</b>的進(jìn)階應(yīng)用 | Checksum算法的實(shí)現(xiàn)

    ?CAPL在診斷中的應(yīng)用,你值得了解!

    作者|胖胖磊小編|吃不飽CANoe主要用于汽車總線的開發(fā)并廣泛被汽車電子工程師們使用。它具有強(qiáng)大的開發(fā)、分析、仿真、診斷、測(cè)試等功能。一提到CANoe大家往往都會(huì)想到CAPL,在使用CANoe
    的頭像 發(fā)表于 09-07 08:27 ?1094次閱讀
    ?<b class='flag-5'>CAPL</b>在診斷中的應(yīng)用,你值得了解!

    CAPL腳本使用介紹

    CAPL中也有類似于C語言中的回調(diào)函數(shù)的機(jī)制,如檢測(cè)報(bào)文周期和錯(cuò)誤幀的函數(shù)中就可以使用,當(dāng)周期超界或者總線出現(xiàn)錯(cuò)誤幀就會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)執(zhí)行一些操作
    的頭像 發(fā)表于 04-01 11:23 ?2382次閱讀

    PLC的編程方式及編程語言

    在工業(yè)自動(dòng)化領(lǐng)域,PLC(Programmable Logic Controller,可編程邏輯控制器)因其強(qiáng)大的控制功能和靈活的編程方式而得到了廣泛應(yīng)用。PLC的編程方式和編程語言是
    的頭像 發(fā)表于 06-27 14:08 ?920次閱讀

    Vector推出一套基于Visual Studio Code的免費(fèi)插件

    編寫工具(如Vector的CAPL Browser)雖然功能強(qiáng)大,但是結(jié)合Visual Studio Code更能夠滿足多語言編程和集成現(xiàn)代開發(fā)工具的需求。 因此,Vector推出一套基于Visual
    的頭像 發(fā)表于 11-24 14:15 ?596次閱讀
    Vector推出一套基于Visual Studio Code的免費(fèi)插件