根据说明书,
仅当变量的值达到时才会调用 sysVar 上的过程 变化。也可以写成on 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
没有更改其值。
我不明白为什么,我采取了很多解决方法来避免这种情况,有人可以帮忙吗?
编辑:
根据一篇回复,事件处理程序不是结构体元素,而是变量。但是,关键字
this
现在指向结构元素而不是变量。
手册的这一部分也相关:
您也可以以同样的方式对特定的价值变化做出反应 结构体或泛型数组类型的系统变量的元素。为了 将元素添加到变量的名称中。
我已经在最新的 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”键时,就会触发相应的事件。
你的变量是
s::sysv
。每当变量的值发生变化时,就会调用事件处理程序。无论A
还是B
改变。
没有办法将其仅限于值的某些变化。
这类似于您也无法在以下情况下收到通知的事实:只有整数的第 3 位发生变化。
对我来说,最好重新考虑您的设置并问问自己,使用结构体是否是正确的方法,或者使用两个单独的系统变量
A
和B
是否会更好。
也许你可以看看“on sysvar”帮助。可以使用 sysVarMember 而不是 sysVar 来仅查看结构或数组的成员。