我正试图弄清楚,通过写入CANopen对象字典中的存储索引1010.01
,我可以在什么状态下存储当前配置。我试着在运转前的状态下做,但出现了这个错误
Time: 2914.034 SDO slave:1 index:1010.01 error:08000022 Data cannot be transferred or stored to the application because of the present device state
uint32_t store_password = 0x65766173;
ret = ec_SDOwrite(slave, 0x1010, 0x01, FALSE, sizeof(store_password), &store_password, EC_TIMEOUTTXM);
值得注意的是,我正在使用CANopen over EtherCAT和SOEM库。
这听起来像是不合规的行为。据我所知,CANopen并没有指定在写入1010h时必须处于哪个状态。
我建议始终在预操作状态下执行此操作,因为如果从操作状态执行(并且可能会发生SDO超时(,那么写入flash等可能会耗费时间并中断实时行为。
与问题无关,使用以下内容会更可读:
const char store_password [4] = "save"; // null termination purposely ignored
... sizeof(store_password), store_password, ...
这也删除了当前代码中的endianes依赖项。