启用操作后 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,这使我的控制器无法正常工作。隔离后效果很好:)!
我是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,这使我的控制器无法正常工作。隔离后效果很好:)!