第3章:主站与从站架构

好,咱们开始聊正题。

上一章我们把EtherCAT的协议栈框架搭起来了,但说实话,那只是个空壳子。真正要让系统跑起来,你得搞清楚主站和从站到底是怎么分工的。我当年第一次接触EtherCAT时,就被这俩角色的交互搞得一头雾水——主站发个报文,从站怎么就能在几微秒内把数据塞进去?

嗯,今天咱们就把这个谜底揭开。

3.1 EtherCAT主站功能模块

主站,说白了就是整个网络的指挥官。但它不是事无巨细地管,而是只管三件事:发命令、收数据、处理异常。

我个人习惯把主站软件拆成四个核心模块:

  • 网络接口层:负责收发EtherCAT帧。说白了就是操作网卡,把报文发出去,再把回来的报文收上来。我建议直接用标准以太网驱动,别自己造轮子。
  • 数据链路层:管理逻辑寻址、帧转发、看门狗。这里有个坑——从站掉线时,你得能快速检测到。我曾经因为看门狗超时设得太长,导致产线停了3秒才报警,被领导骂惨了。
  • 应用层:处理CoE、SoE、FoE这些协议。比如你要读写从站的SDO对象字典,就得走这一层。
  • 状态机管理:控制从站的状态切换(Init→Pre-Op→Safe-Op→Op)。这个顺序不能乱,否则从站会罢工。

核心要点:主站不参与从站内部的实时控制。它只负责把数据包发到总线上,至于从站怎么处理,那是从站自己的事。这叫「分布式时钟」的精髓——各管各的,但时间要同步。

3.2 从站控制器(ESC)硬件架构

从站这边,核心就是ESC芯片。市面上主流的是Beckhoff的ET1100/ET1200,或者一些国产替代方案。

ESC内部长什么样?我画个简图给你看:

+------------------+
|    PHY接口        |  ← 接网线
+--------+---------+
         |
+--------v---------+
|   数据链路层      |  ← 处理EtherCAT帧
|  (帧转发/过滤)    |
+--------+---------+
         |
+--------v---------+
|   寄存器/内存     |  ← 存储过程数据
|  (PDI接口)        |
+--------+---------+
         |
+--------v---------+
|   应用层接口      |  ← 接MCU或FPGA
|  (SPI/并行总线)   |
+------------------+

这里有个关键点:ESC芯片内部有双端口RAM。主站发来的数据直接写入这个RAM,从站MCU通过SPI或并行总线读取。反过来也一样。

我在项目中遇到过一个问题:某款国产ESC芯片的SPI时钟频率只能跑到10MHz,导致数据吞吐量上不去。后来换成ET1100,直接飙到50MHz。所以选型时一定要看PDI接口的速率。

避坑指南:ESC芯片的「帧转发延迟」通常只有几百纳秒。但如果你用了外部PHY芯片,延迟会翻倍。我曾经因为用了便宜的PHY,导致整个环网的同步精度从100ns掉到了500ns。嗯,一分钱一分货。

3.3 主站与从站的交互流程

好了,现在咱们把主站和从站连起来,看看它们怎么配合。

整个交互流程分三步:

  1. 主站发送帧:主站构造一个EtherCAT帧,里面包含所有从站的过程数据。帧格式是固定的——以太网头 + EtherCAT头 + 数据段。
  2. 从站处理帧:帧经过每个从站时,ESC芯片会:
    • 读取属于自己的数据(从帧中提取)
    • 写入自己的数据(插入到帧中)
    • 把帧转发给下一个从站
  3. 主站回收帧:最后一个从站把帧返回给主站。主站解析帧,拿到所有从站的反馈数据。

你想想看,这个过程有多快?每个从站只处理自己那一段数据,其他数据原封不动地传过去。所以整个环网的延迟,基本就是「帧长度 × 从站数量 × 每站处理时间」。我实测过,50个从站,每个站处理时间约200ns,总延迟才10微秒。

关键机制:EtherCAT用的是「集总帧」技术。一个帧里可以塞多个从站的数据,而不是每个从站单独发一个帧。这就像快递车一次拉几十个包裹,而不是每个包裹派一辆车。效率能不高吗?

3.4 一个简单的交互示例

假设你有两个从站:一个数字量输入模块(DI),一个数字量输出模块(DO)。

主站要做的:

  • 从DI模块读8位输入状态
  • 向DO模块写8位输出状态

帧结构大概长这样:

以太网头 | EtherCAT头 | DI数据区(8bit) | DO数据区(8bit) | FCS

主站发送时,DI数据区是空的(或者填0),DO数据区填上要输出的值。

帧经过DI从站时,ESC把输入状态写入DI数据区。

帧经过DO从站时,ESC从DO数据区读取输出值,驱动继电器。

最后帧回到主站,主站从DI数据区拿到输入状态。

整个过程,一个帧搞定。这就是EtherCAT的厉害之处。

注意:从站的数据处理是硬件完成的,不经过MCU。所以即使MCU在跑别的任务,也不影响实时性。但如果你需要从站做复杂逻辑(比如PID计算),那就得用MCU参与,这时候延迟会变大。我建议把简单IO交给ESC直通,复杂计算留给MCU。

3.5 总结一下

主站和从站的架构,说白了就是「主站发号施令,从站硬件执行」。主站软件负责调度,从站硬件负责实时响应。两者通过EtherCAT帧这个「快递车」来交换数据。

我个人觉得,理解这个交互流程是入门EtherCAT最关键的一步。你不需要一开始就搞懂所有寄存器,但一定要明白数据是怎么在总线上流动的。否则后面调试时,你连问题出在主站还是从站都分不清。

下一章,咱们开始动手写第一个主站程序。到时候你会更深刻地理解今天讲的内容。