一文了解CANoe-CAPL语言编程

文摘   2025-01-20 07:32   上海  

CAPL(Communication Access Programming Language)是一种用于汽车电子领域的编程语言,它是一种类C语言的程序语,利用CAPL可以在单个的应用中对CANoe进行编程。

一、背景和用途    

汽车网络测试:在汽车电子系统的开发过程中,众多电子控制单元(ECU)之间需要通过各种网络通信协议(如 CAN、LIN、FlexRay 等)进行信息交互。CAPL 主要用于对这些通信过程进行模拟、测试和分析。例如,汽车制造商在测试新的发动机控制单元(ECU)与车身控制模块(BCM)之间的 CAN 通信时,可以使用 CAPL 编写测试脚本,以验证信号传输的正确性、实时性和可靠性。

ECU 软件开发:帮助开发人员实现 ECU 内部的一些特定功能逻辑。比如在一个自动变速器的 ECU 开发中,通过 CAPL 编写程序来处理来自各种传感器(如车速传感器、节气门位置传感器)的信号,并根据预设的策略(如换挡策略)控制变速器的动作。

二、语言特点    

事件驱动编程:CAPL 是基于事件驱动的。它能够对各种网络事件(如接收到特定的 CAN 消息、定时器超时等)做出响应。例如,当车辆的 CAN 总线上收到一条包含车速信息的消息时,使用 CAPL 编写的程序可以触发一个事件处理函数,对该车速信息进行处理,如判断车速是否超过设定的阈值,进而触发报警功能。
支持多种汽车网络协议:可以方便地与 CAN、LIN、FlexRay 等协议一起工作。开发人员能够在同一 CAPL 脚本中针对不同的协议进行操作。例如,在一个复杂的汽车电子系统测试场景中,同时处理 CAN 网络上的动力系统相关消息和 LIN 网络上的车窗控制消息。
丰富的函数库和数据类型:提供了大量用于汽车网络通信和数据处理的函数。比如,有用于消息发送和接收的函数,像output()函数用于在总线上发送消息,on message关键字用于定义消息接收的事件处理程序。在数据类型方面,除了基本的数据类型(如整型、浮点型等),还有专门用于汽车网络数据表示的类型,如信号(Signal)和消息(Message)类型。信号类型可以方便地对 CAN 消息中的某个具体信号进行操作,比如读取和写入车速信号的值。    

三、CAPL数据类型    

3.1 CAPL数据类型
如下表所示:
数据类型
名称
注释
无符号整型
byte
1 个字节
word
2 个字节
dword
4 个字节
有符号整型
int
2 个字节
long
4 个字节
浮点型
float
8 个字节
double
8 个字节
CAN 报文
message
11/29 ID
定时器
timer
msTimer
毫秒
单个字符
char
1 个字节
3.2 数据定义
变量定义

int i;    

message 0x123 HiRain;

message MotorData Vector;

3.3 关键字
this代表触发事件的对象

on message 100 {

byte byte_0;

byte_0 = this.byte(0);//将ID为100的报文的信号byte的值送变量byte_0,this指ID为100的报文

...

}

on envVar Switch {

int val;

val = getvalue(this);得到环境变量Switch的值送val,this指Switch

...

}

四、CAPL Broswer    

它主要用于浏览和查看 CAPL(Communication Access Programming Language)程序的相关信息。    
CAPL Broswer功能特点:可以做到代码浏览、变量查看、事件跟踪。
代码浏览:可以方便地查看 CAPL 脚本的结构。它以一种层次化的方式展示代码中的函数、变量、事件等元素。例如,在一个复杂的车辆网络通信模拟 CAPL 程序中,通过 CAPL Browser 可以快速定位到特定的网络节点通信函数,查看函数内部的参数设置和逻辑流程。
变量查看:能够显示程序中定义的全局变量和局部变量的信息。包括变量的类型、初始值等。对于调试程序非常有用,比如当怀疑某个变量的值导致通信故障时,可以在 CAPL Browser 中检查该变量的定义和当前可能的值。
事件跟踪:对于 CAPL 中的事件(如定时器事件、消息接收事件等),CAPL Browser 可以帮助用户查看事件的关联函数。以 CAN 通信中的消息接收事件为例,它可以显示当接收到某一特定 ID 的 CAN 消息时,对应的处理函数是什么,以及这个函数是如何对消息数据进行处理的。
4.1 CAPL事件
事件类型
事件名
程序执行条件
事件过程语法结构 *
系统事件        
PreStart
CANoe 初始化时执行
on preStart {...}
Start
测量开始时执行
on start {...}
StopMeasuremet
测量结束时执行
on stopMeasurement {...}
CAN 控制器事件
BusOff
硬件检测到 BusOff 时执行
on busOff {...}
ErrorActive
硬件检测到 ErrorActive 时执行
on errorActive {...}
ErrorPassive
硬件检测到 ErrorPassive 时执行
on errorPassive {...}
WarningLimit
硬件检测到 WarningLimit 时执行
on warningLimit {...}
CAN 消息事件
自定义
接收到指定的消息时执行
on message Message {...}
时间事件
自定义
定时时间超过时执行
on timer Timer {...}
键盘事件
自定义键值
指定的按键按下时执行
on key Key {...}
错误帧事件
ErrorFrame
硬件每次检测到错误帧时执行
on errorFrame {...}
环境变量事件
自定义
指定的环境变量值改变时执行
on envVar EnvVar {...}

