对象字典 index 0x1C32:0x01 可以选择 ethercat 主站和从站的同步方式。
一共有三种:
- Free Run 模式
这种模式就是说每个slave根据自己的时间中断(未同步的timer)来处理ethercat数据,跟主站的运行周期其他从站的周期以及ethercat帧的到达时间都没关系。 - SMx 模式
这种模式就是slave根据SM2 或者 SM3 event 来处理ethercat帧数据的读写(也就是说slave一收到ethercat数据就会触发SM event),但是由于有些设备SM3一直是输出有效,因此有些设备的SM3不能用来作为同步信号。 - DC 模式
这种模式就是高精度的时间同步模式(与第一个有 DC 的 slave 同步),该模式会将第一个有DC的slave的时间作为 system time,然后再用这个 system time 来作为所有设备的参考时间(加上传输延时,抖动等等时间误差)来生成 SYNC0 或者 SYNC1 同步信号。该模式要求主站有很强的实时性能,因为某些slave要求在该模式县时间抖动不超过 100us,否则会有 Sync Error 报警。
Free Run
SM2/3
DC
每一种同步方式都有些有一个 Cycle Time 的参数 (index 0x1C32:0x02),该ethercat数据帧在这个时间内必须被消化(也可以理解为主站运行周期)。而一个 Cycle Time 周期又可以分为几个部分:
主要有四部分时间:其中 Copy and Prepare output 部分表示 slave 将ethercat数据从SyncManager(表示 PDO)中读出并复制到从站的 local RAM 中并经过计算输出的时间(0x1c32 0x06, 只读),外加一些硬件延时等(ox1c32 0x09 只读); Output Valid 表示将数据读入,并且经过设备内部周期,使数据生效的时间点;Input Latch 表示从传感器读入数据的时刻; Get and Copy inputs 部分表示将数据从传感器读入并插入到 ethercat帧中的时间(0x1c33 0x06 只读)。
例如,Sanyo 驱动器对各部分时间的描述:
一般ethercat从站需要设置两个时间参数: cycle_time
和 shift_time
,其中cycle time表示SYNC0信号的生成周期,一般即为ethercat的主站运行周期时间; shift_time 表示的是 SYNC0信号 相对于 DC信号 到偏移时间(正值,表示向后推移,例如可以设置为cycle_time的一半)), 如图(见参考链接):
还有些驱动器直接将 shift_time 设置为零,有些设置为零会出现数据周期错乱导致 sync error。具体看驱动器sm是否支持 shfit_time,可以读取index 为 0x1c32 或者 0x1c33,subindex 为 0x04 的uint16的数据,如图:
如果 bit6-5 为 00 则表示不支持 ShiftTime.