根据手册
仅当变量值时才调用sysVar上的过程 变化。也可以将其写为sysVar_change。如果你想成为 通知变量值更新,但不会更改 值,则应改用sysVar_update。
在我的示例场景中,我有一个自定义结构数据类型s::sysv
的系统变量X
,其中X
有两个字段:A
和B
在我的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或通用数组的系统变量的元素。对于 为此,将元素添加到变量的名称。
答案 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是正确的方法,还是使用两个单独的系统变量A
和B
可能更好。