当前位置:首页 > 工业控制 > 工业控制
[导读]工业多轴设备(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从站)为主线。

工业多轴设备(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拐角不抖。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