我有一个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结束模拟的唯一方法。
我查看了stackoverflow,以下论坛帖子谈到了我没有提供任何有效解决方案的非常类似的问题:
CAPL Programming usage of Timer as a delay
答案 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
需要参数timer
或mstimer
变量并返回值
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();
}