【问题标题】:onTimer not working as intended - Vector CANoeonTimer 未按预期工作 - 矢量 CANoe
【发布时间】:2021-08-21 16:52:33
【问题描述】:

我正在使用 Vector CANoe 15.1 的演示版,目前,我已经成功创建了两个节点和两个面板。我创建了一些可以控制一些 LED 的按钮。我的想法是我想使用计时器,这样当我按下按钮时,我的 LED 会以 1Hz(1 秒)的频率闪烁。我设法让它在 5 个点火状态中的 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

【问题讨论】:

    标签: timer canoe


    【解决方案1】:

    我找到了问题所在。点火 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);
      }
    }
    

    谢谢!

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2020-11-30
      • 2018-09-15
      • 2022-10-04
      • 2021-06-04
      相关资源
      最近更新 更多