CAPL 编程系列教程的第二十期内容,这一期开始系统性地学习 CAPL 中的事件 (Events)。
CAPL 编程系列教程 - 第二十期:CAPL 事件概述
一、 课程回顾与本期目标
- 回顾: 前面学习了 CAPL 的基础语法(数据类型、变量、运算符、控制流、函数、定时器)以及如何发送报文。
- 本期目标: 系统性地学习 CAPL 的核心机制——事件驱动模型,了解 CAPL 中常见的事件类型及其触发时机和用途。
二、 CAPL 事件驱动模型回顾
- 核心: CAPL 是一种基于事件 (Event-based) 或事件控制 (Event-controlled) 的编程语言
。 - 机制: CAPL 代码的执行不是顺序的,而是由 CANoe/CANalyzer 环境中发生的特定事件来触发
。 - 流程: 当某个特定事件(如收到报文、按下按键、定时器到期等)发生时,如果用户在 CAPL 脚本中编写了处理该事件的事件处理程序 (Event Handler/Procedure)(通常以
on EventName {...}的形式),那么系统会自动调用并执行该事件处理程序中的代码。
三、 CAPL 中常见的事件类型分类与介绍
-
(一) 测量生命周期事件 (Measurement Lifecycle Events)
on preStart:- 触发时机:在 CANoe 测量开始之前,准备工作阶段
。 - 用途:执行一些初始化或准备任务,例如加载测试数据文件、配置初始状态等
。
- 触发时机:在 CANoe 测量开始之前,准备工作阶段
on start:- 触发时机:当 CANoe 测量正式开始,可以收发总线报文的那一刻
。 - 用途:执行测量开始时需要进行的操作,如启动周期性发送报文的定时器、设置初始信号值等
。
- 触发时机:当 CANoe 测量正式开始,可以收发总线报文的那一刻
on preStop:- 触发时机:当 CANoe 即将结束测量之前,收到停止请求但尚未完全脱离总线时
。 - 用途:执行一些必要的收尾工作,例如发送下线通知报文、保存临时状态等
。
- 触发时机:当 CANoe 即将结束测量之前,收到停止请求但尚未完全脱离总线时
on stopMeasurement:- 触发时机:当 CANoe 测量完全结束,已脱离总线之后
。 - 用途:执行测量结束后的数据处理、分析、统计、生成报告等任务
。
- 触发时机:当 CANoe 测量完全结束,已脱离总线之后
-
(二) 用户输入与定时器事件 (Input & Timer Events)
(前面已接触) on key <KeyName>:- 触发时机:当用户在 CANoe 运行时按下键盘上指定的按键时 (如
'a','B',F1等)。 - 用途:用于手动触发特定的测试动作或脚本逻辑
。
- 触发时机:当用户在 CANoe 运行时按下键盘上指定的按键时 (如
on timer <TimerName>:- 触发时机:当名为
<TimerName>的定时器(timer或msTimer类型)到达设定的时间时。 - 用途:执行延迟任务或周期性任务
。
- 触发时机:当名为
-
(三) 报文与信号事件 (Message & Signal Events)
(非常常用) on message <ID | MsgName | *>:- 触发时机:当 CANoe 接收到总线上符合指定条件的报文时
。 - 可以指定具体的报文 ID (如
0x123)。 - 可以指定 DBC 文件中定义的报文名称 (如
EngineState)。 - 可以使用通配符
*来匹配所有接收到的报文。
- 可以指定具体的报文 ID (如
- 用途:对接收到的特定报文或所有报文进行处理、分析、记录或响应
。
- 触发时机:当 CANoe 接收到总线上符合指定条件的报文时
on signal <SignalName>:- 触发时机:当总线上指定信号 (
<SignalName>) 的值发生变化时 (从一个值变为另一个不同的值)。 - 前提:需要加载包含该信号定义的 DBC 文件
。 - 用途:响应特定信号值的改变,执行相应的逻辑
。 - 注意:如果信号值更新了,但值与上次相同,则不会触发
on signal。
- 触发时机:当总线上指定信号 (
on signal_update <SignalName>:- 触发时机:当总线上指定信号 (
<SignalName>) 的值被更新时,即使值没有发生变化。 - 前提:需要加载包含该信号定义的 DBC 文件
。 - 用途:当需要每次信号出现(无论值是否变化)都执行操作时使用,相对
on signal用得较少。
- 触发时机:当总线上指定信号 (
-
(四) 系统变量事件 (System Variable Events)
(后续讲解) on sysVar <SysVarName>/on sysVar_update <SysVarName>- 触发时机:当系统变量的值发生变化或更新时
。 - 用途:通常与仿真面板 (Panel) 交互相关,用于响应面板控件的变化或更新面板显示
。将在后续讲解系统变量时再详细介绍。
四、 总结与后续
- 本期系统性地介绍了 CAPL 的事件驱动模型,并分类梳理了常见的事件类型及其触发条件和基本用途。
- 理解这些事件是编写有效 CAPL 脚本的基础,能够让你在正确的时间点执行正确的代码逻辑。
- 后续计划:
- 下一期(第二十一期)将通过实例详细讲解测量生命周期事件 (
on preStart,on start,on preStop,on stopMeasurement)。 - 之后会继续讲解其他重要的事件类型,特别是报文和信号事件。
- 下一期(第二十一期)将通过实例详细讲解测量生命周期事件 (