EtherCAT的三种同步模式(随笔)

EtherCAT存在三种同步模式,分别是
- FreeRun
- SM同步模式
- DC同步模式
1、FreeRUN
FreeRUN,即自由运行模式,这是EtherCAT最基本的同步方式。虽称之为同步模式,但其实在这种模式下,主站和从站并非处于同步的状态。FreeRUN的特点如下:
- 主站和从站按照自身的定时器进行工作,即主站发帧的时刻和从站处理过程数据的时刻都是由自身的定时器所决定
- 各个FreeRun的从站时间偏移量是不同的
- 适用于一些简单的、不需要实时控制的IO设备,例如一些温度传感器
2、SM同步模式
SM同步模式,即从站的过程数据处理,在接收到周期性数据帧时触发。也就是说,当从站接收到数据帧时,产生一个事件,这个事件由中断的形式通知从站的MCU,这个中断称之为PDI中断,当然PDI中断不仅仅只有数据来临时才会触发,这点需要注意。
SM的同步事件有两种,SM2同步事件和SM3同步事件。当过程数据(PDO)中包括Output数据,则触发SM2事件;当过程数据仅有Input数据,才会触发SM3事件。
SM同步事件的特点:
- 整个同步过程取决于主站周期性的发帧,主站发帧的周期如果出现抖动(jitter)则所有的从站都会受到这个抖动的影响
- 即使主站的发帧周期非常稳定,受实际硬件传输延迟的影响(例如线缆过长、从站转发时间长等情况),最后一个从站接收到数据帧并产生SM同步事件也必然晚于第一个从站
- 适用于一些慢速的设备上,us级的抖动
3、DC同步模式
DC同步模式,即从站的过程数据处理,由从站中基于DC系统时间产生的硬件同步事件(SYNC Event)触发。DC模式可以容忍主站的数据帧在不同的时刻达到从站,但是从站对数据的处理、响应却是同一时刻进行的。同时控制多个电机时就需要这种方式。
那么是如何做到的呢?
首先各个从站必须使用同一个参考时间,也就是说产生SYNC事件的时刻必须是同一时刻(举个例子,当各个从站约定中午12点时一起产生SYNC事件,但是从站A现在处于7点,从站B处于9点,很显然,从站A和从站B不可能同一时间产生SYNC事件)。同时主站也必须与各个从站使用同一个参考时钟,因为如果主站发帧的时刻晚于所有从站的SYNC事件,从站产生SYNC事件时发现没有有效的数据到达,这将是一个灾难性的错误啊!
那这个参考时钟由谁提供呢?在实际应用中,会选择一个从站或主站作为参考时钟的来源,我们一般选择离主站最近的从站的时钟作为参考时钟。
在通信开始时,主站会发送一个广播数据帧(BRD),每个从站都会在接收时锁存当前的时刻,同时当数据帧返回再次收到时再次锁存一个时刻。主站可以收集到如下时间:
- T1:数据帧到达参考从站时,参考从站的本地时间
- Tn1: 数据帧到达从站n时,从站n的本地时间
- Tn2: 数据帧再次返回从站n时,从站n的本地时间
- T2:数据帧再次返回参考从站时,参考从站的本地时间
根据上面的时间,主站可以知晓:
T2-T1:整个数据帧从参考从站处,在后续网络中跑一圈所需的时间
Tn2-Tn1:某个设备发出去,在后续网络中跑一圈所需的时间
那么(T2-T1)-(Tn2-Tn1) 不正是参考从站到从站n的传输延迟(t_delay)吗?通过这种方式,我们可以计算所有从站到参考从站的物理延迟t_delay。
得到传输延迟后,主站会将物理传输延迟t_delay和t_offset(从站时间和参考时间的差值,这个很好理解,大家的时间戳不同嘛,肯定有一个初始的差值,或许大或许小,当然这个值是考虑了t_delay以后的)写入到从站中,此时各个从站在时间上和参考从站就是一致的了。
前面提到的方式是初始化阶段时的调整,EtherCAT在通信过程中,还会在PDO数据中加入从站的参考时钟,每个从站在每次PDO数据来临时,都可以对内部的时钟进行校准,避免因为环境等因素导致的时钟偏差影响到SYNC事件的产生。
在同步完成后,主站开始发出数据帧,此时各个从站也开始准备产生SYNC事件了。那么SYNC事件在主站发出数据帧这个时间点过多久产生SYNC0呢? 当然是在主站的发帧周期内找一个点就好了,这个点只需要满足以下两点:
- 1、不要超过主站的发帧周期
- 2、要最后一个从站接收到主站的过程数据以后再产生
知道条件后,我们就可以设置SYNC事件的产生时刻了,产生这个时刻的控制元素叫做shfit time,一般设置为周期的30%,也写入到从站的寄存器就行了。
当然,在DC模式中有两个SYNC事件,分别是SYNC0和SYNC1。SYNC1的产生时刻为SYNC0的产生时刻 + SYNC1的shift time
仅有 1 条评论
妙哉。