大白话详解:EtherCAT的SM同步和DC同步作用
很多人学EtherCAT最绕不开的误区:分不清SM同步、DC同步到底干啥的、为啥要两个一起开。
我用最通俗的工程大白话,不讲虚理论,只讲真实作用,适配TwinCAT + LAN9252 + STM32整套架构。
一、先记核心一句话
SM同步 = 管数据不乱跑(数据锁稳)
DC同步 = 管时间不跑偏(时间对齐)
只开SM:数据准,但多设备动作不同步;只开DC:时间齐,但数据是乱的。必须两个一起开才是高精度同步。
二、大白话讲透 SM 同步(SyncManager 同步管理器)
1、它解决什么问题?
解决数据半更新、数据撕裂、数据错乱的问题。
EtherCAT总线帧是飞速穿过每一个从站的,LAN9252硬件读写速度极快。如果不开SM同步:
STM32随时能改上传数据(TxPDO)
ESC硬件随时刷新下发数据(RxPDO)
就会出现一个离谱问题:帧还没走完、数据还没传完,程序就读到一半新、一半旧的数据,运动控制直接抖动、报错。
2、SM同步真正干的事
开启SM同步并绑定SYNC0后,它会锁死数据刷新时机:
整个总线周期内,数据一律禁止乱刷新!
只等总线帧完全遍历完所有从站、一整帧数据全部就位的那一刻:
所有从站统一锁存主站下发的RxPDO数据(冻结不动)
所有从站统一刷新要上传的TxPDO数据(一次性提交)
3、最关键的误区纠正
不是“锁住就不放开”,是每个周期只在唯一一瞬间更新数据。
其余时间全部锁定,杜绝半路更新数据,保证STM32执行任务时,拿到的一定是一帧完整、干净、没撕裂的有效数据。
三、大白话讲透 DC 同步(分布式时钟)
1、它解决什么问题?
解决所有从站动作时间对不齐的问题。
网线有长有短、芯片时钟有微小误差,如果不靠DC校准:
A从站0ms动作、B从站0.2ms动作、C从站0.5ms动作 →多轴不同步、控制精度极差。
2、DC同步真正干的事
LAN9252硬件自带高精度时钟,DC同步会做两件事:
自动测量每根网线的传输延迟、校准本地时钟偏差
让全网所有从站,共用一套绝对统一的系统时间
最终效果:全网所有LAN9252,在完全同一个纳秒时刻,输出SYNC0硬件脉冲。
所有STM32同时进中断、同时执行控制任务,真正做到时序绝对对齐。
四、双同步完整联动超详细时序流程
1、总线发帧前,SM同步开启写保护冻结:主站开始往下发数据帧。这时候,每个从站的SM(同步管理器)立刻生效,把RxPDO、TxPDO的应用缓冲区全部写保护——也就是不让STM32中途去改,保证这一轮传输的数据从头到尾不撕裂、不乱套。
2、总线帧逐站硬件穿透,临时数据搬运:帧一路串行经过每个从站,LAN9252硬件直接动手:把主站发来的新指令,存进临时寄存器;同时把TxPDO里上一周期的旧状态数据,直接塞进回传帧的空位,带回给主站。全程操作的都是临时寄存器和回传通道,完全不碰应用区的RxPDO和TxPDO,STM32根本不知道这回事。
3、总线闭环,全网统一数据就绪、等待同步:当帧遍历完最后一个从站,总线闭环的一瞬间,每个从站都知道“这周期的数据全收到了”。SM马上把“数据就绪”标志置位,并向DC(分布式时钟)发出“锁存请求”。但这里绝不允许马上把暂存数据写进RxPDO——因为各个从站收到帧尾的时间有先后(网线有长有短),如果各搞各的,全网数据就不同步了。
**4、**SYNC偏移延时兜底,抹平全网传输时差:接下来进入主站配置好的SYNC偏移延时窗口。这个窗口是DC故意留出来的“缓冲时间”,专门用来抵消总线传输的物理时差。DC会等到全网最远的那个从站也完成了数据就绪之后,才准备下一步。在这个窗口里,所有从站的SM都处于“待命”状态,应用层数据纹丝不动。
**5、**DC全网统一触发,同步刷新RxPDO、TxPDO数据:偏移延时结束的瞬间,DC分布式时钟无视各从站网线长短、晶振误差,全网所有LAN9252在同一纳秒时刻,同时输出SYNC0硬件脉冲触发锁存机制。
把临时寄存器里的新指令,一次性写入RxPDO应用区(供STM32本周期使用);
同时把STM32已经备好的最新状态数据,一次性推入TxPDO发送区(留给下一轮总线回传)。
至此,全网所有从站在同一时刻,数据同步更新完成。
6、SYNC0脉冲****触发STM32周期任务,形成流水线闭环:SYNC0脉冲在触发SM锁存的同时,也硬线连到了STM32的中断引脚。于是,全网STM32在同一时刻被唤醒,统一进入中断服务程序执行任务:
读取刚刚锁存好的当前周期RxPDO控制指令;
执行控制算法、信号采样、设备输出等实时任务;
任务完成后,将最新设备状态数据写入TxPDO预备区。
注意:本轮写入的TxPDO新数据,不会被当前数据帧带走,而是提前为下一轮总线周期上传做准备。周而复始,形成EtherCAT标准同步流水线机制。
一句话极简串讲(面试收尾专用):
SM负责“接货就绪”,DC负责“统一开火”;数据来了先暂存,等所有兄弟都到齐,SYNC0一声令下,全网同时切换,STM32再跟上执行。这就是EtherCAT双同步的精髓。
五、终极总结
SM同步是管数据的:防止数据半路刷新、撕裂错乱,保证每个周期用的都是完整有效的一帧数据。
DC同步是管时间的:校准全网时钟和线路延迟,保证所有从站在同一时刻执行动作。
SM保数据正确性,DC保时序一致性,双开才是工业高精度EtherCAT同步的标准方案。
六、工程实操:SM同步 + DC同步 全套配置步骤(TwinCAT+LAN9252+STM32)
双同步必须分层配置,先从站开启能力、再底层代码适配、最后主站校准参数,三步缺一不可,以下为标准化可复用配置流程。
1、从站SSC工具配置(ESI文件核心配置,前置必做)
所有同步能力的底层开关,均在SSC工具生成ESI设备描述文件时配置,未开启则主站配置全部无效。
(1)DC同步基础配置
进入Slave Information → ESC Config Data
开启DC_SUPPORTED = 1:解锁从站硬件DC时钟能力,允许主站下发时钟校准指令
开启AL_EVENT_ENABLED = 1:开启ESC硬件中断,支持SYNC0脉冲触发
(2)SM同步管理器配置(核心双同步绑定)
SM0/SM1:默认邮箱通道,异步通信,无需同步配置
SM2(RxPDO 主→从):设置为缓冲同步模式,绑定SYNC0事件,禁止总线传输过程中数据刷新
SM3(TxPDO 从→主):设置为缓冲同步模式,绑定SYNC0事件,统一周期数据提交
开启PDO Synchronization:强制所有Rx/TxPDO数据锁存、刷新动作,仅跟随SYNC0脉冲执行
同步触发方式选择:Sync Event(硬件同步事件触发)
配置完成后,重新生成ESI.xml文件和从站底层协议栈代码,保证从站硬件支持双同步机制。
2、STM32+LAN9252底层代码配置
(1)硬件配置
LAN9252搭载25MHz高精度晶振(≤±50ppm),保障时钟基准精度
LAN9252SYNC0引脚外接STM32外部中断,所有周期控制任务仅在该中断内执行
中断优先级配置:PDI主中断 > SYNC0同步中断,避免同步中断被抢占失效
(2)软件初始化配置(PREOP→SAFEOP阶段执行)
开启LAN9252硬件DC时钟模块,配置与主站一致的同步周期(常规1ms)
激活SYNC0硬件脉冲输出,关联SM同步通道
关闭STM32软件定时轮询刷新PDO,完全交由SM锁存+SYNC0脉冲驱动数据更新与任务执行
3、TwinCAT主站配置(最终校准生效)
(1)全局DC基础配置
导入修改后的ESI文件,重启扫描总线,正常识别从站设备
主站高级设置勾选Enable Distributed Clock,开启全网分布式时钟
设置全局总线周期(如1ms),主从站周期严格统一
自动将总线首个DC从站设为参考时钟,统一全网时间基准
(2)从站同步模式配置
从站DC模式选择DC Synchronous(Sync0同步模式)
开启Sync0输出使能,绑定从站SM2/SM3同步通道
对象字典默认配置:0x1C33:01 = 0x01(启用SYNC0同步模式)
(3)SYNC偏移时间微调(实战核心)
初始基准值:1ms周期默认设置50μs偏移量,预留总线数据收尾时间
精调方式:通过TwinCAT Scope抓取Sync0抖动,每次增减20~50μs,最终将抖动稳定在±50ns以内
阈值限制:偏移量严禁超过总线周期1/3(1ms周期≤300μs),避免时序超时
单点补偿:个别从站抖动异常,通过对象字典0x1C32:03微调独立偏移,无需改动全局参数
七、双同步配置关键校验标准
SM同步生效:总线运行过程中无数据撕裂、无半帧数据,PDO数据每周期完整更新一次
DC同步生效:全网从站SYNC0脉冲时序一致,抖动稳定在纳秒级,多从站动作无偏移
双同步联动:先SM锁存完整数据,再DC脉冲触发任务,数据、时序双重可靠