CANoe中Capl脚本使用笔记

本文详细介绍了CANoe中Capl脚本的使用,包括CAPL界面、功能区、使用场景、脚本结构、事件、基本语法、数据类型及常见指令。CAPL适用于节点仿真、测试功能和分析功能,其脚本基于事件执行,支持多种数据类型如整数、浮点数和CAN消息类型。此外,文章还展示了CAPL中消息过程、键盘过程、时间过程和环境变量过程的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CAPL界面介绍

CAPL代开路径:CANoe界面-Tools-CAPL Browser打开。

CAPL界面由功能区、程序框架浏览树、输出窗口、编辑区、访问区五部分组成。

程序编辑区就是编写CAPL脚本的区域;

程序架构浏览树:起目录的作用,可以把编辑区定位到编写的事件或函数类型的语句;

输出窗口可以输出编译过程中的事件和使用搜索时定位到的结果;

Symbols访问区:访问到CANoe工程加载的数据库中的信号、创建的系统变量;

CAPL函数库区:直接从右侧访问区拖拽到中间编辑区使用(注意:工程创建路径中不能有中文,否则访问不到数据库文件)。

功能区界面介绍

由五部分构成,首先是File菜单栏,与大多数软件相同,它是文件创建、保存、加载、设置等功能区域。

Home功能区提供了CAPL编译常用功能,包括代码编译、查找、替换、屏蔽、取消屏蔽等功能。

Filter功能区的作用是管理CAPL的函数库,可以在函数访问区中屏蔽掉不需要的函数。

Debug功能区是调试的区域,提供了一些基本的调试操作,一般情况下不通过debug模式来调试脚本。基本上编译一次,存在错误可以通过Output输出窗口获得错误类型并进行更改。如果脚本编译成功之后,仍然不能满足测试步骤的输出,一般会使用Write窗口进行调试。

Layout功能区主要是针对CAPL用户的页面展示。例如进行水平分区、垂直分区等操作方便用户进行脚本编写。

CAPL的使用场景

节点仿真

CAPL脚本关联Simulation Setup中的ECU节点,实现ECU节点仿真和整车网络仿真。

测试功能

关联Simulation Setup中的Test Module模块或是Test菜单中的Test Setup,结合TSL(Test Service Library,测试服务库)进行测试功能开发。

分析功能

关联Measurement Setup窗口功能模块中的Program Node,实现总线过滤、分析功能。

CAPL脚本结构

CAPL脚本需要包含:变量、事件、和自定义函数三部分。

 CAPL程序执行顺序




事件过程之间无关联,执行顺序由运行时间事件决定
事件过程通过全局变量和子程序决定
事件过程为一整体,不能被其它事件中断

CAPL中的数据类型


无符号整数
        byte        (1字节)
        word        (2字节)
        dword        (4字节)
有符号整数
        int        (2字节)
        long        (4字节)
浮点数
        float        (8字节)
        double        (8字节)
CAN消息类型
        message
定时器类型
        timer        (秒为单位)
        msTimer        (毫秒为单位)
单个字符
        Char        (1字节)

CAPL事件

CAPL的事件类型包含三种:总线事件、属性事件、时间事件。CAPL常用的事件类型如下图所示。 红色字体表示用户自定义的名称,{...}内式CAPL程序体,用户根据需要使用CAPL语言编写。

CAPL程序能够检测事件,并执行和事件相关的程序,检测的事件类型包括:

        程序开始执行使事件

        程序停止执行事件

        键盘输入事件

        CAN消息的接收事件

        定时器超时事件

        图形面板输入事件(只在CANoe中)

CAPL程序是基于事件程序的组合

CAPL基本语法

        CAPL语言的语法与C语言基本相同

        注释

                //   放置在需要注释的语句之前,单行注释

                /*   注释起始符,其后的内容被注释

                */   注释结束符,结束由‘/*’开始的注释

        事件过程

        分号 语句结束符

        大括号

消息过程

         on message 123               //对消息123(dec)反应

         on message 0x123           //对消息123(hex)反应

         on message MotorData    //对消息MotorData(符号//名字)反应

         on message CAN1.123    /*对CAN1.123反应*/

        on message *                    //对所有信息反应

        on message *100 -200     //对100-200间信息反应

键盘过程

        on key ‘a’                 //按‘a’键反应
        on key‘’                    //按空格键反应
        on key 0x20            //按空格键反应
        on key F1                //按F1键反应
        on key Ctrl-F12       //按Ctrl + F12键反应
        on key PageUP      //按PageUp键反应
        on key Home          //按Home键反应
        on key*                   //按所有键反应

时间过程

时间过程表示法:
        on timer myTimer      //对myTimer设定的时间到反应
定时器的申明
        ms Timer myTimer    //将myTimer申明ms为单位的变量
        timer myTimer          //将myTimer申明s为单位的变量

定时器的设置
        setTimer(myTimer,20)       //将定时值设定为20ms,并启动
        setTimerCyclic(myTimer,10)   //将定时设置为10ms周期循环启动
        cancelTimer(myTimer);//停止定时器myTimer

每次使用setTimer的设置,只能触发一次时间过程


环境变量过程


