0

我使用 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); 
}

我在图形中可视化结果:

在此处输入图像描述

但是想要的结果应该是这样的,没有信号的上下波动:

在此处输入图像描述

请问有什么提示吗?知道我不使用任何交互层。

4

1 回答 1

3

请注意该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");
    }    
}

如果您不使用任何交互层,请确保为您的消息禁用它。此外,您的代码存在一些问题:

  1. 您应该在 中启动计时器on start,而不是在 中on envVar
  2. 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);
}
于 2016-10-18T11:58:47.087 回答