完整技术总结 | 基于多轮深度讨论整理
涵盖:原理、架构、源码、调试、工程实践


目录

  1. EtherCAT 核心要点

  2. 飞读飞写原理

  3. 分布式时钟同步

  4. 主站集中调度

  5. ESC 芯片硬件机制

  6. 拓扑结构

  7. 实时性保证

  8. 缓冲区与数据流

  9. 中断通知机制

  10. 邮箱协议

  11. 工程实践与排错


1. EtherCAT 核心要点

1.1 解决的三大问题

问题

传统方案痛点

EtherCAT 解决方案

实时性不够

每个设备独立响应,延迟累积

飞读飞写,一帧穿透所有从站

多设备不同步

各设备时钟独立,漂移累积

分布式时钟,纳秒级同步

成本高

专用总线贵,普通以太网慢

标准以太网物理层 + 专用协议

1.2 四大核心创新

┌─────────────────────────────────────────────────────────┐
│                    EtherCAT 核心                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ① 飞读飞写 (Processing on the Fly)                     │
│     数据帧在传输中被处理,不停车装卸货                  │
│                                                         │
│  ② 分布式时钟 (Distributed Clocks)                      │
│     主站测量→下发偏移→从站硬件补偿,±20ns 精度          │
│                                                         │
│  ③ 主站集中调度                                         │
│     单一主站控制所有通信,100% 确定性                    │
│                                                         │
│  ④ 专用 ESC 芯片                                        │
│     硬件状态机处理,纳秒级延迟,避免系统调度            │
│                                                         │
└─────────────────────────────────────────────────────────┘

1.3 技术对比

特性

传统以太网

EtherCAT

提升

通信周期

1-10 ms

100 μs

10-100 倍

同步精度

无

±20 ns

纳秒级

从站数量

受限于延迟

100+ 无压力

拓扑灵活

带宽利用率

~50%

>90%

效率翻倍

单站延迟

10-50 μs

~50 ns

1000 倍


2. 飞读飞写 (Processing on the Fly)

2.1 核心原理

传统以太网:
主站 → [设备 1] → 等待响应 → [设备 2] → 等待响应 → [设备 3]
      (每个设备都要处理完整帧,延迟累积)

EtherCAT:
主站 → [设备 1]→[设备 2]→[设备 3] → 返回
      (一帧穿透所有设备,"飞读飞写")

2.2 帧结构

┌─────────────────────────────────────────────────────────┐
│  以太网头 (14B)  │  EtherCAT 头 (2B)  │  Telegrams  │ FCS  │
├─────────────────────────────────────────────────────────┤
│ DA | SA | Type   │ Len | Res | 数据帧内容...          │
│ 08:A8:17         │     │     │                        │
└─────────────────────────────────────────────────────────┘

Telegram 结构:
┌─────┬──────┬────────┬──────┬────────┬─────────┐
│命令 │索引  │子索引  │长度  │数据    │ 状态    │
│1B   │2B    │1B      │2B    │N 字节   │  2B     │
└─────┴──────┴────────┴──────┴────────┴─────────┘

2.3 数据映射机制

主站配置阶段(启动前):
─────────────────────────────────────────────────

主站询问每个从站:
"你需要多少输入字节?多少输出字节?"

从站 0: 输入 8B, 输出 8B
从站 1: 输入 16B, 输出 16B
从站 2: 输入 4B, 输出 4B

主站计算总长度:8+16+4+... = 200B

主站构建映射表:
┌─────────────────────────────────────────────────┐
│ 帧偏移 0-7B    → 从站 0 输入                     │
│ 帧偏移 8-23B   → 从站 1 输入                     │
│ 帧偏移 24-27B  → 从站 2 输入                     │
│ ...                                             │
│ 帧偏移 100-107B → 从站 0 输出                    │
│ 帧偏移 108-123B → 从站 1 输出                    │
└─────────────────────────────────────────────────┘

运行时:
主站发送帧(200B 数据区已预留)
     ↓
从站根据配置知道"偏移 X-Y 是我的"
     ↓
从站硬件直接读写对应偏移位置
     ↓
帧继续传输,长度不变!

2.4 命令字详解

命令

十六进制

用途

​APRW​

0x00

物理地址读写(配置用)

​APRD​

0x01

物理地址读

​APWR​

0x02

