onTimer 未按预期工作 - Vector CANoe

问题描述

我正在使用 Vector CANoe 15.1 的演示版,目前,我已经设法创建了两个节点和两个面板。我创建了一些按钮,我可以用它们来控制一些 LED。这个想法是我想使用计时器,以便当我按下按钮时,我的 LED 以 1Hz(1 秒)的频率闪烁。我设法让它在 5 个 IGNITION 状态中的 3 个中工作,但在其他 2 个状态中却没有,即使我使用了相同的代码。也许如果我向您展示我的代码,您可以更好地理解我。

/*@!Encoding:1252*/
includes
{
  
}

variables
{
  msTimer MainCyclic;
  msTimer TurnLeftCyclic;
  msTimer TurnRightCyclic;
  msTimer HazardCyclic;
  int ignition;
  int hazardWarning;
  int turnlights;
  int flag1;
  int flag2;
  int flag3;
  byte byte0;
}

on preStart
{
  flag1=0;
  flag2=0;
  flag3=0;
}

on start
{
  setTimer(MainCyclic,50);
//  setTimer(TurnLeftCyclic,1500);
//  setTimer(TurnRightCyclic,1500);
//  setTimer(HazardCyclic,1000);
}

on timer MainCyclic
{
  setTimer(MainCyclic,50);
  fMain();
}

on timer TurnLeftCyclic
{
  setTimer(TurnLeftCyclic,1500);
  if (@IPC::LeftSignal == 1)
  {
    @IPC::LeftSignal=0;
    @IPC::RightSignal=0;
  }
  else
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=0;
  }
}

on timer TurnRightCyclic
{
  setTimer(TurnRightCyclic,1500);
  if (@IPC::RightSignal == 1)
  {
    @IPC::RightSignal=0;
    @IPC::LeftSignal=0;
  }
  else
  {
    @IPC::RightSignal=1;
    @IPC::LeftSignal=0;
  }
}

on timer HazardCyclic
{
  setTimer(HazardCyclic,1000);
  if (@IPC::LeftSignal == 1 && @IPC::RightSignal == 1)
  {
    @IPC::LeftSignal=0;
    @IPC::RightSignal=0;
  }
  else if (@IPC::LeftSignal == 0 && @IPC::RightSignal == 0)
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=1;
  }
}

on message ExternalLights
  {
    byte0=this.byte(0);
    if (byte0 == 0x0)
    {
      turnlights=0;
      hazardWarning=0;
    }
    if (byte0 == 0x1)
    {
      turnlights=1;
      hazardWarning=0;
    }
    if (byte0 == 0x2)
    {
      turnlights=2;
      hazardWarning=0;
    }
    if (byte0 == 0x4)
    {
      turnlights=0;
      hazardWarning=1;
    }
    if (byte0 == 0x5)
    {
      turnlights=1;
      hazardWarning=1;
    }
    if (byte0 == 0x6)
    {
      turnlights=2;
      hazardWarning=1;
    }
  }

on message IGN
  {
    byte0=this.byte(0);
    if (byte0 == 0x0)
      ignition=0;
    if (byte0 == 0x1)
      ignition=1;
    if (byte0 == 0x2)
      ignition=2;
    if (byte0 == 0x3)
      ignition=3;
    if (byte0 == 0x4)
      ignition=4;
  }

void fMain()
{
  if (ignition == 0 || ignition == 1)
  {
     if (turnlights == 0 || turnlights == 1 || turnlights == 2)
     {
        @IPC::LeftSignal=0;
        @IPC::RightSignal=0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
     }
     if (hazardWarning == 1 && flag3==0)
     {
        @IPC::LeftSignal=1;
        @IPC::RightSignal=1;
        setTimer(HazardCyclic,1000);
        flag1=0;
        flag2=0;
        flag3=1;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
     }
     else
     {
        @IPC::LeftSignal=0;
        @IPC::RightSignal=0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
     }
  }
  else if (ignition == 2 || ignition == 3)
  {
    if (hazardWarning == 0) 
    {
      if (turnlights == 0)
      {
        @IPC::LeftSignal = 0;
        @IPC::RightSignal = 0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
      }
    
      else if (turnlights == 1 && flag1==0)
      {
        @IPC::LeftSignal = 1;
        @IPC::RightSignal = 0;
        setTimer(TurnLeftCyclic,1500);
        flag1=1;
        flag2=0;
        flag3=0;
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
      }
    
      else if (turnlights == 2 && flag2==0)
      {
        @IPC::LeftSignal = 0;
        @IPC::RightSignal = 1;
        setTimer(TurnRightCyclic,1500);
        flag1=0;
        flag2=1;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(HazardCyclic);
      }
    }    
      else if (hazardWarning==1 && flag3==0)
      {
        @IPC::LeftSignal = 1;
        @IPC::RightSignal = 1;
        setTimer(HazardCyclic,1000);
        flag1=0;
        flag2=0;
        flag3=1;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
      }
  }
  else if (ignition == 4 && flag3==0)
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=1;
    setTimer(HazardCyclic,1000);
    flag1=0;
    flag2=0;
    flag3=1;
    cancelTimer(TurnLeftCyclic);
    cancelTimer(TurnRightCyclic);
  }
}

当点火=0 或 1 时,应该只作为 hazardLights 工作(左右同时闪烁)。问题是,当我按下 HazardSwitch 时,LED 亮起,但不闪烁。我将附上一张包含图形的照片。在前几秒,这是应该如何工作的(因为它在点火 = 2 或 3 或 4 时工作),之后您可以看到它在点火 = 0 或 1 时的工作原理。