定时器事件(Timer Events)

基本概念:定时器事件允许你在特定的时间间隔后执行代码。例如,你可以设置一个定时器,每隔 100 毫秒执行一次函数。这在模拟周期性的数据发送或者对某些信号进行周期性检查时非常有用。示例代码:

variables

{
    timer myTimer;
}
on start
{
    setTimer(myTimer, 100); // 设置定时器,时间间隔为100毫秒
}
on timer myTimer
{
    // 这里写定时器触发后要执行的代码,比如发送一个CAN消息
    message myMessage;
    myMessage.id = 0x123;
    output(myMessage);
}
在这个示例中,当 CAPL 程序启动(on start事件)时,设置了一个定时器myTimer,时间间隔为 100 毫秒。每次定时器触发(on timer myTimer事件),就会创建一个 CAN 消息myMessage,并将其 ID 设置为0x123,然后通过output函数发送出去。
消息事件(Message Events)
基本概念:消息事件用于处理接收到的 CAN、LIN 等网络消息。当特定的消息被接收到时,与之关联的 CAPL 事件代码就会被执行。这可以用于对车辆网络中的信号进行解析、处理和响应。 示例代码:

on message 0x456

{

    // 当接收到ID为0x456的消息时执行以下代码

    byte dataByte = this.byte(0); // 获取消息的第一个字节数据

    if(dataByte == 0x01)

    {

        write("Received a specific value in the message!");

    }

}

在这里,当接收到 ID 为0x456的消息时,代码获取该消息的第一个字节数据。如果这个字节的值为0x01,就会在 CAPL 的输出窗口中显示一条消息,表示收到了特定值。
系统事件(System Events)
基本概念:系统事件包括 CAPL 程序的启动(on start)和停止(on stop)等。on start事件可以用于初始化变量、设置定时器、打开文件等操作。on stop事件则可以用于清理资源,比如关闭文件、停止正在运行的定时器等。示例代码(on start):

on start

{

    int myVariable;

    myVariable = 0;

    write("CAPL program started. Initial variable set to 0");

}

在这个on start事件的示例中,定义了一个整数变量myVariable并将其初始化为 0,同时在输出窗口中显示一条消息表示程序已经启动。    
按键事件(Key Events)
基本概念:如果在 CANoe 的测试环境中,需要用户进行交互,比如通过按键来触发某些操作,就可以使用按键事件。例如,当用户按下某个特定的功能键时,执行特定的测试步骤或者发送特定的消息。示例代码:

on key 'F1'

{

    // 当用户按下F1键时执行以下代码

    message testMessage;

    testMessage.id = 0x789;

    output(testMessage);

    write("Message sent when F1 key is pressed");

}

当用户按下F1键时,这个事件被触发。代码会创建一个 ID 为0x789的消息并发送出去,同时在输出窗口中显示一条消息说明操作已经执行。
4.2CAPL响应
CAPL(Communication Access Programming Language)中,“响应” 通常是指对各种事件(如消息事件、定时器事件、系统事件等)做出的处理动作。
4.2.1对消息事件的响应
信号提取与处理
当收到一条 CAN 消息时,响应动作可能包括提取消息中的信号值并进行计算或判断。例如,假设有一条包含车速信号的 CAN 消息,其 ID 为 0x100,车速信号存储在消息的第 2 个字节(字节索引为 1)。
消息转发    
响应还可能涉及将接收到的消息转发到其他网络节点或者进行消息格式的转换后再发送。假设要将接收到的 CAN 消息转发到另一个 CAN 通道。
4.2.2对定时器事件的响应
周期性数据发送
定时器事件响应常用于周期性地发送数据。例如,每隔 500 毫秒发送一次包含车辆状态信息(如发动机转速、油温等)的 CAN 消息。
状态检查与更新
定时器事件响应也可以用于定期检查系统状态。例如,检查车辆的电池电压是否低于阈值,如果低于阈值则发送警告消息。
4.2.3对系统事件的响应
程序启动时的初始化响应
在on start系统事件中,可以进行一系列的初始化操作,如打开文件用于记录数据、初始化网络接口等。
程序停止时的清理响应
在on stop事件中,主要是清理程序运行过程中占用的资源。例如,关闭在程序启动时打开的文件。 


谦益行
分享汽车研发日常,助力你我共同成长。
 最新文章