物理地址写

​BRD​

0x04

广播读

​BWR​

0x05

广播写

​BRW​

0x06

广播读写

​LRD​

0x0A

逻辑地址读(运行时用)

​LWR​

0x0B

逻辑地址写

​LRW​

0x0C

逻辑地址读写(​最常用​)


3. 分布式时钟 (Distributed Clocks)

3.1 同步原理

┌─────────────────────────────────────────────────────────┐
│              分布式时钟系统架构                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│                      主站                                │
│                       │                                 │
│              发送同步帧 (BRD)                           │
│                       ↓                                 │
│  ┌─────────────────────────────────────────────────┐   │
│  │  从站 0        从站 1        从站 2        从站 3  │   │
│  │  [64 位计数器] [64 位计数器] [64 位计数器] [64 位计数器]│   │
│  │       ↑             ↑             ↑             ↑   │   │
│  │  锁存 T₀=1000  锁存 T₁=1150  锁存 T₂=1300  锁存 T₃=1450│   │
│  │       │             │             │             │   │   │
│  │       └─────────────┴─────────────┴─────────────┘   │   │
│  │                         ↓                           │   │
│  │              主站读取所有锁存值                      │   │
│  │                         ↓                           │   │
│  │              计算偏移 + 传播延迟                     │   │
│  │                         ↓                           │   │
│  │              下发校正值到各从站                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.2 同步流程(三步走)

步骤 1: 测量从站间相对延迟
─────────────────────────────────────────────────
主站发广播帧
从站记录本地到达时间
主站计算差值(同一时钟系统内,有效!)

步骤 2: 测量主从时钟偏移(往返法)
─────────────────────────────────────────────────
主站 T1 发送
从站收到,立即返回
主站 T4 接收

往返时间 = T4 - T1
单程延迟 = (T4 - T1) / 2
时钟偏移 = 从站时间 - 单程延迟 - 主站时间

步骤 3: 下发校正
─────────────────────────────────────────────────
从站 0:offset
从站 1..N:offset + propagation_delay/2

3.3 关键寄存器 (ESC)

地址

寄存器

说明

0x0900-0x0903

System Time Low

系统时间低 32 位

0x0904-0x0907

System Time High

系统时间高 32 位

0x0908-0x090B

Time Offset Low

时钟偏移低 32 位

0x090C-0x090F

Time Offset High

时钟偏移高 32 位

0x0910-0x0913

Propagation Delay

传播延迟

0x0920-0x0923

Speed Counter Start

速度补偿

0x0980

DC LATCH Control

锁存控制

0x09A0-0x09AC

DC SYNC Cycle/Shift

同步周期/偏移

3.4 Sync 信号时序

┌─────────────────────────────────────────────────────────┐
│              Sync 信号时序                               │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  EtherCAT 帧 ──→ [ESC 接收]                             │
│                      ↓                                  │
│  Sync0 脉冲 ──→ ┌─────┐  ← 脉宽 100-500ns              │
│                 │     │     帧到达 + 传播延迟补偿       │
│                 └─────┘                                 │
│                      ↓                                  │
│                 (200μs 偏移)                            │
│                      ↓                                  │
│  Sync1 脉冲 ──→ ┌─────┐  ← 脉宽 100-500ns              │
│                 │     │     Sync0 + 偏移                │
│                 └─────┘                                 │
│                                                         │
│  Sync0: 用于输入采样(从站→主站)                       │
│  Sync1: 用于输出更新(主站→从站)                       │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.5 同步精度

阶段

精度

初始同步后

±500ns

运行 1 分钟后

±100ns

运行 1 小时后

±50ns

稳态 (带补偿)

±20-30ns


4. 主站集中调度

4.1 集中的三个层面

┌─────────────────────────────────────────────────────────┐
│              集中调度的三个层面                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ① 通信调度集中                                         │
│     只有主站能发起通信,从站只能响应                    │
│     无冲突,无重传                                      │
│                                                         │
│  ② 时间调度集中                                         │
│     主站决定:通信周期、Sync 触发、时钟校准             │
│     从站:等待 Sync 信号,在指定时刻采样/更新           │
│                                                         │
│  ③ 配置管理集中                                         │
│     主站负责:拓扑扫描、地址分配、PDO 映射、状态监控    │
│     从站:存储配置,等待主站配置,上报状态              │
│                                                         │
└─────────────────────────────────────────────────────────┘

