我现在正在学习控制事情。 :) 我正在使用 SOEM、ethercat 堆栈。 PC 是我的主人,伺服电机是我的奴隶。我在那里学到了一些东西,但一直停留在移动伺服电机上。我确保数据是从主机发送的,但由于某种原因,它没有到达从机,即伺服电机。这就是与你们联系的原因。
我的简明扼要的是,它必须与同步管理器做一些事情,但作为学习者,我不确定。
// Code for reaching the slaves to operational state
// And then I try to control the servo motor by writing to its control word(6040).
// send_data & receive_data is called as usual for master/slave.
if(ec_slave[0].state == EC_STATE_OPERATIONAL) {
uint16 status[1];
int pointer_2=sizeof(status);
uint16 uint16val;
printf("Operational state reached for all slaves.\n");
for(i = 1; i <= 10; i++) {
ec_send_processdata();
wkc = ec_receive_processdata(EC_TIMEOUTRET);
ec_SDOread(1,0x6041,0,FALSE,&pointer_2,&status, EC_TIMEOUTRXM);
printf("status=%d\n", status[0]);
uint16val=0xf;
ec_SDOwrite(1, 0x6040, 0, FALSE, sizeof(uint16val), &uint16val, EC_TIMEOUTRXM);
osal_usleep(5000);
}
}
此代码打印的状态是“608”。
有专家可以指导我下一步吗?为他们干杯。
附注如果标签不合适,请更改/添加标签。
我在 Github 上整理了一个使用 Raspberry PI 4(使用 SPI W5500 芯片)向 EtherCat 发送移动命令的示例。
https://github.com/TheBeef/EthercatMotorExample
您可能想要查看的函数是 GotoPos()。
它发送执行以下操作:
SOEM_Write8(0x6060,0x00,1); // Set mode
SOEM_Write16(0x6040,0x00,0x0000); // Clear bits
SOEM_Write16(0x6040,0x00,0x0006); // Shutdown
SOEM_Write16(0x6040,0x00,0x0007); // Switch on
SOEM_Write16(0x6040,0x00,0x000F); // Enable
SOEM_Write32(0x6083,0x00,0x96); // Set profile acceleration
SOEM_Write32(0x6084,0x00,0x96); // Set profile deceleration
SOEM_Write32(0x6081,0x00,0x0200); // Set profile velocity
SOEM_Write32(0x607A,0x00,0x6500000/360*180); // Set target 180deg
SOEM_Write16(0x6040,0x00,0x000F); // Mask control word to "enable"
SOEM_Write16(0x6040,0x00,0x001F); // Engage new set point (absolute)
诸如轮廓速度 (0x200)、0x6500000 表示“刻度”、0x96 轮廓加速度等信息来自电机。您可能需要根据电机的功能来更改它们(尝试较小的值,以使用较慢的电机)。