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