Canoe CAPL编程

CAPL 简介

CAPL(Communication Access Programming Language)是一种用于汽车电子领域的编程语言,主要用于开发和测试汽车电子控制单元(ECU)之间的通信协议。它是由 Vector Informatik 公司开发的,专门为汽车网络设计,例如 CAN(Controller Area Network)、LIN(Local Interconnect Network)、FlexRay 和 Ethernet 等网络。
在汽车软件开发过程中,CAPL 用于创建测试脚本,模拟 ECU 的行为,对通信系统进行功能验证和故障注入测试等。例如,在汽车的动力系统控制单元(PCU)和车身控制单元(BCU)之间的 CAN 通信测试中,可以使用 CAPL 编写测试脚本来检查信号传输是否正确、消息是否按时发送和接收等。

在CANoe工程的”Simulation Setup”界面下的左侧的网络节点中,点击铅笔形状的图标,进入CAPL编辑界面(若当前节点还没有创建对应的CAPL程序,则此时会先提示输入CAPL程序名,并保存为.can后缀的文件)
在这里插入图片描述

CAPL的程序结构

如下,一个完整的CAPL程序的结构包含了头文件、全局变量、事件函数、自定义函数;当然不是每个因素都要有,视具体程序功能确定。
请添加图片描述

CAPL的数据类型

1. 无符号整数

  • byte (1 字节)
  • word(2 字节)
  • dword(4 字节)

2. 有符号整数

  • int(2 字节)
  • long(4 字节)

3. 有符号整数

  • float(8 字节)
  • double(8 字节)

4. CAN消息类型

  • message

5. 定时器类型

  • timer (秒为单位)
  • msTimer (毫秒为单位)

6. 变量定义

// 一种方式
message 0x431 msg1;//将报文0x431定义为变量msg1

// 一种方式
message VoiceStatus msg;         /*将工程中dbc中定义的VoiceStatus这条报文取名为msg*/

// 一种方式
message * msg;//先声明报文,暂时没有ID
msg.can = 1;//将这条报文设置为通道1
msg.id = 0x23;//报文ID为0x23
//msg.name = "mymsg";//报文名称是只读的
msg.dlc = 8;//报文长度
msg.byte(0) = 0x10;//报文第0个字节的内容
output(msg);//发送报文

on message xxx 中 this相关方法

this.byte(x);x可以是0-7
this.Word(x);x可以是0-6
this.DWord(x);x可以是0-4
this.QWord(x);x只能是0
this.id;报文ID
this.DLC;报文长度
this.can;报文所在通道
this.dir;报文方向是 接收还是发送
this.time;报文时间戳(单位10us)
this.simulated;报文是否由仿真节点发送,0:不是,1:是
this.FDF;FD报文格式标志位,0:CAN,1:CANFD

公共方法

1. output(msgName) 从程序块输出message(形式1)或errorframe(形式2)。

在这里插入图片描述

2. applILTxPending 在message发送之前更改数据

dword applILTxPending(long aId, dword aDlc, byte data[]);

  • aId:message ID
  • aDLC:要发送消息的数据字节数组的长度。
  • data:数据字节数组,包含要发送的字节。字节可以随意更改。
  • 返回值:
    • 0:阻止使用提供的aId发送消息
    • 1:使用提供的aId发送消息
// Calculation of a checksum and a message counter 示例:
dword applILTxPending (long aId, dword aDlc, byte data[])
{
  dword i;
  byte xor;
  /* Message 0x1A0 contains a XOR checksum in Byte 0. It will
  /* be calculated from the other data bytes of the message.
  */
  if(aId == 0x1A0)
  {
    // calculate
    xor = 0x00;
    for(i = 1; i < aDlc; ++i) {
      xor = xor ^ data[i];
    }
    // set the new checksum
    data[0] = xor;
  }
  /* Message 0x1A1 contains a 4-Bit message counter in
  /* the first 4 Bits of Byte 0.
  */
  if(aId == 0x1A1)
  {
    // get the old value
    i = data[0] & 0x0F;
    // increment
    i++;
    i = i % 16;
    //set the new message counter
    data[0] = i & 0x0F;
  }
  return 1; // don't prevent sending of the message
}

在CANoe交互层(CANoe IL)向总线发送消息之前,可以选择调用此回调。在此回调中,可以阻止消息的发送或更改消息的数据。

$ 和 @ 的区别

  • 一般来说,前面带$的就是message 中的 signal。
  • 一般来说,前面带@的就是系统变量。

如何切换 ECU加载的 .can 文件

在这里插入图片描述
在这里插入图片描述

自定义函数定义的变量 不是局部变量

需要注意的是,自定义函数定义的变量 不是局部变量

如何打印信息

打印输出信息通常使用 write() 函数,它可以将指定的内容输出到 CANoe 的输出窗口中。

int num =0;
write("%d",num);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值