偶然的机会接触到EtherCAT,怀着好奇和学习的心态研究下SOEM的源码,才发现工业领域真是博大精深,百年工业名不虚传。看了太多AI大模型权重动辄几十GB,再看看EtherCAT的帧全部长度只有1518字节,将精密和确定性发挥到了极致。本次为系列学习笔记,本次介绍EtherCAT的协议基础。2)硬件处理:从站ESC芯片直接解析帧,不占用CPU┌─────────────────────────────────────────────────────────────────┐│ OSI 七层模型与 EtherCAT ├─────────────────────────────────────────────────────────────────┤│ ││ 7. 应用层 │ HTTP, FTP, Modbus │├─────────────────┼──────────────────────────────────────────────┤│ 6. 表示层 │ │├─────────────────┼──────────────────────────────────────────────┤│ 5. 会话层 │ │├─────────────────┼──────────────────────────────────────────────┤│ 4. 传输层 │ │├─────────────────┼──────────────────────────────────────────────┤│ 3. 网络层 │ │├─────────────────┼──────────────────────────────────────────────┤│ 2. 数据链路层 │ ★★★ EtherCAT ★★★ ││ │ (直接在 Ethernet 帧上运行) │├─────────────────┼──────────────────────────────────────────────┤│ 1. 物理层 │ Ethernet (网线/光纤) │└─────────────────────────────────────────────────────────────────┘
// 定义在 ec_type.h 中#define ETH_P_ECAT 0x88A4 // EtherCAT 专用 EtherType
┌─────────────────────────────────────────────────────────────────────────────────┐│ 完整 EtherCAT 帧结构 │├─────────────────────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ Ethernet Header (14bytes) │ ││ │ ┌─────────┬─────────┬──────────────┐ │ ││ │ │ Dest │ Source │ Type │ │ ││ │ │ MAC │ MAC │ 0x88A4 │ │ ││ │ │ (6B) │ (6B) │ (2B) │ │ ││ │ └─────────┴─────────┴──────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ EtherCAT Header (2bytes) │ ││ │ ┌────────────────┬──────────────────────────────────────────────┐ │ ││ │ │ Length │ 后续数据长度 + 10 (命令头+数据+WKC) │ │ ││ │ │ (2B) │ │ │ ││ │ └────────────────┴──────────────────────────────────────────────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ Datagram 1 (N1 bytes) │ ││ │ ┌───────┬───────┬───────┬───────┬────────────┬───────────┬───────┐ │ ││ │ │ Cmd │ Index │ ADP │ ADO │ Length │ Data │ WKC │ │ ││ │ │ 1B │ 1B │ 2B │ 2B │ 2B │ N1-10B │ 2B │ │ ││ │ └───────┴───────┴───────┴───────┴────────────┴───────────┴───────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ Datagram 2 (N2 bytes) │ ││ │ ┌───────┬───────┬───────┬───────┬────────────┬───────────┬───────┐ │ ││ │ │ Cmd │ Index │ ADP │ ADO │ Length │ Data │ WKC │ │ ││ │ └───────┴───────┴───────┴───────┴────────────┴───────────┴───────┘ │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ ││ ┌─────────────────────────────────────────────────────────────────────────┐ ││ │ Ethernet FCS (4bytes) │ ││ │ CRC32 校验码 │ ││ └─────────────────────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐│ 完整帧的内存布局 │├─────────────────────────────────────────────────────────────────────────┤│ ││ 偏移 大小 内容 说明 ││ ──────────────────────────────────────────────────────────── ││ 0x006 DA MAC Ethernet 目标地址 ││ 0x066 SA MAC Ethernet 源地址 ││ 0x0C2 EtherType=0x88A4 EtherCAT 协议标识 ││ ││ ─────────────── EtherCAT Header ──────────────── ││ 0x0E2 elength 总长度 (包含所有 Datagram + WKC) ││ ││ ─────────────── Datagram 1 ───────────────────── ││ 0x101 command 命令类型 ││ 0x111 index 帧索引 ││ 0x122 ADP 地址位置 ││ 0x142 ADO 地址偏移 ││ 0x162 dlength 数据长度 ││ 0x182 irpt 中断 (未用) ││ 0x1A N data 数据区 (dlength 字节) ││ 0x1A+N 2WKC 工作计数器 ││ ││ ─────────────── Datagram 2 (如果有) ──────────────────── ││ ... ││ ││ ─────────────── Frame Trailer ─────────────────────── ││ 最后 4 FCS CRC32 校验 ││ │└─────────────────────────────────────────────────────────────────────────┘
// ec_type.h 第 64-75 行// Ethernet 头部定义typedef struct OSAL_PACKED{uint16 da0, da1, da2; // 目标 MAC 地址 (6字节)uint16 sa0, sa1, sa2; // 源 MAC 地址 (6字节)uint16 etype; // EtherType (0x88A4)} ec_etherheadert;// ec_type.h 第 80-99 行// EtherCAT 数据报头部定义typedef struct OSAL_PACKED{uint16 elength; // 长度 (包含数据报头+数据+WKC)uint8 command; // 命令类型 (LRD/LWR/LRW/BRD/BWR...)uint8 index; // 帧索引 (用于发送-接收匹配)uint16 ADP; // 地址位置 (Address Position)uint16 ADO; // 地址偏移 (Address Offset)uint16 dlength; // 数据长度 (不含头部)uint16 irpt; // 中断 (当前未使用)} ec_comt;
// ec_type.h 第 51-59 行#define EC_MAXECATFRAME 1518 // 最大帧长度#define EC_ECATTYPE 0x1000 // EtherCAT 类型#define EC_MAXLRWDATA (EC_MAXECATFRAME - 14 - 2 - 10 - 2 - 4)// 计算: 1518 - 14(以太网头) - 2(EC头) - 10(数据报头) - 2(WKC) - 4(FCS)// 结果: 1486 字节 (LRW 最大数据量)
因此EtherCAT帧的最大长度是1518字节,最大数据长度是1486个字节。思考:由于对于工业的理解还很浅薄,从目前来看,从底层帧的角度结合AI很难,只能从应用层结合AI,对从站的数据进行诊断分析,做一些辅助维护类的任务。另外端侧模型的意义很大,而且不需要很大参数。