4.2 主站调度循环

void ethercat_master_main(void)
{
    ec_init();
    ec_config_map();
    ec_dc_init();
    
    uint64_t cycle_count = 0;
    
    while (1) {
        // 1. 等待同步时刻
        wait_for_cycle_start();  // 1ms 周期
        
        // 2. 发送过程数据
        ec_frame_t *frame = build_process_frame();
        ec_send_frame(frame);
        
        // 3. 接收过程数据
        ec_receive_frame(frame);
        
        // 4. 控制算法计算
        control_loop();
        
        // 5. 分布式时钟同步(每秒 1 次)
        if (cycle_count % 1000 == 0) {
            ec_dc_sync();
        }
        
        // 6. 状态监控
        check_slave_states();
        
        cycle_count++;
    }
}

5. ESC 芯片硬件机制

5.1 直通转发 vs 存储转发

┌─────────────────────────────────────────────────────────┐
│              两种转发方式对比                            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  存储转发(传统以太网):                               │
│  [══════ 完整接收帧 ══════] → [CRC 校验] → [CPU 处理]  │
│  总延迟 = 10μs + 50μs + 10μs = 70μs                    │
│                                                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  直通转发(EtherCAT ESC):                             │
│  [接收帧头] ──→ [开始转发]                              │
│  [继续接收] ──→ [继续转发]                              │
│  [读写数据] ──→ [修改后转发]                            │
│  总延迟 = 帧头处理时间 ≈ 50 ns                          │
│                                                         │
│  关键:接收和发送同时进行!                             │
│                                                         │
└─────────────────────────────────────────────────────────┘

5.2 ESC 内部架构

┌─────────────────────────────────────────────────────────┐
│              ESC 芯片内部架构 (ET1100)                   │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  IN 口 → [PHY 接口] → [时间戳单元] → [FIFO] → [状态机]  │
│                    ↑                        │           │
│              硬件捕获 (5ns)              直接转发       │
│                                           ↓           │
│  OUT 口 ←────────────────────────── [PHY 接口]          │
│                                                         │
│  延迟分解:                                             │
│  - PHY 接收:5 ns                                       │
│  - ESC 处理:25 ns                                      │
│  - PHY 发送:5 ns                                       │
│  - 总计:~35-50 ns                                      │
│                                                         │
└─────────────────────────────────────────────────────────┘

5.3 多从站延迟累积

单站延迟:~40 ns (含 1m 电缆)
100 个从站累积:100 × 40 ns = 4000 ns = 4 μs

对比传统以太网:
100 × 50 μs = 5000 μs = 5 ms

EtherCAT 优势:1250 倍提升!

6. 拓扑结构

6.1 支持的拓扑

┌─────────────────────────────────────────────────────────┐
│              EtherCAT 拓扑类型                           │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  线型(最常用):                                       │
│  主站 ──→ [从站 1] ──→ [从站 2] ──→ [从站 3] ──→ 终端 │
│                                                         │
│  树型:                                                 │
│              主站                                       │
│               │                                         │
│       ┌───────┼───────┐                                │
│       ↓       ↓       ↓                                │
│    从站 1   从站 2   从站 3                             │
│     │               │                                  │
│   ┌─┴─┐           ┌─┴─┐                               │
│   ↓   ↓           ↓   ↓                                │
│ 从站 4 从站 5    从站 6 从站 7                          │
│                                                         │
│  环型(冗余):                                         │
│  主站 OUT ──→ [从站 1] ──→ [从站 2] ──→ 主站 IN       │
│       ↑                                    │           │
│       └────────────────────────────────────┘           │
│                                                         │
└─────────────────────────────────────────────────────────┘

6.2 从站网口结构

┌─────────────────────────────────────────────────────────┐
│              从站网口内部结构                            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  主站方向 ──→ IN  ┌─────────────────┐ OUT ──→ 下一站   │
│                 │     ESC 芯片      │                  │
│  下一站方向 ←───  │                 │ ←─── 返回数据    │
│                 └────────┬──────────┘                  │
│                          │                             │
│                          ↓                             │
│                 ┌─────────────┐                        │
│                 │  本地 I/O    │                        │
│                 └─────────────┘                        │
│                                                         │
│  每个从站是"透明网桥":                                │
│  - 帧从 IN 进,处理后从 OUT 出                          │
│  - 同时读写帧中属于自己的数据段                        │
│  - 帧内容改变,但长度不变                              │
│                                                         │
└─────────────────────────────────────────────────────────┘

