首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用操作后CANOPEN同步超时

启用操作后CANOPEN同步超时
EN

Stack Overflow用户
提问于 2021-04-27 16:09:43
回答 2查看 233关注 0票数 1

我是CANOPEN的新手。我编写了一个通过PDO1读取实际位置的程序(默认值是statusword +实际位置)。

代码语言:javascript
复制
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",驱动程序会出现”同步帧超时“错误。我不知道司机有问题或我的代码有问题。我的代码有问题吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-29 15:02:05

问题解决了。由于伺服系统产生了大量的电磁干扰,使我的控制器无法正常工作。隔离后,效果很好:)!

票数 0
EN

Stack Overflow用户

发布于 2021-04-28 13:14:59

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

代码语言:javascript
复制
setCyclePeriod(1000);
setSyncWindow(100);

可能对应于这些OD条目:

7.5.2.6)

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

它们分别设置同步PDO的同步间隔和时间窗口。标准将后者描述为:

,如果同步窗口长度过期,则可以丢弃所有同步TPDO,并且可以发送EMCY消息;所有同步RPDO都可以被丢弃,直到接收到下一同步消息为止。使用下一条同步消息恢复同步RPDO处理。

现在,如果您将这个同步时间窗口设置为100 up,但是有一个草率的繁忙等待延迟delay_ms(1),那么这就不算了。如果将零写入对象1007h,则禁用同步窗口功能。我想setSyncWindow(0);可能会这么做。你可以试着这样做,看看这是否是问题所在。如果是这样的话,你必须放弃你的忙碌--等待合适的硬件定时器,一个用于同步周期,另一个用于PDO超时(如果必须使用该功能)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67286771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档