我已经使用Vector软件在CANoe中创建了一个节点,我为它设计了设计数据库。
我需要传输连续的消息,为此我创建了一个带按钮的面板。当我一直按下按钮时,信息的信号应始终取值1,否则为0(按钮释放)
应该传输的消息具有以下特征:
我按下按钮后传输消息的代码:
variables {
message messageDeclaredInDb myMessage;
msTimer cyclicTimer200ms;
}
on envVar ev_Button_Status
{
switch (getValue(this)) {
case 0: myMessage.Sig = 0;
write("button released");
break;
case 1: myMessage.Sig = 1;
write("button pressed");
break;
default: write("Default");
}
setTimerCyclic(cyclicTimer200ms, 200);
}
on timer cyclicTimer200ms
{
myMessage.Sig = getValue(ev_Button_Status);
output(myMessage);
}
我在图形中可视化结果:
但是想要的结果应该是这样的,没有信号的上下:
有任何提示吗?知道我不使用任何交互层。
答案 0 :(得分:2)
请注意GenMsgILSupport = Yes
属性,表示此消息已启用交互层支持。 IL负责根据数据库中定义的属性(如周期时间)接收和发送消息。
使用IL支持,您可以直接访问信号。您既不需要定义消息变量也不需要定时器,只需在信号名称前添加$
字符并设置值即可。例如:
$Sig = 1;
完成示例1:
on envVar ev_Button_Status
{
switch (getValue(this)) {
case 0:
$Sig = 0;
write("button released");
break;
case 1:
$Sig = 1;
write("button pressed");
break;
default:
write("Default");
}
}
如果您不使用任何互动图层,请确保您的邮件已停用。此外,您的代码存在一些问题:
on start
中启动计时器,而不是on envVar
。on envVar
或on timer
,但不能同时设置。完成示例2:
variables {
message messageDeclaredInDb myMessage;
msTimer cyclicTimer200ms;
}
on start
{
setTimerCyclic(cyclicTimer200ms, 200);
}
on timer cyclicTimer200ms
{
myMessage.Sig = getValue(ev_Button_Status);
output(myMessage);
}