环境变量过程onenvVar对环境变量值的改变产生反应
测量设置中的CAPL节点不会阻止环境变量在数据流图中的传输
环境变量过程常用的函数:
        getValue() | sysGetVariable*       //获取环境变量的值
        putvalue() |sysSetVariable*       //设置环境变量的值

到可使用this在过程内部访问环境变量的值


消息的申明


消息申明的格式
        Message 0XA my_msgl;
        Message 100 my_msg2;
        Message EngineData my_msg3

消息数据的索引
        my—msg1.byte(0)         //数据字节0
        my_msg2.word(2)        //从第2字节开始的一个字
        my_msg3.EngSpeed        /*如果使用了符号数据库,可使用信号符号名来索引



关键字  this


在事件过程中,关键字this指定事件对象的数据结构
        on message 100{
                                bytebyte_0;
                                byte_0=this.byte(0);

                                ...

                                 }

        on envVar Switch{
                                        intVal;
                                        val=getvalue(this);

                                        ...

                                         }

到this可作为参数使用
对于this值的改变仅在过程内部有效

CAPL常见指令

针对消息的一些常用语句


常进行读写
        if(this.id==100){...}                //消息ID
常写的
        msg.can=2;                                //消息所使用的CAN控制器编号
        msg.dlc=8;                                //消息中包含的数据字节长度

常读的
        dwordt;t=this.time;                //消息的时标,单位是I0 us
        if(this、dir!=RX){return;}        //消息的收发特性

注意:this是关键字,在事件过程中代表所定义的触发事件名


CAPL指令块


        Counter=counter+1·
                if(counter==256)

                {
                counter=O;
                stop();
                }

CAPL中输出文本


        int h=100;
        char ch='a;
        char s100[8]="hundred'·
        write("Hundredasanumber:%d,%×”h,h);
        write('Hundredasastring:%s",sl00);
        write('ThesquarerootOftwois0/06.4g",sqrt(2.0));

传输信号


        on key 'a' {
                                message  MotorData  mMoDa;
                                mMODa.temperature.phys=60;
                                mMoDa.speed.phys=4300;
                                output(mMoDa);

                        }
        on key 'b' {
                                message 100 m100={dlc=1};
                                m100.byte(0)=0x0B,
                                output(m100);

                        }

周期性消息发送的CAPL示例1


        Variables                                                                                //定义全局变量

                {
                                message 0x555 msgl = {dlc = 1};                //定消息变量msg1,并初始化数据字节代码为1
                                ms Timer timerl;                                   //定又定时器变量timerl
          on Start                                                                        //系统过程
                {
                                setTimer(timerl,100);   //初始化定时器变量timerl的值为100msec,并启动

                }
        on timer timer1                                            //时间过程(对于定时器变量timer1)

                {
                                setTimer(timerl,100);    //重新设ntimerl,并启动
                                msgLbyte(0)=msgLbyte(0)+1;      //改变消息数据字节
                                output(msgl);                                    //输出消息

                }        


周期性消息发送的CAPL示例2

        variables
                {
                                  message CAN1.C2_152 msg_152;
                                  msTimer CyclicTimer;
                }

        on start
                {
                                  setTimerCyclic(CyclicTimer,10);
                }

        on timer CyclicTimer //10ms执行一次
                { 

                                msg_152.ReqActive = 1;
                                msg_152.can=1;
                                output(msg_152);

                }

环境变量过程的示例


        on envVar evSwitch     

                {                           //声明传输CAN消息
                                message Msg1 msg;                               //配置环境变量的值
                                msg.bsSwItch=getVaIue(this);              //获取环境值
                                output(msg);                                            //出消息

                }

系统变量过程的示例

        variables
                {
                                int msgflg;  

                }

        on sysvar msg::message                                                     //配置系统变量
              {       

                                 msgflg=@this;                                             //获取变量值
                                 if(msgflg==1)
               }
                                output(msgflg);                                                                      //输出消息                
                } 

系统变量需要在CANoe中定义系统变量,可以由图像面板对系统变量进行赋值操作。

系统变量创建

在Environment - System Variables打开系统变量界面

右键new

填写变量组名、变量名、数据类类型、初始值、最大值、最小值、单位等信息

生成的变量可在CAPL 通过系统变量进行引用和操作

例:on sysvar msg::message        

CAPL简化实例

//通过系统变量msg::message设定或者按键0将C2_152 msg_152的数值设定为0,否则从报文C2_170获取值//
variables
{
message CAN1.C2_152 msg_152;
msTimer CyclicTimer;  //定义计时器
int activeflag =0;
int envflg = 0;
double simval = 0;
double realval =0;
}

on message C2_170 // 定义输入CAN ID 从数据库直接获取CAN信号名称
	realval = this.Relang; //获取CAN信号上的值
}
on start
{
	setTimerCyclic(CyclicTimer,10);   //设定计时器,并启动
}
on timer CyclicTimer //10ms执行一次
{
    if(activeflag)
    {
      simval = 0;
    else
      simval =realval ;
    }
	msg_152.Value.phys = angle;
}
on sysvar msg::message //通过系统变量输入值
  {
    envflg =@this;
    if(envflg ==1)
    {
	    activeflag = 1;
    }
on key '0'  //按键0输入值
{
	activeflag = 1;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值