除了 PDO 实时数据交换,如何通过 SDO 读取/写入从站的参数?
SDO (Service Data Object) 用于非实时的参数配置和诊断:
1. SDO 写操作 (主站 → 从站)
int32_t ECM_EcatSdoWrite(uint8_t slave, // 从站编号
uint16_t index, // 对象索引 (如 0x6060)
uint8_t subindex, // 子索引
uint16_t size, // 数据大小 (字节)
uint8_t *data); // 数据指针
2. SDO 读操作 (从站 → 主站)
int32_t ECM_EcatSdoRead(uint8_t slave, // 从站编号
uint16_t index, // 对象索引
uint8_t subindex, // 子索引
uint16_t *size, // [in]缓冲区大小 [out]实际大小
uint8_t *data); // 读取数据缓冲区
使用示例:
// 设置操作模式为 CSP
uint8_t mode = 8;
ECM_EcatSdoWrite(1, 0x6060, 0x00, 1, &mode);
// 读取当前操作模式
uint8_t readMode;
uint16_t size = 1;
ECM_EcatSdoRead(1, 0x6061, 0x00, &size, &readMode);
// 读取编码器分辨率
uint32_t encoderRes;
uint16_t readSize = 4;
ECM_EcatSdoRead(1, 0x608F, 0x01, &readSize, (uint8_t*)&encoderRes);
常用 SDO 对象:
┌──────────┬──────────────────────┬──────────────┬────────────┐
│ 索引 │ 名称 │ 方向 │ 常见用途 │
├──────────┼──────────────────────┼──────────────┼────────────┤
│ 0x6040 │ Control Word │ 写 │ 控制电机 │
│ 0x6041 │ Status Word │ 读 │ 读取状态 │
│ 0x6060 │ Modes of Operation │ 写 │ 设置模式 │
│ 0x6061 │ OpMode Display │ 读 │ 读取模式 │
│ 0x6064 │ Position Actual Value │ 读 │ 实际位置 │
│ 0x607A │ Target Position │ 写 │ 目标位置 │
│ 0x608F │ Encoder Resolution │ 读 │ 编码器参数 │
│ 0x609A │ Position Accuracy │ 读 │ 位置精度 │
│ 0x607C │ Following Window │ 写 │ 跟随误差窗 │
└──────────┴──────────────────────┴──────────────┴────────────┘


