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);
}
集成步骤
- 在CANoe中打开Simulation Setup,新建一个Network Node,双击打开其CAPL Browser。
- 将上述代码粘贴到CAPL Browser中,编译(F5)确保无错误。
- 在Database中无需额外配置,因为消息直接以
0x123定义在CAPL中。 - 启动CANoe仿真(F9),观察Trace窗口。
验证方法
在CANoe的Trace窗口中添加CAN通道,启动测量后观察:
- 是否存在ID为
0x123的报文,且方向为Tx(发送)。 - 报文数据场是否为
11 22 33 44 55 66 77 88。 - 两条相邻报文的时间戳间隔是否约为100ms(允许±1ms抖动)。
判定标准:以上三项全部满足,则案例通过。若Trace中无报文,检查节点是否被正确分配至总线通道,以及CAPL程序是否编译并激活。
报文发送时序
关键说明
- 本案例使用
on start初始化定时器,适用于仿真启动即开始发送的场景。 - 若需停止发送,可在CAPL中调用
cancelTimer(tSend)。 - 消息周期可通过修改
settimer的第二个参数调整,单位为ms。 - 若总线通道未配置或节点未分配,
output()不会产生实际报文,需检查CANoe的总线设置。