2. 使用CAPL实现周期报文发送

任务说明

在CANoe中通过CAPL脚本周期性地向总线发送一条单帧CAN消息。本案例实现一个最小可用的发送逻辑:使用on timer事件周期性调用output()函数,将预定义的报文发送到CAN总线。通过CANoe的Trace窗口或IG(Interaction Generator)对比,验证报文ID、数据场和发送周期是否符合预期。

实现方案

在CAPL中发送CAN消息的核心是output()函数。本案例在Test Setup或Simulation Setup中新建一个Network Node,并在其CAPL程序中定义消息变量、初始化定时器,并在定时器回调中发送消息。发送周期设为100ms,报文ID为0x123,数据场为8字节固定值。

CAPL代码

/* 消息定义:ID=0x123,标准帧,8字节数据 */
message 0x123 MsgToSend = { dlc = 8 };

/* 定时器,用于周期发送 */
timer tSend;

/* 系统启动后初始化 */
on start
{
  // 填充发送数据(示例数据)
  MsgToSend.byte(0) = 0x11;
  MsgToSend.byte(1) = 0x22;
  MsgToSend.byte(2) = 0x33;
  MsgToSend.byte(3) = 0x44;
  MsgToSend.byte(4) = 0x55;
  MsgToSend.byte(5) = 0x66;
  MsgToSend.byte(6) = 0x77;
  MsgToSend.byte(7) = 0x88;

  // 启动周期发送,周期100ms
  settimer(tSend, 100);
}

/* 定时器到期,发送消息并重新启动定时器 */
on timer tSend
{
  output(MsgToSend);
  settimer(tSend, 100);
}

集成步骤

  1. 在CANoe中打开Simulation Setup,新建一个Network Node,双击打开其CAPL Browser。
  2. 将上述代码粘贴到CAPL Browser中,编译(F5)确保无错误。
  3. 在Database中无需额外配置,因为消息直接以0x123定义在CAPL中。
  4. 启动CANoe仿真(F9),观察Trace窗口。

验证方法

在CANoe的Trace窗口中添加CAN通道,启动测量后观察:

  • 是否存在ID为0x123的报文,且方向为Tx(发送)。
  • 报文数据场是否为11 22 33 44 55 66 77 88。
  • 两条相邻报文的时间戳间隔是否约为100ms(允许±1ms抖动)。

判定标准:以上三项全部满足,则案例通过。若Trace中无报文,检查节点是否被正确分配至总线通道,以及CAPL程序是否编译并激活。

报文发送时序

0ms 100ms 200ms 300ms 400ms Tx Tx Tx Tx Tx ID=0x123 11 22 33 44 55 66 77 88 ID=0x123 11 22 33 44 55 66 77 88 ID=0x123 11 22 33 44 55 66 77 88 100ms 100ms 100ms 100ms

关键说明

  • 本案例使用on start初始化定时器,适用于仿真启动即开始发送的场景。
  • 若需停止发送,可在CAPL中调用cancelTimer(tSend)。
  • 消息周期可通过修改settimer的第二个参数调整,单位为ms。
  • 若总线通道未配置或节点未分配,output()不会产生实际报文,需检查CANoe的总线设置。