7. 实时性保证

7.1 实时性三支柱

┌─────────────────────────────────────────────────────────┐
│              实时性保证的三大支柱                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ① 硬件确定性                                           │
│     - 专用 ESC 芯片,硬件状态机                         │
│     - 无 CPU,无操作系统,无中断                        │
│     - 处理延迟固定 ~50 ns                               │
│                                                         │
│  ② 直通转发                                             │
│     - 边收边发,不存完整帧                              │
│     - 接收和发送并行                                    │
│     - 数据读写"捎带"完成                                │
│                                                         │
│  ③ 主站集中调度                                         │
│     - 单一主站控制所有通信                              │
│     - 无冲突,无重传                                    │
│     - 通信周期固定                                      │
│                                                         │
└─────────────────────────────────────────────────────────┘

7.2 实测数据 (ET1100)

测试条件

值

帧长度

100 字节

电缆长度

1m

温度

25°C

最小延迟

35 ns

最大延迟

65 ns

平均延迟

50 ns

抖动

±15 ns


8. 缓冲区与数据流

8.1 双缓冲区机制

┌─────────────────────────────────────────────────────────┐
│              ESC 双缓冲区结构                            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│                 ┌─────────────────┐                    │
│                 │     ESC 芯片     │                    │
│                 │                 │                    │
│  帧数据流 ──→ ┌──────────┐  ┌──────────┐ ──→ 帧继续   │
│               │ 过程数据  │  │ 过程数据  │              │
│               │ 输入区   │  │ 输出区   │              │
│               │ (Rx)     │  │ (Tx)     │              │
│               └────┬─────┘  └────┬─────┘              │
│                    │             │                     │
│                    │ Sync 触发交换│                    │
│                    ↓             ↓                     │
│               ┌──────────┐  ┌──────────┐              │
│               │ 应用读取  │  │ 应用写入  │              │
│               │ 缓冲区   │  │ 缓冲区   │              │
│               └────┬─────┘  └────┬─────┘              │
│                    │             │                     │
│                    ↓             ↓                     │
│              读传感器数据   写执行器命令                │
│                                                         │
│  为什么需要双缓冲?                                     │
│  - 硬件转发和应用处理速度不同                           │
│  - 避免数据竞争(硬件写的时候应用在读)                │
│  - Sync 触发时"快照"交换,保证数据一致性               │
│                                                         │
└─────────────────────────────────────────────────────────┘

8.2 硬件 vs 应用能力不匹配问题

┌─────────────────────────────────────────────────────────┐
│              缓冲区溢出风险                              │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ESC 硬件能力:                                         │
│  - 帧转发延迟:50 ns/站                                 │
│  - 缓冲区大小:固定(如 2KB)                           │
│  - 处理速度:硬件级,确定                               │
│                                                         │
│  应用层能力:                                           │
│  - 中断响应:1-10 μs                                    │
│  - 数据处理:10-100 μs                                  │
│  - 处理速度:软件级,不确定                             │
│                                                         │
│  风险:                                                 │
│  硬件每秒处理 10000 帧,应用层只能处理 1000 帧          │
│  → 中间 9000 帧的数据被覆盖                             │
│  → 硬件没报错,但控制逻辑出错                           │
│                                                         │
└─────────────────────────────────────────────────────────┘

8.3 解决方案

方案

优点

缺点

适用场景

增大 ESC 缓冲区

简单

ESC 固定,成本高

缓冲区太小

降低通信周期

给应用更多时间

实时性下降

控制周期可放宽

应用层优化

不改硬件

需要深入优化

大多数场景(首选)

数据分级处理

关键数据不丢

逻辑复杂

有优先级场景

主从协调

系统级解决

需主站配合

高端应用

8.4 调优检查清单

□ 测量 Sync 中断响应时间(目标:<5 μs)
□ 测量数据处理时间(目标:< 周期×80%)
□ 监控缓冲区溢出计数(目标:0)
□ 设置看门狗超时(目标:周期×3-5)
□ 配置中断优先级(Sync 最高)
□ 启用 DMA 传输(如支持)
□ 优化数据拷贝(零拷贝优先)
□ 分级处理数据(关键数据优先)
□ 预留余量(周期×20% 用于异常处理)

