带有自定义结构数据类型的sysvar的sysvar_change过程的CAPL

时间:2019-11-06 14:26:08

标签: capl

根据手册

  

仅当变量值时才调用sysVar上的过程   变化。也可以将其写为sysVar_change。如果你想成为   通知变量值更新,但不会更改   值,则应改用sysVar_update。

在我的示例场景中,我有一个自定义结构数据类型s::sysv的系统变量X,其中X有两个字段:AB

在我的CAPL脚本中,我输入了以下内容:

on sysvar_change s::sysv.A
{
    // do stuff
} 

仅当s::sysv.A更改时,预期的输出才起作用。但是,由于s::sysv.B经常在模拟运行时更新,因此即使on sysvar_change s::sysv.A不变,过程A的调用次数也比我预期的多。 / p>

我不明白为什么,为了避免这种情况,我正在采取很多解决方法,有人可以帮忙吗?


编辑:

根据一个答复,事件处理程序不是struct元素,而是变量。但是,关键字this现在指向struct元素,而不是变量。

手册的这一点也很重要:

  

您也可以以相同的方式对特定项目的价值变化做出反应   类型为struct或通用数组的系统变量的元素。对于   为此,将元素添加到变量的名称。

2 个答案:

答案 0 :(得分:1)

我已经在最新的CANoe中尝试了此功能,并且可以正常使用。以下是我的代码。

on key 'a'
{
  @sysvar::Var_Struct1.StructMem1++;
}
on key 'b'
{
  @sysvar::Var_Struct1.StructMem2++;
}

on sysvar_change Var_Struct1.StructMem1
{
  write("StructMem1 value changed");
}
on sysvar_change Var_Struct1.StructMem2
{
  write("StructMem2 value changed");
}

每当我按下“ a”或“ b”键时,就会触发相应的事件。

答案 1 :(得分:0)

您的变量为s::sysv。每当变量的值更改时,都会调用事件处理程序。无论A还是B发生变化。

没有办法将其限制为仅对该值的某些更改。

这类似于在以下情况下也无法通知您的事实:只有整数的第3位会发生变化。

对我来说,最好重新考虑您的设置并问自己,使用struct是正确的方法,还是使用两个单独的系统变量AB可能更好。