使用自定义结构数据类型的 sysvar 进行 sysvar_change 过程的 CAPL

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

根据说明书,

仅当变量的值达到时才会调用 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
现在指向结构元素而不是变量。

手册的这一部分也相关:

您也可以以同样的方式对特定的价值变化做出反应 结构体或泛型数组类型的系统变量的元素。为了 将元素添加到变量的名称中。

capl
3个回答
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”键时,就会触发相应的事件。


0
投票

你的变量是

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

没有办法将其仅限于值的某些变化。

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

对我来说,最好重新考虑您的设置并问问自己,使用结构体是否是正确的方法,或者使用两个单独的系统变量

A
B
是否会更好。


0
投票

也许你可以看看“on sysvar”帮助。可以使用 sysVarMember 而不是 sysVar 来仅查看结构或数组的成员。

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