9. 中断通知机制

9.1 中断方式对比

方式

优点

缺点

适用场景

硬件中断

实时性好,延迟低

需硬件连接,ISR 要快

实时控制(推荐)

状态寄存器轮询

简单,无需中断引脚

实时性差,浪费 CPU

简单场景

邮箱中断

适合非周期性数据

不适合过程数据

配置/诊断

Sync 信号 + 中断

精确同步,确定性高

需 DC 配置

DC 同步场景

9.2 ESC 中断寄存器 (ET1100)

地址

寄存器

说明

0x0220

AL_EVENT_MASK

中断屏蔽寄存器

0x0222

AL_EVENT_REQUEST

中断请求寄存器

位定义:

  • Bit 0: AL_CONTROL_EVENT (状态机变化)

  • Bit 2: DC_SYNC0_EVENT (Sync0 中断) ← 最常用

  • Bit 3: DC_SYNC1_EVENT (Sync1 中断)

  • Bit 6-7: SM2/SM3_EVENT (过程数据)

  • Bit 8: MAILBOX_EVENT (邮箱)

  • Bit 9: ALINK_EVENT (链路状态)

9.3 中断服务程序示例

// 中断服务程序
void EXTI0_IRQHandler(void)
{
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0)) {
        // 读取 ESC 中断请求寄存器
        g_esc_event = ESC_Read16(0x0222);
        
        // 清除中断标志
        ESC_Write16(0x0222, g_esc_event);
        
        // Sync0 中断 - 输入采样
        if (g_esc_event & 0x0004) {
            g_sync0_received = 1;
        }
        
        // Sync1 中断 - 输出更新
        if (g_esc_event & 0x0008) {
            g_sync1_received = 1;
        }
        
        // 邮箱中断
        if (g_esc_event & 0x0100) {
            mailbox_handler();
        }
    }
    
    EXTI_ClearITPendingBit(EXTI_Line0);
}

// 主循环
int main(void)
{
    system_init();
    esc_interrupt_init();
    
    while (1) {
        if (g_sync0_received) {
            g_sync0_received = 0;
            read_sensors();
            update_input_pdo();
        }
        
        if (g_sync1_received) {
            g_sync1_received = 0;
            read_output_pdo();
            write_actuators();
        }
        
        do_background_tasks();
    }
}

10. 邮箱 (Mailbox)

10.1 邮箱 vs PDO

特性

邮箱 (Mailbox)

过程数据 (PDO)

通信类型

非周期性

周期性

实时性

低(ms 级)

高(μs 级)

数据长度

可变(0-128B)

固定

确认机制

有

无

错误处理

重试/错误码

无

典型用途

配置、诊断、参数

控制命令、传感器

同步管理器

SM0/SM1

SM2/SM3

10.2 邮箱应用场景

┌─────────────────────────────────────────────────────────┐
│              邮箱的 5 大应用场景                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ① 设备配置(启动阶段)                                 │
│     读取设备信息、配置工作模式、设置 PDO 映射           │
│                                                         │
│  ② 参数读写(CoE - CAN over EtherCAT)                  │
│     读取对象字典、修改设备参数、保存参数到 EEPROM       │
│                                                         │
│  ③ 诊断信息                                             │
│     读取错误代码、获取设备状态、历史记录查询            │
│                                                         │
│  ④ 固件更新(FoE - File over EtherCAT)                 │
│     下载固件文件、Bootloader 通信、固件版本校验         │
│                                                         │
│  ⑤ 厂商特定协议                                         │
│     厂商自定义命令、特殊功能访问                        │
│                                                         │
└─────────────────────────────────────────────────────────┘

10.3 邮箱类型

类型

代码

说明

AoE

0x01

ADS over EtherCAT (倍福专用)

EoE

0x02

Ethernet over EtherCAT

CoE

0x03

CAN over EtherCAT (最常用)

FoE

0x04

File over EtherCAT (固件更新)

VoE

0x05

Vendor over EtherCAT (厂商自定义)

SoE

0x06

Sercos over EtherCAT

10.4 CoE 读参数示例

