【发布时间】: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