事件过程执行时机

这些事件过程会在测量开始前、测量启动时以及测量结束时被调用。例如,您可以在此处初始化变量,使用write函数将启动报告输出到 Write 窗口,启动定时器或在测量结束后输出统计信息。

 [个人解读:上文标粗文字说明了,on (start/prestart/stopmeasure/prestop)这些事件的触发源 是“测量”,这里测量原文中的单词就是Measure,对应的就是下文中两个图标“Start,和Stop”]

准确的来说 on (start/prestart)是可以被“Start”触发,on (stopmeasure/prestop)可以被Stop触发。Pre开头的事件可以被称为“预事件”是先被触发的。怎么理解喃?如一个脚本中同时定义了,on (start/prestart)事件,当Start被按下时,prestart被先触发。可以直接在脚本中试一下,就知道了。

on preStart过程

on preStart过程仅用于初始化变量、在 Write 窗口显示消息以及从文件读取数据。当on preStart过程执行时,系统(CANoe)的部分功能尚未完全可用。例如,此时无法通过output函数向总线发送消息。

【记住,在on preStart事件中,output(函数是无法使用的)】

on preStop处理程序

当请求停止测量后,on preStop处理程序会被调用。该函数可用于执行某些必须在测量停止生效前完成的最终操作。
注意:若仅在on StopMeasurement中执行环境变量设置等操作可能无效。若需要执行更复杂的预停止操作(如向连接的 ECU 发送关机消息并等待确认),可在on preStop函数中调用DeferStop来进一步延迟测量停止。如果 CAPL 节点中未调用DeferStop,则所有预停止活动将在on preStop处理程序结束后视为完成,即测量会立即停止(除非其他节点仍在延迟测量停止)。

[记住,如果在on StopMeasurement事件被触发后,执行对环境变量的操作,则可能是无效的,复杂操作也可能是无效的,如在prestart中启动一个定时器,也是无效的。]

DeferStop函数:

如下图,就是一个延迟的函数,延迟关闭

针对 CANoe 用户的说明

在网络节点模型中,可能需要在测量启动时执行与环境变量变化时相同的操作。具体包括:

  • 初始化环境变量                                          
  • 启动响应环境变量变化的定时器
  • 使用环境变量的初始值向总线发送消息

1、怎么都在说环境变量,现在环境变量基本不是,不使用了

由于这些功能通常在模型的on envVar事件过程中执行,CAPL 提供了CallAllOnEnvVar函数,可用于调用模型中所有on envVar事件过程。您应在on start过程中执行此函数以初始化模型的环境变量。

针对 Test Feature Set 用户的说明

在测试单元和测试模块中,不建议在on prestart处理程序中初始化变量,因为每次启动测试单元 / 模块时所有变量都会被清除。应使用测试场景本身进行变量初始化。更多细节请参考《CANoe 测试入门》。

示例代码

on preStart过程

capl

on preStart
{
   write("Measurement started!");
   msg_Count = 0;
}
on start过程

capl

on start
{
   write("start Node A");
   setTimer(cycTimer,20);
   CallAllOnEnvVar(); // 仅适用于CANoe
}
on preStop过程

capl

on preStop
{
   message ShutdownReq m;
   output(m);
   DeferStop(1000);
}
on stopMeasurement过程

capl

on stopMeasurement
{
   write("Message 0x%x received: %d", msg.id, msg_Count);
}

CAPL 测试节点中使用处理程序的注意事项

对于on preStop处理程序、事件处理程序和定时器处理程序:
如果测试被停止(测试模块处于非活动状态),这些处理程序将不会在 CAPL 测试节点中执行。

示例
在 XML 测试模块中添加 CAPL 测试节点:

xml

<TestModule>
  <CAPLTestNode>
    on preStart
    {
      write ("start");
    }
    
    on preStop
    {
      write ("stop");
      deferStop (5000);
    }
  </CAPLTestNode>
</TestModule>

当测试模块非活动时:

  • on preStart()write输出会显示
  • on preStop不会执行

格式说明

  1. 代码块:保留原文缩进和语法高亮格式
  2. 注意事项:使用斜体标注并单独成段
  3. 函数名 / 变量名:保持 CAPL 原生写法(如DeferStopmsg_Count
  4. XML 代码:保留标签结构和缩进
  5. 技术术语:采用行业标准译法(如 "measurement" 译为 "测量","environment variables" 译为 "环境变量")
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