4. 使用系统变量控制发送

任务目标

在CANalyzer中定义一个系统变量,通过监控该变量的值变化来触发发送一条CAN消息。当系统变量被外部修改(如通过Panel、CAPL程序或ILib)时,CAPL代码自动检测到变化并发送指定的CAN帧。

实现方案

使用CAPL的on sysvar事件处理程序监听系统变量变化。系统变量在CANalyzer的System Variables窗口中定义,CAPL代码通过事件处理器响应变化并调用output()函数发送CAN消息。

前置条件

  • 已创建CAN数据库(.dbc)或使用原始CAN帧ID发送
  • 在CANalyzer的System Variables窗口中已定义系统变量(本案例使用SysVarName作为示例,实际使用时需替换为已定义的变量名)

关键完整代码

/* CAPL脚本:系统变量变化触发CAN消息发送 */
variables
{
  /* 定义要发送的CAN消息 */
  message 0x123 CAN_Msg;  // 使用原始ID,也可替换为dbc中定义的message类型
  
  /* 记录上一次变量值,用于检测变化方向(可选) */
  int lastValue = 0;
}

/* 系统变量变化事件处理 */
on sysvar SysVarName
{
  /* 获取当前系统变量值 */
  int currentValue = @SysVarName;
  
  /* 将当前值填入CAN消息数据场 */
  CAN_Msg.byte(0) = currentValue & 0xFF;        // 低字节
  CAN_Msg.byte(1) = (currentValue & 0xFF00) >> 8; // 高字节
  
  /* 发送CAN消息 */
  output(CAN_Msg);
  
  /* 可选:记录到Write窗口便于观察 */
  write("系统变量变化: 新值=%d, CAN消息已发送", currentValue);
  
  /* 更新记录值 */
  lastValue = currentValue;
}

/* 可选:初始化时发送一次当前状态 */
on start
{
  int initValue = @SysVarName;
  CAN_Msg.byte(0) = initValue & 0xFF;
  CAN_Msg.byte(1) = (initValue & 0xFF00) >> 8;
  output(CAN_Msg);
  write("初始化发送,当前值=%d", initValue);
}

运行与验证

  1. 在CANalyzer中新建CAPL程序,将上述代码粘贴到编辑器中
  2. 确保系统变量SysVarName已在System Variables窗口中定义(类型为Integer,建议Int或Long)
  3. 编译CAPL程序,确认无语法错误
  4. 启动CANalyzer测量(按F9或点击Start按钮)
  5. 在System Variables窗口或使用Panel控件修改SysVarName的值

通过条件

  • 每次修改系统变量值后,Write窗口出现“系统变量变化”日志
  • 在CAN Trace窗口中观察到ID为0x123的CAN帧被发送
  • 发送帧的Data字段Byte0和Byte1与所设置的变量值一致(例如设置值为0x1234,则Byte0=0x34,Byte1=0x12)
  • 若使用CANoe的CAN Statistics窗口,Tx帧计数随变量修改而增加

常见问题

  • 变量名不匹配:代码中的SysVarName必须与System Variables窗口中定义的名称完全一致(包括命名空间,如Namespace::VarName)
  • 消息未发送:确认CAN通道已激活且总线无硬件故障;检查消息ID是否被其他节点占用
  • 事件不触发:确认系统变量类型为Integer而非String或Float;若变量在Panel中被修改,需确保Panel绑定的是同一变量