检查在CAPL(CANoe)中运行计时器时的条件

问题描述 投票:0回答:1

我正在CAPL中运行脚本,在该脚本中,我应该注意到来自ECU的信号(例如:信号B)的值发生了变化。在计时器启动时,我更改了另一个信号的值(例如:信号A),并通过CAN总线将其发送给ECU。当计时器运行时,我希望看到来自ECU的信号B的变化值,作为对信号A的变化值的响应。在计时器用完后,我想将信号A重置为其原始值。

*注:我将不同的信号称为信号A和信号B只是为了更清楚地理解问题

信号A将值从2更改为0。信号B的原始值为61,更改后的值可以是0-60之间的任何数字。计时器运行4秒钟。我正在使用while循环和命令(isTimerActive(timer)== 1),以检查计时器运行时信号B的值是否发生变化。

下面是附加的代码->

variables
{
 msTimer Execute;
}

on key 'c'
{
 setTimer(Execute,4000);
 Write("Test starts");
 SetSignal(Signal A, 2);
while (isTimerActive(Execute)==1)
{
 if ($Signal B != 61)
    {
     Write("Test pass");
     }
    else
    {
      Write("Test fail");
    }
}
}

on timer Execute
{
  write("Test over");
  setSignal(Signal A, 0);
}

我正在执行此代码,信号A的值变为2,但信号B的值没有变化。我正在使用(isTimerActive(timer)== 1)在while循环中,这是否是正确的命令为我的问题?另外,当我运行(isTimerActive(timer)== 1)时,CANoe变为非活动状态,我必须使用任务管理器停止CANoe。

任何想法如何纠正我的代码并获得所需的响应?

谢谢和最好

while-loop timer can-bus capl canoe
1个回答
0
投票

CAPL是事件驱动的。您唯一的选择是通过对事件处理程序(即以on ...开头的函数)进行编程来对事件做出反应。

在执行事件处理程序期间,系统基本上会阻塞所有内容,直到事件处理程序完成为止。从字面上看,什么也没有发生,没有sysvars改变,没有信号改变,没有定时器到期,没有总线消息被处理,等等。

对于测试模块和-unit,情况有些不同。您可以使用各种testWaitFor...方法在执行代码期间等待。

使用当前的on key ‘c‘实现,基本上可以阻塞系统,因为那里有一个while循环,等待Timer到期。

如上所述,这会阻止所有东西,您必须杀死独木舟。

幸运的是,信号的改变也是可以处理的事件。

这样的事情应该做:

删除while块,而是添加另一个事件处理程序,如下所示:

on signal SignalB
{
  if(isTimerActive(Execute))
  {
    if ($SignalB != 61)
    {
      Write("Test pass");
    }
    else
    {
      Write("Test fail");
    }
  }
}

SignalB更改时将调用该代码。然后,它检查计时器是否仍在运行,并检查信号值。

代替处理程序内部的$SignalB,您还可以编写this

在事件处理程序中,this始终是引起事件的对象。

© www.soinside.com 2019 - 2024. All rights reserved.