精华内容
下载资源
问答
  • capl语言简介

    2018-12-13 10:37:18
    capl 作为can线测试的主要测试脚本语言,这是capl语言的基本知识
  • CAPL语言资料

    2019-04-16 11:23:41
    CAPL ,test mode ,CCI,CANoe and CANalyzer as diagnostic tools
  • CANoe CAPL语言详细说明

    2019-04-23 15:53:13
    此文档是CANoe的CAPL语言的详细说明文档,是比较早的资源,因为Vector没有新的资源更新,所以这个文档很难找到。
  • capl语言学习资料

    2017-11-01 16:53:00
    这是我整理的capl语言学习和开发资料,包含官方文档和我自己网上查找的一些capl编程手册,适合初学者和开发者。
  • CAPL语言参考手册

    热门讨论 2014-09-22 09:48:14
    CAPL是Vector公司CANalyzer分析CAN协议包的语言,可以方便使用者更加灵活利用和控制仿真CAN通信情况。本文档是详细介绍CAPL语言,并有很好的实例
  • Both flagship tools, owned by Vector, are equipped with their own programming language called CAPL (CAN Access Programming Language). This event-based language allows simulation of network and node ...
  • CAPL语言学习

    千次阅读 2019-11-12 10:46:22
    CAPL语言允许你编写单独的应用程序。比如说:当你添加新节点的时候,你要测试新添加的节点能否与以前的节点正常通信。在CAPL的帮助下就能够对系统环境进行仿真,也就是说能够仿真以前节点之间的数据通信,然后与新...

    (一)CAPL简介

    CAPL全称为Communication Access Programming Language。CAPL语言允许你编写单独的应用程序。比如说:当你添加新节点的时候,你要测试新添加的节点能否与以前的节点正常通信。在CAPL的帮助下就能够对系统环境进行仿真,也就是说能够仿真以前节点之间的数据通信,然后与新节点相连,就可以测试出新节点的功能性和可靠性,这也就是半实物仿真。

    通过CAPL你也能够对你网络上的数据通信进行分析优化,也能做一个网关程序——连接2种不同的总线,保证不同类型总线之间的数据通信。

     CAPL程序与数据库结合起来,通过调用数据库中的信号,消息,环境变量和实际测试环境联系起来,从而你能够实时监测总线上的数据通信;能够接受总线上的控制信息,使得模拟面板上的控件进行动作;也能够通过总线发出控制信息,控制外部环境动作,从而支持开发全仿真,半实物仿真,测试分析全实物系统3个仿真阶段,对节点的仿真很重要的地方就是准确的描述节点在总线上的动作。

    (二)CAPL功能

    • 编写解决问题的函数
    • 仿真控制设备
    • 仿真控制系统的环境
    • 执行测试和验证
    • 作为网关

    (三)CAPL特征

    • 基于事件建模的语言

    总线事件

    属性事件

    时间事件

    • 类似C语言
    • 友好的开发界面
    • 可用用户的动态连接库

    (四)CAPL编辑器

    CAPL程序在一个被划分为4个小窗口的浏览器窗口建立。

    左上角的窗格是浏览器树,包括所有CAN事件节点。

    右边的两个窗格是程序编辑窗口,其中上面的是全局变量编辑器,下面的是具体程序编辑窗口。

        最底下的窗格是消息窗口。当程序编好后,编译运行的结果会在消息窗口中显示,并指出该程序的路径,若运行有错,则会在指出哪行程序出错。

    (五)数据类型

    • 整型

    有符号:int(16 bit),long(32 bit)

    无符号:byte(8 bit),word(16 bit),dword(32 bit)

    • 浮点数

    Float (64 bit)

    Double (64 bit)

    • 单个字符

    Char (8 bit)

    • 定时器(timers)

    Timer (s)

    Mstimers (ms)

    这些数据类型在声明中已被初始化。整数和浮点数的用法跟其他程序设计语言相同。

    (六)全局变量的声明与初始化

    在浏览器中,全程变量的声明写在全局变量窗口的右上方。数据类型DWORD, LONG, WORD, INT, BYTE ,CHAR的用法与在C语言中的用法近似。64位浮点数FLOAT 和DOUBLE遵照IEEE标准。

    当编写一个定时器语句时产生一个定时器,当程序跳转到定时器运行语句时,开始执行定时器。与定时器相关的事件程序被唤醒。定时器的建立和取消通过关键字setTimer和cancelTimer执行。

    通过关键字将数据库中的消息定义成变量。变量在声明中被初始化。单一的符号和大括号{ }形式都是允许的。除了定时器和省略补充的量,所有变量都被编译器初始化。消息变量DIR的发送方向通过发送请求(TXREQUEST)来初始化。

    CAPL语言允许数组(arrays, vectors, matrices)的声明,包括消息变量。

    局部变量在CAPL语言中是静态的(与C语言形成对比),这就是说要在程序开始时设定初值。假定变量进入程序的值是它们上次跳出程序时的值。

    Simple types:

    Int j, k = 2; // j = 0

    Double f = 17.5;

    MsTimer t1; // No initialization

    Initialization of message variables:

    Message 100 msg = {dlc = 4, word (0) = 0x1234};

    Arrays:

    Int lookUpTable [3] = {1, 2, 3};

    Char text [12] = "Hello world";

    Int matrix [2] [2] = {{11,12},{21,22}};

    (七)事件程序

    • 总线事件(on  message{})

    On message 100{

    Write (“Message 100”)

    }

    • 键盘事件(on  key{})

    On key ‘a’ {

         Write (“’a’pressed”);

    }

    • 时间事件(on  timer{})

    On timer Time_1 {

           Write (“time elapsed”);

    }

    • 出错事件(on errorFrome{})

        On errorFrame

    {

    If (ABS_NM_State)

    {

    Switch (Error_Status)

    {

    Case 0:

    CountTx += 8;

    CountRx += 8;

    if ((countTx > 127)||(countRx > 127))

    {

    Error_Status = 1; //Error_Pass;

    }

    Break;

    • 环境变量事件(on  envVar{})

        On envvar Switch {

    // declare a CAN message to be transmitteed

    Message Controller msg;

    // Read out the value of the switch
    // Assign to the signal Stop

    msg.Stop = getvalue (this);

    // Output the message on the bus
    output (msg);
    }

     

    (八)消息选择器

    你可以通过以下选择器控制CAN消息的收发:

    • ID     消息标识符

    On message * {

    If (this.ID == 0x600) {

    Write ("message 0x600 received; triggering logging...");

    Trigger ();

    }

    }

    • CAN     通道编号

    Message 0x100 msg = {dlc = 2, word (0) = 0x1234};

    On key '1' {

    Write ("sende via CAN 1");

    msg.CAN = 1;

    Output (msg);

    }

    on key '2' {

    write("sende via CAN 2");

    msg.CAN = 2;

    output(msg);

    }

    • DLC     数据编码长度

    on message OneByteMessage {

    if (this.DLC != 1) {

    write("error: OneByteMessage hat DLC != 1");

    stop();

    }

    }

    • DIR     Direction of transmission, event classification; possible values: RX, TX, TXREQUEST

    Selector DIR (direction of transmission) 

    on message 0x100 {

    if (this.DIR == RX) {

    write("message 0x100 received");

    }

    if (this.DIR == TX) {

    write("message 0x100 sent");

    }

    }

    • RTR     远距离传输;可能值:0(no RTR),1(RTR)

    Selector RTR (remote transmission request)

    // send remote frame

    message 0x100 rmsg;

    rmsg.RTR = 1;

    output(rmsg);

    • TYPE    与DIR和RTR相互作用产生有效值(TYPE=(RTR<< 8) | DIR)

    message 0x100 resp_msg = {dlc = 2, word(0) = 0x1234};

     

    on message 0x100 {

    if (this.TYPE == RXREMOTE) {

    // remote frame 0x100 received

    output(resp_msg);

    }

    }

    • TIME    指明时间,单位;10微秒

    Selector TIME (time stamp of message in units of 10 microseconds)

    const dword sendDist = 10000; // *10 us = 100ms

    on message CP24TX {

    int delta;

    dword lastTime;

    delta = (this.TIME - lastTime - sendDist); // in 10 us

    lastTime = this.TIME;

    if (delta != 0) {

    write("deviation of send distance: %d us",10*delta);

    }

    }

    • MsgFlags     表示接收和发送

                  0 x 02   表示在传输消息前传输缓冲器是空闲的

                  0 x 04   表示消息收发器主动接收消息

                  0 x 08  表示在high voltage模式时消息被发送或接收

                  0x10   表示远程帧

                  0x40   表示发送(等同于DIR==TX)

                  0x80   发送请求(等同于DIR==TXREQUEST)

    • SIMULATED  表示通过仿真的CAPL节点发送消息;可能值:0 (no), 1 (yes)

    Selector SIMULATED (message from simulated node)

    On message LightState {

    If (this.dir == RX) {

    If (! this.SIMULATED) {

    Write("message LightState received from real system");

    }

    Putvalue (Bulb, this.OnOff);

    }

    Else {

    // write ("message LightState received as TX");

    }

     

    以下是能完成独立编码的DIR  RTR的表示方法:

    • DIR

    RX             接收消息(DIR == RX)

    TX               发送消息(DIR == TX)

    TXREQUEST     发送请求(DIR == TXREQUEST)

    • TYPE:

    RXREMOTE    远程消息接收((DIR == RX) && RTR)

    TXREMOTE    远程消息发送((DIR == TX) && RTR)

    TXREQUESTREMOTE    发送请求远程消息发送请求((DIR == TXREQUEST) && RTR)

    RXDATA      数据消息接收((DIR == RX) && !RTR)

    RXDATA      数据消息发送((DIR == TX) && !RTR)

    TXREQUESTDATA       数据消息发送请求((DIR == TXREQUEST) && !RTR)

     

    展开全文
  • CAPL语言速成.pdf

    2019-08-14 21:19:32
    Quick Introduction To CAPL This application note is a brief introduction to CAPL, the easy-to-use C-based programming language and integrated programming environment inside both CANalyzer and CANoe. ...
  • CANoe学习4—CAPL语言设计

    千次阅读 2020-12-28 23:58:47
    也是学习CANoe的时候才知道的CAPL,因为是...今天的总结分享主要从以下几个方面描述CAPL语言:CAPL简介CAPL主要用途CAPL浏览器CAPL基础语法CAPL常见运算流程控制CAPL程序结构变量和信号的访问1. CAPL简介CAPL,...

    也是学习CANoe的时候才知道的CAPL,因为是Vector公司专门为CANoe配置的语言,所以应用针对性较强。刚开始学习的时候,在网上也没搜到太多与之相关的资料。目前算是掌握了基本使用。今天来简单分享一下。

    今天的总结分享主要从以下几个方面描述CAPL语言:CAPL简介

    CAPL主要用途

    CAPL浏览器

    CAPL基础语法

    CAPL常见运算

    流程控制

    CAPL程序结构

    变量和信号的访问

    1. CAPL简介CAPL,Communication Access Programming Language,即通信访问编程语言

    类C语言

    与C语言的区别:1)未定义返回类型,默认为void类型; 2)像C++一样允许空的参数列表;3)像C++一样允许函数重载;4)参数检测与C++中一样;5)CAPL提供一些自带的库函数;6)CAPL编译时不对自带的关键字和自带的函数名做区分。

    2. CAPL主要用途仿真节点或模块

    仿真时间报文、周期报文或者附加条件的重复报文

    使用PC键盘模拟操作按钮等人工操作事件

    仿真节点的定时或网络事件

    仿真多个时间事件,每个事件都有自己特定行为

    仿真普通操作、诊断或生产操作

    仿真物理参数或报文的变化

    生成错误帧,评估模块和网络软件处理机制

    仿真模块或网络错误来评估相关的防错机制

    提供网络测试、诊断等功能测试库函数

    3. CAPL浏览器

    CANoe自带的CAPL Browser是CAPL程序的开发环境。学习CAPL基本语法之前,先来认识下CANoe是如何创建CAPL程序。

    3.1 创建CAPL程序文件

    1)进入CAPL浏览器:CANoe主界面Tools → CAPL Browser

    2)创建CAPL程序文件:在CAPL Browser主页点击File→New→New CAPL Document

    CAPL程序的文件后缀为.can

    3.2 浏览器功能区

    1)Home功能区:提供CAPL编译常用功能,包括代码编译以及编译等操作

    2)Filter功能区:管理CAPL函数库,可在函数浏览器中屏蔽掉不需要的函数库

    3)Debug功能区:提供CAPL编程常用功能,包括代码编译以及变异操作等

    注:断点组件智能在debug模式开启的情况下进行操作

    4)Layout功能区:设置各子窗口的显示模式

    4. CAPL基础语法

    基本上学习所有的语法思路都是差不多的,首先是变量与全局变量、数据类型、支持的运算符、流程控制语句以及函数等。

    4.1变量的声明与定义只能使用字母字符、数字和下划线

    名称的第一个字符不能是数字

    区分大小写字符

    不能将CAPL关键字用作名称

    不能将CAPL的函数名和对象名用作变量名

    变量名的字符长度最好不要超过32个(编译系统只能识别前32个字符)

    变量名最好具有易读性,“见名知意”

    注:CAPL关键字分类数据类型关键字:int, byte, long etc.

    控制语句关键字:if, else

    存储类型关键字:static, extern

    其他关键字:const, message

    4.2 全局变量与局部变量

    全局变量在variables部分声明全局变量

    可通过直接赋值进行初始化,如果没有初始化,编译器自动初始化为0

    全局变量的作用域:整个CAPL文件以及与此文件有链接的其他CAPL文件

    局部变量局部变量被静态地创建,初始化只在程序体启动时执行,再次进入程序,局部变量被假定是上一次跳出程序时的值。

    局部变量的作用域仅限于当前函数体范围内

    4.3简单变量整型:byte(0-255),word, dword, gword, int, long, int64

    字符:char, 可以和byte类型直接转换

    浮点型

    4.4 复合类型

    结构 struct结构名在程序中必须唯一

    简单类型、枚举类型或者其他的结构都可以作为结构的成员

    枚举 enum枚举的成员名必须唯一(否则将有可能代替隐藏数据库中同名的报文和信号)

    如果没有在声明枚举的同时对成员进行赋值,编译器将按照成员声明的顺序对成员进行初始化(第一个为0,往后依次加1)

    数组 ArrayCAPL直接用字符串初始化字符数组的行为

    CAPL也支持多维数组

    CAPL通过内建函数elCount(数组名)来获得数组成员的个数

    4.4 特殊类型

    报文使用关键字message来声明一个报文变量,默认是CAN报文

    声明报文变量,有数据库支撑时,完整的声明应包含message ID or message name

    Message ID以x结尾的ID表示扩展帧

    *表示这条报文在声明时还不含有CAN ID

    诊断报文通过诊断请求和诊断响应两个对象来实现和ECU之间的诊断服务交互

    在声明诊断对象时进行初始化

    diagRequest ServiceQualifier request;

    diagResponse ServiceQualifier response;

    注:1)以上语句声明了队形request 和 response,通过给出诊断服务ServiceQualifier进行初始化;2)使用*代替ServiceQualifier,可用于初始化未添加诊断描述的空对象,但是在发送之前对象的数据必须完成具体设置

    系统变量系统变量用来描述某种特殊状态(eg.某种事件的触发)或者记录测量数据

    可通过系统定义和用户自定义系统变量

    系统变量的作用域在其命令空间内

    定时器CAPL提供了两种定时器变量:timer和msTimer

    timer基于秒

    msTimer基于毫秒

    5. CAPL常见运算

    CAPL常见运算包括以下:

    6. 流程控制

    6.1 if语句

    If (表达式) 语句;

    If (表达式) 语句1; else 语句2

    6.2 switch语句

    Switch (表达式):

    {

    Case 常量表达式1: 语句1;

    Case 常量表达式2: 语句2;

    ……

    Case 常量表达式n: 语句n;

    Default: 语句n+1;

    }

    6.3 while语句While(表达式) 语句;

    Do-while语句:

    Do

    循环语句;

    While(表达式)

    6.4 for语句

    For (; ; ) 语句;初始化:为一赋值语句,给循环变量赋初始值

    条件表达式:关系表达式,决定退出循环的条件

    增量:定义循环控制变量 变化/单次循环

    以上三者可省略,但是;不能少

    6.5 break语句break语句用于跳出循环体

    在多层循环中,一个break语句之能向外跳出一层

    6.6 returen语句格式: Return 语句;

    一般放在函数体的最后

    一个函数中可以有多个return语句,但实际运行时只能有一个return语句起作用

    7.CAPL程序结构

    7.1头文件

    Includes

    {

    }{}中一般放.cin文件,该文件一般是一些可复用的代码段构成

    includes

    {

    #include "CommonFunction.cin"

    #include "BaseServices.cin"

    }用户可以通过.cin文件搭建自定义的测试框架

    cin文件中可包含其他的.cin文件,可形成多层的引用结构

    cin文件中一般存放可复用的代码

    7.2 全局变量的声明

    Variables

    {

    }在此部分声明的全局变量生命周期从仿真开始持续到仿真结束,作用域为整个CAPL文件

    variables

    {

    int i =0;

    message 100 msg;

    msTimer myTimer;

    byte ECU_Serical_Number[3]= {0x31, 0x32, 0x33};

    }

    7.3 事件处理 event handler

    CAPL采用面向事件的机制满足CANoe对于CAN通信网络建模、仿真、测试和开发。

    事件起始关键字on *

    On * /On 后加条件语句,比如message XXX或者是Timer XXX等

    {

    语句; /实现接下来要含完成的操作

    }

    关键字this

    在CAN报文事件或者变量事件中,用this访问数据内容,

    on message 100

    {

    byte byte_0;

    byte_0 = this.byte(0);

    }

    这里的this指代的是前面说的报文100,总之this指代的就是前面提到的事件或者数据。

    系统事件主要用于处理CANoe测量系统的控制功能

    常见的系统事件:

    On prestart:仿真测量初始化

    On start:CAPL程序开始

    On prestop:仿真测量停止

    On stopMeasurement:仿真测量结束

    CAN控制器事件对硬件接口设备中CAN控制器状态变化事件的响应

    CAN控制器事件有:

    CAN报文事件在CAN总线上有指定的或任意报文出现时调用CAN报文事件

    格式为: on message xxx

    CAN信号事件CAN总线上出现指定的信号时调用该事件(需要配合DBC文件使用)

    格式为:on signal xxx (指定信号的值发生变化时调用)

    或者 on signal_update xxx(每次接收到指定信号时均被调用)

    定时事件定时器变量用来创建一个定时事件

    SetTimer函数用来设定时间间隔

    定时器运行到达设定时间间隔触发定时事件 on timer {}

    周期性触发需要每次触发结束后使用SetTimer复位

    cancelTimer函数用来在定时器运行中需要取消计时

    variables

    {

    message 0x555 msgl; //将报文0x555起名为msgl

    msTimer myTimer; //声明一个毫秒计时器

    }

    on start

    {

    setTimer(myTimer,100); //将定时值设置为100ms并启动

    }

    //定时器超时,触发以下事件

    on timer myTimer

    {

    serTimer(myTimer, 100); //复位定时器

    msgl.byte(0) = msgl.byte(0) +1; //报文0x555的第一位上数据增加1

    output(msgl); //发送报文0x555

    }

    键盘事件

    这个事件是用来定义一些在键盘上输入某些字母或者数字,来实现快捷操作的目的。

    格式为:On key xxx

    //以下事件定义了在键盘上敲击S,write窗口会打印语句“Logging Starts"

    on key 's'

    {

    write("Logging Starts");

    }

    错误帧事件总线上出现错误帧或者过载帧时,错误帧事件将被调用,以进行错误帧处理

    格式:on errorframe {}

    系统变量事件该事件是对系统变量发生变化的响应,我们写面板的时候这个语句用的最多

    //以下语句定义了系统变量DI_O改变时,触发以下事件

    on sysVar IO::DI_O

    {

    $Gateway::IOValue1 = @this;

    }

    //以下语句定义了系统变量DI_O更新时,触发以下事件

    on sysvar_update IO::DI_O

    {

    $Gateway::IOValue2 = @this;

    }

    诊断事件诊断事件是在诊断请求或诊断响应发生时产生

    常用诊断事件

    7.4 函数

    CAPL其实自身有一个很强大的函数库,几乎可以满足用户绝大部分的需求,包括一些:计算函数

    字符串函数

    CAN总线函数

    LIN总线函数

    诊断函数

    通用函数

    同时,用户可可以根据自己的需求,自定义一些满足自己独特需要的函数CAPL函数致力于定义接口,形成模块化的代码以提高代码的重用性

    与C的区别有以下几点:1)当返回类型省略时,被默认解释为void类型;2)允许函数包含一个空的形参列表;3)允许重载函数;4)函数可用实参进行类型检查,如果类型不同则检查是否能够通过隐式类型转换,如不能,则无法通过编译; 5)任意维度或大小的数组都可被作为函数参数传递; 6)大部分CAPL支持的数据类型都可以直接声明为函数参数

    8. 访问信号和变量

    CAPL因为支持总线数据库,所以可以直接访问数据库已定义的报文(message)名称、类型和标识符等属性。访问语法如下:

    on message 数据库中报文的名字

    {

    此处写要执行的动作;

    }

    刚开始看CAPL代码对于一些XXX::XXX以及@XXX以及$XXX的表述感觉很奇怪,看不进去。后面才搞清楚了这是CAPL访问数据的特殊表达方式,今天就在这里好好总结一下:

    信号、系统变量和环境变量都可以被直接访问和赋值,只是方式稍微有些不同

    访问信号

    虽然不能通过CAPL定义一个信号,但是却可以通过CAPL访问信号的值,只是我们访问信号的值一般在信号名字前面加上$符号,比如:

    a = $EngineSpeed; //将信号EngineSpeed的值赋给变量a

    b = $EngineSpeed.raw; //将信号EngineSpeed的物理值赋给变量b

    $VehicleSpeed = 80; //将信号VehicleSpeed的值设置为80

    有时候也见过这种表达:

    $Gateway::VehicleData::VehicleSpeed

    这也是信号的一种表达方式,即 节点::报文::信号,这是为了避免重名的信号出现,在前面加上节点、报文也是为了更精确的引用。比如一个学校有好几个叫小明的,你指定是六年级::一班::第三排::王小明,一般就不会找错了。

    完成的引用格式是:

    channel::Node::Message::Signal

    顺便介绍以下这种格式输入的好用的方法:

    在要输入信号的CAPL程序位置,点击右键,如下操作,会跳转至数据库文件,找到自己要引用的信号,这样就不用手输入了。变量也是同理。

    还有一种常用的又不会出错的引用信号的方式是:

    VehicleData.VehicleSpeed = @this; //VehicleData报文底下的信号VehiclSpeed

    访问变量

    格式:@变量空间名字::变量名

    if((@Engine::Gear ==2)&&(@Power::KeyState==2))

    a = @EngineSate; //直接访问

    环境变量也是如此,不过我们也可以用getValue()和putValue()访问变量的值,比如:

    a = getvalue(EngineSpeed); //读取变量EngineSpeed的值并将其赋值给变量a

    b = putvalue(EngineSpeed); //输出变量EngineSpeed的值并将其赋值给变量b

    好了今天的总结分享就到这里了。后面如果有新的认识再与大家分享~Good Night~

    展开全文
  • **最近一段时间有几个同行小伙伴问我如何利用CAPL语言开发出ECU与ECU之间的交互通信?** 汽车行业的小伙伴都知道,ECU与ECU之间是通过CAN/LIN线信号交互的,从一个ECU端到另一个ECU之间是经过网关转发,基本链路...

    最近一段时间有好几个小伙伴问我如何利用CAPL语言开发出ECU与ECU之间的交互通信?今天就给大家简单讲一个例子,有需要做这方面的仿真同学可以参考下

    汽车行业的小伙伴都知道,ECU与ECU之间是通过CAN/LIN线信号交互的,从一个ECU端到另一个ECU之间是经过网关转发,基本链路就是 ECU—GW(网关)—ECU。如下如所示

    在这里插入图片描述

    至于如何制作测试面板之类的我就不多加讲了,买本书看,或是百度下,这类的例子还是很多,如果有问题请私信我。
    -------------------------------------------------以下内容是重点-----------------------------------------------------

    实现步骤:
    1.例如:IVI端控制驾驶模式(代码以事件循环型信号为例),VCU监控IVI发送的信号,然后处理后在返回信号,信号链路就是:IVI–GW–VCU
    2.IVI端可以自己接一个硬件或是自己开发,我重点讲一下底层对手件是如何获取并处理后转发出去
    以下是代码块,大家参考下改改基本上能用

    /*@!Encoding:936*/
    
    variables
    {
     //设置两个变量和一个结构体
      message 0xIVI_ID msg;
      int EU_VCUPowerMode = 0;
      int EU_VCUPowerMode _TEMP;
      
      mstimer timer_0xVCU_ID;
      message  0xVCU_ID message_0xVCU_ID;
    }
    on start
    {
      message_0xVCU_ID.EU_VCUPowerMode = EU_VCUPowerMode ;//临时变量赋值给VCU,然后外发
      settimer(timer_0xVCU_ID, xxx);
    }
    -----------------------------------------------------------------------------------
    该段代码就是通过ON message 来实时监控IVI的信号,如果有变化,会自动将变化的值赋值给VCU
    
    on message 0xIVI_ID 
    {
      msg = this; 
      
      // IVIDriveModeSet 就是通过IVI设置驾驶模式,外发的信号,比如IVIDriveModeSet  = 2(运动),那么就将2这个值赋值给VCU的值
      if(msg.IVIDriveModeSet == 2)
      {
        message_0xVCU_ID.EU_VCUPowerMode = 1;
      }
      if(msg.IVIDriveModeSet == 3)
      {
        message_0xVCU_ID.EU_VCUPowerMode = 3;
      }
      if(msg.IVIDriveModeSet == 1)
      {
        message_0xVCU_ID.EU_VCUPowerMode = 2;
      }
    }
    -----------------------------------------------------------------------------------
    //on timer内的代码就是VCU将在ON message获取的值进行处理,并对信号进行回复
    
    on timer timer_0xVCU_ID
    {  
      if(message_0xVCU_ID.EU_VCUPowerMode  == 1)
      {
        EU_VCUPowerMode _TEMP= 1;
      }
      if(message_0xVCU_ID.EU_VCUPowerMode == 2)
      {
        EU_VCUPowerMode _TEMP= 2;
      }
      if(message_0xVCU_ID.EU_VCUPowerMode == 3)
      {
        EU_VCUPowerMode _TEMP = 3;
      }
      if(message_0xVCU_ID.EU_VCUPowerMode == 0) //因为是信号是CE模式的,所以在信号返回0时在执行IVI端的请求
      {
        //这意识是将临时存储的值赋值给一个变量EU_VCUPowerMode ,这个变量将会赋值给message_0xVCU_ID.EU_VCUPowerMode ,见on start的代码
        EU_VCUPowerMode = EU_VCUPowerMode _TEMP;
      }
      settimer(timer_0xVCU_ID, xxx);
      output(message_0xVCU_ID);
    }
    
    
    

    以上就是详细的代码了,我在台架已经测试过,收发没有任何问题,基本上实现了利用CAPL语言实现仿真系统的收发功能,至于checksum以及RollingCounter等校验问题我的其他博客内容均有介绍。
    如有不正之处或是其他问题,欢迎大家一起交流!

    展开全文
  • 写这个博客,为了记录自己在实际开发中...以下脚本基于CAPL脚本。 错误的代码: On key 'c' { long a,b,c,d; a=0x11; b=0x22; c=0x33; d = a <<16 + b <<8 + c ; write("a:0x%x",a); write("b:0x

    写这个博客,为了记录自己在实际开发中因为C语言的运算符模糊不清,犯的一个错误

    需求:
    有三个long 型变量,a = 0x11 ,b =0x22, c =0x33 ,我想 实现 d = 0x112233

    以下脚本基于CAPL脚本。
    错误的代码:

    On key 'c'
    {
      long  a,b,c,d;
      a=0x11;
      b=0x22;
      c=0x33;
      d = a <<16 + b <<8 + c ;
      write("a:0x%x",a);
      write("b:0x%x",b);
      write("c:0x%x",c);
      write("d:0x%x",d); 
    }
    

    上面代码实际输出的是 0x00,因为 “<< ”的 优先级小于 “+”的优先级 ,所以 最后 d = a << (16+0x22)<<(8+0x33) 。

    正确的代码:

    On key 'c'
    {
      long  a,b,c,d;
      a=0x11;
      b=0x22;
      c=0x33;
      d =( a <<16 )+ (b <<8 )+ c ;
      write("a:0x%x",a);
      write("b:0x%x",b);
      write("c:0x%x",c);
      write("d:0x%x",d); 
    }
    

    另外一种正确的方式:

    On key 'c'
    {
      long  a,b,c,d;
      a=0x11;
      b=0x22;
      c=0x33;
      d = a <<16 | b <<8 | c ;
      write("a:0x%x",a);
      write("b:0x%x",b);
      write("c:0x%x",c);
      write("d:0x%x",d); 
    }
    

    因为 “|”的运算符优先级是小于 “<<”运算符的,故这种方式也可以得到正确的结果。

    下图附上C语言的运算符优先级,其实养成一个 只要有运算就加上括号的好习惯,管它什么优先级呢。
    在这里插入图片描述

    展开全文
  • CANoe CAPL语言Step2

    千次阅读 2016-07-17 13:16:21
    CANoe 入门 Step by step系列(二)CAPL编程 CAPL就是Communication Application Programming Laguage的缩写,CAPL类似于C语言的语法,因此所有的语法请参考C语言教程,这里不在这里进行详述,关于C语言,...
  • Information and explanation on the CAPL Callback Interface (CCI) for diagnostics in CANoe, including examples and references
  • CAPL常用语句.docx

    2020-12-30 15:46:08
    CAPL 编程
  • 本文的重点是分析该工程中各个节点CAPL语言是怎么编写的,主要目的在于理解整个工程的实现,具体关于CAPL语言的理论知识总结等以后再分享。 CAPL就是Communication Application Programming Laguage的缩写,CAPL...
  • CAPL编写的基于UDS的bootloader

    热门讨论 2018-03-29 14:08:11
    基于UDS协议的CAN booloader,用CAPL编写,可以直接下载BIN文件,目标平台是S12G192,可以修改后支持S19。
  • 功能设计思路如下:  1:整车环境模型搭建  2:实时监控XXX节点的发送帧  3:模拟节点发送CAN帧,观测xxx节点能否正常接收  4:实时监控总线负载率  5:界面化编程 【非纯代码,设计思路及部分代码】
  • CAPL编程入门(中文)

    热门讨论 2012-05-05 09:26:17
    CAPL编程入门指导(中文) ,很不错的一份资料,
  • CAPL语法介绍

    2012-05-08 11:37:21
    在CAN总线的开发测试阶段,需要对其拓扑结构,节点功能,网路整合等进行开发测试,所以CAN总线的开发需要专业的开发测试工具,CAPL语言是vector公司的一种面向对象编程语言,学习汽车电子嵌入式开发人员应该要熟知的
  • CAPL是什么

    千次阅读 2021-03-02 14:00:29
    CAPL是Communication Access Programming Language的缩写,是CANoe/CANalyzer专用的编程语言。 特征 类似于C语言 以事件驱动的程序执行形式运行,“在发生任何事情时做一些事情” CAPL节点的作用 CAPL可以作为总线...
  • #define在CAPL与C语言中的应用
  • CAPL 枚举变量

    2020-09-22 10:07:48
    CAPL 脚本中 枚举变量的定义和 函数传参
  • CAPL 二维查表

    2021-11-10 17:15:49
    使用CAPL语言写的一个二维查表实现函数,按需取用。 /*@!Encoding:936*/ includes { } variables { struct _myTable { long _tableIndexXCount,_tableIndexYCount; //x轴座标点 double _tableIndexX[30];//...
  • CAPL编程基础

    万次阅读 2019-05-23 19:15:35
    CAPL是CAN总线访问编程语言,在汽车电子开发中运行十分广泛,类似C语言,同时是基于事件建模的语言,事件类型包含三种: 总线事件 属性事件 时间时间 CAPL时间类型可以从一张表格清楚表示,图片素材来源网络 和...
  • CANoe/CAPL零基础教程

    热门讨论 2012-09-10 19:53:50
    CANoe/CANalyzer/CAPL ,零基础教程,CANoe软件教程,零基础教程。专门应用在汽车行业。
  • CAPL创建与语法简介

    万次阅读 多人点赞 2015-10-18 23:13:09
    CAPL 语言和C语言基本语法很相似,只是没有指针,list, set 等概念。 如何通过CANOE 创建自动测试节点   1. 创建一个CANoe configuration 2. 点击viewàSimulation Setup 3. 点击右键->insert xml test moudle ...
  • capl语法基于C语言,允许使用以下指令、表达式和运算符 指令 {…} 完整的一段函数体需要用中括号括起来 void func1() { if () { ... } } if…else… 判断语句if…else…,一般用来判断是或非两种情况,当然也...
  • CAPL中常用数学函数API

    千次阅读 2020-05-26 19:53:35
    CAPL中常用数学函数API _atoi64() _ceil() _floor() _gcvt() _max and _min _pow() _round(); abs(); atodbl() _atoi64() 将一个字符串转换成64bits整形数据,字符串应该是十进制的字符串 如果转换失败,返回值为0,...
  • CANoe之CAPL编程(CANoe系列其三)

    万次阅读 多人点赞 2019-07-02 19:42:28
    CANoe之CAPL编程(CANoe系列其三)摘要1、CAPL概述1.1、CAPL语言特性1.2、CAPL的程序结构1.3、CAPL的数据类型1.4、CAPL事件类型概述2、CAPL事件类型2.1、系统事件2.2、CAN控制器事件2.3、CAN消息事件2.4、时间事件...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 257
精华内容 102
关键字:

capl语言