用wireshark抓取分析EtherCAT报文
📜 第1章:EtherCAT报文结构
EtherCAT报文结构及Wireshark对应显示:
- 以太网帧头:14字节,包含目标/源MAC地址,帧类型 (EtherType)固定为0x88A4。
- EtherCAT帧头:2字节,包含一个11位的“数据长度”字段,指示其后所有EtherCAT子报文的总长度。
- EtherCAT数据报 (Datagram):一个EtherCAT帧可包含多个数据报,由帧头指示的总长度决定。Wireshark会将其展开为独立单元,包含以下字段:
- 命令 (Cmd):1字节,定义寻址和读写操作,如BRD(广播读)、LRD(逻辑读)、LWR(逻辑写)、ARMW等。
- 索引 (Idx):1字节,用于为请求和响应报文配对。
- 地址区 (Address):4字节,寻址方式不同其含义也不同:
- 设备寻址:前16位是从站地址(Adp),后16位是偏移地址(Ado)。
- 逻辑寻址:32位全部是主站分配的全局逻辑地址(LogAddr)。
- 长度 (Len):11位,表示数据区字节数。
- 数据 (Data):实际数据区,长度由Len字段决定。
- 工作计数器 (WKC):2字节,EtherCAT调试的核心指示器。主站发送时WKC=0,每经过一个正确处理该报文的从站,WKC就按服务类型增加相应值,最终主站通过检查WKC增量是否符合预期来验证通信是否成功。
🔧 第2章:环境搭建与抓包配置
2.1 硬件连接
- 场景一:主站PC上直接安装Wireshark,可以直接抓取主站网卡发出的流量。
- 场景二:主站(如专用控制器)无法安装Wireshark,抓包电脑须并联在总线中,可使用工业以太网交换机[15†L7-L8](可能有风险)或带镜像端口的专用工具。
2.2 软件配置
- 检查协议支持:旧版Wireshark可能需要手动启用EtherCAT解析器,路径为“分析 (Analyze) → 启用的协议 (Enabled Protocols)”,搜索
ethercat并确保启用。 - 关闭网卡Offload(关键!):Wireshark默认驱动常无法重组硬件Offload合并的报文,导致无法解析。必须在终端执行以下命令关闭:
sudoethtool-K<你的网卡名>rx off tx off tso off gso off gro off lro off
🎯 第3章:Wireshark过滤器核心
3.1 捕获过滤器
- 推荐:
ether proto 0x88a4。推荐仅捕获EtherCAT帧,以降低CPU占用并减小文件大小。
3.2 显示过滤器
显示过滤器功能强大,参考下表:
| 目标 | 显示过滤器 | 说明 |
|---|---|---|
| 显示所有EtherCAT包 | ethercat | 最基本的过滤器。 |
| 过滤周期性过程数据 (PDO) | ethercat.cmd == 0x0c | 只显示逻辑读/写命令,通常用于周期性数据交换。 |
| 过滤邮箱数据 (Mailbox) | ecat_mailbox | 过滤包含邮箱协议的报文,如CoE,FoE,EoE。 |
| 过滤CANopen over EtherCAT (CoE) | ecat_mailbox.coe | 专门查看CoE协议,用于SDO/PDO配置等。 |
| 查看DC同步相关报文 | ethercat.ado == 0x0910 | 过滤对DC系统时间寄存器(0x0910)的访问。 |
| 按从站物理地址过滤 | ethercat.adp == 0x1001 | 查看与设备地址为1001的从站的通信。 |
| 按从站偏移地址过滤 | ethercat.ado == 0x0130 | 查看对ESC寄存器0x0130(AL状态寄存器)的访问,常用于判断状态机切换。 |
| 按工作计数器 (WKC) 过滤 | ethercat.wkc != <预期值> | 定位WKC异常的报文。例如主站期待值为3却收到1或2,可能存在通信问题。 |
| 按命令索引过滤 | ethercat.idx == 0x01 | 筛选出包含特定索引值的报文,用于追踪特定请求的响应。 |
| 组合过滤 | ethercat.cmd == 0x0c && ethercat.adp == 0x1001 | 使用&&(与)、` |
提示:在Wireshark的过滤器输入框中输入
ethercat.会自动弹出支持的字段列表。
🔬 第4章:EtherCAT报文深度解析
掌握了过滤器后,我们来学习如何解读具体的EtherCAT报文,本章节将结合前文知识,分析典型的通信过程。
4.1 从站初始化:状态机切换
主站通过向AL控制寄存器0x0120写入特定值来驱动从站状态机。以下过滤器可捕捉这个过程:
ethercat.ado==0x0120例如,当从站成功地由PreOP进入SafeOP时,WKC应按照协议规范增加。
4.2 邮箱通信 (Mailbox)
邮箱通信用于非周期性的参数配置(如SDO服务)。其报文结构为邮箱头 + 邮箱数据。Wireshark能解析邮箱头,并在邮箱数据部分显示更具体的服务数据,如下例使用ecat_mailbox.coe过滤器跟踪SDO读请求:
- 请求报文:Wireshark会显示其为
CoE类型,并解析出SDO命令、索引、子索引等信息。 - 响应报文:从站处理后的响应,包含请求的执行状态和读取的数据。
- 工作计数器 (WKC):如果WKC与预期不符,说明从站可能未正确响应,需检查地址、链路等。
4.3 过程数据通信 (PDO)
当从站进入OP状态后,周期性PDO数据交换开始。其典型特征是包含LRD和LWR命令的报文。可以使用以下过滤器查看:
ethercat.cmd==0x0c通过Wireshark的“统计 (Statistics) → IO图表 (IO Graph)”功能,可以直观地观察PDO报文的发送间隔,评估主站周期的抖动情况。
🛠️ 第5章:高级分析与排错
5.1 不同寻址方式的报文识别
| 寻址模式 | 命令示例 | 地址区呈现 | 应用场景 |
|---|---|---|---|
| 设备寻址 | FPRD,FPWR | Adp和Ado两个字段 | 访问特定从站的寄存器或SII EEPROM。 |
| 逻辑寻址 | LRD,LWR | 单个LogAddr字段 | 周期性过程数据交换,是OP模式下的主流寻址方式。 |
| 广播寻址 | BRD,BWR | Adp为广播地址 | 向所有从站发送命令,如网络扫描。 |
| 自动增量寻址 | APRD,APWR | 地址为连接顺序的位置 | 系统启动时发现和枚举从站。 |
📖 EtherCAT 32位地址模式速查表
| 寻址模式 | 常用命令码 (Cmd) 示例 | 32位地址结构 | 地址含义与工作原理 |
|---|---|---|---|
| 位置寻址 (Position/自增量寻址) | APRD, APWR, APRW, ARMW | [16位位置 (Position)][16位偏移量 (Offset)]如: 0xFFF9 0x0123 | 位置 (高16位): 自动递增的从站物理位置地址。主站预设一个负值,每经过一个从站,硬件自动加1,值为0的从站响应。 偏移量 (低16位): 从站内部的内存地址或寄存器地址。 |
| 节点寻址 (Node/固定地址寻址) | FPRD, FPWR, FPRW, FRMW | [16位节点地址 (Node Addr)][16位偏移量 (Offset)]如: 0x0004 0x0123 | 节点地址 (高16位): 从站预先配置的静态地址(主站分配或从EEPROM加载),不再变化。 偏移量 (低16位): 与位置寻址相同,指从站内部地址。 |
| 广播寻址 (Broadcast) | BRD, BWR, BRW | [16位保留 (Reserved)][16位偏移量 (Offset)]如: 0x0000 0x0123 | 高16位通常设为0并保留。无论地址值是多少,所有从站都接收并处理该报文,访问由偏移量指定的同一内部地址。 |
| 逻辑寻址 (Logical) | LRD, LWR, LRW | [32位逻辑地址 (Logical Address)]如: 0x1000_0000 | 整个32位作为统一的4GB逻辑地址空间。主站通过配置FMMU(现场总线内存管理单元),将从站物理内存动态映射到这个逻辑地址上。 |
