尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IgH EtherCAT主站实战:x86-64与arm64平台调试及星形拓扑实现

IgH EtherCAT主站实战:x86-64与arm64平台调试及星形拓扑实现 干过EtherCAT现场调试的朋友应该都有体会明明原理都懂手册也翻了几遍真到现场把主站跑起来还是会被各种莫名其妙的问题卡住。尤其是我这两年在x86-64工控机和arm64嵌入式板卡上反复折腾IgH EtherCAT主站从最初的编译安装、网卡绑定到后来为了实现星形走线连接多从站踩过的坑比想象中多得多。这篇文章就把我实际调试IgH主站的过程和思路完整梳理一遍重点讲x86-64和arm64两个平台上容易出问题的地方以及EtherCAT星形拓扑的实现方案。手里拿着RK3568这类板子想跑EtherCAT的朋友或者现场要接几十个从站、走线又没法拉成一条直线的工程师应该能从中找到可以直接抄的答案。1. 整体设计与选型解读1.1 为什么选IgH而不是SOEM经常会有人问“IGH和SOEM哪个稳定”说实话这个问题的答案取决于你的场景。SOEM是一个纯用户态的EtherCAT主站实现它不依赖内核模块移植起来非常容易功能也够用——如果你只是做实验、跑跑小型教学平台或者主站本身跑在非实时操作系统上SOEM确实省心。但一旦涉及工业现场级别的应用比如几十个伺服同步运行、要求分布式时钟DC同步精度在微秒级甚至亚微秒级SOEM的表现就会比较吃力因为它所有的数据处理都要经过用户态和内核态之间的上下文切换实时性天然受限。IgH EtherCAT Master后面简称IgH走的是内核模块路线主站核心逻辑跑在内核态周期通信可以直接在中断上下文或者高优先级内核线程中完成不需要经过用户态调度。这对实时性非常关键。另外IgH支持多主站实例、EoE、DC、冗余、热连接等多个高级特性尤其是DC同步在运动控制这类对时间一致性要求极高的场景里几乎是标配功能。所以我的经验是功能验证用SOEM没问题但真正做设备、做产线优先考虑IgH。从稳定性上看IgH在Linux社区已经发展了十几年处理过大量边界情况只要你的内核版本、网卡驱动和IgH版本匹配跑起来之后很少会莫名崩溃。它的问题反而是配置复杂、上手门槛高这也是很多人觉得“IGH有bug”的原因——实际上绝大多数“卡住不动”“读不到数据”的问题最后排查下来都是配置或环境问题真正属于主站代码本身的坑反而很少。1.2 x86-64和arm64的平台差异到底在哪很多人觉得换一个架构无非是重新编译一遍但实际移植过就知道IgH对平台的依赖不只是“能编译”这么简单。x86-64平台的优势在于生态成熟。Intel I210/I211这类网卡在IgH里有官方支持驱动稳定而且PCIe插卡方便一个工控机能轻松插两三张网卡做多主站。实时性方面x86-64配合PREEMPT_RT补丁在标准Linux上能达到不错的实时表现。再加上x86-64工控机性能普遍过剩跑EtherCAT主站几乎不会成为瓶颈。arm64平台的难点集中在三块第一内核模块必须针对目标板卡的内核版本单独编译稍微不注意就容易出现版本不匹配第二板载网卡驱动不一定是IgH支持的型号比如瑞芯微RK3568的自带GMAC在IgH官方源码里就没有现成适配需要打补丁或者换网卡第三嵌入式平台的Cache一致性、DMA分配方式、中断处理路径和x86-64有差异偶尔会遇到数据错乱或时序抖动。虽然这些问题都有解决办法但如果没有心理准备第一次在开发板上跑IgH会相当折腾。所以我的建议是前期开发和调试尽量在x86-64上完成把协议逻辑、拓扑方案跑通之后再移植到arm64做产品化验证。这样能省掉大量“平台问题”和“业务逻辑问题”互相纠缠的时间。1.3 拓扑规划为什么标题里要特意强调星形走线EtherCAT标准推荐的是线型菊花链拓扑从站一个串一个接线简单帧传输效率也最高。但到了真实产线这个理想拓扑经常实现不了。比如你的主站放在控制柜里从站分布在好几个工位上每个工位离控制柜的距离有远有近如果强行拉成一条线线缆要么绕一大圈要么走到一半没地方固定维护起来非常痛苦。这时候就需要从控制柜引出多根线缆分别连到不同工位物理上呈星形。这种布局在现场特别常见但EtherCAT并不是“随便找个交换机一插就能分叉”的协议这里面的坑比想象中大。很多人第一次做星形走线买了个普通千兆交换机插上去结果从站一个都扫描不到或者通信断断续续——这就是没有理解EtherCAT的帧处理机制。后面第5章我会专门讲星形拓扑的几种可行实现方案。2. 核心细节解析EtherCAT协议关键点与IgH架构2.1 EtherCAT帧处理机制从“存储转发”到“飞行中处理”理解EtherCAT最核心的一点是它的帧处理方式和普通以太网完全不同。普通以太网交换机是“存储转发”模式数据包到了交换机先完整收进来查表再发出去这个过程中存在明显的延迟。EtherCAT从站则是“飞行中处理”processing on the fly模式主站发一帧数据帧经过每个从站时从站只花几十纳秒的时间读取发给自己的数据、写入自己要返回的数据然后立刻把帧传给下一个从站。打个比方普通以太网是快递跑到中转站卸货、分拣、再装车出发EtherCAT是高铁沿路每个站都在列车经过的瞬间完成“装卸货”车都不停。这个机制决定了EtherCAT不能随便用普通交换机分叉——交换机一来一回的存储转发延迟以及它对超长帧的过滤会彻底毁掉EtherCAT的实时链路。EtherCAT帧的EtherType是0x88A4帧长度经常超过标准以太网的1518字节因为一帧里面要带很多从站的过程数据。普通交换机遇到这种“超长帧”要么丢弃要么报错。这也是为什么星形拓扑必须用专门的方案来解决而不是简单粗暴地加交换机。2.2 IgH主站的软件架构IgH的软件架构分成两层。底层是编译进内核的ec_master模块它负责和网卡驱动打交道、发送和接收EtherCAT帧、维护从站状态机、处理DC同步。上层是用户空间工具和应用程序接口通过/dev/EtherCAT0这个字符设备文件来访问主站。调试时最常用的ethercat命令行工具就是跑在用户空间通过ioctl和mmap和内核模块通信。这个架构带来的直接好处是应用层程序不需要处理任何EtherCAT协议细节只需要调用IgH提供的接口告诉主站“我要把这段数据写到逻辑地址0x1000”主站会自动处理FMMU映射、帧封装、周期发送等工作。坏处是一旦出了问题排查链条会比较长从应用层到内核模块到网卡驱动再到物理链路每一层都可能是锅。在实际开发中我建议把ethercat master的输出作为第一个排查节点——它会显示主站当前状态、周期时间、是否有丢帧。这个信息能帮你快速定位问题到底出在应用层、主站层还是链路层。2.3 FMMU与SM映射从站数据是怎么“搬”到主站内存的FMMUFieldbus Memory Management Unit和SMSync Manager是EtherCAT里特别容易混淆的两个概念但它们其实是分工明确的。SM是从站本地对邮箱通信和过程数据缓冲区进行管理的单元。简单说SM0和SM1管邮箱收发配置、SDO之类SM2管主站到从站的输出数据SM3管从站到主站的输入数据。SM的分配是静态的一般从站出厂时就定好了。FMMU则负责把从站的物理内存地址映射到主站的逻辑地址空间。主站发送数据帧时帧里带的不是“从站地址”而是“逻辑地址”每个从站的FMMU会检查这帧数据里有没有属于自己的逻辑地址区间有的话就取走相应的位或字节。这个映射粒度可以很细甚至支持位级别的映射非常灵活。很多人看到“ethercat fmmu 支持软件加密”这个说法以为FMMU带加密功能。实际上FMMU是映射单元不负责加密。它真正强大的地方在于你可以只暴露需要暴露的内存区域给主站其他部分不映射这在某种程度上起到了“数据隔离”的作用。有些安全设计利用FMMU的灵活映射只开放必要的过程数据降低被非法访问的风险。调试时用ethercat pdos和ethercat mapping可以查看当前从站的PDO分配和FMMU映射结果。如果映射不对最常见的问题就是输出数据写到错误的位置从站不动或者输入数据错位读出来的数值完全对不上。2.4 EoE为什么经常被禁用EoEEtherCAT over EtherCAT是一个比较tricky的功能。它的目的是让EtherCAT网络里的某些从站比如倍福的EL6601网口端子可以传输标准的TCP/IP数据这样你不需要给这些设备单独拉以太网线直接从EtherCAT总线里把网络数据“截”下来用。听起来很方便但问题在于EoE本质上是在EtherCAT周期帧里塞了额外的以太网数据包。这个过程会分帧、封装大幅增加每个周期的数据量。以太网包最大能到1518字节一个完整的EoE包可能要拆成多个EtherCAT邮箱帧传输反复占用周期时间。实测中如果某个从站启用EoE传输大量数据EtherCAT周期可能从250us直接被拉到500us甚至1ms这对运动控制来说是不可接受的。就算数据量不大EoE的封装和解析也会带来额外的抖动影响DC同步精度。IgH社区里大家普遍建议除非你的现场确实有设备必须走EoE否则在编译IgH时直接加上--disable-eoe或者配置时不启用EoE。这也是“iigh为什么要禁用eoe”这个问题的标准答案——为了实时性该舍的就得舍。3. x86-64平台调试实录从编译到OP模式3.1 编译安装与内核模块加载在x86-64上编译IgH理论上很简单但细节决定成败。第一步是下载源码。我长期用的是1.5.2版本功能稳定文档也全。然后执行配置./configure --prefix/opt/etherlab --enable-cycles make sudo make modules_install sudo make install这里有几个坑需要提前避开。第一--prefix决定了后面所有文件装在哪里建议统一放/opt/etherlab方便管理和卸载。第二--enable-cycles会启用周期时间统计功能对后期调优非常有帮助建议加上。第三如果你确定不用EoE可以在configure时加--disable-eoe从源头减少麻烦。还有一个容易被忽略的问题内核头文件必须和当前运行的内核完全一致。如果系统升级过内核但没重启或者头文件没装全make modules_install会失败。我在一台Ubuntu 22.04机器上遇到过编译通过但modprobe ec_master报错的情况后来发现是内核版本对不上重新装了对齐的linux-headers才解决。编译安装完成之后需要在/opt/etherlab/etc/ethercat.conf里配置网卡。至少要把MASTER0_DEVICE设置成你使用的网卡MAC地址然后执行/opt/etherlab/sbin/ethercatctl start启动。启动后dmesg能看到主站注册信息。3.2 网卡选择与绑定要点IgH对网卡的依赖非常强。官方文档里列出的支持列表里Intel的e1000/e1000e系列表现最好Realtek的r8169也能用但配置上注意更多。如果条件允许尽量用Intel I210/I211实测在EtherCAT这种低延迟、高频率帧发送场景下稳定性要比Realtek强不少。绑定网卡时最需要注意的一点是网卡不能被系统网络管理工具占用。Ubuntu上NetworkManager或者systemd-networkd默认会把所有网卡都接管如果你不处理IgH根本拿不到这个网卡的控制权。我一般这样处理先修改NetworkManager配置把要用的接口设为“不受管理”然后ip link set ethX up再用ethtool确认网卡状态。最后在ethercat.conf里指定MAC地址。启动主站后dmesg里应该能看到类似“ec_master: Master0 registered”的日志。如果这里就报错先不要继续往下走把网卡绑定问题解决再说。常见的报错是“Link down”或者“No such device”前者多半是网线没插或者网卡没up后者多半是MAC地址写错了。3.3 ethercat命令现场调试的瑞士军刀IgH自带的ethercat命令是调试过程中使用频率最高的工具没有之一。这里列几个我每天都会用到的ethercat master查看主站状态、周期时间、丢帧计数。ethercat slaves -p列出所有从站-p会显示从站在拓扑中的位置。ethercat states查看或切换从站状态INIT、PREOP、SAFEOP、OP。ethercat pdos查看从站的PDO分配情况。ethercat mapping查看FMMU映射逻辑地址。ethercat dc查看分布式时钟状态。ethercat upload/download通过邮箱读写从站对象字典。ethercat reg_read/reg_write直接读写从站寄存器。举个例子当你做完所有配置想验证从站能不能进OP可以这样操作ethercat states OP如果报错马上执行dmesg | tail -n 50看日志主站会把失败原因写得比较清楚。如果成功再执行ethercat slaves看到的每个从站状态列里应该是“OP”。我记得有一次现场排查从站怎么都进不了OP用ethercat slaves -p看状态全部停在SAFEOPdmesg里持续报“Invalid output data”最后用ethercat mapping一看发现主站配置的SM2映射方式和从站EEPROM里写的PDO长度不一致导致输出数据校验失败。这种问题不看映射信息根本定位不到。3.4 进入OP模式的完整流程与常见卡点EtherCAT从站有四种状态INIT、PREOP、SAFEOP、OP。主站要按顺序一级一级往上切每一级都有严格的检查机制。INIT到PREOP主站和从站建立邮箱通信。从站必须配置好SM0和SM1主站才能通过邮箱发送配置数据。如果卡在这一步多半是邮箱配置不对或者从站EEPROM里的SII信息损坏。PREOP到SAFEOP主站配置FMMU和SM2/SM3然后从站开始刷新输入数据。卡在这里通常是PDO映射或FMMU映射有问题从站校验不过。SAFEOP到OP主站开始周期发送输出数据从站被允许输出。卡在这里的情况最多常见原因是看门狗没配好、主站没有真正发送有效输出或者从站检测到输出数据无效拒绝切换。实际调试时我习惯写一个小脚本依次切换状态每一步都打印ethercat slaves的状态检查从站有没有跟上。一旦卡住立刻看dmesg和从站寄存器的AL Status0x0130寄存器那里会有具体的错误码。这个流程看着繁琐但真的是最高效的定位路径。4. arm64平台移植与调试4.1 板端编译还是交叉编译arm64平台跑IgH第一个要决策的问题是编译环境怎么搭。板端编译最省心直接在开发板上跑configure和make只要安装了build-essential和内核头文件基本不会出现环境不匹配的问题。缺点是性能差像我用的RK3568开发板编译IgH虽然不算太久但如果你在改内核模块或者反复调试每次等待都会消磨耐心。交叉编译性能好但配置复杂。需要下载aarch64交叉编译工具链设置CROSS_COMPILEaarch64-linux-gnu-然后最关键的是内核模块的编译必须依赖目标板的内核源码和Module.symvers文件。这个文件如果版本对不上即使编译通过insmod时也会报“version magic”错误根本没商量。我个人的经验是前期代码开发用交叉编译效率高很多但一旦到了需要在板子上验证真实硬件环境的阶段切回板端编译减少变量。很多奇怪的报错最后发现都是编译环境和运行环境不一致导致的。4.2 板载网卡驱动的适配问题这是arm64平台上最大的坑。以RK3568为例板载GMAC在Linux里用的驱动是stmmac/dwmac-rk。IgH官方源码的devices目录里对stmmac的支持并不完善。你翻一下IgH 1.5.2源码支持的网卡驱动主要是e1000、e1000e、r8169、igb、i40e这些stmmac可能要打补丁才能用。有几个解决办法。第一去IgH社区或者厂商SDK里找已经移植好的补丁。很多做RK3568 EtherCAT方案的公司都发布过适配好的IgH版本直接拿来用最省事。第二外接PCIe网卡Intel I210这是最稳的方案但开发板上不一定有PCIe插槽。第三用USB转千兆网卡比如RTL8153这种办法最简单但USB链路的实时性比较差建议只用来做功能验证别用在正式的周期通信里。我在RK3568上做过一次板载GMAC的适配尝试花了大半天时间打补丁、调驱动最后还是用USB网卡跑通了前期的协议验证后续正式版本直接换了一个带PCIe接口的核心板配I210网卡才彻底解决了实时性问题。有时候硬件平台选型比在后端补洞重要得多。4.3 实时性配置PREEMPT_RT与中断隔离arm64和x86-64在实时性上的配置思路类似但嵌入式平台的CPU核心数通常更少所以更得精打细算。首先内核需要打PREEMPT_RT补丁。RK3568这类平台很多厂商的SDK已经打了但你要确认/boot/config-*里有没有CONFIG_PREEMPT_RTy。如果没有需要先搞定实时内核再谈EtherCAT否则周期抖动会非常难看。其次建议用isolcpusnohz_full3这样的内核参数把某个核从Linux调度器中隔离出来专门跑EtherCAT相关的实时任务。IgH主站的内核线程可以通过sched_setaffinity绑定到这个核减少其他进程的干扰。实测在RK3568四核A55上做好隔离之后250us周期下抖动可以控制在几微秒以内不隔离的话动不动就几十微秒甚至上百微秒的毛刺这在运动控制里根本没法用。另外中断处理也要注意。网卡的中断尽量绑定到非实时核避免实时内核线程和网卡中断在同一个核上打架。可以用/proc/irq/irq/smp_affinity来设置中断亲和性。4.4 QEMU模拟arm64能用来做什么看到热搜里有“qemu模拟arm64”很多人会想能不能用QEMU跑一个arm64的Linux虚拟机然后在里面调试IgH我的回答是可以拿来熟悉环境、编译代码、验证应用层逻辑但别指望它能验证EtherCAT通信。QEMU模拟的是CPU和基本外设它模拟不出真实网卡驱动也模拟不出EtherCAT从站的on-the-fly处理过程。你在QEMU里跑IgH最多能看到模块加载成功但链路层通信、从站枚举、DC同步这些东西一个都验证不了。我自己会在QEMU里做一类事情调试应用层的状态机逻辑。比如写一个不依赖真实从站的模拟程序通过虚拟接口和IgH主站交互验证应用代码的边界条件。这样能提前发现很多程序逻辑问题等到真硬件上只需要关注协议和时序问题。至于完整的EtherCAT调试老老实实准备一块真开发板配一个EtherCAT从站模块这条路省不掉。5. 星形走线连接多从站的实现5.1 为什么不能随便用交换机这是星形拓扑里最容易踩的坑。我前面讲过EtherCAT帧要求从站在帧经过的瞬间完成处理而普通交换机是存储转发这两者在原理上就冲突。而且EtherCAT帧经常超过1518字节。如果你把一串从站挂到某个分支上PDO数据加起来很容易超过1KB再加上EtherCAT头、邮箱数据帧长很容易超过标准以太网MTU。普通交换机看到这种帧直接丢了。那是不是完全不能用交换机也不绝对。部分工业交换机支持所谓的“EtherCAT透传模式”内部对0x88A4帧做特殊处理帧长容忍度也高。但这类交换机价格不便宜而且不同品牌和IgH的兼容性参差不齐。所以我的建议是能不用交换机就不用实在要选先做一轮全链路实测再上线。5.2 方案一多网卡多主站实例最直接的星形方案就是主站用多张网卡每张网卡挂一条独立的EtherCAT链物理上所有链路汇聚到主站这一点形成一个标准的星形。IgH支持多个主站实例配置很简单在/opt/etherlab/etc/ethercat.conf里这样写MASTER0_DEVICE00:11:22:33:44:55 MASTER1_DEVICE00:11:22:33:44:66这样启动后系统里会有master0和master1两个主站分别管理两条从站链。应用层需要分别打开两个接口、分别配置、分别收发数据。这个方案的好处是实现简单、成本可控稳定性高因为每条链之间完全独立一条链出问题不会影响另一条。缺点是需要多几张网卡而且如果从站之间需要跨链通信应用层得额外做协调。另外每一条链都对应一个独立的周期和DC域如果你计划做多轴联动得自己处理好域间的同步关系。5.3 方案二使用EtherCAT分支模块Junction这是更贴合的星形拓扑方案。EtherCAT协议本身允许树型或星型拓扑只要链路中有支持帧转发的“分支从站”即可。倍福的EK1122就是典型的EtherCAT分支模块它有两个额外的EtherCAT输出端口可以分别向下挂一串联设备物理拓扑从外观上看就是标准星形。分支模块在IgH里会被当作一个普通从站扫描到但它本身不参与过程数据通信只负责把帧转发到每个分支端口。也就是说你不需要在IgH里为它做任何特殊配置只要接线正确主站扫描时自然会把所有分支上的从站按顺序列出来。使用分支模块时要特别注意供电和DC能力。分支模块本身需要单独供电如果用它时后面挂的从站比较多电源容量得算好。另外一个重要选择标准是分支模块是否支持DC传播延迟补偿。如果要保证各分支从站的同步精度这个功能是必须的。实测中不带DC补偿的分支模块接出来的从站同步抖动会比带补偿的大不少。5.4 方案三支持EtherCAT透传的工业交换机如果一个分支点后面要接的从站特别多动辄几十个用分支模块串接会产生一定的限制比如拓扑深度、帧延迟预算这时候可以考虑工业交换机方案。支持EtherCAT透传的交换机会对0x88A4帧做专门处理帧长容量更大转发延迟更低可以在一个交换节点下挂大量从站。IgH扫描时这些从站会被视为同一链路中的节点逻辑上依然是一条“长链”。但我要提醒的是每个交换机都会引入额外的转发延迟而且多台交换机级联时延迟会累积。如果从站要求极高的DC同步精度这个方案可能达不到要求。另外不同交换机对EtherCAT帧的透传深度、WKC的处理细节有差异前期必须做兼容性验证。实际项目中我见过用这个方案挂了几十个IO从站的场景效果还不错但伺服同步场景没人敢这么用基本都是回到分支模块或多网卡方案。5.5 DC同步在星形拓扑下的注意事项星形拓扑下不同分支的线缆长度、经过的分支模块数量都不一样传输延迟差异会比纯线型拓扑大得多。这时候DC分布式时钟的作用就非常明显了。DC机制的核心是让所有从站共享同一个时间基准。IgH主站会选择一个参考时钟从站通常是拓扑中第一个支持DC的从站然后遍历所有从站测量每个从站到参考时钟的传播延迟写入从站的系统时间寄存器进行补偿。实际操作中用ethercat dc命令查看所有从站的DC状态。如果某个从站的延迟补偿值显示异常比如突然跳变或者无法补偿多半是它所在分支的拓扑信息没有被正确识别或者分支模块不支持DC延迟测量。我的经验是星形拓扑里尽量让所有分支的线缆长度保持在一个量级别一个分支只有0.3米另一个分支拉出去60米。即使有DC补偿极端不对称的拓扑也会在精度上打折扣。6. 常见问题与排查技巧实录6.1 “OP模式下读不到数据”六步排查法这个问题的关键词在热搜里反复出现说明实在太多人踩了。我自己第一次调IgH时也卡在这里好几天。后来总结出一套六步排查法基本能覆盖90%的情况。第一步确认从站确实在线而且状态正确。执行ethercat slaves -p看所有从站是否枚举出来状态是否都到了OP。如果从站数量不对先查物理接线、供电和终端电阻。第二步看主站层信息。执行ethercat master关注周期时间、丢帧计数、状态是否正常。如果丢帧严重可能是网卡驱动问题、中断冲突或者系统调度延迟。第三步检查SII配置。用ethercat parse把从站的SII信息导出来重点看PDO映射和SM配置确认和实际硬件是否一致。第四步检查过程数据映射。ethercat pdos和ethercat mapping能显示主站视角下的PDO逻辑地址。如果逻辑地址分配和你的应用代码里读写地址不一致那自然“读不到数据”。第五步检查DC同步。ethercat dc看所有从站的DC状态有没有哪个从站没有DC能力或者补偿异常。DC出问题常见表现是数据时对时错。第六步检查应用层。确认你的应用程序是否真的调用了正确的接口读写过程数据周期时间配置是否和主站一致。有时候主站一切正常但从站数据就是不刷新最后发现是应用层压根没执行写操作。这六步走完绝大多数“读不到数据”的问题都能定位。剩下那10%大概率是硬件电气问题需要万用表和示波器出马了。6.2 星形拓扑中从站掉线与报文丢失星形拓扑相比线型多了一个风险点分支点。分支模块、交换机、接线端子这些地方任何一个接触不良整条分支就会掉线而且故障定位比线型困难因为主站只知道“某个从站丢了”不知道是哪个分支出的问题。排查时先在dmesg里找有没有“Lost frame”或“CRC error”之类的记录。如果集中在某个分支优先检查那一段的线缆、接头和分支模块。EtherCAT对线缆质量要求比较高屏蔽双绞线必须单端接地线缆长度别超过100米。分支点的地方线缆固定要牢靠避免振动导致接触不良。还有一个经验星形拓扑下分支模块出来的线缆如果走线和动力电缆捆在一起容易受到电磁干扰表现为偶发性掉线、数据错误。这种问题用软件调试基本查不出来只能靠改善布线解决。6.3 Wireshark抓包分析EtherCAT帧有时候主站层面看不出来的问题抓包一看就清楚了。IgH主站所在的网卡其实在发送和接收EtherCAT帧你可以用Wireshark抓这些帧来分析。抓包时要注意EtherCAT的EtherType是0x88A4Wireshark识别后会把帧解析成EtherCAT协议。重点看几个字段帧头里的类型字段判断是读命令、写命令还是读写命令。从站寻址方式配置地址、站地址、逻辑地址。WKCWorking Counter字段这个字段表示有多少个从站正确响应了该命令。如果主站发了一个写命令期望2个从站响应但WKC只有1说明有一个从站没完成操作。实测中WKC不对是排查从站状态机问题最直接的线索。另外Wireshark抓包能看到主站是否在周期性发送帧、周期时间是否稳定、帧长是否超限。如果帧被异常截断多半是交换机或网卡驱动在中间搞鬼。6.4 常见问题速查表最后整理一个我在现场调试时反复查阅的速查表希望对你有用问题现象可能原因解决办法从站枚举不出来网卡绑定错误、线缆断裂、从站供电不足检查ethercat.conf、重插网线、单独供电从站停在PREOP不上SAFEOPPDO映射错误、SII信息损坏、FMMU配置异常用ethercat parse检查SII重新载入配置从站停在SAFEOP不上OPSM2输出校验失败、看门狗未配置、主站未发送有效输出检查PDO长度、配置看门狗参数、确认应用层写入数据时对时错DC同步异常、线缆EMC干扰、拓扑不对称检查DC补偿值、改善布线、缩短分支线缆周期抖动大系统调度被干扰、EoE开启、中断亲和性未配置隔离CPU核心、禁用EoE、设置中断亲和性模块加载失败内核版本不匹配、Module.symvers缺失用板端内核源码重新编译模块主站频繁丢帧网卡驱动不兼容、中断处理不及时、系统负载过高更换网卡、调整中断绑定、检查CPU使用率这张表我打印出来贴在工位上每次排查问题先对一遍能少走很多弯路。当然实际项目中问题往往不是单独出现的可能是两三个因素叠加这时候还是得从底层链路开始一步步查。最后再分享一个算是压箱底的小技巧。我在现场调试的时候习惯写一个特别简单的监控脚本每隔几秒执行一次ethercat master和ethercat slaves -p把结果打上时间戳存到日志文件里。设备跑几个小时后再去翻这个日志很多偶发性的掉线、时序抖动问题都能从中找到规律比你在现场干等着故障重现要高效得多。EtherCAT调试这件事耐心比智商重要方法比经验重要把每一步的原因都弄清楚你踩过的每个坑都会变成后续项目里的底气。
返回列表