四、EtherCAT 主站 SOEM 源码解析----分布时钟 DC
分布时钟(DC,Dsitributed Clock)可以使所有 EtherCAT 设备使用相同的系统
时间,从而控制各设备任务的同步执行。
1、DC 从站
支持分布式时钟的从站称为 DC 从站,同步原理如下所示:
其中,
Tref: 参考时间,网络中第一个 DC 从站的时间
Tsys_local(n): 第 n 个从站的本地系统时间副本(同步后等于 Tref),这个时间用来产生同步信号和锁存信号时间标记,供从站微处理器使用。
Tdleay(n): 从第一个 DC 从站到从站 n 的传输延时。
Toffset(n):从站 n 的时间和参考时间的初始偏移量。
其中,Toffset(n)和 Tdelay(n)在初始化时由主站测量,并写入从站对应寄存器中。Tref 在运行过程中由主站使用 FRMW 命令定期更新。
SOEM 中配置同步时钟的步骤如下:
2、获取从站 DC 特征信息
在/soem/EthercatConfig.c 的 ecx_config_init(ecx_contextt *context,uint8 usetable)函数中,获取从站信息,判断从站是否为 DC 从站。
3、锁存端口时间
在计算时间偏差 Toffset(n)和传输延时之前,主站需要发送一个广播命令BWR,写所有从站端口 0 的接收时间寄存器 0x0900,将所有从站捕捉数据帧第一个前导位到达每个端口的本地时间保存到寄存器 x0900~0x090F, 每个端口使用 4 个字节。具体代码在/soem/Ethercatdc.c 的函数
ecx_configdc(ecx_contextt context)中:
ecx_BWR(context->port, 0, ECT_REG_DCTIME0, sizeof(ht), &ht,EC_TIMEOUTRET); / latch DCrecvTimeA of all slaves */
4、计算初始时间偏移
读取数据帧处理单元接收时间,与主站的系统时间比较,差值作为
Toffset(n)写入从站寄存器 0x0920. 计算代码为:
SOEM 只在初始化时使从站时间同步主站时间,若要运行后使主从时间同步,需要定期修正主站时间或从站时间 。
5、计算传输延时
传输延时的计算比较复杂,与总线拓扑密切相关,计算原理图如下:
假设系统有 5 个从站,拓扑如上图所示,以计算从站 4 的传输延时 Tdelay(4)为例。
Tdelay(4) = deltaT + Tdelay(2) + dt2 //deltaT 为图中黄色粗箭头所示时间
而 deltaT = (dt3-dt1)/2。 假设数据帧经过图中两段黄色粗箭头的时间相等。
dt3 为数据帧从 Slave2 端口 2 离开到返回的时间,计算代码为:
6、广播参考时钟
在运行过程中,主站使用命令 FRMW 读取第一个 DC 从站的时间并写入到后续 DC 从站,达到时间同步的目的。
五、EtherCAT 主站 SOEM 源码解析----同步管理器 SM 配置
1、SM 寄存器
其中,物理起始地址和控制寄存器使用从站 EEPROM 中的值,长度根据 PDO 中映射的数据长度计算。
2、寄存器初始化
初始化过程中,SOEM 会通过 SII 接口读取从站 EEPROM 中 SM 信息(分类信息类型为 41),并赋给相应的结构体,具体代码在/soem/EthercatConfig.c 的函数 ecx_config_init()中:
3、更新数据长度寄存器
4、写入寄存器
在 ecx_map_sm()函数中通过 FPWR 命令将值写入从站对应寄存器:
更多回帖