EtherCAT丢包

丢包现象

1. 初始化丢包导致驱动器状态迁移失败

2. 进入OP状态丢包导致重新扫描总线

3. 进入OP状态隔1-2min丢一个包

EtherCAT抓包

用EtherCAT分析仪或者igh自带的虚拟网卡抓包。

igh抓包

正常编译 

./configure --prefix=$install_path --with-linux-dir=$path_linux_kernel --enable-8139too=no --enable-generic=yes --host=arm-linux-gnueabihf
​make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
​make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

添加抓包功能编译,--enable-debug-if=yes

./configure --prefix=$install_path --with-linux-dir=$path_linux_kernel --enable-8139too=no --enable-generic=yes --host=arm-linux-gnueabihf --enable-debug-if=yes
​make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
​make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

重新替换掉ko后启动,执行ifconfig -a就可以看到ecdbgm0网卡,ifconfig ecdbgm0 up启动网卡才能抓包。

抓包命令:

tcpdump -i ecdbgm0 -w tmp.cap

过滤 

  1. 使用Wireshark打开tmp.cap并输入过滤条件;
  2. 点击“文件”-->选择“导出分组解析结果”-->选择“As CSV...”,保存为csv格式,得到两份csv文件;
  3. 用wps打开csv文件,Time列就是时间戳,相邻两行相减得到发送或者接收包间隔,再降排序,如果最大的间隔是周期的两倍或者以上,说明有丢包。

过滤条件:

过滤发送包:

(eth.type == 0x88a4) && (ecat.cnt == 0)

过滤接收包:

(eth.type == 0x88a4) && (ecat.cnt != 0)

 保存csv:

通过分析,发送正常,接收出现丢包(通过分析csv定位丢包,再通过时间戳反相在WireShark中找到丢包位置):

 

问题分析

初步分析

因为发送正常,接收没有数据包,所以应该在某个驱动器丢的。要进一步分析在哪个驱动器丢的。

驱动器分析

读错误计数器

查阅资料发现驱动器有错误计数器寄存器,读每个驱动器的0x0300和0x0301寄存器。

脚本rx_err_counter.sh读每个驱动器的0x0300和0x0301寄存器(8个驱动器):

#!/bin/bash

echo 0x0300
sudo ethercat reg_read -t uint8 0x0300 -p 0
sudo ethercat reg_read -t uint8 0x0300 -p 1
sudo ethercat reg_read -t uint8 0x0300 -p 2
sudo ethercat reg_read -t uint8 0x0300 -p 3
sudo ethercat reg_read -t uint8 0x0300 -p 4
sudo ethercat reg_read -t uint8 0x0300 -p 5
sudo ethercat reg_read -t uint8 0x0300 -p 6
sudo ethercat reg_read -t uint8 0x0300 -p 7

echo 0x0301
sudo ethercat reg_read -t uint8 0x0301 -p 0
sudo ethercat reg_read -t uint8 0x0301 -p 1
sudo ethercat reg_read -t uint8 0x0301 -p 2
sudo ethercat reg_read -t uint8 0x0301 -p 3
sudo ethercat reg_read -t uint8 0x0301 -p 4
sudo ethercat reg_read -t uint8 0x0301 -p 5
sudo ethercat reg_read -t uint8 0x0301 -p 6
sudo ethercat reg_read -t uint8 0x0301 -p 7

测试方法

1. 启动应该程序 
2. 查看是否启动成功

执行dmesg|grep EtherCAT,看到OP状态,表示已经启动成功

3. 查看错误计数器

执行date && ./rx_err_counter.sh

截图记录当前状态

4. 查看是否丢包 

执行dmesg|grep EtherCAT;

测试1小时或者出现丢包为止。

OP之后出现“datagram TIMED OUT!”表示有丢包;没有则没有丢包。

5. 出现丢包 

执行date && ./rx_err_counter.sh

截图记录当前状态

0x0300和0x0301接收错误计数器,都有8行,第几行出现增加,表示第几个驱动器的线出现问题。

如图第5个驱动器增加,表示其接收到错误包,则第4个和第5个驱动器之间连线有问题。

总结

偶尔丢包是由于线造成的,可能是干扰,换带有屏蔽功能的线就没有丢包了。

其他问题

一直打印丢包

EtherCAT WARNING 0: 500 datagrams TIMED OUT!

EtherCAT WARNING 0: 500 datagrams TIMED OUT!

EtherCAT WARNING 0: 500 datagrams TIMED OUT!

出现这种情况,可能原因:

  1. 使用generic通用模式的网卡驱动,但是没有网卡没有打开,执行ifconfig ethX up;
  2. igh开启了冗余功能,但是只用一个网卡导致丢包。备用网卡也要使用,执行命令启动两个网卡
insmod ec_master.ko main_devices=75:42:f5:84:40:e0 backup_devices=75:42:f5:84:40:e8

 驱动器报0xFF10

可能原因:

1. 抱闸没有打开;

2. 接线有问题,电机缺相导致;

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值