启用操作后 CANOPEN SYNC 超时

CANOPEN SYNC timeout after enable Operation

我是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:同步 window 长度 (CiA 301 7.5.2.7)

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

If the synchronous window length expires all synchronous TPDOs may be discarded and an EMCY message may be transmitted; all synchronous RPDOs may be discarded until the next SYNC message is received. Synchronous RPDO processing is resumed with the next SYNC message.

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

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