CAPL 编程使用定时器作为延迟
CAPL Programming usage of Timer as a delay
我一直在编写一个 CAPL 脚本,该脚本会在一定的延迟后在每个频道(2 个否)上发送消息。我想使用 SetTimer() 和 mstimer::isRunning 函数生成以下延迟。
我可以使用 setTimer 函数,但我不知道如何使用 mstimer::isRunning。
代码如下:
Variables{
message * temp = {DLC=8};
mstimer timer1;
}
on timer timer1{
//Do nothing
}
onstart{
for(noofChannel=1;noofChannel<=2;noofChannel++){
settimer(timer1,100);
temp.CAN = noofChannel;
temp.ID = 0xAA;
While (mstimer::isrunning)==0 // I need to write this right.
{ //wait for timer to expire}
Output(temp);
}
而不是 mstimer::isrunning
使用 isTimerActive()
方法。
isTimerActive()
returns 如果计时器为 运行 则为 1,如果超时则为 0。
所以你的代码看起来像:
on start{
for(noofChannel=1;noofChannel<=2;noofChannel++){
settimer(timer1,100);
temp.CAN = noofChannel;
temp.ID = 0xAA;
While (isTimerActive(timer1) == 1)
{ //wait for timer to expire}
}
Output(temp);
}
}
但我不建议这样做。您可以通过 onTimer
输出第二条消息,而不是在 on start
中循环
on start{
temp.CAN = 1;
temp.ID = 0xAA;
Output(temp);
settimer(timer1,100);
}
on timer timer1{
temp.CAN = 2;
Output(temp);
}
如果你想让它保持通用,即不限制为 2 个通道,你可以获取一个变量并在计时器中递增它。
我问 Vector 同样的问题,他们的回答是这样的:
“msTimer.isRunning” 给我们定时器的状态,无论定时器是否 运行
可用性如下所述:
on timer myTimer
{
write("Running Status %d",myTimer.isRunning());
}
“timeToElapse()”函数也可用于以下情况。
语法:
timer t;
setTimer(t,5);
write("Time to elapse: %d",timeToElapse(t)); // Writes 5
/*Solution on how timer works*/
variables
{
mstimer t1,t2;/*millisec timer*/
timer t3;/*sec timer*/
}
on timer t1
{
settimer(t2, 10);/*wait in timer t1 for 10ms and then goes to timer t2*/
}
on timer t2
{
settimer(t3, 10);/*wait in timer t2 for 10ms and then goes to timer t3*/
}
on timer t3
{
settimer(t4, 10);/*wait in timer t3 for 10sec and then goes to timer t4*/
}
on timer t4
{
settimer(t1, 10);/*wait in timer t4 for 10sec and then goes to timer t1*/
}
on start()
{
settimer(t1,10);/*waits here for 10ms and then goes to timer t1*/
}
我一直在编写一个 CAPL 脚本,该脚本会在一定的延迟后在每个频道(2 个否)上发送消息。我想使用 SetTimer() 和 mstimer::isRunning 函数生成以下延迟。 我可以使用 setTimer 函数,但我不知道如何使用 mstimer::isRunning。 代码如下:
Variables{
message * temp = {DLC=8};
mstimer timer1;
}
on timer timer1{
//Do nothing
}
onstart{
for(noofChannel=1;noofChannel<=2;noofChannel++){
settimer(timer1,100);
temp.CAN = noofChannel;
temp.ID = 0xAA;
While (mstimer::isrunning)==0 // I need to write this right.
{ //wait for timer to expire}
Output(temp);
}
而不是 mstimer::isrunning
使用 isTimerActive()
方法。
isTimerActive()
returns 如果计时器为 运行 则为 1,如果超时则为 0。
所以你的代码看起来像:
on start{
for(noofChannel=1;noofChannel<=2;noofChannel++){
settimer(timer1,100);
temp.CAN = noofChannel;
temp.ID = 0xAA;
While (isTimerActive(timer1) == 1)
{ //wait for timer to expire}
}
Output(temp);
}
}
但我不建议这样做。您可以通过 onTimer
on start
中循环
on start{
temp.CAN = 1;
temp.ID = 0xAA;
Output(temp);
settimer(timer1,100);
}
on timer timer1{
temp.CAN = 2;
Output(temp);
}
如果你想让它保持通用,即不限制为 2 个通道,你可以获取一个变量并在计时器中递增它。
我问 Vector 同样的问题,他们的回答是这样的: “msTimer.isRunning” 给我们定时器的状态,无论定时器是否 运行 可用性如下所述:
on timer myTimer
{
write("Running Status %d",myTimer.isRunning());
}
“timeToElapse()”函数也可用于以下情况。 语法:
timer t;
setTimer(t,5);
write("Time to elapse: %d",timeToElapse(t)); // Writes 5
/*Solution on how timer works*/
variables
{
mstimer t1,t2;/*millisec timer*/
timer t3;/*sec timer*/
}
on timer t1
{
settimer(t2, 10);/*wait in timer t1 for 10ms and then goes to timer t2*/
}
on timer t2
{
settimer(t3, 10);/*wait in timer t2 for 10ms and then goes to timer t3*/
}
on timer t3
{
settimer(t4, 10);/*wait in timer t3 for 10sec and then goes to timer t4*/
}
on timer t4
{
settimer(t1, 10);/*wait in timer t4 for 10sec and then goes to timer t1*/
}
on start()
{
settimer(t1,10);/*waits here for 10ms and then goes to timer t1*/
}