EtherCAT使用与解析-关于DC

DC,distributed clock(不是Direct current...),分布式时钟;分布式时钟的意义在于所有EtherCAT设备使用相同的时间,控制各个设备同步执行,尤其体现在多轴同步运行。

每个从站中都有自己的本地时钟,且本地时钟保持独立运行,系统启动过程中,由于通电方面的差异必定会导致从站的本地时钟会有一定的偏差,该偏差就是时钟初始偏移量,运行过程中,由于从站使用各自的本地时钟,必然会有一定的时钟漂移现象,导致同步失败。而DC系统主要处理了两个问题:一个就是初始补偿(开始时的初始偏移量和各个线路之间的传输延迟和设备内部的延迟),一个就是本地时钟偏移,前者负责静态的补偿,后者则负责动态补偿:

对于静态补偿,有两个部分,一个就是从站时间和主站应用时间之间的初始偏差,另外一个就是由于线路引起的延迟:

对于后者,首先就是确定参考时钟,参考时钟选用主站连接的所有从站中第一个支持DC(获取从站寄存器基础配置与检测从站是否支持系统时间寄存器进行判断)的从站作为系统的参考时钟从站,然后就是计算整个系统的拓扑结构,这部分是基于从站的数据链路状态进行操作的,具体还涉及到ethercat从站的端口转发顺序,从站的端口转发顺序为为0->3->1->2这样的顺序,通过这样的顺序去将整个ethercat设备进行串接起来。涉及到的结构体如下:

typedef struct 
{
    ec_slave_port_desc_t desc; /**< Port descriptors. */
    ec_slave_port_link_t link; /**< Port link status. */
    ec_slave_t *next_slave; /**< Connected slaves. */
	
    uint32_t receive_time; /**< Port receive times for delay measurement. */
    uint32_t delay_to_next_dc; /**< Delay to next slave with DC support behind this port [ns]. */
} ec_slave_port_t;

以上结构体就是从站端口的接口,next_slave指向下一个连接的下一个物理从站。整体类似于迭代。

有了计算好的从站拓扑结构后,就可以了解到本从站数据处理完毕之后要发送给下一个从站的位置,根据从站之前的对0x0900寄存器写入后对从站本地时间的锁存,即可以计算得到每个从站与相邻从站之间由于线路导致的延时。然后依据各个从站之间的传输延迟就可以计算得到参考时钟到各个从站之间的传输延迟(这里将所有静态的误差因素到考虑进去了);该传输延时时间需要设置到0x0928(参考时钟时间和本地时间之间的偏差值);

这里有个点需要注意,就是关于4个端口的时间锁存的解释问题,以第一个端口为例:中文ethercat协议中对端口1的描述是“一个写访问在该参数的PDU的端口1开始接收时应锁存本地时间”,而英文版则是“local time at receive begin on Port 1 when a PDU containing a write access to Receive time port 0 register was received correctly“,两相比较有些异意。查看源码后,源码是按照英文版协议实现的。即在获取各个端口之间接收到数据的本地时间的时候,只需要对0x0900第一个端口进行写入即可。

对于前者,主要使用到的是系统时间偏差寄存器,这个寄存器(0x0920)用于设置本地时间与系统时间的偏差值.

 

对于动态的误差,DC系统主要基于了FRMW类型子报文,将主站系统时间设置到参考时钟的本地系统时间位置,然后将参考时钟的本地系统时间逐个赋值给其余从站,当从站检测到有本地系统时间写入,就会进行相应运算,本地系统时间参与到PLL中,从而对本地时间计时产生影响,使整个系统的时间进行同步。关于本地系统时间可以参考英文版本的ethercat协议,中文版看起来不怎么明确。

posted @ 2020-04-07 21:57  呵哈呵  阅读(576)  评论(0)    收藏  举报