【问题标题】:to send the CAN frames after recieving ACK in CAPL (using delay/timer in CAPL)在 CAPL 中收到 ACK 后发送 CAN 帧(使用 CAPL 中的延迟/定时器)
【发布时间】:2020-11-13 12:27:54
【问题描述】:

我写了一个 CAPl 代码,它必须发送 CAN 帧来控制步进电机的步进。使用的步进电机是TMCM-1311模块。

variables{
message step myMsg1;
message llmmodule myMsg2;
message llmmodule myMg3;
}
 
on start{
int i=0;
for (i=0:;i<=5000:i++)
{
  myMsg1.DLC = 8;
  myMsg1.byte(0) = 0x04;
  myMsg1.byte(1) = 0x01;
  myMsg1.byte(2) = 0x00;
  myMsg1.byte(3) = 0x00;
  myMsg1.byte(4) = 0x00;
  myMsg1.byte(5) = 0x00;
  myMsg1.byte(6) = 0x0A;
  myMsg1.byte(7) = 0x00;
  output(mymsg1);
 
  
  myMsg2.DLC = 8;
  myMsg2.byte(0) = 0x07;
  myMsg2.byte(1) = 0x01;
  myMsg2.byte(2) = 0x03;
  myMsg2.byte(3) = 0x11;
  output(mymsg2);

  myMsg3.DLC = 8;
  myMsg3.byte(0) = 0x07;
  myMsg3.byte(1) = 0x03;
  myMsg3.byte(2) = 0x01;
  myMsg3.byte(3) = 0x00;
  output(mymsg3);
  }
 
  }

在上面代码的for循环中,CAN帧是连续发送的,不等待ACK,发送第一个数据帧,即myMsg1,用于将步进电机旋转到一定的步长,所以一旦发送了该帧步进电机需要一些时间才能旋转到该位置,一旦到达该位置,则应发送其他 2 个 CAN 帧,即 myMsg2 和 myMsg3。在收到所有发送的 3 个数据帧的 ACK 之后,for 循环中的 i 应该递增,并且应该进行下一次迭代。但是在上面的代码中,for循环正在执行而不等待来自CAN帧的ACK,所以我认为应该在那里使用定时器来延迟并在收到ACK后执行下一次迭代。我尝试使用计时器,但找不到所需的解决方案,所以如果有人能告诉我应该如何执行它,那将是非常有帮助的。

【问题讨论】:

  • 什么是“ACK”?
  • 这是一个接收到的 CAN 数据帧。系统为我们的传输数据帧回复的帧。
  • 那么你必须对该罐头框架做出反应。看看 CAPL 的 on message 处理程序。

标签: can-bus capl system.timers.timer canalyzer


【解决方案1】:

对于此用例,您必须使用 on message 事件。

variables
{
   message step myMsg1;
   message llmmodule myMsg2;
   message llmmodule myMg3;
}
on start
{
   myMsg1.DLC = 8;
   myMsg1.byte(0) = 0x04;
   myMsg1.byte(1) = 0x01;
   myMsg1.byte(2) = 0x00;
   myMsg1.byte(3) = 0x00;
   myMsg1.byte(4) = 0x00;
   myMsg1.byte(5) = 0x00;
   myMsg1.byte(6) = 0x0A;
   myMsg1.byte(7) = 0x00;
   myMsg2.DLC = 8;
   myMsg2.byte(0) = 0x07;
   myMsg2.byte(1) = 0x01;
   myMsg2.byte(2) = 0x03;
   myMsg2.byte(3) = 0x11;
   myMsg3.DLC = 8;
   myMsg3.byte(0) = 0x07;
   myMsg3.byte(1) = 0x03;
   myMsg3.byte(2) = 0x01;
   myMsg3.byte(3) = 0x00;
   output(mymsg1);
}
on message ACK_Msg1
{
   output(mymsg2);
}

on message ACK_Msg2
{
   output(mymsg3);
}

on message ACK_Msg3
{
   output(mymsg1);
}

此代码将继续运行,直到 ack 消息停止。因此,如果您想在一定时间内执行此操作,则可能必须在每个事件中使用某种标志。

【讨论】:

    猜你喜欢
    • 2015-08-09
    • 2021-09-27
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多