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);
}
运行与验证
- 在CANalyzer中新建CAPL程序,将上述代码粘贴到编辑器中
- 确保系统变量
SysVarName已在System Variables窗口中定义(类型为Integer,建议Int或Long) - 编译CAPL程序,确认无语法错误
- 启动CANalyzer测量(按F9或点击Start按钮)
- 在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绑定的是同一变量