2015-05-27 3 views
2

Я писал сценарий CAPL, который отправил сообщение по каждому каналу (2 нокаута) после некоторой задержки. Следующая задержка, которую я хочу сгенерировать, используя SetTimer() и mstimer :: isRunning функция. Я могу использовать функцию setTimer, но я не знаю, как использовать mstimer :: isRunning. Код показан ниже:CAPL Программирование использования таймера в качестве задержки

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); 

    } 
+2

Задавая материал о CAPL, важно указать, если вы находитесь в «Моделирование» или в режиме «Тест». Некоторые функции доступны/отключены в зависимости от того, какой сценарий вы пишете. – PlamZ

+0

Спасибо за совет! Я использовал режим Simulation, но мне было нужно решение, совместимое как с симуляцией, так и с Realtime. –

ответ

1

Вместо использования mstimer::isrunningisTimerActive() метод. isTimerActive() возвращает 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); 

     } 
    } 

Но я бы не рекомендовал это делать. Вместо того, чтобы зацикливание в on start, вы можете Ouput 2-ое сообщение через onTimer

on start{ 
      temp.CAN = 1; 
      temp.ID = 0xAA; 
      Output(temp); 
      settimer(timer1,100); 
     } 

on timer timer1{ 
    temp.CAN = 2; 
    Output(temp); 
} 

Если вы хотите сохранить его родовое, т.е. не ограничивая до 2-х каналов, вы можете взять переменную и увеличить его в таймере.

0

Я спросил Вектор для того же вопроса, и они отвечали ему что-то вроде этого: «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 
-1
/*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*/ 
} 
Смежные вопросы