1. 项目背景与核心价值
在工业自动化领域,伺服电机控制一直是运动控制系统的核心环节。传统的控制方案往往依赖于专用控制器和封闭式总线系统,不仅成本高昂,还存在扩展性差、二次开发困难等问题。EtherCAT作为一种高性能工业以太网协议,凭借其确定性、低延迟和灵活的拓扑结构,正在重塑工业控制领域的格局。
DR1M90这个开源案例的独特之处在于,它基于IgH EtherCAT主站实现了对伺服电机的实时控制。IgH(EtherLab)作为Linux平台下最成熟的开源EtherCAT主站实现,为开发者提供了免专利费的技术方案。这个案例特别展示了如何通过开源工具链实现伺服电机的正反转控制——这是工业自动化中最基础却又最关键的电机控制模式。
提示:在实际工业场景中,正反转控制不仅需要精确的力矩和位置控制,还要考虑加减速曲线、过载保护等安全机制,这些在本案例中都有体现。
2. 系统架构与硬件选型
2.1 整体架构设计
这套控制系统采用典型的EtherCAT主从站架构:
code复制[PC运行IgH主站] --(EtherCAT)--> [EtherCAT从站1:伺服驱动器] --> [伺服电机]
\-> [EtherCAT从站2:IO模块]
主站运行在带有PREEMPT_RT补丁的Linux系统上,确保实时性。我们选择的伺服驱动器需要支持CiA402标准协议(这是EtherCAT伺服驱动的通用规范),常见的如台达ASDA-A3、汇川IS620N等型号都适用。
2.2 关键硬件参数
- 伺服驱动器:至少支持以下功能模式:
- 循环同步位置模式(CSP)
- 循环同步速度模式(CSV)
- 力矩控制模式(CST)
- 编码器分辨率:建议17位以上(131072脉冲/转)
- EtherCAT从站芯片:ET1100或ETG1000系列
- 网络接口:建议使用Intel I210等支持Time-Stamping的网卡
3. 软件环境搭建
3.1 实时Linux系统准备
bash复制# 安装PREEMPT_RT补丁的内核(以Ubuntu为例)
sudo apt install linux-image-rt-aws
实时性测试工具:
bash复制# 安装cyclictest
sudo apt install rt-tests
# 运行测试(典型值应小于50μs)
cyclictest -l1000000 -m -n -p99
3.2 IgH主站编译与配置
bash复制# 下载源码
git clone https://gitlab.com/etherlab.org/ethercat.git
cd ethercat
./bootstrap
./configure --enable-generic --disable-8139too
make
sudo make modules_install
关键配置文件/etc/ethercat.conf需要设置:
ini复制MASTER0_DEVICE="eth0"
DEVICE_MODULES="generic"
4. EtherCAT从站配置
4.1 XML设备描述文件
每个EtherCAT从站都需要对应的ESI(EtherCAT Slave Information)文件。以台达ASDA-A3为例:
xml复制<Slave>
<VendorId>0x00000001</VendorId>
<ProductCode>0x000A3B01</ProductCode>
<RxPdo>
<Entry Index="0x6041" SubIndex="0x00" BitSize="16"/>
<Entry Index="0x6064" SubIndex="0x00" BitSize="32"/>
</RxPdo>
<TxPdo>
<Entry Index="0x6040" SubIndex="0x00" BitSize="16"/>
<Entry Index="0x6061" SubIndex="0x00" BitSize="8"/>
</TxPdo>
</Slave>
4.2 从站状态机控制
通过命令行工具控制从站状态转换:
bash复制ethercat slave 0 state OP
状态转换顺序必须遵循:
INIT → PREOP → SAFEOP → OP
5. 伺服控制核心实现
5.1 CiA402状态机实现
伺服驱动器的标准状态转换流程:
code复制PowerOn → NotReadyToSwitchOn → SwitchOnDisabled
↓
ReadyToSwitchOn → SwitchedOn → OperationEnabled
↑ ↓ ↑
Fault → QuickStopActive → Fault
对应的控制字(0x6040)操作:
c复制// 启动序列
write_control_word(0x06); // SwitchOnDisabled → ReadyToSwitchOn
write_control_word(0x07); // ReadyToSwitchOn → SwitchedOn
write_control_word(0x0F); // SwitchedOn → OperationEnabled
5.2 正反转控制逻辑
在CSP模式下,通过目标位置(0x607A)的相对变化实现正反转:
c复制// 正转90度
int32_t target_pos = current_pos + (131072/4); // 131072脉冲/转
write_target_position(target_pos);
// 反转180度
target_pos = current_pos - (131072/2);
write_target_position(target_pos);
5.3 实时控制线程实现
使用Xenomai或RT_PREEMPT的实时线程:
c复制void* control_thread(void* arg) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
while(1) {
// 4ms周期
ts.tv_nsec += 4*1000*1000;
if(ts.tv_nsec >= 1000000000) {
ts.tv_nsec -= 1000000000;
ts.tv_sec++;
}
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL);
// PDO交换
ecrt_master_receive(master);
ecrt_domain_process(domain);
// 控制逻辑
update_control();
ecrt_domain_queue(domain);
ecrt_master_send(master);
}
}
6. 关键参数调试
6.1 伺服增益调节
通过SDO写入驱动器参数:
c复制// 位置环增益
write_sdo(0x60FB, 0x01, 2000); // 单位:0.1rad/s
// 速度环增益
write_sdo(0x60F9, 0x01, 100); // 单位:0.1%
6.2 EtherCAT同步配置
分布式时钟(DC)同步参数:
ini复制# 主站时钟配置
EC_TIMEOUTMON=500
EC_WATCHDOG_MS=100
从站时钟偏移补偿:
bash复制ethercat dc -a 0x1000,0x1001,0x1002
7. 安全机制实现
7.1 急停处理
通过PDO映射急停信号:
c复制// 控制字bit8置1触发急停
emergency_stop() {
control_word |= 0x0100;
write_control_word(control_word);
}
7.2 软件限位保护
c复制void check_position_limit(int32_t pos) {
if(pos > POS_LIMIT_HIGH) {
pos = POS_LIMIT_HIGH;
set_fault();
}
else if(pos < POS_LIMIT_LOW) {
pos = POS_LIMIT_LOW;
set_fault();
}
}
8. 性能优化技巧
8.1 实时性调优
bash复制# 设置CPU亲和性
taskset -pc 3 $(pidof ethercat)
# 提高线程优先级
chrt -f 99 $(pidof ethercat)
8.2 网络优化
bash复制# 禁用网卡节能
ethtool -C eth0 rx-usecs 0 tx-usecs 0
# 增加socket缓冲区
sysctl -w net.core.rmem_max=16777216
9. 常见问题排查
9.1 从站无法进入OP状态
检查流程:
- 确认物理连接(网线、终端电阻)
- 检查ESI文件匹配度
- 查看从站LED状态码
- 分析
ethercat debug输出
9.2 运动控制抖动问题
优化步骤:
- 检查实时性(cyclictest)
- 调整伺服增益参数
- 检查机械共振频率
- 优化EtherCAT周期时间
10. 扩展应用方向
基于此基础方案可扩展:
- 多轴同步控制(电子齿轮/凸轮)
- 力位混合控制
- 与ROS2的集成(通过ros2_control)
- 数字孪生仿真(配合Gazebo)
注意:在实际部署时,建议先通过Wireshark抓包分析EtherCAT帧时序,确保通信周期稳定。我们曾遇到因网卡驱动不兼容导致的周期抖动问题,更换为Intel网卡后解决。