工业以太网EtherCAT主站搭建:从站配置与分布式时钟同步实操
工业多轴设备(3–8轴伺服+远程IO+阀岛)的实时总线首选EtherCAT——Sync0周期1ms、DC抖动<100ns、一帧扫32从站<20μs。主站主流两条路:IgH EtherLab(开源,Linux RT下跑)和Acontis EC-Master(商业,Win/Linux/VxWorks都支持),从站配置靠ESI文件+ENI生成,DC同步是命门。下面以IgH+3轴汇川SV660N+1块Beckhoff EL1809/2809 IO(共4从站)为主线。
一、ESI与ENI:从站配置的入口
每个从站的厂家都会给ESI(EtherCAT Slave Information,.xml),里面描述了:从站支持的SM(Sync Manager)通道数、Mailbox/Process Data分配;PDO(Process Data Object)候选列表——TxPDO(从站→主站,如位置反馈/报警)和RxPDO(主站→从站,如位置给定/控制字);DC能力(支持Sync0/Sync1与否、最小周期)。IgH下操作流程:
# 1. 把厂家ESI拷进/etc/ethercat/
cp SV660N.xml /etc/ethercat/master.xml # 单从站调试可直用,多从站要合并
# 2. 启主站扫从站,生成ENI
ethercat master
ethercat slaves # 看4个从站是否都"PREOP"
ethercat cstruct -a 0 -p 0 > eni.xml # 导出ENI
# 3. 重刷ENI进主站
ethercat config -w eni.xml
ENI是主站跑起来后真正加载的描述文件,里面固化了从站顺序、PDO映射、SM分配、DC参数——改PDO不用改ESI,改完重生成ENI即可。
二、PDO映射:只留要的,砍掉冗余
厂家默认PDO映射很"全"(报警16个字、扩展参数一堆),但1ms周期下每多2字节就多16ns总线时间,3轴+IO要控总PDO在64字节内。汇川SV660N常用PDO裁剪后(每轴16字节Tx+16字节Rx):
• RxPDO(主→伺服):控制字(2B)+模式(1B)+位置给定(4B)+速度给定(4B)+转矩给定(2B)→共13B,对齐16B
• TxPDO(伺服→主):状态字(2B)+实际位置(4B)+实际速度(4B)+实际转矩(2B)+报警码(2B)→共14B,对齐16B
IgH用户态配PDO映射(ec_user_app里):
ec_slave_config_t *sc = ecrt_master_slave_config(master, 0, 0, 0x0000092B, 0x10400001);
ecPDO映射:0x6040:00控制字, 0x607A:00位置给定
ecrt_slave_config_pdo_assign_add(sc, EC_DIR_OUTPUT, 0x1600);
ecrt_slave_config_pdo_mapping_add(sc, EC_DIR_OUTPUT, 0x1600, 0x6040, 0x00, 16);
ecrt_slave_config_pdo_mapping_add(sc, EC_DIR_OUTPUT, 0x1600, 0x607A, 0x00, 32);
TxPDO同理配0x1A00
配完ecrt_master_activate(master),从站进SAFEOP→OP。
三、DC同步:Sync0+ShiftTime是核心
EtherCAT的DC让所有从站在同一时刻(±100ns内)锁存/更新数据,多轴插补必须开。关键参数:Sync0周期=位置环周期(通常1ms或250μs);ShiftTime各从站Sync0相位错开,避免同时发中断抢总线;看门狗DC失锁后多少周期进PREOP(一般500–1000个Sync0)。IgH配DC(3轴错开Shift):
#define SYNC0_PERIOD_NS 1000000 // 1ms
ecrt_slave_config_dc(sc_axis0, 0x0300, SYNC0_PERIOD_NS, 0, 0, 0); // Shift=0
ecrt_slave_config_dc(sc_axis1, 0x0300, SYNC0_PERIOD_NS, 300000, 0, 0); // 0.3ms
ecrt_slave_config_dc(sc_axis2, 0x0300, SYNC0_PERIOD_NS, 600000, 0, 0); // 0.6ms
ecrt_slave_config_dc(sc_io, 0x0300, SYNC0_PERIOD_NS, 900000, 0, 0); // 0.9ms ← 错!
0x0300是DC激活模式(Sync0使能+同步到RefClock,通常选0号从站即轴0当参考)。验DC:ethercat dc看各从站Offset和Jitter。⚠上面代码里0+0.3+0.6+0.9=1.8ms > 1ms周期——Shift总和超周期后,轴2/IO的Sync0会踩到下个周期的边,Jitter炸。4从站1ms周期→Shift应取0/0.25/0.5/0.75ms才对。
四、三个翻车高发点
• ShiftTime总和≥Sync0周期:Sync0是"周期触发",所有从站Shift加起来超周期,后面从站Sync0踩下周期边,DC漂移持续涨。4从站1ms→Shift最大0.75ms
• PDO映射完SM通道没对齐:RxPDO走SM2、TxPDO走SM3,有的厂家ESI里SM2/3的"输出/输入"方向反了(Mailbox和PD混),ENI生成后从站卡SAFEOP,dmesg报SM2 watchdog,要在ESI里把SM2/3的Dir="out"/"in"对调
• 主站CPU没绑核+没PREEMPT_RT:IgH跑普通Ubuntu时1ms周期下DC Jitter能到2μs,3轴插补拐角跟误差0.1mm。必须isolcpus=3+PREEMPT_RT+CpuAffinity=0x08,Jitter才能压<100ns
多轴>8轴+1kHz+IO混扎时,Sync0周期建议压到500μs(伺服内位置环250μs靠FPGA分),主站IPO 4ms不变——这样DC总线负载降一半,Shift能塞更多从站。
EtherCAT主站搭建的真谛:ESI合并进/etc/ethercat→ecrt扫从站生成ENI→PDO裁剪到每轴32B内→DC Sync0周期对齐位置环、Shift错开总和<周期、主站PREEMPT_RT+绑核压Jitter<100ns。这套走完3轴+IO 1ms周期,DC Jitter<80ns,3轴插补200mm/s拐角不抖。





