CAPL代码,在代码中加入延迟

时间:2018-03-29 06:22:22

标签: delay capl canoe

我有一个CAPL测试代码,用于控制CAN信号发送的开始。我的目标是延迟发送过程的开始。 我的想法是通过setTimer()函数与isTimerActive()。

结合使用

一般来说,我的代码如下所示:

main() {   
CANstart();
function_2();
function_3();   
}

CANstart() {    
  SetTimer(Delay, 5000); //Timer initialization, set to be 5000ms

  while (isTimerActive()==1) {
    // this while loop avoids that the code is proceding while the settimer exception is being called and executed
  }

  StartCANTransmitting(); // After this function, jump back to main and proceed with function_2   
}

on timer Delay {
  // Do nothing, just wait   
}

上面的程序代码导致卡在那一点,CANoe没有响应,我可以通过taskmanager结束模拟的唯一方法。

  • 我方的进一步审查得出的结论是,计时器需要更多时间来处理,而根本没有执行。
  • 如果没有isTimerActive()函数,程序代码不会等待计时器完成,也没有任何延迟。似乎代码在没有等待异常的情况下运行。
  • 好像CAPL处理循环非常糟糕。

我查看了stackoverflow,以下论坛帖子谈到了我没有提供任何有效解决方案的非常类似的问题:

CAPL Programming usage of Timer as a delay

Are timers running, while loops are active?

Delay function in CAPL apart from testwaitfortimeout()

2 个答案:

答案 0 :(得分:0)

我发现您的代码存在很多问题。它实际上根本不像代码,但更像是伪代码。它是否在您的CAPL浏览器上编译?

main() {   
CANstart();
function_2();
function_3();   
}

如果这是function declaration,则它缺少类型和返回值。此外,您希望何时执行main()

同样适用于:

CANstart()

让我们退后一步。你需要延迟可以传输的开始。如果你需要这样做,因为你有CANalyzer / CANoe运行之外的代码,那么我建议你通过命令行调用应用程序(参考指南获得更多帮助)。

但是,如果您需要在设置配置中运行块,如重播块,Loggin块或其他,我建议您执行以下操作:

variables {
    /* define your variables here. You need to define all messages you want to send and respective signal values if not defaulted */
    message 0x12345678 msg1;   // refer to CAPL guide on how to define message type variables
    msTimer delay;
    msTimer msgClock1;
}

on start {
    /* when you hit the start measurements button (default F9) */
    setTimer(delay, 5000);   // also note your syntax is wrong in the example
}

on timer delay {
    /* when timer expires, start sending messages */
    output(msg1);    // send your message
    setTimer(msgClock1,250);    // set timer for cyclic message sending
}

on timer msgClock1 {
    /* this mimicks the behaviour of a IG block */
    setTimer(msgClock1,250);    // keep sending message
    output(msg1)
}

这是否达到了你的目标?请随时询问更多详情。

答案 1 :(得分:0)

您似乎对while (isTimerActive()==1) {语句有疑问。

CAPL函数int isTimerActive需要参数timermstimer变量并返回值  1,如果计时器处于活动状态,否则0

您可以通过以下方式检查计时器是否处于活动状态以及经过的时间。

timer t;
write("Active? %d", isTimerActive(t)); // writes 0
setTimer(t, 5);
write("Active? %d", isTimerActive(t)); // writes 1
write("Time to elapse: %d",timeToElapse(t)); // Writes 5

尝试在timer处添加参数while (isTimerActive(Delay)==1) {

我不建议您使用while语句,而是可以直接使用计时器来调用函数StartCANTransmitting(),而您的Main()应该是MainTest()

void MainTest()
{
   TestModuleTitle("Sample Tests");
   TestModuleDescription("This test module calls some test cases to demonstrate ");
   CANstart();
   if (TestGetVerdictLastTestCase() == 1)
      Write("CANstart failed.");
   else
      Write("CANstart passed.");
}

testcase CANstart() {   
  // add info block to test case in report  
  TestReportAddMiscInfoBlock("Used Test Parameters");
  TestReportAddMiscInfo("Max. voltage", "19.5 V");
  TestReportAddMiscInfo("Max. current", "560 mA");
  TestReportAddMiscInfo("StartCANTransmitting");

  SetTimer(Delay, 5000); //Timer initialization, set to be 5000ms
}

on timer Delay {
  StartCANTransmitting();   
}