我正在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。
任何想法如何纠正我的代码并获得所需的响应?
谢谢和最好
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
始终是引起事件的对象。