3

私は、特定の遅延の後に各チャネル (2 つの no) でメッセージを送信する CAPL スクリプトを作成しています。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);

    }
4

3 に答える 3

1

mstimer::isrunningメソッドを使用する代わりにisTimerActive()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、2 番目のメッセージを出力できます。onTimer

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

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

汎用性を維持したい場合、つまり 2 チャネルに制限しない場合は、変数を取得してタイマーでインクリメントすることができます。

于 2015-06-08T04:00:15.337 に答える
0

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
于 2015-06-12T03:32:55.327 に答える