微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

启用操作后CANOPEN SYNC超时

如何解决启用操作后CANOPEN SYNC超时

我是 CAnopEN 的新手。我写了一个通过 PDO1 读取实际位置的程序(认是状态字 + 实际位置)。

void canopen_init() {
// code1 setup PDO mapping
nmtPreOperation();
disablePDO(PDO_TX1_CONfig_COMM);
setTransmissionTypePDO(PDO_TX1_CONfig_COMM,1);
setInhibitTimePDO(PDO_TX1_CONfig_COMM,0);
setEventTimePDO(PDO_TX1_CONfig_COMM,0);
enablePDO(PDO_TX1_CONfig_COMM);

setCyclePeriod(1000);
setSyncWindow(100);

//code 2: enable OPeration
readyToSwitchOn();
switchOn();
enableOperation();    
motionStart();

// code 3
nmtActiveNode();
}


int main (void) {
  canopen_init();   
  while {
    delay_ms(1);
    send_sync();
  }
} 

如果我删除代码 2”(伺服处于 Switch_on_disable 状态),我可以在每次同步发送时读取位置。但是如果我使用“代码 2”,驱动程序会出现“同步帧超时”错误。我不知道驱动程序有问题或我的代码有问题。我的代码有问题吗?谢谢!

解决方法

我不知道这是什么协议栈或它是如何工作的,但这些:

setCyclePeriod(1000);
setSyncWindow(100);

可能对应于这些 OD 条目:

  • 对象 1006h:通信周期周期 (CiA 301 7.5.2.6)
  • 对象 1007h:同步窗口长度 (CiA 301 7.5.2.7)

他们分别为同步 PDO 设置了 SYNC 间隔和时间窗口。后者被标准描述为:

如果同步窗口长度到期,所有同步TPDO可能会被丢弃,并且可能会发送一个EMCY消息;所有同步 RPDO 可能会被丢弃,直到接收到下一个 SYNC 消息。同步 RPDO 处理随着下一个 SYNC 消息恢复。

现在,如果您将此同步时间窗口设置为 100us,但有一个草率的忙等待延迟 delay_ms(1),那么这不会加起来。如果向对象 1007h 写入零,则禁用同步窗口功能。我想 setSyncWindow(0); 可能会这样做。你可以尝试这样做,看看这是否是问题所在。如果是这样,您必须放弃忙等待,转而使用适当的硬件计时器,一个用于 SYNC 周期,另一个用于 PDO 超时(如果您必须使用该功能)。

,

问题已解决。由于来自伺服的大量 EMI,这使我的控制器无法正常工作。隔离后,效果很好:)!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。