0

我写了一个 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后执行下一次迭代。我尝试使用计时器,但找不到所需的解决方案,

4

1 回答 1

0

您必须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 消息停止。因此,如果您想在一定时间内执行此操作,您可能必须在每个事件中使用某种标志。

于 2020-07-30T06:23:53.417 回答