1

我是 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”,驱动程序会出现错误“同步帧超时”。我不知道驱动程序有问题或我的代码有问题。我的代码有问题吗?谢谢你!

4

2 回答 2

0

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

于 2021-04-29T15:02:05.523 回答
0

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

setCyclePeriod(1000);
setSyncWindow(100);

可能对应于这些 OD 条目:

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

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

如果同步窗口长度到期,则可以丢弃所有同步的TPDO并发送EMCY消息;在接收到下一个 SYNC 消息之前,所有同步 RPDO 都可能被丢弃。同步 RPDO 处理通过下一个 SYNC 消息恢复。

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

于 2021-04-28T13:14:59.930 回答