外观
EtherCAT CST 示例
2025-09-22
本示例通过创建一个 EtherCAT Master 实例,完成对 EtherCAT 伺服控制器的初始化配置,使伺服电机控制器工作在CST同步周期转矩模式。将 6060h 设置为 0xA,驱动器处于 CST 模式,在周期同步转矩模式下,上位控制器将计算好的目标转矩 6071h 周期性同步的方式发送给伺服驱动器,转矩调节由伺服内部执行。当速度达到限幅值后将进入调速阶段。
EtherCAT CST
硬件连接
需要准备硬件:
- 睿擎工业开发平台支持板卡 1 块(
睿擎派 RC3506) - EtherCAT 伺服驱动器一套(推荐
汇川 SV660N或者LICHUAN-LC10E) - 串口调试器、jlink 调试各一套
用网线将伺服控制器 IN 口与开发板 ETH1 网口连接。伺服电机的电源线和编码器线分别接入电源口和 CN3 连接口,目前示例都是支持双轴的,如图所示:

创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

控制命令
| 命令 | 功能描述 | 使用示例 |
|---|---|---|
ect_cst | 启动 EtherCAT 主站服务 | ect_cst |
motor_run | 启动电机运行 | motor_run |
motor_stop | 停止电机运行 | motor_stop |
motor_dir [dir] | 设置电机转动方向(0 或 1) | motor_dir 0 |
核心示例代码
初始化 EtherCAT 主站及配置
- EtherCAT 服务初始化:首先调用
ecat_service_init()函数初始化 EtherCAT 主站服务的核心组件。 - 网络接口配置:指定 EtherCAT 主站使用的网络接口,如 "e1"。
- 主站结构体初始化:通过
ecat_master_init(&cst_master)函数初始化主站结构体。 - 总线拓扑配置:调用
ecat_config_init(&cst_master, RT_FALSE)进行自动拓扑扫描。
ethercat_cst.c
ecat_service_init();
if (ifname)
{
cst_master.nic0 = ifname;
}
err = ecat_master_init(&cst_master);
if (err)
{
rt_kprintf("ethercat master init failed, err:%d\n", err);
return err;
}
err = ecat_config_init(&cst_master, RT_FALSE);
if (err)
{
rt_kprintf("ethercat master init failed, err:%d\n", err);
goto cfg_init_err;
}配置时钟同步和参数映射
- 通过
ecat_config_dc配置分布式时钟同步。 - 调用
sv660n_pdo_config设置伺服驱动器的 PDO 参数映射。 - 使用
ecat_config_map_group将配置应用到过程数据缓冲区,并在映射失败时返回错误。
ethercat_cst.c
ecat_config_dc(&cst_master);
sv660n_pdo_config(&cst_master, slave_counts);
err = ecat_config_map_group(
&cst_master, (void *)(cst_master.process_data), 0);
if (err != RT_EOK)
{
rt_kprintf("ecat_config_map_group failed\n");
goto map_err;
}切换到 SAFE-OP 状态
- 通过
ecat_write_state将总线上所有从站切换到 SAFE-OP 状态。 - 调用
ecat_check_state持续验证所有从站是否成功进入该状态。
ethercat_cst.c
err = ecat_write_state(&cst_master, 0, EC_STATE_SAFE_OP);
if (err != RT_EOK)
{
rt_kprintf("ecat_write_state PRE_OP failed\n");
goto write_safe_op_err;
}
state = EC_STATE_SAFE_OP;
err = ecat_check_state(&cst_master, 0, &state, 20000000 * 3);
if (err != RT_EOK)
{
rt_kprintf("Not all slaves reached SAFE_OP state.%d\n", err);
goto check_safe_op_err;
}切换到 OPERATIONAL 状态
- 通过
ecat_write_state将总线上所有从站切换到 OPERATIONAL 状态。 - 初始化过程数据映射指针并设置控制字为 0xA (CST)。
- 每次发送 PDO 数据并接收反馈。
- 调用
ecat_check_state持续验证所有从站是否成功进入该状态。
ethercat_cst.c
err = ecat_write_state(&cst_master, 0, EC_STATE_OPERATIONAL);
if (err != RT_EOK)
{
rt_kprintf("ecat_write_state PRE_OP failed\n");
goto write_op_err;
}
struct rpdo_cst *rmap;
struct tpdo_cst *tmap;
/* swith mode */
int _chk = 400;
do
{
for (size_t slave = 1; slave <= slave_counts; slave++)
{
rmap = servo_rpdo_get(&cst_master, slave);
tmap = servo_tpdo_get(&cst_master, slave_counts, slave);
rmap->mode_of_operation = 0xA;
servo_switch_op(rmap, tmap);
}
ecat_send_processdata_group(&cst_master, 0);
ecat_receive_processdata_group(&cst_master, 0, 2000000 * 3);
state = EC_STATE_OPERATIONAL;
} while (
_chk-- && (ecat_check_state(&cst_master, 0, &state, 2000) != RT_EOK));实现电机业务逻辑
- 首先更新伺服状态机并检查运行标志,若停止则发送禁用命令。
- 发送 PDO 数据并接收反馈,根据控制字状态配置目标转矩。
- 在循环末尾发送 PDO 数据确保状态同步,最后通过 DC 同步和补偿维持设定的周期。
ethercat_cst.c
while (1)
{
if (servo_run == 0)
{
for (size_t slave = 1; slave <= slave_counts; slave++)
{
rmap = servo_rpdo_get(&cst_master, slave);
tmap = servo_tpdo_get(&cst_master, slave_counts, slave);
servo_switch_op(rmap, tmap);
rmap->control_word = 0x2;
}
goto stop;
}
for (size_t slave = 1; slave <= slave_counts; slave++)
{
rmap = servo_rpdo_get(&cst_master, slave);
tmap = servo_tpdo_get(&cst_master, slave_counts, slave);
if (rmap->control_word == 7)
{
rmap->mode_of_operation = 0xA;
}
if (rmap->control_word == 0xf)
{
rmap->torque_limit_pos = -3500;
rmap->torque_limit_neg = 3500;
rmap->max_motor_speed = (1 << 17);
rmap->max_torque = 3500;
if (servo_dir == 0)
{
rmap->target_torque = 200;
}
else
{
rmap->target_torque = -200;
}
}
servo_switch_op(rmap, tmap);
}
stop:
ecat_send_processdata_group(&cst_master, 0);
ecat_receive_processdata_group(&cst_master, 0, 2000 * 10);
ecat_sync_dc(&cst_master);
}示例运行
初始化 EtherCAT 主站
msh > ect_cst启动电机运行
msh > motor_run改变电机方向
msh > motor_dir 0/1停止电机
msh > motor_stop使用 IDE 调试并运行程序,初始化完 EtherCAT 主站后,在终端输入motor_run 运行电机,可以观察到电机旋转。EtherCAT 示例运行后,电机会顺时针旋转。驱动器风扇会开启,面板显示8Arn字符。
在终端输入motor_stop 可以停止电机。
在终端输入motor_dir 0/1 可以改变电机方向。
