保姆级教程:手把手教你用Wireshark和IgH主站分析EtherCAT BRD报文(0x0130/0x0131)

张开发
2026/4/20 0:08:52 15 分钟阅读

分享文章

保姆级教程:手把手教你用Wireshark和IgH主站分析EtherCAT BRD报文(0x0130/0x0131)
工业现场实战用Wireshark与IgH主站深度解析EtherCAT BRD报文在工业自动化现场调试中EtherCAT网络的稳定性直接关系到产线运行效率。当从站设备突然离线或主站报拓扑错误时如何快速定位问题本文将带你用Wireshark抓包工具和IgH主站日志像侦探一样逐层剖析0x0130/0x0131状态报文掌握从数据包到故障结论的完整分析链条。1. 环境准备与工具配置1.1 搭建实验环境我们需要准备以下硬件组件IgH主站运行在Linux实时内核建议Xenomai或PREEMPT_RT补丁从站设备至少3个支持EtherCAT协议的伺服驱动器或IO模块网络拓扑建议使用菊花链连接保留交换机用于抓包关键软件工具版本要求工具名称推荐版本作用说明Wireshark3.6.0抓取并解析EtherCAT帧IgH Master1.5.2提供实时EtherCAT主站功能tcpdump4.9.3命令行抓包备用工具1.2 Wireshark特殊配置EtherCAT报文解析需要加载专用协议插件# 检查是否已加载EtherCAT解析器 tshark -G protocols | grep EtherCAT # 若未加载手动启用插件 sudo wireshark -o uat:user_dlts:\User 0 (DLT147)\,\EtherCAT\,\0\,\\,\0\,\\提示工业现场建议关闭Wireshark的Allow subdissectors to reassemble TCP streams选项避免报文解析异常。2. BRD报文捕获实战2.1 触发状态查询报文在IgH主站中通过以下命令强制发起从站状态轮询# 进入IgH命令行交互模式 ethercat master # 触发状态机重新扫描 fsm reset此时观察dmesg日志会出现类似输出[ 2500.968421] EtherCAT DEBUG 0: Sending frame: [ 2500.968422] EtherCAT DEBUG: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 [ 2500.968427] EtherCAT DEBUG: 07 00 00 00 30 01 02 00 00 00 00 00 00 00 00 002.2 抓包过滤器设置在Wireshark中使用以下过滤表达式精准捕获BRD报文eth.dst ff:ff:ff:ff:ff:ff ecat.type 0x01 ecat.adp 0x0000关键字段解释目的MAC全F广播地址ECAT类型0x01表示EtherCAT命令ADP0x0000表示广播地址3. 报文关键字段深度解析3.1 发送报文结构拆解以示例报文为例Offset 0x0000: FF FF FF FF FF FF 6C 24 08 29 52 19 88 A4 0E 10 Offset 0x0010: 07 00 00 00 30 01 02 00 00 00 00 00 00 00 00 00对应字段解析表偏移量字节数字段名值含义0x00006目标MAC全F广播报文0x00066源MAC6C:24...主站网卡地址0x000C2EtherType0x88A4EtherCAT协议标识0x000E1报文类型0x0EBRD读操作0x00122寄存器地址0x0130AL Status寄存器0x00162数据长度0x0002读取2字节3.2 响应报文差异分析对比主从站交互报文重点关注四个变化点MAC地址变异现象发送帧目标MACFF:FF:FF:FF:FF:FF响应帧源MAC6E:24:08:29:52:19第1字节从6C→6E这是EtherCAT从站的硬件自动应答机制修改首字节作为身份标识。ADP地址分配// IgH主站内部处理逻辑 if (adp 0x0000) { // 广播报文响应时ADP设为应答从站总数 resp.adp htons(slave_count); }Working Counter机制每个从站正确响应时WKC1示例中WKC0x0003表示3个从站正常应答4. 典型故障诊断案例4.1 从站数量不一致当出现以下日志时[ 2501.084367] EtherCAT WARNING: slaves_responding(2) ! wkc(3)诊断步骤检查Wireshark中响应报文WKC值对比主站配置的从站数量使用ethercat slaves命令确认实际连接状态4.2 报文响应超时在dmesg中观察到[ 2501.284361] EtherCAT ERROR: Frame timeout排查方案检查物理层连接ethtool -p eth0 # 测试网口指示灯验证从站供电状态使用T型分支器捕获异常从站的单独响应4.3 寄存器数据异常当AL Status返回值不符合预期时解码状态位# Python状态位解析示例 def parse_al_status(status): return { INIT: bool(status 0x01), PREOP: bool(status 0x02), SAFEOP: bool(status 0x04), OP: bool(status 0x08) }检查从站状态机转换是否完整ethercat states # 查看所有从站状态5. 高级调试技巧5.1 自定义报文注入通过IgH的测试接口发送特定BRD报文// 示例构造查询0x0130寄存器的报文 struct ec_ioctl_master_activate { uint16_t type 0x0E; // BRD uint16_t addr 0x0130; uint16_t len 0x0002; };5.2 实时报文监控脚本使用Python实现自动化监控import subprocess def monitor_ecat(): cmd [tshark, -i, eth0, -Y, ecat, -T, fields, -e, ecat.adp, -e, ecat.cmd, -e, ecat.wkc] proc subprocess.Popen(cmd, stdoutsubprocess.PIPE) while True: line proc.stdout.readline() if b0130 in line: print(fAL Status query detected: {line.decode()})5.3 性能优化建议调整主站线程优先级chrt -f 99 ethercat master优化Wireshark显示过滤器ecat !(ecat.adp 0x0000 ecat.cmd 0x0E)在最近一次汽车产线调试中我们发现当WKC值突然从3变为2时实际是由于某个从站的电源模块接触不良导致间歇性离线。通过持续捕获报文并关联分析dmesg时间戳最终定位到连接器松动这个硬件问题。

更多文章