CAPL 编程系列教程的第二十八期内容 ,继续讲解 CAPL 内置函数,本期重点是高级日志记录控制,即如何通过 CAPL 函数更精确地控制 CANoe 中的 Logging Block(日志记录模块)的启停,包括指定模块名称以及设置预触发和后触发时间参数。
CAPL 编程系列教程 - 第二十八期:常用内置函数之高级日志控制
一、 课程回顾与本期目标
- 回顾: 上一期学习了使用
startLogging()和stopLogging()这两个基本函数来启动和停止 CANoe 的日志记录功能。 - 局限性: 无参数的
startLogging()和stopLogging()会同时启动或停止 CANoe 测量设置中的所有 Logging Block。 - 本期目标: 学习如何使用
startLogging和stopLogging函数的重载形式,实现对特定 Logging Block 的精确启停控制,并了解如何利用预触发 (Pre-trigger) 和后触发 (Post-trigger) 时间参数。
二、 CANoe 中使用多个 Logging Block 的场景
- 必要性: 在复杂的测试场景中,可能需要对不同类型或来源的数据进行分类记录,或者根据不同的触发条件记录日志。
- 实现: 可以在 CANoe 的 Measurement Setup 中添加多个 Logging Block 实例。
- 可以为每个 Logging Block 重命名 (如 "贾老师Logging", "LDW_Logging") 以便区分。
- 可以为每个 Logging Block 配置不同的过滤器 (Filter),使其只记录特定的报文或信号。
- 可以为每个 Logging Block 配置不同的触发方式 (如 Triggered - 由 CAPL 控制,Continuous - 持续记录等)。(注:CANoe 配置细节非本期重点)
- 结果: 生成多个独立的日志文件,便于分类管理和分析。
三、 通过名称控制单个 Logging Block
- 函数重载:
startLogging和stopLogging函数存在接受字符串参数的重载版本,该参数即为 Logging Block 的名称。
-
startLogging(char blockName[])- 作用: 仅启动名称为
blockName的那个 Logging Block。 - 参数:
blockName: 要启动的 Logging Block 在 CANoe Measurement Setup 中设置的名称(字符串)。 - 示例:
Code snippet
on key 'a' { // 只启动名为 "贾老师Logging" 的日志模块 startLogging("贾老师Logging"); write("启动了 贾老师Logging"); }
- 作用: 仅启动名称为
-
stopLogging(char blockName[])- 作用: 仅停止名称为
blockName的那个 Logging Block。 - 参数:
blockName: 要停止的 Logging Block 的名称(字符串)。 - 示例:
Code snippet
on key 'b' { // 只停止名为 "贾老师Logging" 的日志模块 stopLogging("贾老师Logging"); write("停止了 贾老师Logging"); }
- 作用: 仅停止名称为
- 对比: 使用带名称的重载版本可以精确控制目标模块,而无参数版本则控制所有模块。
四、 设置预触发和后触发时间
- 目的: 在事件触发日志记录时,往往不仅需要记录事件发生之后的数据,还需要记录事件发生之前的一段时间(预触发)或停止记录请求发出之后的一段时间(后触发)的数据,以获取更完整的上下文信息。
- 实现函数 (进一步重载):
-
startLogging(char blockName[], long preTriggerTimeMs)- 作用: 启动名为
blockName的 Logging Block,并指定记录触发时刻之前preTriggerTimeMs毫秒的数据。 - 参数:
blockName: 模块名称。preTriggerTimeMs: 预触发时间,单位为毫秒 (ms)。
- 实现原理 (CANoe 内部缓存): CANoe 在测量过程中会维护一个内部的环形缓冲区 (Ring Buffer),缓存最近一段时间的总线数据。当调用带预触发时间的
startLogging时,CANoe 会从缓冲区中提取触发时刻之前的相应时间段的数据并写入日志文件。 - 示例:
Code snippet
on key 'a' { // 启动 "贾老师Logging",并记录触发前 2000ms 的数据 startLogging("贾老师Logging", 2000); }
- 作用: 启动名为
-
stopLogging(char blockName[], long postTriggerTimeMs)- 作用: 请求停止名为
blockName的 Logging Block,但在实际停止前,继续记录postTriggerTimeMs毫秒的数据。 - 参数:
blockName: 模块名称。postTriggerTimeMs: 后触发时间,单位为毫秒 (ms)。
- 用途: 确保在触发停止事件(如报警信号消失)后,还能记录一小段时间的数据,以观察事件结束后的状态。
- 示例:
Code snippet
on key 'b' { // 请求停止 "贾老师Logging",但在停止前再多记录 3000ms 的数据 stopLogging("贾老师Logging", 3000); }
- 作用: 请求停止名为
- 与 CANoe 配置的关系: Logging Block 本身也可以在 CANoe 界面配置预触发和后触发时间。使用 CAPL 函数指定的预/后触发时间优先于 CANoe 界面上的配置,并且是动态生效的。
五、 示例与验证
- 教程演示了在 CANoe 中添加两个 Logging Block ("贾老师Logging" 和 "LDW_Logging")。
- 通过 CAPL 代码:
- 验证了无参数
startLogging/stopLogging会同时启停两个模块。 - 验证了带名称参数的版本可以单独启停 "贾老师Logging" 模块。
- 验证了带预触发和后触发时间的版本:
- 按 'A' 键使用
startLogging("贾老师Logging", 2000)启动。 - 按 'B' 键使用
stopLogging("贾老师Logging", 3000)停止。 - 通过检查生成的日志文件的时间戳,确认了触发日志记录 (
Trigger event) 时刻之前约 2 秒的数据被记录下来,并且在停止请求发出后又延续记录了约 3 秒的数据。
- 按 'A' 键使用
- 验证了无参数
六、 总结与后续
- 本期学习了通过 CAPL 函数对 CANoe 日志记录模块进行高级控制的方法。
- 掌握了如何使用带名称参数的
startLogging/stopLogging控制特定模块。 - 理解并掌握了如何使用带时间参数的
startLogging/stopLogging实现预触发和后触发日志记录。 - 这些功能对于在自动化测试中根据特定事件精确地、带上下文地记录所需数据非常有用。
- 后续将继续学习 CAPL 的其他内置函数或应用。