主站发送请求:
┌─────────────────────────────────────────────────┐
│  邮箱头                                          │
│  邮件类型:0x0003 (CoE)                         │
│  邮件子类型:0x02 (SDO Upload)                  │
│  数据长度:8 字节                                │
├─────────────────────────────────────────────────┤
│  CoE 数据                                        │
│  索引:0x1008                                   │
│  子索引:0x00                                   │
│  命令:0x40 (上传请求)                          │
└─────────────────────────────────────────────────┘

从站响应:
┌─────────────────────────────────────────────────┐
│  邮箱头                                          │
│  邮件类型:0x0003 (CoE)                         │
│  邮件子类型:0x02 (SDO Upload)                  │
│  数据长度:16 字节                               │
├─────────────────────────────────────────────────┤
│  CoE 数据                                        │
│  索引:0x1008                                   │
│  子索引:0x00                                   │
│  命令:0x43 (上传响应)                          │
│  数据:"EL2008\0\0\0\0\0\0\0\0"              │
└─────────────────────────────────────────────────┘

11. 工程实践与排错

11.1 常见故障及定位

故障现象

可能原因

定位方法

从站丢失

电缆干扰/接地不良

检查屏蔽层接地

同步抖动大

DC 配置错误

检查同步周期和偏移

通信超时

帧长度超限

单帧≤1518 字节

电机抖动

数据丢失

检查缓冲区溢出计数

位置偏差

输入数据更新不及时

测量 Sync 响应时间

中断不触发

中断配置错误

检查中断屏蔽寄存器

11.2 调试工具

# Wireshark 抓包
wireshark -i eth0 -f "ether[12:2] = 0x88a4"

# 查看从站状态
ethercat slaves -v

# 监控 DC 同步
watch -n 0.1 'ethercat dc -s'

# 读取从站寄存器
ethercat reg_read -p 0 0x0900  # 系统时间
ethercat reg_read -p 0 0x0910  # 传播延迟

11.3 设计建议

┌─────────────────────────────────────────────────────────┐
│              工程设计建议                                │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  通信周期选择:                                         │
│  - 高速运动控制:100-250 μs                             │
│  - 一般运动控制:500 μs - 1 ms                          │
│  - 过程控制:1-10 ms                                    │
│                                                         │
│  同步周期:                                             │
│  - 时钟校准:1 秒 1 次                                  │
│  - Sync 触发:与通信周期相同或整数倍                    │
│                                                         │
│  余量预留:                                             │
│  - 处理时间 < 周期×80%                                 │
│  - 缓冲区大小 > 实际需求×1.5                           │
│                                                         │
│  可靠性:                                               │
│  - 关键应用使用环型拓扑(冗余)                         │
│  - 启用看门狗功能                                       │
│  - 实现缓冲区溢出检测                                   │
│                                                         │
└─────────────────────────────────────────────────────────┘

附录:核心公式

A.1 时钟偏移计算

往返时间 = T4 - T1
单程延迟 = (T4 - T1) / 2
时钟偏移 = 从站时间 - 单程延迟 - 主站时间

A.2 传播延迟计算

从站 N 相对延迟 = (T_arrival_N - T_arrival_0) × 2

A.3 同步精度估算

晶振漂移 = ±50 ppm = ±0.005%
1ms 内最大漂移 = 1000000 ns × 0.00005 = 50 ns

A.4 多从站延迟

单站延迟 ≈ 40 ns (含 1m 电缆)
N 站总延迟 ≈ N × 40 ns

总结

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  EtherCAT 的核心 = 用硬件确定性换取时间精度             │
│                                                         │
│  解决的问题 = 工业现场"既要便宜又要快又要准"           │
│                                                         │
│  设计哲学 = 主站聪明,从站简单,数据流中处理            │
│                                                         │
│  关键洞察:                                             │
│  - 飞读飞写:帧长度预先分配,从站按偏移读写            │
│  - 分布式时钟:主站测量→下发偏移→从站硬件补偿          │
│  - 集中调度:主站决定何时发、何时同步、如何配置        │
│  - ESC 芯片:硬件状态机处理,纳秒级延迟                │
│  - 双缓冲区:硬件/应用解耦,Sync 触发交换              │
│  - 邮箱协议:非周期性数据,配置/诊断/参数              │
│                                                         │
└─────────────────────────────────────────────────────────┘