问题描述
我正在使用 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 时的工作原理。
解决方法
我发现了问题。点火 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);
}
}
谢谢!