My panels + graphic

解决方法

我发现了问题。点火 0 或 1 的条件设置不正确,并且 flag3 被重置太多次,因此只要我的开关为 0x1,我的 HazardCyclic 计时器就会打开和关闭。这是现在的代码:

includes
{
  
}

variables
{
  msTimer MainCyclic;
  msTimer TurnLeftCyclic;
  msTimer TurnRightCyclic;
  msTimer HazardCyclic;
  int ignition;
  int hazardWarning;
  int turnlights;
  int flag1;
  int flag2;
  int flag3;
  byte byte0;
}

on preStart
{
  flag1=0;
  flag2=0;
  flag3=0;
}

on start
{
  setTimer(MainCyclic,50);
//  setTimer(TurnLeftCyclic,1500);
//  setTimer(TurnRightCyclic,1500);
//  setTimer(HazardCyclic,1000);
}

on timer MainCyclic
{
  setTimer(MainCyclic,50);
  fMain();
}

on timer TurnLeftCyclic
{
  setTimer(TurnLeftCyclic,1500);
  if (@IPC::LeftSignal == 1)
  {
    @IPC::LeftSignal=0;
    @IPC::RightSignal=0;
  }
  else
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=0;
  }
}

on timer TurnRightCyclic
{
  setTimer(TurnRightCyclic,1500);
  if (@IPC::RightSignal == 1)
  {
    @IPC::RightSignal=0;
    @IPC::LeftSignal=0;
  }
  else
  {
    @IPC::RightSignal=1;
    @IPC::LeftSignal=0;
  }
}

on timer HazardCyclic
{
  setTimer(HazardCyclic,1000);
  if (@IPC::LeftSignal == 1 && @IPC::RightSignal == 1)
  {
    @IPC::LeftSignal=0;
    @IPC::RightSignal=0;
  }
  else if (@IPC::LeftSignal == 0 && @IPC::RightSignal == 0)
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=1;
  }
}

on message ExternalLights
  {
    byte0=this.byte(0);
    if (byte0 == 0x0)
    {
      turnlights=0;
      hazardWarning=0;
    }
    if (byte0 == 0x1)
    {
      turnlights=1;
      hazardWarning=0;
    }
    if (byte0 == 0x2)
    {
      turnlights=2;
      hazardWarning=0;
    }
    if (byte0 == 0x4)
    {
      turnlights=0;
      hazardWarning=1;
    }
    if (byte0 == 0x5)
    {
      turnlights=1;
      hazardWarning=1;
    }
    if (byte0 == 0x6)
    {
      turnlights=2;
      hazardWarning=1;
    }
  }

on message IGN
  {
    byte0=this.byte(0);
    if (byte0 == 0x0)
      ignition=0;
    if (byte0 == 0x1)
      ignition=1;
    if (byte0 == 0x2)
      ignition=2;
    if (byte0 == 0x3)
      ignition=3;
    if (byte0 == 0x4)
      ignition=4;
  }

void fMain()
{
  if (ignition == 0 || ignition == 1)
  {
     if ((turnlights == 0 || turnlights == 1 || turnlights == 2) && (hazardWarning == 0))
     {
        @IPC::LeftSignal=0;
        @IPC::RightSignal=0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
     }
     if (hazardWarning == 1 && flag3==0)
     {
        @IPC::LeftSignal=1;
        @IPC::RightSignal=1;
        setTimer(HazardCyclic,1000);
        flag1=0;
        flag2=0;
        flag3=1;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
     }
     else if(hazardWarning == 0)
     {
        @IPC::LeftSignal=0;
        @IPC::RightSignal=0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
     }
  }
  else if (ignition == 2 || ignition == 3)
  {
    if (hazardWarning == 0) 
    {
      if (turnlights == 0)
      {
        @IPC::LeftSignal = 0;
        @IPC::RightSignal = 0;
        flag1=0;
        flag2=0;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
      }
    
      else if (turnlights == 1 && flag1==0)
      {
        @IPC::LeftSignal = 1;
        @IPC::RightSignal = 0;
        setTimer(TurnLeftCyclic,1500);
        flag1=1;
        flag2=0;
        flag3=0;
        cancelTimer(TurnRightCyclic);
        cancelTimer(HazardCyclic);
      }
    
      else if (turnlights == 2 && flag2==0)
      {
        @IPC::LeftSignal = 0;
        @IPC::RightSignal = 1;
        setTimer(TurnRightCyclic,1500);
        flag1=0;
        flag2=1;
        flag3=0;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(HazardCyclic);
      }
    }    
      else if (hazardWarning==1 && flag3==0)
      {
        @IPC::LeftSignal = 1;
        @IPC::RightSignal = 1;
        setTimer(HazardCyclic,1000);
        flag1=0;
        flag2=0;
        flag3=1;
        cancelTimer(TurnLeftCyclic);
        cancelTimer(TurnRightCyclic);
      }
  }
  else if (ignition == 4 && flag3==0)
  {
    @IPC::LeftSignal=1;
    @IPC::RightSignal=1;
    setTimer(HazardCyclic,1000);
    flag1=0;
    flag2=0;
    flag3=1;
    cancelTimer(TurnLeftCyclic);
    cancelTimer(TurnRightCyclic);
  }
}

谢谢!